t32cb16blend.S revision 068f9f3bf9d09ebca0016cfcbb682d8ca27480f5
1068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand/* libs/pixelflinger/t32cb16blend.S
2068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand**
3068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Copyright 2010, The Android Open Source Project
4068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand**
5068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Licensed under the Apache License, Version 2.0 (the "License");
6068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** you may not use this file except in compliance with the License.
7068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** You may obtain a copy of the License at
8068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand**
9068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand**     http://www.apache.org/licenses/LICENSE-2.0
10068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand**
11068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Unless required by applicable law or agreed to in writing, software
12068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** distributed under the License is distributed on an "AS IS" BASIS,
13068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** See the License for the specific language governing permissions and
15068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** limitations under the License.
16068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand*/
17068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
18068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#ifdef DEBUG
19068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#define DBG
20068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else
21068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#define DBG #
22068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif
23068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
24068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand/*
25068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * blend one of 2 16bpp RGB pixels held in dreg selected by shift
26068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * with the 32bpp ABGR pixel held in src and store the result in fb
27068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand *
28068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * Assumes that the dreg data is little endian and that
29068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * the the second pixel (shift==16) will be merged into
30068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * the fb result
31068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand *
32068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * Uses $t0,$t6,$t7,$t8
33068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */
34068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
35068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#if __mips==32 && __mips_isa_rev>=2
36068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.macro pixel dreg src fb shift
37068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/*
38068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * sA = s >> 24
39068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * f = 0x100 - (sA + (sA>>7))
40068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 */
41068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	noat
42068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	rdhwr	$at,$2
43068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	at
44068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
45068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t7,\src,24
46068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t6,$t7,7
47068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t7,$t6
48068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	li	$t6,0x100
49068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	subu	$t7,$t6,$t7
50068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
51068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* red */
52068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t8,\dreg,\shift+6+5,5			# dst[\shift:15..11]
53068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t6,$t8,$t7
54068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t0,\dreg,\shift+5,6			# start green extraction dst[\shift:10..5]
55068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t8,\src,3,5				# src[7..3]
56068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t6,8
57068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t8,$t6
58068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ins	\fb,$t8,\shift+6+5,5			# dst[\shift:15..11]
59068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
60068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        /* green */
61068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t8,$t0,$t7
62068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t0,\dreg,\shift,5			# start blue extraction dst[\shift:4..0]
63068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t6,\src,2+8,6				# src[15..10]
64068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,8
65068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        addu	$t8,$t6
66068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
67068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* blue */
68068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t0,$t0,$t7
69068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ins	\fb,$t8,\shift+5,6			# finish green insertion dst[\shift:10..5]
70068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ext	$t6,\src,(3+8+8),5
71068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,$t0,8
72068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t8,$t6
73068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	ins	\fb,$t8,\shift,5
74068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
75068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	noat
76068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	rdhwr	$t8,$2
77068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	subu	$t8,$at
78068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	sltu	$at,$t8,$v0
79068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	movn	$v0,$t8,$at
80068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	sgtu	$at,$t8,$v1
81068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	movn	$v1,$t8,$at
82068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	at
83068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.endm
84068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
85068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else
86068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
87068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.macro pixel dreg src fb shift
88068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/*
89068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * sA = s >> 24
90068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * f = 0x100 - (sA + (sA>>7))
91068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 */
92068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	push
93068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	noat
94068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	mips32r2
95068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG 	rdhwr	$at,$2
96068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	pop
97068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
98068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t7,\src,24
99068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t6,$t7,7
100068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t7,$t6
101068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	li	$t6,0x100
102068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	subu	$t7,$t6,$t7
103068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
104068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/*
105068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * red
106068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * dR = (d >> (6 + 5)) & 0x1f;
107068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * dR = (f*dR)>>8
108068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * sR = (s >> (   3)) & 0x1f;
109068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * sR += dR
110068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * fb |= sR << 11
111068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 */
112068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,\dreg,\shift+6+5
113068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift==0
114068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and     $t8,0x1f
115068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
116068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t8,$t8,$t7
117068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t6,\src,3
118068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and	$t6,0x1f
119068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,8
120068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t8,$t6
121068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
122068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sll	$t8,\shift+11
123068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	or	\fb,$t8
124068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else
125068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sll	\fb,$t8,11
126068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
127068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
128068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        /*
129068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * green
130068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * dG = (d >> 5) & 0x3f
131068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * dG = (f*dG) >> 8
132068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 * sG = (s >> ( 8+2))&0x3F;
133068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	 */
134068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,\dreg,\shift+5
135068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        and	$t8,0x3f
136068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t8,$t8,$t7
137068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        srl	$t6,\src,8+2
138068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        and     $t6,0x3f
139068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,8
140068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        addu	$t8,$t6
141068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sll	$t8,\shift + 5
142068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	or	\fb,$t8
143068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
144068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* blue */
145068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
146068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,\dreg,\shift
147068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and	$t8,0x1f
148068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else
149068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and	$t8,\dreg,0x1f
150068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
151068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	mul	$t8,$t8,$t7
152068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t6,\src,(8+8+3)
153068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and	$t6,0x1f
154068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	srl	$t8,8
155068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$t8,$t6
156068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
157068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sll	$t8,\shift
158068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
159068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	or	\fb,$t8
160068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	push
161068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	noat
162068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	mips32r2
163068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	rdhwr	$t8,$2
164068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	subu	$t8,$at
165068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	sltu	$at,$t8,$v0
166068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	movn	$v0,$t8,$at
167068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	sgtu	$at,$t8,$v1
168068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	movn	$v1,$t8,$at
169068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set	pop
170068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.endm
171068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif
172068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
173068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.text
174068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.align
175068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
176068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.global scanline_t32cb16blend_mips
177068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.ent	scanline_t32cb16blend_mips
178068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandscanline_t32cb16blend_mips:
179068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	li	$v0,0xffffffff
180068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	li	$v1,0
181068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* Align the destination if necessary */
182068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	and	$t0,$a0,3
183068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$t0,aligned
184068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
185068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* as long as there is at least one pixel */
186068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$a2,done
187068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
188068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t4,($a1)
189068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a0,2
190068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a1,4
191068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$t4,1f
192068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lhu	$t3,-2($a0)
193068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel   $t3,$t4,$t1,0
194068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sh	$t1,-2($a0)
195068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1:	subu	$a2,1
196068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
197068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandaligned:
198068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* Check to see if its worth unrolling the loop */
199068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	subu	$a2,4
200068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	bltz	$a2,tail
201068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
202068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* Process 4 pixels at a time */
203068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandfourpixels:
204068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* 1st pair of pixels */
205068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t4,0($a1)
206068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t5,4($a1)
207068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a0,8
208068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a1,16
209068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
210068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* both are zero, skip this pair */
211068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	or	$t3,$t4,$t5
212068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$t3,1f
213068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
214068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* load the destination */
215068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t3,-8($a0)
216068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
217068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel	$t3,$t4,$t1,0
218068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel	$t3,$t5,$t1,16
219068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sw	$t1,-8($a0)
220068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
221068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1:
222068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* 2nd pair of pixels */
223068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t4,-8($a1)
224068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t5,-4($a1)
225068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
226068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* both are zero, skip this pair */
227068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	or	$t3,$t4,$t5
228068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$t3,1f
229068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
230068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* load the destination */
231068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t3,-4($a0)
232068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
233068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel	$t3,$t4,$t1,0
234068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel	$t3,$t5,$t1,16
235068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sw	$t1,-4($a0)
236068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
237068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1:	subu    $a2,4
238068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	bgtz	$a2,fourpixels
239068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
240068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandtail:
241068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* the pixel count underran, restore it now */
242068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a2,4
243068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
244068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	/* handle the last 0..3 pixels */
245068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$a2,done
246068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandonepixel:
247068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lw	$t4,($a1)
248068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a0,2
249068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	addu	$a1,4
250068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	beqz	$t4,1f
251068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	lhu	$t3,-2($a0)
252068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	pixel   $t3,$t4,$t1,0
253068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	sh	$t1,-2($a0)
254068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1:	subu	$a2,1
255068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	bnez	$a2,onepixel
256068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sanddone:
257068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set    push
258068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set    mips32r2
259068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG 	rdhwr	$a0,$3
260068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG 	mul	$v0,$a0
261068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG 	mul	$v1,$a0
262068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG	.set    pop
263068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	j	$ra
264068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand	.end	scanline_t32cb16blend_mips
265