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
36606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .macro pixel dreg src fb shift
37606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /*
38606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * sA = s >> 24
39606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * f = 0x100 - (sA + (sA>>7))
40606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     */
41606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    noat
42606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr   $at,$2
43606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    at
44068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
45606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t7,\src,24
46606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,$t7,7
47606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t7,$t6
48606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    li   $t6,0x100
49606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    subu $t7,$t6,$t7
50068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
51606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* red */
52606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t8,\dreg,\shift+6+5,5         # dst[\shift:15..11]
53606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t6,$t8,$t7
54606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t0,\dreg,\shift+5,6           # start green extraction dst[\shift:10..5]
55606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t8,\src,3,5               # src[7..3]
56606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,8
57606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
58606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.if \shift!=0
59606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8,\shift+11
60606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb,$t8
61606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.else
62606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  \fb,$t8,11
63606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.endif
64068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
65606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* green */
66606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t8,$t0,$t7
67606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t0,\dreg,\shift,5         # start blue extraction dst[\shift:4..0]
68606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t6,\src,2+8,6             # src[15..10]
69606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,8
70606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
71068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
72606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* blue */
73606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t0,$t0,$t7
74606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8, $t8, \shift+5
75606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb, \fb, $t8
76606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext  $t6,\src,(3+8+8),5
77606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,$t0,8
78606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
79606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8, $t8, \shift
80606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb, \fb, $t8
81068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
82606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    noat
83606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $t8,$2
84606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG subu  $t8,$at
85606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sltu  $at,$t8,$v0
86606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn  $v0,$t8,$at
87606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sgtu  $at,$t8,$v1
88606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn  $v1,$t8,$at
89606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    at
90606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .endm
91068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
92068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else
93068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
94606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .macro pixel dreg src fb shift
95606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /*
96606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * sA = s >> 24
97606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * f = 0x100 - (sA + (sA>>7))
98606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     */
99606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    push
100606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    noat
101606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    mips32r2
102606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr   $at,$2
103606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    pop
104068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
105606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t7,\src,24
106606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,$t7,7
107606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t7,$t6
108606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    li   $t6,0x100
109606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    subu $t7,$t6,$t7
110068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
111606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /*
112606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * red
113606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * dR = (d >> (6 + 5)) & 0x1f;
114606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * dR = (f*dR)>>8
115606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * sR = (s >> (   3)) & 0x1f;
116606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * sR += dR
117606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * fb |= sR << 11
118606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     */
119606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,\dreg,\shift+6+5
120068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift==0
121606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t8,0x1f
122068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
123606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t8,$t8,$t7
124606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,\src,3
125606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t6,0x1f
126606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,8
127606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
128068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
129606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8,\shift+11
130606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb,$t8
131068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else
132606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  \fb,$t8,11
133068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
134068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
135068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand        /*
136606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * green
137606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * dG = (d >> 5) & 0x3f
138606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * dG = (f*dG) >> 8
139606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     * sG = (s >> ( 8+2))&0x3F;
140606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes     */
141606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,\dreg,\shift+5
142606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t8,0x3f
143606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t8,$t8,$t7
144606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,\src,8+2
145606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t6,0x3f
146606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,8
147606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
148606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8,\shift + 5
149606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb,$t8
150068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
151606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* blue */
152068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
153606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,\dreg,\shift
154606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t8,0x1f
155068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else
156606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t8,\dreg,0x1f
157068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
158606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul  $t8,$t8,$t7
159606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t6,\src,(8+8+3)
160606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and  $t6,0x1f
161606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl  $t8,8
162606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu $t8,$t6
163068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0
164606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll  $t8,\shift
165068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif
166606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or   \fb,$t8
167606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    push
168606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    noat
169606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    mips32r2
170606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr   $t8,$2
171606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG subu    $t8,$at
172606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sltu    $at,$t8,$v0
173606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn    $v0,$t8,$at
174606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sgtu    $at,$t8,$v1
175606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn    $v1,$t8,$at
176606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    pop
177606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .endm
178068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif
179068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
180606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .text
1811109f115bd016e82a4d8304b17fdaa4d3e577ba4Nikola Veljkovic    .balign 4
182068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
183606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .global scanline_t32cb16blend_mips
184606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .ent    scanline_t32cb16blend_mips
185068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandscanline_t32cb16blend_mips:
186606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG li    $v0,0xffffffff
187606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG li    $v1,0
188606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* Align the destination if necessary */
189606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    and   $t0,$a0,3
190606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $t0,aligned
191068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
192606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* as long as there is at least one pixel */
193606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $a2,done
194068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
195606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t4,($a1)
196606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a0,2
197606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a1,4
198606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $t4,1f
199606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lhu   $t3,-2($a0)
200606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t4,$t1,0
201606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sh    $t1,-2($a0)
202606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1:  subu  $a2,1
203068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
204068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandaligned:
205606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* Check to see if its worth unrolling the loop */
206606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    subu  $a2,4
207606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bltz  $a2,tail
208068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
209606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* Process 4 pixels at a time */
210068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandfourpixels:
211606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* 1st pair of pixels */
212606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t4,0($a1)
213606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t5,4($a1)
214606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a0,8
215606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a1,16
216068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
217606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* both are zero, skip this pair */
218606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or    $t3,$t4,$t5
219606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $t3,1f
220068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
221606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* load the destination */
222606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t3,-8($a0)
223068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
224606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t4,$t1,0
225606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    andi  $t1, 0xFFFF
226606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t5,$t1,16
227606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sw    $t1,-8($a0)
228068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
229068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1:
230606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* 2nd pair of pixels */
231606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t4,-8($a1)
232606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t5,-4($a1)
233068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
234606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* both are zero, skip this pair */
235606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or    $t3,$t4,$t5
236606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $t3,1f
237068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
238606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* load the destination */
239606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t3,-4($a0)
240068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
241606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t4,$t1,0
242606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    andi  $t1, 0xFFFF
243606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t5,$t1,16
244606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sw    $t1,-4($a0)
245068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
246606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1:  subu  $a2,4
247606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bgtz  $a2,fourpixels
248068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
249068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandtail:
250606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* the pixel count underran, restore it now */
251606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a2,4
252068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand
253606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* handle the last 0..3 pixels */
254606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $a2,done
255068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandonepixel:
256606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lw    $t4,($a1)
257606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a0,2
258606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu  $a1,4
259606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz  $t4,1f
260606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lhu   $t3,-2($a0)
261606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel $t3,$t4,$t1,0
262606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sh    $t1,-2($a0)
263606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1:  subu  $a2,1
264606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bnez  $a2,onepixel
265068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sanddone:
266606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    push
267606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    mips32r2
268606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr   $a0,$3
269606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG mul     $v0,$a0
270606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG mul     $v1,$a0
271606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set    pop
272606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    j     $ra
273606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .end    scanline_t32cb16blend_mips
274