beta-0.89.2
[luatex.git] / source / libs / pixman / pixman-src / pixman / pixman-mips-dspr2-asm.S
blob9dad163b792e9fc690a385d4650551aff4be9e7c
1 /*
2  * Copyright (c) 2012
3  *      MIPS Technologies, Inc., California.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
14  *    contributors may be used to endorse or promote products derived from
15  *    this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * Author:  Nemanja Lukic (nemanja.lukic@rt-rk.com)
30  */
32 #include "pixman-private.h"
33 #include "pixman-mips-dspr2-asm.h"
35 LEAF_MIPS_DSPR2(pixman_fill_buff16_mips)
37  * a0 - *dest
38  * a1 - count (bytes)
39  * a2 - value to fill buffer with
40  */
42     beqz     a1, 3f
43      andi    t1, a0, 0x0002
44     beqz     t1, 0f          /* check if address is 4-byte aligned */
45      nop
46     sh       a2, 0(a0)
47     addiu    a0, a0, 2
48     addiu    a1, a1, -2
50     srl      t1, a1, 5       /* t1 how many multiples of 32 bytes */
51     replv.ph a2, a2          /* replicate fill value (16bit) in a2 */
52     beqz     t1, 2f
53      nop
55     addiu    t1, t1, -1
56     beqz     t1, 11f
57      addiu   a1, a1, -32
58     pref     30, 32(a0)
59     sw       a2, 0(a0)
60     sw       a2, 4(a0)
61     sw       a2, 8(a0)
62     sw       a2, 12(a0)
63     sw       a2, 16(a0)
64     sw       a2, 20(a0)
65     sw       a2, 24(a0)
66     sw       a2, 28(a0)
67     b        1b
68      addiu   a0, a0, 32
69 11:
70     sw       a2, 0(a0)
71     sw       a2, 4(a0)
72     sw       a2, 8(a0)
73     sw       a2, 12(a0)
74     sw       a2, 16(a0)
75     sw       a2, 20(a0)
76     sw       a2, 24(a0)
77     sw       a2, 28(a0)
78     addiu    a0, a0, 32
80     blez     a1, 3f
81      addiu   a1, a1, -2
82     sh       a2, 0(a0)
83     b        2b
84      addiu   a0, a0, 2
86     jr       ra
87      nop
89 END(pixman_fill_buff16_mips)
91 LEAF_MIPS32R2(pixman_fill_buff32_mips)
93  * a0 - *dest
94  * a1 - count (bytes)
95  * a2 - value to fill buffer with
96  */
98     beqz     a1, 3f
99      nop
100     srl      t1, a1, 5 /* t1 how many multiples of 32 bytes */
101     beqz     t1, 2f
102      nop
104     addiu    t1, t1, -1
105     beqz     t1, 11f
106      addiu   a1, a1, -32
107     pref     30, 32(a0)
108     sw       a2, 0(a0)
109     sw       a2, 4(a0)
110     sw       a2, 8(a0)
111     sw       a2, 12(a0)
112     sw       a2, 16(a0)
113     sw       a2, 20(a0)
114     sw       a2, 24(a0)
115     sw       a2, 28(a0)
116     b        1b
117      addiu   a0, a0, 32
119     sw       a2, 0(a0)
120     sw       a2, 4(a0)
121     sw       a2, 8(a0)
122     sw       a2, 12(a0)
123     sw       a2, 16(a0)
124     sw       a2, 20(a0)
125     sw       a2, 24(a0)
126     sw       a2, 28(a0)
127     addiu    a0, a0, 32
129     blez     a1, 3f
130      addiu   a1, a1, -4
131     sw       a2, 0(a0)
132     b        2b
133      addiu   a0, a0, 4
135     jr       ra
136      nop
138 END(pixman_fill_buff32_mips)
140 LEAF_MIPS_DSPR2(pixman_composite_src_8888_0565_asm_mips)
142  * a0 - dst (r5g6b5)
143  * a1 - src (a8r8g8b8)
144  * a2 - w
145  */
147     beqz     a2, 3f
148      nop
149     addiu    t1, a2, -1
150     beqz     t1, 2f
151      nop
152     li       t4, 0xf800f800
153     li       t5, 0x07e007e0
154     li       t6, 0x001f001f
156     lw       t0, 0(a1)
157     lw       t1, 4(a1)
158     addiu    a1, a1, 8
159     addiu    a2, a2, -2
161     CONVERT_2x8888_TO_2x0565 t0, t1, t2, t3, t4, t5, t6, t7, t8
163     sh       t2, 0(a0)
164     sh       t3, 2(a0)
166     addiu    t2, a2, -1
167     bgtz     t2, 1b
168      addiu   a0, a0, 4
170     beqz     a2, 3f
171      nop
172     lw       t0, 0(a1)
174     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
176     sh       t1, 0(a0)
178     j        ra
179      nop
181 END(pixman_composite_src_8888_0565_asm_mips)
183 LEAF_MIPS_DSPR2(pixman_composite_src_0565_8888_asm_mips)
185  * a0 - dst (a8r8g8b8)
186  * a1 - src (r5g6b5)
187  * a2 - w
188  */
190     beqz     a2, 3f
191      nop
192     addiu    t1, a2, -1
193     beqz     t1, 2f
194      nop
195     li       t4, 0x07e007e0
196     li       t5, 0x001F001F
198     lhu      t0, 0(a1)
199     lhu      t1, 2(a1)
200     addiu    a1, a1, 4
201     addiu    a2, a2, -2
203     CONVERT_2x0565_TO_2x8888 t0, t1, t2, t3, t4, t5, t6, t7, t8, t9
205     sw       t2, 0(a0)
206     sw       t3, 4(a0)
208     addiu    t2, a2, -1
209     bgtz     t2, 1b
210      addiu   a0, a0, 8
212     beqz     a2, 3f
213      nop
214     lhu      t0, 0(a1)
216     CONVERT_1x0565_TO_1x8888 t0, t1, t2, t3
218     sw       t1, 0(a0)
220     j        ra
221      nop
223 END(pixman_composite_src_0565_8888_asm_mips)
225 LEAF_MIPS_DSPR2(pixman_composite_src_x888_8888_asm_mips)
227  * a0 - dst (a8r8g8b8)
228  * a1 - src (x8r8g8b8)
229  * a2 - w
230  */
232     beqz     a2, 4f
233      nop
234     li       t9, 0xff000000
235     srl      t8, a2, 3    /* t1 = how many multiples of 8 src pixels */
236     beqz     t8, 3f       /* branch if less than 8 src pixels */
237      nop
239     addiu    t8, t8, -1
240     beqz     t8, 2f
241      addiu   a2, a2, -8
242     pref     0, 32(a1)
243     lw       t0, 0(a1)
244     lw       t1, 4(a1)
245     lw       t2, 8(a1)
246     lw       t3, 12(a1)
247     lw       t4, 16(a1)
248     lw       t5, 20(a1)
249     lw       t6, 24(a1)
250     lw       t7, 28(a1)
251     addiu    a1, a1, 32
252     or       t0, t0, t9
253     or       t1, t1, t9
254     or       t2, t2, t9
255     or       t3, t3, t9
256     or       t4, t4, t9
257     or       t5, t5, t9
258     or       t6, t6, t9
259     or       t7, t7, t9
260     pref     30, 32(a0)
261     sw       t0, 0(a0)
262     sw       t1, 4(a0)
263     sw       t2, 8(a0)
264     sw       t3, 12(a0)
265     sw       t4, 16(a0)
266     sw       t5, 20(a0)
267     sw       t6, 24(a0)
268     sw       t7, 28(a0)
269     b        1b
270      addiu   a0, a0, 32
272     lw       t0, 0(a1)
273     lw       t1, 4(a1)
274     lw       t2, 8(a1)
275     lw       t3, 12(a1)
276     lw       t4, 16(a1)
277     lw       t5, 20(a1)
278     lw       t6, 24(a1)
279     lw       t7, 28(a1)
280     addiu    a1, a1, 32
281     or       t0, t0, t9
282     or       t1, t1, t9
283     or       t2, t2, t9
284     or       t3, t3, t9
285     or       t4, t4, t9
286     or       t5, t5, t9
287     or       t6, t6, t9
288     or       t7, t7, t9
289     sw       t0, 0(a0)
290     sw       t1, 4(a0)
291     sw       t2, 8(a0)
292     sw       t3, 12(a0)
293     sw       t4, 16(a0)
294     sw       t5, 20(a0)
295     sw       t6, 24(a0)
296     sw       t7, 28(a0)
297     beqz     a2, 4f
298      addiu   a0, a0, 32
300     lw       t0, 0(a1)
301     addiu    a1, a1, 4
302     addiu    a2, a2, -1
303     or       t1, t0, t9
304     sw       t1, 0(a0)
305     bnez     a2, 3b
306      addiu   a0, a0, 4
308     jr       ra
309      nop
311 END(pixman_composite_src_x888_8888_asm_mips)
313 #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
314 LEAF_MIPS_DSPR2(pixman_composite_src_0888_8888_rev_asm_mips)
316  * a0 - dst (a8r8g8b8)
317  * a1 - src (b8g8r8)
318  * a2 - w
319  */
321     beqz              a2, 6f
322      nop
324     lui               t8, 0xff00;
325     srl               t9, a2, 2   /* t9 = how many multiples of 4 src pixels */
326     beqz              t9, 4f      /* branch if less than 4 src pixels */
327      nop
329     li                t0, 0x1
330     li                t1, 0x2
331     li                t2, 0x3
332     andi              t3, a1, 0x3
333     beq               t3, t0, 1f
334      nop
335     beq               t3, t1, 2f
336      nop
337     beq               t3, t2, 3f
338      nop
341     beqz              t9, 4f
342      addiu            t9, t9, -1
343     lw                t0, 0(a1)            /* t0 = R2 | B1 | G1 | R1 */
344     lw                t1, 4(a1)            /* t1 = G3 | R3 | B2 | G2 */
345     lw                t2, 8(a1)            /* t2 = B4 | G4 | R4 | B3 */
347     addiu             a1, a1, 12
348     addiu             a2, a2, -4
350     wsbh              t0, t0               /* t0 = B1 | R2 | R1 | G1 */
351     wsbh              t1, t1               /* t1 = R3 | G3 | G2 | B2 */
352     wsbh              t2, t2               /* t2 = G4 | B4 | B3 | R4 */
354     packrl.ph         t3, t1, t0           /* t3 = G2 | B2 | B1 | R2 */
355     packrl.ph         t4, t0, t0           /* t4 = R1 | G1 | B1 | R2 */
356     rotr              t3, t3, 16           /* t3 = B1 | R2 | G2 | B2 */
357     or                t3, t3, t8           /* t3 = FF | R2 | G2 | B2 */
358     srl               t4, t4, 8            /* t4 =  0 | R1 | G1 | B1 */
359     or                t4, t4, t8           /* t4 = FF | R1 | G1 | B1 */
360     packrl.ph         t5, t2, t1           /* t5 = B3 | R4 | R3 | G3 */
361     rotr              t5, t5, 24           /* t5 = R4 | R3 | G3 | B3 */
362     or                t5, t5, t8           /* t5 = FF | R3 | G3 | B3 */
363     rotr              t2, t2, 16           /* t2 = B3 | R4 | G4 | B4 */
364     or                t2, t2, t8           /* t5 = FF | R3 | G3 | B3 */
366     sw                t4, 0(a0)
367     sw                t3, 4(a0)
368     sw                t5, 8(a0)
369     sw                t2, 12(a0)
370     b                 0b
371      addiu            a0, a0, 16
374     lbu               t6, 0(a1)            /* t6 =  0 |  0 |  0 | R1 */
375     lhu               t7, 1(a1)            /* t7 =  0 |  0 | B1 | G1 */
376     sll               t6, t6, 16           /* t6 =  0 | R1 |  0 | 0  */
377     wsbh              t7, t7               /* t7 =  0 |  0 | G1 | B1 */
378     or                t7, t6, t7           /* t7 =  0 | R1 | G1 | B1 */
380     beqz              t9, 4f
381      addiu            t9, t9, -1
382     lw                t0, 3(a1)            /* t0 = R3 | B2 | G2 | R2 */
383     lw                t1, 7(a1)            /* t1 = G4 | R4 | B3 | G3 */
384     lw                t2, 11(a1)           /* t2 = B5 | G5 | R5 | B4 */
386     addiu             a1, a1, 12
387     addiu             a2, a2, -4
389     wsbh              t0, t0               /* t0 = B2 | R3 | R2 | G2 */
390     wsbh              t1, t1               /* t1 = R4 | G4 | G3 | B3 */
391     wsbh              t2, t2               /* t2 = G5 | B5 | B4 | R5 */
393     packrl.ph         t3, t1, t0           /* t3 = G3 | B3 | B2 | R3 */
394     packrl.ph         t4, t2, t1           /* t4 = B4 | R5 | R4 | G4 */
395     rotr              t0, t0, 24           /* t0 = R3 | R2 | G2 | B2 */
396     rotr              t3, t3, 16           /* t3 = B2 | R3 | G3 | B3 */
397     rotr              t4, t4, 24           /* t4 = R5 | R4 | G4 | B4 */
398     or                t7, t7, t8           /* t7 = FF | R1 | G1 | B1 */
399     or                t0, t0, t8           /* t0 = FF | R2 | G2 | B2 */
400     or                t3, t3, t8           /* t1 = FF | R3 | G3 | B3 */
401     or                t4, t4, t8           /* t3 = FF | R4 | G4 | B4 */
403     sw                t7, 0(a0)
404     sw                t0, 4(a0)
405     sw                t3, 8(a0)
406     sw                t4, 12(a0)
407     rotr              t7, t2, 16           /* t7 = xx | R5 | G5 | B5 */
408     b                 11b
409      addiu            a0, a0, 16
412     lhu               t7, 0(a1)            /* t7 =  0 |  0 | G1 | R1 */
413     wsbh              t7, t7               /* t7 =  0 |  0 | R1 | G1 */
415     beqz              t9, 4f
416      addiu            t9, t9, -1
417     lw                t0, 2(a1)            /* t0 = B2 | G2 | R2 | B1 */
418     lw                t1, 6(a1)            /* t1 = R4 | B3 | G3 | R3 */
419     lw                t2, 10(a1)           /* t2 = G5 | R5 | B4 | G4 */
421     addiu             a1, a1, 12
422     addiu             a2, a2, -4
424     wsbh              t0, t0               /* t0 = G2 | B2 | B1 | R2 */
425     wsbh              t1, t1               /* t1 = B3 | R4 | R3 | G3 */
426     wsbh              t2, t2               /* t2 = R5 | G5 | G4 | B4 */
428     precr_sra.ph.w    t7, t0, 0            /* t7 = R1 | G1 | B1 | R2 */
429     rotr              t0, t0, 16           /* t0 = B1 | R2 | G2 | B2 */
430     packrl.ph         t3, t2, t1           /* t3 = G4 | B4 | B3 | R4 */
431     rotr              t1, t1, 24           /* t1 = R4 | R3 | G3 | B3 */
432     srl               t7, t7, 8            /* t7 =  0 | R1 | G1 | B1 */
433     rotr              t3, t3, 16           /* t3 = B3 | R4 | G4 | B4 */
434     or                t7, t7, t8           /* t7 = FF | R1 | G1 | B1 */
435     or                t0, t0, t8           /* t0 = FF | R2 | G2 | B2 */
436     or                t1, t1, t8           /* t1 = FF | R3 | G3 | B3 */
437     or                t3, t3, t8           /* t3 = FF | R4 | G4 | B4 */
439     sw                t7, 0(a0)
440     sw                t0, 4(a0)
441     sw                t1, 8(a0)
442     sw                t3, 12(a0)
443     srl               t7, t2, 16           /* t7 =  0 |  0 | R5 | G5 */
444     b                 21b
445      addiu            a0, a0, 16
448     lbu               t7, 0(a1)            /* t7 =  0 |  0 |  0 | R1 */
450     beqz              t9, 4f
451      addiu            t9, t9, -1
452     lw                t0, 1(a1)            /* t0 = G2 | R2 | B1 | G1 */
453     lw                t1, 5(a1)            /* t1 = B3 | G3 | R3 | B2 */
454     lw                t2, 9(a1)            /* t2 = R5 | B4 | G4 | R4 */
456     addiu             a1, a1, 12
457     addiu             a2, a2, -4
459     wsbh              t0, t0               /* t0 = R2 | G2 | G1 | B1 */
460     wsbh              t1, t1               /* t1 = G3 | B3 | B2 | R3 */
461     wsbh              t2, t2               /* t2 = B4 | R5 | R4 | G4 */
463     precr_sra.ph.w    t7, t0, 0            /* t7 = xx | R1 | G1 | B1 */
464     packrl.ph         t3, t1, t0           /* t3 = B2 | R3 | R2 | G2 */
465     rotr              t1, t1, 16           /* t1 = B2 | R3 | G3 | B3 */
466     rotr              t4, t2, 24           /* t4 = R5 | R4 | G4 | B4 */
467     rotr              t3, t3, 24           /* t3 = R3 | R2 | G2 | B2 */
468     or                t7, t7, t8           /* t7 = FF | R1 | G1 | B1 */
469     or                t3, t3, t8           /* t3 = FF | R2 | G2 | B2 */
470     or                t1, t1, t8           /* t1 = FF | R3 | G3 | B3 */
471     or                t4, t4, t8           /* t4 = FF | R4 | G4 | B4 */
473     sw                t7, 0(a0)
474     sw                t3, 4(a0)
475     sw                t1, 8(a0)
476     sw                t4, 12(a0)
477     srl               t7, t2, 16           /* t7 =  0 |  0 | xx | R5 */
478     b                 31b
479      addiu            a0, a0, 16
482     beqz              a2, 6f
483      nop
485     lbu               t0, 0(a1)            /* t0 =  0 | 0 | 0 | R */
486     lbu               t1, 1(a1)            /* t1 =  0 | 0 | 0 | G */
487     lbu               t2, 2(a1)            /* t2 =  0 | 0 | 0 | B */
488     addiu             a1, a1, 3
490     sll               t0, t0, 16           /* t2 =  0 | R | 0 | 0 */
491     sll               t1, t1, 8            /* t1 =  0 | 0 | G | 0 */
493     or                t2, t2, t1           /* t2 =  0 | 0 | G | B */
494     or                t2, t2, t0           /* t2 =  0 | R | G | B */
495     or                t2, t2, t8           /* t2 = FF | R | G | B */
497     sw                t2, 0(a0)
498     addiu             a2, a2, -1
499     bnez              a2, 5b
500      addiu            a0, a0, 4
502     j                 ra
503      nop
505 END(pixman_composite_src_0888_8888_rev_asm_mips)
507 LEAF_MIPS_DSPR2(pixman_composite_src_0888_0565_rev_asm_mips)
509  * a0 - dst (r5g6b5)
510  * a1 - src (b8g8r8)
511  * a2 - w
512  */
514     SAVE_REGS_ON_STACK 0, v0, v1
515     beqz              a2, 6f
516      nop
518     li                t6, 0xf800f800
519     li                t7, 0x07e007e0
520     li                t8, 0x001F001F
521     srl               t9, a2, 2   /* t9 = how many multiples of 4 src pixels */
522     beqz              t9, 4f      /* branch if less than 4 src pixels */
523      nop
525     li                t0, 0x1
526     li                t1, 0x2
527     li                t2, 0x3
528     andi              t3, a1, 0x3
529     beq               t3, t0, 1f
530      nop
531     beq               t3, t1, 2f
532      nop
533     beq               t3, t2, 3f
534      nop
537     beqz              t9, 4f
538      addiu            t9, t9, -1
539     lw                t0, 0(a1)            /* t0 = R2 | B1 | G1 | R1 */
540     lw                t1, 4(a1)            /* t1 = G3 | R3 | B2 | G2 */
541     lw                t2, 8(a1)            /* t2 = B4 | G4 | R4 | B3 */
543     addiu             a1, a1, 12
544     addiu             a2, a2, -4
546     wsbh              t0, t0               /* t0 = B1 | R2 | R1 | G1 */
547     wsbh              t1, t1               /* t1 = R3 | G3 | G2 | B2 */
548     wsbh              t2, t2               /* t2 = G4 | B4 | B3 | R4 */
550     packrl.ph         t3, t1, t0           /* t3 = G2 | B2 | B1 | R2 */
551     packrl.ph         t4, t0, t0           /* t4 = R1 | G1 | B1 | R2 */
552     rotr              t3, t3, 16           /* t3 = B1 | R2 | G2 | B2 */
553     srl               t4, t4, 8            /* t4 =  0 | R1 | G1 | B1 */
554     packrl.ph         t5, t2, t1           /* t5 = B3 | R4 | R3 | G3 */
555     rotr              t5, t5, 24           /* t5 = R4 | R3 | G3 | B3 */
556     rotr              t2, t2, 16           /* t2 = B3 | R4 | G4 | B4 */
558     CONVERT_2x8888_TO_2x0565 t4, t3, t4, t3, t6, t7, t8, v0, v1
559     CONVERT_2x8888_TO_2x0565 t5, t2, t5, t2, t6, t7, t8, v0, v1
561     sh                t4, 0(a0)
562     sh                t3, 2(a0)
563     sh                t5, 4(a0)
564     sh                t2, 6(a0)
565     b                 0b
566      addiu            a0, a0, 8
569     lbu               t4, 0(a1)            /* t4 =  0 |  0 |  0 | R1 */
570     lhu               t5, 1(a1)            /* t5 =  0 |  0 | B1 | G1 */
571     sll               t4, t4, 16           /* t4 =  0 | R1 |  0 | 0  */
572     wsbh              t5, t5               /* t5 =  0 |  0 | G1 | B1 */
573     or                t5, t4, t5           /* t5 =  0 | R1 | G1 | B1 */
575     beqz              t9, 4f
576      addiu            t9, t9, -1
577     lw                t0, 3(a1)            /* t0 = R3 | B2 | G2 | R2 */
578     lw                t1, 7(a1)            /* t1 = G4 | R4 | B3 | G3 */
579     lw                t2, 11(a1)           /* t2 = B5 | G5 | R5 | B4 */
581     addiu             a1, a1, 12
582     addiu             a2, a2, -4
584     wsbh              t0, t0               /* t0 = B2 | R3 | R2 | G2 */
585     wsbh              t1, t1               /* t1 = R4 | G4 | G3 | B3 */
586     wsbh              t2, t2               /* t2 = G5 | B5 | B4 | R5 */
588     packrl.ph         t3, t1, t0           /* t3 = G3 | B3 | B2 | R3 */
589     packrl.ph         t4, t2, t1           /* t4 = B4 | R5 | R4 | G4 */
590     rotr              t0, t0, 24           /* t0 = R3 | R2 | G2 | B2 */
591     rotr              t3, t3, 16           /* t3 = B2 | R3 | G3 | B3 */
592     rotr              t4, t4, 24           /* t4 = R5 | R4 | G4 | B4 */
594     CONVERT_2x8888_TO_2x0565 t5, t0, t5, t0, t6, t7, t8, v0, v1
595     CONVERT_2x8888_TO_2x0565 t3, t4, t3, t4, t6, t7, t8, v0, v1
597     sh                t5, 0(a0)
598     sh                t0, 2(a0)
599     sh                t3, 4(a0)
600     sh                t4, 6(a0)
601     rotr              t5, t2, 16           /* t5 = xx | R5 | G5 | B5 */
602     b                 11b
603      addiu            a0, a0, 8
606     lhu               t5, 0(a1)            /* t5 =  0 |  0 | G1 | R1 */
607     wsbh              t5, t5               /* t5 =  0 |  0 | R1 | G1 */
609     beqz              t9, 4f
610      addiu            t9, t9, -1
611     lw                t0, 2(a1)            /* t0 = B2 | G2 | R2 | B1 */
612     lw                t1, 6(a1)            /* t1 = R4 | B3 | G3 | R3 */
613     lw                t2, 10(a1)           /* t2 = G5 | R5 | B4 | G4 */
615     addiu             a1, a1, 12
616     addiu             a2, a2, -4
618     wsbh              t0, t0               /* t0 = G2 | B2 | B1 | R2 */
619     wsbh              t1, t1               /* t1 = B3 | R4 | R3 | G3 */
620     wsbh              t2, t2               /* t2 = R5 | G5 | G4 | B4 */
622     precr_sra.ph.w    t5, t0, 0            /* t5 = R1 | G1 | B1 | R2 */
623     rotr              t0, t0, 16           /* t0 = B1 | R2 | G2 | B2 */
624     packrl.ph         t3, t2, t1           /* t3 = G4 | B4 | B3 | R4 */
625     rotr              t1, t1, 24           /* t1 = R4 | R3 | G3 | B3 */
626     srl               t5, t5, 8            /* t5 =  0 | R1 | G1 | B1 */
627     rotr              t3, t3, 16           /* t3 = B3 | R4 | G4 | B4 */
629     CONVERT_2x8888_TO_2x0565 t5, t0, t5, t0, t6, t7, t8, v0, v1
630     CONVERT_2x8888_TO_2x0565 t1, t3, t1, t3, t6, t7, t8, v0, v1
632     sh                t5, 0(a0)
633     sh                t0, 2(a0)
634     sh                t1, 4(a0)
635     sh                t3, 6(a0)
636     srl               t5, t2, 16           /* t5 =  0 |  0 | R5 | G5 */
637     b                 21b
638      addiu            a0, a0, 8
641     lbu               t5, 0(a1)            /* t5 =  0 |  0 |  0 | R1 */
643     beqz              t9, 4f
644      addiu            t9, t9, -1
645     lw                t0, 1(a1)            /* t0 = G2 | R2 | B1 | G1 */
646     lw                t1, 5(a1)            /* t1 = B3 | G3 | R3 | B2 */
647     lw                t2, 9(a1)            /* t2 = R5 | B4 | G4 | R4 */
649     addiu             a1, a1, 12
650     addiu             a2, a2, -4
652     wsbh              t0, t0               /* t0 = R2 | G2 | G1 | B1 */
653     wsbh              t1, t1               /* t1 = G3 | B3 | B2 | R3 */
654     wsbh              t2, t2               /* t2 = B4 | R5 | R4 | G4 */
656     precr_sra.ph.w    t5, t0, 0            /* t5 = xx | R1 | G1 | B1 */
657     packrl.ph         t3, t1, t0           /* t3 = B2 | R3 | R2 | G2 */
658     rotr              t1, t1, 16           /* t1 = B2 | R3 | G3 | B3 */
659     rotr              t4, t2, 24           /* t4 = R5 | R4 | G4 | B4 */
660     rotr              t3, t3, 24           /* t3 = R3 | R2 | G2 | B2 */
662     CONVERT_2x8888_TO_2x0565 t5, t3, t5, t3, t6, t7, t8, v0, v1
663     CONVERT_2x8888_TO_2x0565 t1, t4, t1, t4, t6, t7, t8, v0, v1
665     sh                t5, 0(a0)
666     sh                t3, 2(a0)
667     sh                t1, 4(a0)
668     sh                t4, 6(a0)
669     srl               t5, t2, 16           /* t5 =  0 |  0 | xx | R5 */
670     b                 31b
671      addiu            a0, a0, 8
674     beqz              a2, 6f
675      nop
677     lbu               t0, 0(a1)            /* t0 =  0 | 0 | 0 | R */
678     lbu               t1, 1(a1)            /* t1 =  0 | 0 | 0 | G */
679     lbu               t2, 2(a1)            /* t2 =  0 | 0 | 0 | B */
680     addiu             a1, a1, 3
682     sll               t0, t0, 16           /* t2 =  0 | R | 0 | 0 */
683     sll               t1, t1, 8            /* t1 =  0 | 0 | G | 0 */
685     or                t2, t2, t1           /* t2 =  0 | 0 | G | B */
686     or                t2, t2, t0           /* t2 =  0 | R | G | B */
688     CONVERT_1x8888_TO_1x0565 t2, t3, t4, t5
690     sh                t3, 0(a0)
691     addiu             a2, a2, -1
692     bnez              a2, 5b
693      addiu            a0, a0, 2
695     RESTORE_REGS_FROM_STACK 0, v0, v1
696     j                 ra
697      nop
699 END(pixman_composite_src_0888_0565_rev_asm_mips)
700 #endif
702 LEAF_MIPS_DSPR2(pixman_composite_src_pixbuf_8888_asm_mips)
704  * a0 - dst  (a8b8g8r8)
705  * a1 - src  (a8r8g8b8)
706  * a2 - w
707  */
709     SAVE_REGS_ON_STACK 0, v0
710     li       v0, 0x00ff00ff
712     beqz     a2, 3f
713      nop
714     addiu    t1, a2, -1
715     beqz     t1, 2f
716      nop
718     lw       t0, 0(a1)
719     lw       t1, 4(a1)
720     addiu    a1, a1, 8
721     addiu    a2, a2, -2
722     srl      t2, t0, 24
723     srl      t3, t1, 24
725     MIPS_2xUN8x4_MUL_2xUN8 t0, t1, t2, t3, t0, t1, v0, t4, t5, t6, t7, t8, t9
727     sll      t0, t0, 8
728     sll      t1, t1, 8
729     andi     t2, t2, 0xff
730     andi     t3, t3, 0xff
731     or       t0, t0, t2
732     or       t1, t1, t3
733     wsbh     t0, t0
734     wsbh     t1, t1
735     rotr     t0, t0, 16
736     rotr     t1, t1, 16
737     sw       t0, 0(a0)
738     sw       t1, 4(a0)
740     addiu    t2, a2, -1
741     bgtz     t2, 1b
742      addiu   a0, a0, 8
744     beqz     a2, 3f
745      nop
746     lw       t0, 0(a1)
747     srl      t1, t0, 24
749     MIPS_UN8x4_MUL_UN8 t0, t1, t0, v0, t3, t4, t5
751     sll      t0, t0, 8
752     andi     t1, t1, 0xff
753     or       t0, t0, t1
754     wsbh     t0, t0
755     rotr     t0, t0, 16
756     sw       t0, 0(a0)
758     RESTORE_REGS_FROM_STACK 0, v0
759     j        ra
760      nop
762 END(pixman_composite_src_pixbuf_8888_asm_mips)
764 LEAF_MIPS_DSPR2(pixman_composite_src_rpixbuf_8888_asm_mips)
766  * a0 - dst  (a8r8g8b8)
767  * a1 - src  (a8r8g8b8)
768  * a2 - w
769  */
771     SAVE_REGS_ON_STACK 0, v0
772     li       v0, 0x00ff00ff
774     beqz     a2, 3f
775      nop
776     addiu    t1, a2, -1
777     beqz     t1, 2f
778      nop
780     lw       t0, 0(a1)
781     lw       t1, 4(a1)
782     addiu    a1, a1, 8
783     addiu    a2, a2, -2
784     srl      t2, t0, 24
785     srl      t3, t1, 24
787     MIPS_2xUN8x4_MUL_2xUN8 t0, t1, t2, t3, t0, t1, v0, t4, t5, t6, t7, t8, t9
789     sll      t0, t0, 8
790     sll      t1, t1, 8
791     andi     t2, t2, 0xff
792     andi     t3, t3, 0xff
793     or       t0, t0, t2
794     or       t1, t1, t3
795     rotr     t0, t0, 8
796     rotr     t1, t1, 8
797     sw       t0, 0(a0)
798     sw       t1, 4(a0)
800     addiu    t2, a2, -1
801     bgtz     t2, 1b
802      addiu   a0, a0, 8
804     beqz     a2, 3f
805      nop
806     lw       t0, 0(a1)
807     srl      t1, t0, 24
809     MIPS_UN8x4_MUL_UN8 t0, t1, t0, v0, t3, t4, t5
811     sll      t0, t0, 8
812     andi     t1, t1, 0xff
813     or       t0, t0, t1
814     rotr     t0, t0, 8
815     sw       t0, 0(a0)
817     RESTORE_REGS_FROM_STACK 0, v0
818     j        ra
819      nop
821 END(pixman_composite_src_rpixbuf_8888_asm_mips)
823 LEAF_MIPS_DSPR2(pixman_composite_src_n_8_8888_asm_mips)
825  * a0 - dst  (a8r8g8b8)
826  * a1 - src  (32bit constant)
827  * a2 - mask (a8)
828  * a3 - w
829  */
832     SAVE_REGS_ON_STACK 0, v0
833     li       v0, 0x00ff00ff
835     beqz     a3, 3f
836      nop
837     addiu    t1, a3, -1
838     beqz     t1, 2f
839      nop
842                        /* a1 = source      (32bit constant) */
843     lbu      t0, 0(a2) /* t2 = mask        (a8) */
844     lbu      t1, 1(a2) /* t3 = mask        (a8) */
845     addiu    a2, a2, 2
847     MIPS_2xUN8x4_MUL_2xUN8 a1, a1, t0, t1, t2, t3, v0, t4, t5, t6, t7, t8, t9
849     sw       t2, 0(a0)
850     sw       t3, 4(a0)
851     addiu    a3, a3, -2
852     addiu    t2, a3, -1
853     bgtz     t2, 1b
854      addiu   a0, a0, 8
856     beqz     a3, 3f
857      nop
860     lbu      t0, 0(a2)
861     addiu    a2, a2, 1
863     MIPS_UN8x4_MUL_UN8 a1, t0, t1, v0, t3, t4, t5
865     sw       t1, 0(a0)
866     addiu    a3, a3, -1
867     addiu    a0, a0, 4
870     RESTORE_REGS_FROM_STACK 0, v0
871     j        ra
872      nop
874 END(pixman_composite_src_n_8_8888_asm_mips)
876 LEAF_MIPS_DSPR2(pixman_composite_src_n_8_8_asm_mips)
878  * a0 - dst  (a8)
879  * a1 - src  (32bit constant)
880  * a2 - mask (a8)
881  * a3 - w
882  */
884     li                t9, 0x00ff00ff
885     beqz              a3, 3f
886      nop
887     srl               t7, a3, 2   /* t7 = how many multiples of 4 dst pixels */
888     beqz              t7, 1f      /* branch if less than 4 src pixels */
889      nop
891     srl               t8, a1, 24
892     replv.ph          t8, t8
895     beqz              t7, 1f
896      addiu            t7, t7, -1
897     lbu               t0, 0(a2)
898     lbu               t1, 1(a2)
899     lbu               t2, 2(a2)
900     lbu               t3, 3(a2)
902     addiu             a2, a2, 4
904     precr_sra.ph.w    t1, t0, 0
905     precr_sra.ph.w    t3, t2, 0
906     precr.qb.ph       t0, t3, t1
908     muleu_s.ph.qbl    t2, t0, t8
909     muleu_s.ph.qbr    t3, t0, t8
910     shra_r.ph         t4, t2, 8
911     shra_r.ph         t5, t3, 8
912     and               t4, t4, t9
913     and               t5, t5, t9
914     addq.ph           t2, t2, t4
915     addq.ph           t3, t3, t5
916     shra_r.ph         t2, t2, 8
917     shra_r.ph         t3, t3, 8
918     precr.qb.ph       t2, t2, t3
920     sb                t2, 0(a0)
921     srl               t2, t2, 8
922     sb                t2, 1(a0)
923     srl               t2, t2, 8
924     sb                t2, 2(a0)
925     srl               t2, t2, 8
926     sb                t2, 3(a0)
927     addiu             a3, a3, -4
928     b                 0b
929      addiu            a0, a0, 4
932     beqz              a3, 3f
933      nop
934     srl               t8, a1, 24
936     lbu               t0, 0(a2)
937     addiu             a2, a2, 1
939     mul               t2, t0, t8
940     shra_r.ph         t3, t2, 8
941     andi              t3, t3, 0x00ff
942     addq.ph           t2, t2, t3
943     shra_r.ph         t2, t2, 8
945     sb                t2, 0(a0)
946     addiu             a3, a3, -1
947     bnez              a3, 2b
948      addiu            a0, a0, 1
951     j                 ra
952      nop
954 END(pixman_composite_src_n_8_8_asm_mips)
956 LEAF_MIPS_DSPR2(pixman_composite_over_n_8888_8888_ca_asm_mips)
958  * a0 - dst  (a8r8g8b8)
959  * a1 - src  (32bit constant)
960  * a2 - mask (a8r8g8b8)
961  * a3 - w
962  */
964     beqz         a3, 8f
965      nop
966     SAVE_REGS_ON_STACK 8, s0, s1, s2, s3, s4, s5
968     li           t6, 0xff
969     addiu        t7, zero, -1 /* t7 = 0xffffffff */
970     srl          t8, a1, 24   /* t8 = srca */
971     li           t9, 0x00ff00ff
973     addiu        t1, a3, -1
974     beqz         t1, 4f       /* last pixel */
975      nop
978     lw           t0, 0(a2)    /* t0 = mask */
979     lw           t1, 4(a2)    /* t1 = mask */
980     addiu        a3, a3, -2   /* w = w - 2 */
981     or           t2, t0, t1
982     beqz         t2, 3f      /* if (t0 == 0) && (t1 == 0) */
983      addiu       a2, a2, 8
984     and          t2, t0, t1
985     beq          t2, t7, 1f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
986      nop
988 //if(ma)
989     lw           t2, 0(a0)    /* t2 = dst */
990     lw           t3, 4(a0)    /* t3 = dst */
991     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, t4, t5, t9, s0, s1, s2, s3, s4, s5
992     MIPS_2xUN8x4_MUL_2xUN8   t0, t1, t8, t8, t0, t1, t9, s0, s1, s2, s3, s4, s5
993     not          t0, t0
994     not          t1, t1
995     MIPS_2xUN8x4_MUL_2xUN8x4 t2, t3, t0, t1, t2, t3, t9, s0, s1, s2, s3, s4, s5
996     addu_s.qb    t2, t4, t2
997     addu_s.qb    t3, t5, t3
998     sw           t2, 0(a0)
999     sw           t3, 4(a0)
1000     addiu        t1, a3, -1
1001     bgtz         t1, 0b
1002      addiu       a0, a0, 8
1003     b            4f
1004      nop
1006 //if (t0 == 0xffffffff) && (t1 == 0xffffffff):
1007     beq          t8, t6, 2f   /* if (srca == 0xff) */
1008      nop
1009     lw           t2, 0(a0)    /* t2 = dst */
1010     lw           t3, 4(a0)    /* t3 = dst */
1011     not          t0, a1
1012     not          t1, a1
1013     srl          t0, t0, 24
1014     srl          t1, t1, 24
1015     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, t0, t1, t2, t3, t9, s0, s1, s2, s3, s4, s5
1016     addu_s.qb    t2, a1, t2
1017     addu_s.qb    t3, a1, t3
1018     sw           t2, 0(a0)
1019     sw           t3, 4(a0)
1020     addiu        t1, a3, -1
1021     bgtz         t1, 0b
1022      addiu       a0, a0, 8
1023     b            4f
1024      nop
1026     sw           a1, 0(a0)
1027     sw           a1, 4(a0)
1029     addiu        t1, a3, -1
1030     bgtz         t1, 0b
1031      addiu       a0, a0, 8
1034     beqz         a3, 7f
1035      nop
1036                               /* a1 = src */
1037     lw           t0, 0(a2)    /* t0 = mask */
1038     beqz         t0, 7f       /* if (t0 == 0) */
1039      nop
1040     beq          t0, t7, 5f  /* if (t0 == 0xffffffff) */
1041      nop
1042 //if(ma)
1043     lw           t1, 0(a0)    /* t1 = dst */
1044     MIPS_UN8x4_MUL_UN8x4  a1, t0, t2, t9, t3, t4, t5, s0
1045     MIPS_UN8x4_MUL_UN8    t0, t8, t0, t9, t3, t4, t5
1046     not          t0, t0
1047     MIPS_UN8x4_MUL_UN8x4  t1, t0, t1, t9, t3, t4, t5, s0
1048     addu_s.qb    t1, t2, t1
1049     sw           t1, 0(a0)
1050     RESTORE_REGS_FROM_STACK 8, s0, s1, s2, s3, s4, s5
1051     j            ra
1052      nop
1054 //if (t0 == 0xffffffff)
1055     beq          t8, t6, 6f   /* if (srca == 0xff) */
1056      nop
1057     lw           t1, 0(a0)    /* t1 = dst */
1058     not          t0, a1
1059     srl          t0, t0, 24
1060     MIPS_UN8x4_MUL_UN8 t1, t0, t1, t9, t2, t3, t4
1061     addu_s.qb    t1, a1, t1
1062     sw           t1, 0(a0)
1063     RESTORE_REGS_FROM_STACK 8, s0, s1, s2, s3, s4, s5
1064     j            ra
1065      nop
1067     sw           a1, 0(a0)
1069     RESTORE_REGS_FROM_STACK 8, s0, s1, s2, s3, s4, s5
1071     j            ra
1072      nop
1074 END(pixman_composite_over_n_8888_8888_ca_asm_mips)
1076 LEAF_MIPS_DSPR2(pixman_composite_over_n_8888_0565_ca_asm_mips)
1078  * a0 - dst  (r5g6b5)
1079  * a1 - src  (32bit constant)
1080  * a2 - mask (a8r8g8b8)
1081  * a3 - w
1082  */
1084     beqz         a3, 8f
1085      nop
1086     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7, s8
1088     li           t6, 0xff
1089     addiu        t7, zero, -1 /* t7 = 0xffffffff */
1090     srl          t8, a1, 24   /* t8 = srca */
1091     li           t9, 0x00ff00ff
1092     li           s6, 0xf800f800
1093     li           s7, 0x07e007e0
1094     li           s8, 0x001F001F
1096     addiu        t1, a3, -1
1097     beqz         t1, 4f       /* last pixel */
1098      nop
1101     lw           t0, 0(a2)    /* t0 = mask */
1102     lw           t1, 4(a2)    /* t1 = mask */
1103     addiu        a3, a3, -2   /* w = w - 2 */
1104     or           t2, t0, t1
1105     beqz         t2, 3f      /* if (t0 == 0) && (t1 == 0) */
1106      addiu       a2, a2, 8
1107     and          t2, t0, t1
1108     beq          t2, t7, 1f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
1109      nop
1111 //if(ma)
1112     lhu          t2, 0(a0)    /* t2 = dst */
1113     lhu          t3, 2(a0)    /* t3 = dst */
1114     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, t4, t5, t9, s0, s1, s2, s3, s4, s5
1115     MIPS_2xUN8x4_MUL_2xUN8   t0, t1, t8, t8, t0, t1, t9, s0, s1, s2, s3, s4, s5
1116     not          t0, t0
1117     not          t1, t1
1118     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, s7, s8, s0, s1, s2, s3
1119     MIPS_2xUN8x4_MUL_2xUN8x4 t2, t3, t0, t1, t2, t3, t9, s0, s1, s2, s3, s4, s5
1120     addu_s.qb    t2, t4, t2
1121     addu_s.qb    t3, t5, t3
1122     CONVERT_2x8888_TO_2x0565 t2, t3, t2, t3, s6, s7, s8, s0, s1
1123     sh           t2, 0(a0)
1124     sh           t3, 2(a0)
1125     addiu        t1, a3, -1
1126     bgtz         t1, 0b
1127      addiu       a0, a0, 4
1128     b            4f
1129      nop
1131 //if (t0 == 0xffffffff) && (t1 == 0xffffffff):
1132     beq          t8, t6, 2f   /* if (srca == 0xff) */
1133      nop
1134     lhu          t2, 0(a0)    /* t2 = dst */
1135     lhu          t3, 2(a0)    /* t3 = dst */
1136     not          t0, a1
1137     not          t1, a1
1138     srl          t0, t0, 24
1139     srl          t1, t1, 24
1140     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, s7, s8, s0, s1, s2, s3
1141     MIPS_2xUN8x4_MUL_2xUN8   t2, t3, t0, t1, t2, t3, t9, s0, s1, s2, s3, s4, s5
1142     addu_s.qb    t2, a1, t2
1143     addu_s.qb    t3, a1, t3
1144     CONVERT_2x8888_TO_2x0565 t2, t3, t2, t3, s6, s7, s8, s0, s1
1145     sh           t2, 0(a0)
1146     sh           t3, 2(a0)
1147     addiu        t1, a3, -1
1148     bgtz         t1, 0b
1149      addiu       a0, a0, 4
1150     b            4f
1151      nop
1153     CONVERT_1x8888_TO_1x0565 a1, t2, s0, s1
1154     sh           t2, 0(a0)
1155     sh           t2, 2(a0)
1157     addiu        t1, a3, -1
1158     bgtz         t1, 0b
1159      addiu       a0, a0, 4
1162     beqz         a3, 7f
1163      nop
1164                               /* a1 = src */
1165     lw           t0, 0(a2)    /* t0 = mask */
1166     beqz         t0, 7f       /* if (t0 == 0) */
1167      nop
1168     beq          t0, t7, 5f  /* if (t0 == 0xffffffff) */
1169      nop
1170 //if(ma)
1171     lhu          t1, 0(a0)    /* t1 = dst */
1172     MIPS_UN8x4_MUL_UN8x4     a1, t0, t2, t9, t3, t4, t5, s0
1173     MIPS_UN8x4_MUL_UN8       t0, t8, t0, t9, t3, t4, t5
1174     not          t0, t0
1175     CONVERT_1x0565_TO_1x8888 t1, s1, s2, s3
1176     MIPS_UN8x4_MUL_UN8x4     s1, t0, s1, t9, t3, t4, t5, s0
1177     addu_s.qb    s1, t2, s1
1178     CONVERT_1x8888_TO_1x0565 s1, t1, s0, s2
1179     sh           t1, 0(a0)
1180     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7, s8
1181     j            ra
1182      nop
1184 //if (t0 == 0xffffffff)
1185     beq          t8, t6, 6f   /* if (srca == 0xff) */
1186      nop
1187     lhu          t1, 0(a0)    /* t1 = dst */
1188     not          t0, a1
1189     srl          t0, t0, 24
1190     CONVERT_1x0565_TO_1x8888 t1, s1, s2, s3
1191     MIPS_UN8x4_MUL_UN8       s1, t0, s1, t9, t2, t3, t4
1192     addu_s.qb    s1, a1, s1
1193     CONVERT_1x8888_TO_1x0565 s1, t1, s0, s2
1194     sh           t1, 0(a0)
1195     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7, s8
1196     j            ra
1197      nop
1199     CONVERT_1x8888_TO_1x0565 a1, t1, s0, s2
1200     sh           t1, 0(a0)
1202     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7, s8
1204     j            ra
1205      nop
1207 END(pixman_composite_over_n_8888_0565_ca_asm_mips)
1209 LEAF_MIPS_DSPR2(pixman_composite_over_n_8_8_asm_mips)
1211  * a0 - dst  (a8)
1212  * a1 - src  (32bit constant)
1213  * a2 - mask (a8)
1214  * a3 - w
1215  */
1217     SAVE_REGS_ON_STACK 0, v0
1218     li                t9, 0x00ff00ff
1219     beqz              a3, 3f
1220      nop
1221     srl               v0, a3, 2   /* v0 = how many multiples of 4 dst pixels */
1222     beqz              v0, 1f      /* branch if less than 4 src pixels */
1223      nop
1225     srl               t8, a1, 24
1226     replv.ph          t8, t8
1229     beqz              v0, 1f
1230      addiu            v0, v0, -1
1231     lbu               t0, 0(a2)
1232     lbu               t1, 1(a2)
1233     lbu               t2, 2(a2)
1234     lbu               t3, 3(a2)
1235     lbu               t4, 0(a0)
1236     lbu               t5, 1(a0)
1237     lbu               t6, 2(a0)
1238     lbu               t7, 3(a0)
1240     addiu             a2, a2, 4
1242     precr_sra.ph.w    t1, t0, 0
1243     precr_sra.ph.w    t3, t2, 0
1244     precr_sra.ph.w    t5, t4, 0
1245     precr_sra.ph.w    t7, t6, 0
1247     precr.qb.ph       t0, t3, t1
1248     precr.qb.ph       t1, t7, t5
1250     muleu_s.ph.qbl    t2, t0, t8
1251     muleu_s.ph.qbr    t3, t0, t8
1252     shra_r.ph         t4, t2, 8
1253     shra_r.ph         t5, t3, 8
1254     and               t4, t4, t9
1255     and               t5, t5, t9
1256     addq.ph           t2, t2, t4
1257     addq.ph           t3, t3, t5
1258     shra_r.ph         t2, t2, 8
1259     shra_r.ph         t3, t3, 8
1260     precr.qb.ph       t0, t2, t3
1261     not               t6, t0
1263     preceu.ph.qbl     t7, t6
1264     preceu.ph.qbr     t6, t6
1266     muleu_s.ph.qbl    t2, t1, t7
1267     muleu_s.ph.qbr    t3, t1, t6
1268     shra_r.ph         t4, t2, 8
1269     shra_r.ph         t5, t3, 8
1270     and               t4, t4, t9
1271     and               t5, t5, t9
1272     addq.ph           t2, t2, t4
1273     addq.ph           t3, t3, t5
1274     shra_r.ph         t2, t2, 8
1275     shra_r.ph         t3, t3, 8
1276     precr.qb.ph       t1, t2, t3
1278     addu_s.qb         t2, t0, t1
1280     sb                t2, 0(a0)
1281     srl               t2, t2, 8
1282     sb                t2, 1(a0)
1283     srl               t2, t2, 8
1284     sb                t2, 2(a0)
1285     srl               t2, t2, 8
1286     sb                t2, 3(a0)
1287     addiu             a3, a3, -4
1288     b                 0b
1289      addiu            a0, a0, 4
1292     beqz              a3, 3f
1293      nop
1294     srl               t8, a1, 24
1296     lbu               t0, 0(a2)
1297     lbu               t1, 0(a0)
1298     addiu             a2, a2, 1
1300     mul               t2, t0, t8
1301     shra_r.ph         t3, t2, 8
1302     andi              t3, t3, 0x00ff
1303     addq.ph           t2, t2, t3
1304     shra_r.ph         t2, t2, 8
1305     not               t3, t2
1306     andi              t3, t3, 0x00ff
1309     mul               t4, t1, t3
1310     shra_r.ph         t5, t4, 8
1311     andi              t5, t5, 0x00ff
1312     addq.ph           t4, t4, t5
1313     shra_r.ph         t4, t4, 8
1314     andi              t4, t4, 0x00ff
1316     addu_s.qb         t2, t2, t4
1317     sb                t2, 0(a0)
1318     addiu             a3, a3, -1
1319     bnez              a3, 2b
1320      addiu            a0, a0, 1
1323     RESTORE_REGS_FROM_STACK 0, v0
1324     j                 ra
1325      nop
1327 END(pixman_composite_over_n_8_8_asm_mips)
1329 LEAF_MIPS_DSPR2(pixman_composite_over_n_8_8888_asm_mips)
1331  * a0 - dst  (a8r8g8b8)
1332  * a1 - src  (32bit constant)
1333  * a2 - mask (a8)
1334  * a3 - w
1335  */
1337     SAVE_REGS_ON_STACK 4, s0, s1, s2, s3, s4
1338     beqz      a3, 4f
1339      nop
1340     li        t4, 0x00ff00ff
1341     li        t5, 0xff
1342     addiu     t0, a3, -1
1343     beqz      t0, 3f         /* last pixel */
1344      srl      t6, a1, 24     /* t6 = srca */
1345     not       s4, a1
1346     beq       t5, t6, 2f     /* if (srca == 0xff) */
1347      srl      s4, s4, 24
1349                              /* a1 = src */
1350     lbu       t0, 0(a2)      /* t0 = mask */
1351     lbu       t1, 1(a2)      /* t1 = mask */
1352     or        t2, t0, t1
1353     beqz      t2, 111f       /* if (t0 == 0) && (t1 == 0) */
1354      addiu    a2, a2, 2
1355     and       t3, t0, t1
1357     lw        t2, 0(a0)      /* t2 = dst */
1358     beq       t3, t5, 11f    /* if (t0 == 0xff) && (t1 == 0xff) */
1359      lw       t3, 4(a0)      /* t3 = dst */
1361     MIPS_2xUN8x4_MUL_2xUN8 a1, a1, t0, t1, s0, s1, t4, t6, t7, t8, t9, s2, s3
1362     not       s2, s0
1363     not       s3, s1
1364     srl       s2, s2, 24
1365     srl       s3, s3, 24
1366     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, s2, s3, t2, t3, t4, t0, t1, t6, t7, t8, t9
1367     addu_s.qb s2, t2, s0
1368     addu_s.qb s3, t3, s1
1369     sw        s2, 0(a0)
1370     b         111f
1371      sw       s3, 4(a0)
1373     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, s4, s4, t2, t3, t4, t0, t1, t6, t7, t8, t9
1374     addu_s.qb s2, t2, a1
1375     addu_s.qb s3, t3, a1
1376     sw        s2, 0(a0)
1377     sw        s3, 4(a0)
1379 111:
1380     addiu     a3, a3, -2
1381     addiu     t0, a3, -1
1382     bgtz      t0, 1b
1383      addiu    a0, a0, 8
1384     b         3f
1385      nop
1387                              /* a1 = src */
1388     lbu       t0, 0(a2)      /* t0 = mask */
1389     lbu       t1, 1(a2)      /* t1 = mask */
1390     or        t2, t0, t1
1391     beqz      t2, 222f       /* if (t0 == 0) && (t1 == 0) */
1392      addiu    a2, a2, 2
1393     and       t3, t0, t1
1394     beq       t3, t5, 22f    /* if (t0 == 0xff) && (t1 == 0xff) */
1395      nop
1396     lw        t2, 0(a0)      /* t2 = dst */
1397     lw        t3, 4(a0)      /* t3 = dst */
1399     OVER_2x8888_2x8_2x8888 a1, a1, t0, t1, t2, t3, \
1400                            t6, t7, t4, t8, t9, s0, s1, s2, s3
1401     sw        t6, 0(a0)
1402     b         222f
1403      sw        t7, 4(a0)
1405     sw        a1, 0(a0)
1406     sw        a1, 4(a0)
1407 222:
1408     addiu     a3, a3, -2
1409     addiu     t0, a3, -1
1410     bgtz      t0, 2b
1411      addiu    a0, a0, 8
1413     blez      a3, 4f
1414      nop
1415                              /* a1 = src */
1416     lbu       t0, 0(a2)      /* t0 = mask */
1417     beqz      t0, 4f         /* if (t0 == 0) */
1418      addiu    a2, a2, 1
1419     move      t3, a1
1420     beq       t0, t5, 31f    /* if (t0 == 0xff) */
1421      lw       t1, 0(a0)      /* t1 = dst */
1423     MIPS_UN8x4_MUL_UN8 a1, t0, t3, t4, t6, t7, t8
1425     not       t2, t3
1426     srl       t2, t2, 24
1427     MIPS_UN8x4_MUL_UN8 t1, t2, t1, t4, t6, t7, t8
1428     addu_s.qb t2, t1, t3
1429     sw        t2, 0(a0)
1431     RESTORE_REGS_FROM_STACK 4, s0, s1, s2, s3, s4
1432     j         ra
1433      nop
1435 END(pixman_composite_over_n_8_8888_asm_mips)
1437 LEAF_MIPS_DSPR2(pixman_composite_over_n_8_0565_asm_mips)
1439  * a0 - dst  (r5g6b5)
1440  * a1 - src  (32bit constant)
1441  * a2 - mask (a8)
1442  * a3 - w
1443  */
1444     SAVE_REGS_ON_STACK 24, v0, s0, s1, s2, s3, s4, s5, s6, s7, s8
1445     beqz     a3, 4f
1446      nop
1447     li       t4, 0x00ff00ff
1448     li       t5, 0xff
1449     li       t6, 0xf800f800
1450     li       t7, 0x07e007e0
1451     li       t8, 0x001F001F
1452     addiu    t1, a3, -1
1453     beqz     t1, 3f         /* last pixel */
1454      srl     t0, a1, 24     /* t0 = srca */
1455     not      v0, a1
1456     beq      t0, t5, 2f     /* if (srca == 0xff) */
1457      srl     v0, v0, 24
1459                             /* a1 = src */
1460     lbu      t0, 0(a2)      /* t0 = mask */
1461     lbu      t1, 1(a2)      /* t1 = mask */
1462     or       t2, t0, t1
1463     beqz     t2, 111f       /* if (t0 == 0) && (t1 == 0) */
1464      addiu   a2, a2, 2
1465     lhu      t2, 0(a0)      /* t2 = dst */
1466     lhu      t3, 2(a0)      /* t3 = dst */
1467     CONVERT_2x0565_TO_2x8888 t2, t3, s0, s1, t7, t8, t9, s2, s3, s4
1468     and      t9, t0, t1
1469     beq      t9, t5, 11f    /* if (t0 == 0xff) && (t1 == 0xff) */
1470      nop
1472     MIPS_2xUN8x4_MUL_2xUN8   a1, a1, t0, t1, s2, s3, t4, t9, s4, s5, s6, s7, s8
1473     not      s4, s2
1474     not      s5, s3
1475     srl      s4, s4, 24
1476     srl      s5, s5, 24
1477     MIPS_2xUN8x4_MUL_2xUN8   s0, s1, s4, s5, s0, s1, t4, t9, t0, t1, s6, s7, s8
1478     addu_s.qb                s4, s2, s0
1479     addu_s.qb                s5, s3, s1
1480     CONVERT_2x8888_TO_2x0565 s4, s5, t2, t3, t6, t7, t8, s0, s1
1481     sh       t2, 0(a0)
1482     b        111f
1483      sh      t3, 2(a0)
1485     MIPS_2xUN8x4_MUL_2xUN8   s0, s1, v0, v0, s0, s1, t4, t9, t0, t1, s6, s7, s8
1486     addu_s.qb                s4, a1, s0
1487     addu_s.qb                s5, a1, s1
1488     CONVERT_2x8888_TO_2x0565 s4, s5, t2, t3, t6, t7, t8, s0, s1
1489     sh       t2, 0(a0)
1490     sh       t3, 2(a0)
1491 111:
1492     addiu    a3, a3, -2
1493     addiu    t0, a3, -1
1494     bgtz     t0, 1b
1495      addiu   a0, a0, 4
1496     b        3f
1497      nop
1499     CONVERT_1x8888_TO_1x0565 a1, s0, s1, s2
1501                             /* a1 = src */
1502     lbu      t0, 0(a2)      /* t0 = mask */
1503     lbu      t1, 1(a2)      /* t1 = mask */
1504     or       t2, t0, t1
1505     beqz     t2, 222f       /* if (t0 == 0) && (t1 == 0) */
1506      addiu   a2, a2, 2
1507     and      t9, t0, t1
1508     move     s2, s0
1509     beq      t9, t5, 22f    /* if (t0 == 0xff) && (t2 == 0xff) */
1510      move    s3, s0
1511     lhu      t2, 0(a0)      /* t2 = dst */
1512     lhu      t3, 2(a0)      /* t3 = dst */
1514     CONVERT_2x0565_TO_2x8888 t2, t3, s2, s3, t7, t8, s4, s5, s6, s7
1515     OVER_2x8888_2x8_2x8888   a1, a1, t0, t1, s2, s3, \
1516                              t2, t3, t4, t9, s4, s5, s6, s7, s8
1517     CONVERT_2x8888_TO_2x0565 t2, t3, s2, s3, t6, t7, t8, s4, s5
1519     sh       s2, 0(a0)
1520     sh       s3, 2(a0)
1521 222:
1522     addiu    a3, a3, -2
1523     addiu    t0, a3, -1
1524     bgtz     t0, 21b
1525      addiu   a0, a0, 4
1527     blez      a3, 4f
1528      nop
1529                             /* a1 = src */
1530     lbu      t0, 0(a2)      /* t0 = mask */
1531     beqz     t0, 4f         /* if (t0 == 0) */
1532      nop
1533     lhu      t1, 0(a0)      /* t1 = dst */
1534     CONVERT_1x0565_TO_1x8888 t1, t2, t3, t7
1535     beq      t0, t5, 31f    /* if (t0 == 0xff) */
1536      move    t3, a1
1538     MIPS_UN8x4_MUL_UN8       a1, t0, t3, t4, t7, t8, t9
1540     not      t6, t3
1541     srl      t6, t6, 24
1542     MIPS_UN8x4_MUL_UN8       t2, t6, t2, t4, t7, t8, t9
1543     addu_s.qb                t1, t2, t3
1544     CONVERT_1x8888_TO_1x0565 t1, t2, t3, t7
1545     sh       t2, 0(a0)
1547     RESTORE_REGS_FROM_STACK  24, v0, s0, s1, s2, s3, s4, s5, s6, s7, s8
1548     j        ra
1549      nop
1551 END(pixman_composite_over_n_8_0565_asm_mips)
1553 LEAF_MIPS_DSPR2(pixman_composite_over_8888_n_8888_asm_mips)
1555  * a0 - dst  (a8r8g8b8)
1556  * a1 - src  (a8r8g8b8)
1557  * a2 - mask (32bit constant)
1558  * a3 - w
1559  */
1561     SAVE_REGS_ON_STACK 0, s0
1562     li       t4, 0x00ff00ff
1563     beqz     a3, 3f
1564      nop
1565     addiu    t1, a3, -1
1566     srl      a2, a2, 24
1567     beqz     t1, 2f
1568      nop
1571     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1572     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1573                        /* a2 = mask        (32bit constant) */
1574     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
1575     lw       t3, 4(a0) /* t3 = destination (a8r8g8b8) */
1576     addiu    a1, a1, 8
1578     OVER_2x8888_2x8_2x8888 t0, t1, a2, a2, t2, t3, \
1579                            t5, t6, t4, t7, t8, t9, t0, t1, s0
1581     sw       t5, 0(a0)
1582     sw       t6, 4(a0)
1583     addiu    a3, a3, -2
1584     addiu    t1, a3, -1
1585     bgtz     t1, 1b
1586      addiu   a0, a0, 8
1588     beqz     a3, 3f
1589      nop
1590     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1591                        /* a2 = mask        (32bit constant) */
1592     lw       t1, 0(a0) /* t1 = destination (a8r8g8b8) */
1594     OVER_8888_8_8888 t0, a2, t1, t3, t4, t5, t6, t7, t8
1596     sw       t3, 0(a0)
1598     RESTORE_REGS_FROM_STACK 0, s0
1599     j        ra
1600      nop
1602 END(pixman_composite_over_8888_n_8888_asm_mips)
1604 LEAF_MIPS_DSPR2(pixman_composite_over_8888_n_0565_asm_mips)
1606  * a0 - dst  (r5g6b5)
1607  * a1 - src  (a8r8g8b8)
1608  * a2 - mask (32bit constant)
1609  * a3 - w
1610  */
1612     SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
1613     li       t6, 0x00ff00ff
1614     li       t7, 0xf800f800
1615     li       t8, 0x07e007e0
1616     li       t9, 0x001F001F
1617     beqz     a3, 3f
1618      nop
1619     srl      a2, a2, 24
1620     addiu    t1, a3, -1
1621     beqz     t1, 2f
1622      nop
1624     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1625     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1626                        /* a2 = mask        (32bit constant) */
1627     lhu      t2, 0(a0) /* t2 = destination (r5g6b5) */
1628     lhu      t3, 2(a0) /* t2 = destination (r5g6b5) */
1629     addiu    a1, a1, 8
1631     CONVERT_2x0565_TO_2x8888 t2, t3, t4, t5, t8, t9, s0, s1, t2, t3
1632     OVER_2x8888_2x8_2x8888   t0, t1, a2, a2, t4, t5, \
1633                              t2, t3, t6, t0, t1, s0, s1, s2, s3
1634     CONVERT_2x8888_TO_2x0565 t2, t3, t4, t5, t7, t8, t9, s0, s1
1636     sh       t4, 0(a0)
1637     sh       t5, 2(a0)
1638     addiu    a3, a3, -2
1639     addiu    t1, a3, -1
1640     bgtz     t1, 1b
1641      addiu   a0, a0, 4
1643     beqz     a3, 3f
1644      nop
1645     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1646                        /* a2 = mask        (32bit constant) */
1647     lhu      t1, 0(a0) /* t1 = destination (r5g6b5) */
1649     CONVERT_1x0565_TO_1x8888 t1, t2, t4, t5
1650     OVER_8888_8_8888         t0, a2, t2, t1, t6, t3, t4, t5, t7
1651     CONVERT_1x8888_TO_1x0565 t1, t3, t4, t5
1653     sh       t3, 0(a0)
1655     RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
1656     j                 ra
1657      nop
1659 END(pixman_composite_over_8888_n_0565_asm_mips)
1661 LEAF_MIPS_DSPR2(pixman_composite_over_0565_n_0565_asm_mips)
1663  * a0 - dst  (r5g6b5)
1664  * a1 - src  (r5g6b5)
1665  * a2 - mask (32bit constant)
1666  * a3 - w
1667  */
1669     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5
1670     li       t6, 0x00ff00ff
1671     li       t7, 0xf800f800
1672     li       t8, 0x07e007e0
1673     li       t9, 0x001F001F
1674     beqz     a3, 3f
1675      nop
1676     srl      a2, a2, 24
1677     addiu    t1, a3, -1
1678     beqz     t1, 2f
1679      nop
1681     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
1682     lhu      t1, 2(a1) /* t1 = source      (r5g6b5) */
1683                        /* a2 = mask        (32bit constant) */
1684     lhu      t2, 0(a0) /* t2 = destination (r5g6b5) */
1685     lhu      t3, 2(a0) /* t3 = destination (r5g6b5) */
1686     addiu    a1, a1, 4
1688     CONVERT_2x0565_TO_2x8888 t0, t1, t4, t5, t8, t9, s0, s1, s2, s3
1689     CONVERT_2x0565_TO_2x8888 t2, t3, s0, s1, t8, t9, s2, s3, s4, s5
1690     OVER_2x8888_2x8_2x8888   t4, t5, a2, a2, s0, s1, \
1691                              t0, t1, t6, s2, s3, s4, s5, t4, t5
1692     CONVERT_2x8888_TO_2x0565 t0, t1, s0, s1, t7, t8, t9, s2, s3
1694     sh       s0, 0(a0)
1695     sh       s1, 2(a0)
1696     addiu    a3, a3, -2
1697     addiu    t1, a3, -1
1698     bgtz     t1, 1b
1699      addiu   a0, a0, 4
1701     beqz     a3, 3f
1702      nop
1703     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
1704                        /* a2 = mask        (32bit constant) */
1705     lhu      t1, 0(a0) /* t1 = destination (r5g6b5) */
1707     CONVERT_1x0565_TO_1x8888 t0, t2, t4, t5
1708     CONVERT_1x0565_TO_1x8888 t1, t3, t4, t5
1709     OVER_8888_8_8888         t2, a2, t3, t0, t6, t1, t4, t5, t7
1710     CONVERT_1x8888_TO_1x0565 t0, t3, t4, t5
1712     sh       t3, 0(a0)
1714     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5
1715     j        ra
1716      nop
1718 END(pixman_composite_over_0565_n_0565_asm_mips)
1720 LEAF_MIPS_DSPR2(pixman_composite_over_8888_8_8888_asm_mips)
1722  * a0 - dst  (a8r8g8b8)
1723  * a1 - src  (a8r8g8b8)
1724  * a2 - mask (a8)
1725  * a3 - w
1726  */
1728     SAVE_REGS_ON_STACK 0, s0, s1
1729     li       t4, 0x00ff00ff
1730     beqz     a3, 3f
1731      nop
1732     addiu    t1, a3, -1
1733     beqz     t1, 2f
1734      nop
1736     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1737     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1738     lbu      t2, 0(a2) /* t2 = mask        (a8) */
1739     lbu      t3, 1(a2) /* t3 = mask        (a8) */
1740     lw       t5, 0(a0) /* t5 = destination (a8r8g8b8) */
1741     lw       t6, 4(a0) /* t6 = destination (a8r8g8b8) */
1742     addiu    a1, a1, 8
1743     addiu    a2, a2, 2
1745     OVER_2x8888_2x8_2x8888 t0, t1, t2, t3, t5, t6, \
1746                            t7, t8, t4, t9, s0, s1, t0, t1, t2
1748     sw       t7, 0(a0)
1749     sw       t8, 4(a0)
1750     addiu    a3, a3, -2
1751     addiu    t1, a3, -1
1752     bgtz     t1, 1b
1753      addiu   a0, a0, 8
1755     beqz     a3, 3f
1756      nop
1757     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1758     lbu      t1, 0(a2) /* t1 = mask        (a8) */
1759     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
1761     OVER_8888_8_8888 t0, t1, t2, t3, t4, t5, t6, t7, t8
1763     sw       t3, 0(a0)
1765     RESTORE_REGS_FROM_STACK 0, s0, s1
1766     j        ra
1767      nop
1769 END(pixman_composite_over_8888_8_8888_asm_mips)
1771 LEAF_MIPS_DSPR2(pixman_composite_over_8888_8_0565_asm_mips)
1773  * a0 - dst  (r5g6b5)
1774  * a1 - src  (a8r8g8b8)
1775  * a2 - mask (a8)
1776  * a3 - w
1777  */
1779     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5
1780     li       t6, 0x00ff00ff
1781     li       t7, 0xf800f800
1782     li       t8, 0x07e007e0
1783     li       t9, 0x001F001F
1784     beqz     a3, 3f
1785      nop
1786     addiu    t1, a3, -1
1787     beqz     t1, 2f
1788      nop
1790     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1791     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1792     lbu      t2, 0(a2) /* t2 = mask        (a8) */
1793     lbu      t3, 1(a2) /* t3 = mask        (a8) */
1794     lhu      t4, 0(a0) /* t4 = destination (r5g6b5) */
1795     lhu      t5, 2(a0) /* t5 = destination (r5g6b5) */
1796     addiu    a1, a1, 8
1797     addiu    a2, a2, 2
1799     CONVERT_2x0565_TO_2x8888 t4, t5, s0, s1, t8, t9, s2, s3, s4, s5
1800     OVER_2x8888_2x8_2x8888   t0, t1, t2, t3, s0, s1, \
1801                              t4, t5, t6, s2, s3, s4, s5, t0, t1
1802     CONVERT_2x8888_TO_2x0565 t4, t5, s0, s1, t7, t8, t9, s2, s3
1804     sh       s0, 0(a0)
1805     sh       s1, 2(a0)
1806     addiu    a3, a3, -2
1807     addiu    t1, a3, -1
1808     bgtz     t1, 1b
1809      addiu   a0, a0, 4
1811     beqz     a3, 3f
1812      nop
1813     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1814     lbu      t1, 0(a2) /* t1 = mask        (a8) */
1815     lhu      t2, 0(a0) /* t2 = destination (r5g6b5) */
1817     CONVERT_1x0565_TO_1x8888 t2, t3, t4, t5
1818     OVER_8888_8_8888         t0, t1, t3, t2, t6, t4, t5, t7, t8
1819     CONVERT_1x8888_TO_1x0565 t2, t3, t4, t5
1821     sh       t3, 0(a0)
1823     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5
1824     j        ra
1825      nop
1827 END(pixman_composite_over_8888_8_0565_asm_mips)
1829 LEAF_MIPS_DSPR2(pixman_composite_over_0565_8_0565_asm_mips)
1831  * a0 - dst  (r5g6b5)
1832  * a1 - src  (r5g6b5)
1833  * a2 - mask (a8)
1834  * a3 - w
1835  */
1837     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5
1838     li       t4, 0xf800f800
1839     li       t5, 0x07e007e0
1840     li       t6, 0x001F001F
1841     li       t7, 0x00ff00ff
1842     beqz     a3, 3f
1843      nop
1844     addiu    t1, a3, -1
1845     beqz     t1, 2f
1846      nop
1848     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
1849     lhu      t1, 2(a1) /* t1 = source      (r5g6b5) */
1850     lbu      t2, 0(a2) /* t2 = mask        (a8) */
1851     lbu      t3, 1(a2) /* t3 = mask        (a8) */
1852     lhu      t8, 0(a0) /* t8 = destination (r5g6b5) */
1853     lhu      t9, 2(a0) /* t9 = destination (r5g6b5) */
1854     addiu    a1, a1, 4
1855     addiu    a2, a2, 2
1857     CONVERT_2x0565_TO_2x8888 t0, t1, s0, s1, t5, t6, s2, s3, s4, s5
1858     CONVERT_2x0565_TO_2x8888 t8, t9, s2, s3, t5, t6, s4, s5, t0, t1
1859     OVER_2x8888_2x8_2x8888   s0, s1, t2, t3, s2, s3, \
1860                              t0, t1, t7, s4, s5, t8, t9, s0, s1
1861     CONVERT_2x8888_TO_2x0565 t0, t1, s0, s1, t4, t5, t6, s2, s3
1863     sh       s0, 0(a0)
1864     sh       s1, 2(a0)
1865     addiu    a3, a3, -2
1866     addiu    t1, a3, -1
1867     bgtz     t1, 1b
1868      addiu   a0, a0, 4
1870     beqz     a3, 3f
1871      nop
1872     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
1873     lbu      t1, 0(a2) /* t1 = mask        (a8) */
1874     lhu      t2, 0(a0) /* t2 = destination (r5g6b5) */
1876     CONVERT_1x0565_TO_1x8888 t0, t3, t4, t5
1877     CONVERT_1x0565_TO_1x8888 t2, t4, t5, t6
1878     OVER_8888_8_8888         t3, t1, t4, t0, t7, t2, t5, t6, t8
1879     CONVERT_1x8888_TO_1x0565 t0, t3, t4, t5
1881     sh       t3, 0(a0)
1883     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5
1884     j        ra
1885      nop
1887 END(pixman_composite_over_0565_8_0565_asm_mips)
1889 LEAF_MIPS_DSPR2(pixman_composite_over_8888_8888_8888_asm_mips)
1891  * a0 - dst  (a8r8g8b8)
1892  * a1 - src  (a8r8g8b8)
1893  * a2 - mask (a8r8g8b8)
1894  * a3 - w
1895  */
1897     SAVE_REGS_ON_STACK 0, s0, s1, s2
1898     li       t4, 0x00ff00ff
1899     beqz     a3, 3f
1900      nop
1901     addiu    t1, a3, -1
1902     beqz     t1, 2f
1903      nop
1905     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1906     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1907     lw       t2, 0(a2) /* t2 = mask        (a8r8g8b8) */
1908     lw       t3, 4(a2) /* t3 = mask        (a8r8g8b8) */
1909     lw       t5, 0(a0) /* t5 = destination (a8r8g8b8) */
1910     lw       t6, 4(a0) /* t6 = destination (a8r8g8b8) */
1911     addiu    a1, a1, 8
1912     addiu    a2, a2, 8
1913     srl      t2, t2, 24
1914     srl      t3, t3, 24
1916     OVER_2x8888_2x8_2x8888 t0, t1, t2, t3, t5, t6, t7, t8, t4, t9, s0, s1, s2, t0, t1
1918     sw       t7, 0(a0)
1919     sw       t8, 4(a0)
1920     addiu    a3, a3, -2
1921     addiu    t1, a3, -1
1922     bgtz     t1, 1b
1923      addiu   a0, a0, 8
1925     beqz     a3, 3f
1926      nop
1927     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1928     lw       t1, 0(a2) /* t1 = mask        (a8r8g8b8) */
1929     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
1930     srl      t1, t1, 24
1932     OVER_8888_8_8888 t0, t1, t2, t3, t4, t5, t6, t7, t8
1934     sw       t3, 0(a0)
1936     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
1937     j        ra
1938      nop
1940 END(pixman_composite_over_8888_8888_8888_asm_mips)
1942 LEAF_MIPS_DSPR2(pixman_composite_over_8888_8888_asm_mips)
1944  * a0 - dst  (a8r8g8b8)
1945  * a1 - src  (a8r8g8b8)
1946  * a2 - w
1947  */
1949     SAVE_REGS_ON_STACK 0, s0, s1, s2
1950     li           t4, 0x00ff00ff
1951     beqz         a2, 3f
1952      nop
1953     addiu        t1, a2, -1
1954     beqz         t1, 2f
1955      nop
1957     lw           t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1958     lw           t1, 4(a1) /* t1 = source      (a8r8g8b8) */
1959     lw           t2, 0(a0) /* t2 = destination (a8r8g8b8) */
1960     lw           t3, 4(a0) /* t3 = destination (a8r8g8b8) */
1961     addiu        a1, a1, 8
1963     not          t5, t0
1964     srl          t5, t5, 24
1965     not          t6, t1
1966     srl          t6, t6, 24
1968     or           t7, t5, t6
1969     beqz         t7, 11f
1970      or          t8, t0, t1
1971     beqz         t8, 12f
1973     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, t5, t6, t7, t8, t4, t9, s0, s1, s2, t2, t3
1975     addu_s.qb    t0, t7, t0
1976     addu_s.qb    t1, t8, t1
1978     sw           t0, 0(a0)
1979     sw           t1, 4(a0)
1981     addiu        a2, a2, -2
1982     addiu        t1, a2, -1
1983     bgtz         t1, 1b
1984      addiu       a0, a0, 8
1986     beqz         a2, 3f
1987      nop
1989     lw           t0, 0(a1) /* t0 = source      (a8r8g8b8) */
1990     lw           t1, 0(a0) /* t1 = destination (a8r8g8b8) */
1991     addiu        a1, a1, 4
1993     not          t2, t0
1994     srl          t2, t2, 24
1996     beqz         t2, 21f
1997      nop
1998     beqz         t0, 3f
2000     MIPS_UN8x4_MUL_UN8 t1, t2, t3, t4, t5, t6, t7
2002     addu_s.qb    t0, t3, t0
2004     sw           t0, 0(a0)
2007     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2008     j            ra
2009      nop
2011 END(pixman_composite_over_8888_8888_asm_mips)
2013 LEAF_MIPS_DSPR2(pixman_composite_over_8888_0565_asm_mips)
2015  * a0 - dst  (r5g6b5)
2016  * a1 - src  (a8r8g8b8)
2017  * a2 - w
2018  */
2020     SAVE_REGS_ON_STACK 8, s0, s1, s2, s3, s4, s5
2021     li           t4, 0x00ff00ff
2022     li           s3, 0xf800f800
2023     li           s4, 0x07e007e0
2024     li           s5, 0x001F001F
2025     beqz         a2, 3f
2026      nop
2027     addiu        t1, a2, -1
2028     beqz         t1, 2f
2029      nop
2031     lw           t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2032     lw           t1, 4(a1) /* t1 = source      (a8r8g8b8) */
2033     lhu          t2, 0(a0) /* t2 = destination (r5g6b5) */
2034     lhu          t3, 2(a0) /* t3 = destination (r5g6b5) */
2035     addiu        a1, a1, 8
2037     not          t5, t0
2038     srl          t5, t5, 24
2039     not          t6, t1
2040     srl          t6, t6, 24
2042     or           t7, t5, t6
2043     beqz         t7, 11f
2044      or          t8, t0, t1
2045     beqz         t8, 12f
2047     CONVERT_2x0565_TO_2x8888 t2, t3, s0, s1, s4, s5, t7, t8, t9, s2
2048     MIPS_2xUN8x4_MUL_2xUN8   s0, s1, t5, t6, t7, t8, t4, t9, t2, t3, s2, s0, s1
2050     addu_s.qb    t0, t7, t0
2051     addu_s.qb    t1, t8, t1
2053     CONVERT_2x8888_TO_2x0565 t0, t1, t7, t8, s3, s4, s5, t2, t3
2054     sh           t7, 0(a0)
2055     sh           t8, 2(a0)
2057     addiu        a2, a2, -2
2058     addiu        t1, a2, -1
2059     bgtz         t1, 1b
2060      addiu       a0, a0, 4
2062     beqz         a2, 3f
2063      nop
2065     lw           t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2066     lhu          t1, 0(a0) /* t1 = destination (r5g6b5) */
2067     addiu        a1, a1, 4
2069     not          t2, t0
2070     srl          t2, t2, 24
2072     beqz         t2, 21f
2073      nop
2074     beqz         t0, 3f
2076     CONVERT_1x0565_TO_1x8888 t1, s0, t8, t9
2077     MIPS_UN8x4_MUL_UN8       s0, t2, t3, t4, t5, t6, t7
2079     addu_s.qb    t0, t3, t0
2081     CONVERT_1x8888_TO_1x0565 t0, s0, t8, t9
2082     sh           s0, 0(a0)
2085     RESTORE_REGS_FROM_STACK 8, s0, s1, s2, s3, s4, s5
2086     j            ra
2087      nop
2089 END(pixman_composite_over_8888_0565_asm_mips)
2091 LEAF_MIPS_DSPR2(pixman_composite_over_n_0565_asm_mips)
2093  * a0 - dst  (r5g6b5)
2094  * a1 - src  (32bit constant)
2095  * a2 - w
2096  */
2098     beqz         a2, 5f
2099      nop
2101     not          t0, a1
2102     srl          t0, t0, 24
2103     bgtz         t0, 1f
2104      nop
2105     CONVERT_1x8888_TO_1x0565 a1, t1, t2, t3
2107     sh           t1, 0(a0)
2108     addiu        a2, a2, -1
2109     bgtz         a2, 0b
2110      addiu       a0, a0, 2
2111     j            ra
2112      nop
2115     SAVE_REGS_ON_STACK 0, s0, s1, s2
2116     li           t4, 0x00ff00ff
2117     li           t5, 0xf800f800
2118     li           t6, 0x07e007e0
2119     li           t7, 0x001F001F
2120     addiu        t1, a2, -1
2121     beqz         t1, 3f
2122      nop
2124     lhu          t1, 0(a0) /* t1 = destination (r5g6b5) */
2125     lhu          t2, 2(a0) /* t2 = destination (r5g6b5) */
2127     CONVERT_2x0565_TO_2x8888 t1, t2, t3, t8, t6, t7, t9, s0, s1, s2
2128     MIPS_2xUN8x4_MUL_2xUN8   t3, t8, t0, t0, t1, t2, t4, t9, s0, s1, s2, t3, t8
2129     addu_s.qb                t1, t1, a1
2130     addu_s.qb                t2, t2, a1
2131     CONVERT_2x8888_TO_2x0565 t1, t2, t3, t8, t5, t6, t7, s0, s1
2133     sh           t3, 0(a0)
2134     sh           t8, 2(a0)
2136     addiu        a2, a2, -2
2137     addiu        t1, a2, -1
2138     bgtz         t1, 2b
2139      addiu       a0, a0, 4
2141     beqz         a2, 4f
2142      nop
2144     lhu          t1, 0(a0) /* t1 = destination (r5g6b5) */
2146     CONVERT_1x0565_TO_1x8888 t1, t2, s0, s1
2147     MIPS_UN8x4_MUL_UN8       t2, t0, t1, t4, s0, s1, s2
2148     addu_s.qb                t1, t1, a1
2149     CONVERT_1x8888_TO_1x0565 t1, t2, s0, s1
2151     sh           t2, 0(a0)
2154     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2156     j            ra
2157      nop
2159 END(pixman_composite_over_n_0565_asm_mips)
2161 LEAF_MIPS_DSPR2(pixman_composite_over_n_8888_asm_mips)
2163  * a0 - dst  (a8r8g8b8)
2164  * a1 - src  (32bit constant)
2165  * a2 - w
2166  */
2168     beqz         a2, 5f
2169      nop
2171     not          t0, a1
2172     srl          t0, t0, 24
2173     bgtz         t0, 1f
2174      nop
2176     sw           a1, 0(a0)
2177     addiu        a2, a2, -1
2178     bgtz         a2, 0b
2179      addiu       a0, a0, 4
2180     j            ra
2181      nop
2184     SAVE_REGS_ON_STACK 0, s0, s1, s2
2185     li           t4, 0x00ff00ff
2186     addiu        t1, a2, -1
2187     beqz         t1, 3f
2188      nop
2190     lw           t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2191     lw           t3, 4(a0) /* t3 = destination (a8r8g8b8) */
2193     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, t0, t0, t7, t8, t4, t9, s0, s1, s2, t2, t3
2195     addu_s.qb    t7, t7, a1
2196     addu_s.qb    t8, t8, a1
2198     sw           t7, 0(a0)
2199     sw           t8, 4(a0)
2201     addiu        a2, a2, -2
2202     addiu        t1, a2, -1
2203     bgtz         t1, 2b
2204      addiu       a0, a0, 8
2206     beqz         a2, 4f
2207      nop
2209     lw           t1, 0(a0) /* t1 = destination (a8r8g8b8) */
2211     MIPS_UN8x4_MUL_UN8 t1, t0, t3, t4, t5, t6, t7
2213     addu_s.qb    t3, t3, a1
2215     sw           t3, 0(a0)
2218     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2220     j            ra
2221      nop
2223 END(pixman_composite_over_n_8888_asm_mips)
2225 LEAF_MIPS_DSPR2(pixman_composite_add_8_8_8_asm_mips)
2227  * a0 - dst  (a8)
2228  * a1 - src  (a8)
2229  * a2 - mask (a8)
2230  * a3 - w
2231  */
2233     SAVE_REGS_ON_STACK 0, v0, v1
2234     li                t9, 0x00ff00ff
2235     beqz              a3, 3f
2236      nop
2238     srl               v0, a3, 2   /* v0 = how many multiples of 4 dst pixels */
2239     beqz              v0, 1f      /* branch if less than 4 src pixels */
2240      nop
2243     beqz              v0, 1f
2244      addiu            v0, v0, -1
2245     lbu               t0, 0(a2)
2246     lbu               t1, 1(a2)
2247     lbu               t2, 2(a2)
2248     lbu               t3, 3(a2)
2249     lbu               t4, 0(a0)
2250     lbu               t5, 1(a0)
2251     lbu               t6, 2(a0)
2252     lbu               t7, 3(a0)
2254     addiu             a2, a2, 4
2256     precr_sra.ph.w    t1, t0, 0
2257     precr_sra.ph.w    t3, t2, 0
2258     precr_sra.ph.w    t5, t4, 0
2259     precr_sra.ph.w    t7, t6, 0
2261     precr.qb.ph       t0, t3, t1
2262     precr.qb.ph       t1, t7, t5
2264     lbu               t4, 0(a1)
2265     lbu               v1, 1(a1)
2266     lbu               t7, 2(a1)
2267     lbu               t8, 3(a1)
2269     addiu             a1, a1, 4
2271     precr_sra.ph.w    v1, t4, 0
2272     precr_sra.ph.w    t8, t7, 0
2274     muleu_s.ph.qbl    t2, t0, t8
2275     muleu_s.ph.qbr    t3, t0, v1
2276     shra_r.ph         t4, t2, 8
2277     shra_r.ph         t5, t3, 8
2278     and               t4, t4, t9
2279     and               t5, t5, t9
2280     addq.ph           t2, t2, t4
2281     addq.ph           t3, t3, t5
2282     shra_r.ph         t2, t2, 8
2283     shra_r.ph         t3, t3, 8
2284     precr.qb.ph       t0, t2, t3
2286     addu_s.qb         t2, t0, t1
2288     sb                t2, 0(a0)
2289     srl               t2, t2, 8
2290     sb                t2, 1(a0)
2291     srl               t2, t2, 8
2292     sb                t2, 2(a0)
2293     srl               t2, t2, 8
2294     sb                t2, 3(a0)
2295     addiu             a3, a3, -4
2296     b                 0b
2297      addiu            a0, a0, 4
2300     beqz              a3, 3f
2301      nop
2303     lbu               t8, 0(a1)
2304     lbu               t0, 0(a2)
2305     lbu               t1, 0(a0)
2306     addiu             a1, a1, 1
2307     addiu             a2, a2, 1
2309     mul               t2, t0, t8
2310     shra_r.ph         t3, t2, 8
2311     andi              t3, t3, 0xff
2312     addq.ph           t2, t2, t3
2313     shra_r.ph         t2, t2, 8
2314     andi              t2, t2, 0xff
2316     addu_s.qb         t2, t2, t1
2317     sb                t2, 0(a0)
2318     addiu             a3, a3, -1
2319     bnez              a3, 2b
2320      addiu            a0, a0, 1
2323     RESTORE_REGS_FROM_STACK 0, v0, v1
2324     j                 ra
2325      nop
2327 END(pixman_composite_add_8_8_8_asm_mips)
2329 LEAF_MIPS_DSPR2(pixman_composite_add_n_8_8_asm_mips)
2331  * a0 - dst  (a8)
2332  * a1 - src  (32bit constant)
2333  * a2 - mask (a8)
2334  * a3 - w
2335  */
2337     SAVE_REGS_ON_STACK 0, v0
2338     li                t9, 0x00ff00ff
2339     beqz              a3, 3f
2340      nop
2342     srl               v0, a3, 2   /* v0 = how many multiples of 4 dst pixels */
2343     beqz              v0, 1f      /* branch if less than 4 src pixels */
2344      nop
2346     srl               t8, a1, 24
2347     replv.ph          t8, t8
2350     beqz              v0, 1f
2351      addiu            v0, v0, -1
2352     lbu               t0, 0(a2)
2353     lbu               t1, 1(a2)
2354     lbu               t2, 2(a2)
2355     lbu               t3, 3(a2)
2356     lbu               t4, 0(a0)
2357     lbu               t5, 1(a0)
2358     lbu               t6, 2(a0)
2359     lbu               t7, 3(a0)
2361     addiu             a2, a2, 4
2363     precr_sra.ph.w    t1, t0, 0
2364     precr_sra.ph.w    t3, t2, 0
2365     precr_sra.ph.w    t5, t4, 0
2366     precr_sra.ph.w    t7, t6, 0
2368     precr.qb.ph       t0, t3, t1
2369     precr.qb.ph       t1, t7, t5
2371     muleu_s.ph.qbl    t2, t0, t8
2372     muleu_s.ph.qbr    t3, t0, t8
2373     shra_r.ph         t4, t2, 8
2374     shra_r.ph         t5, t3, 8
2375     and               t4, t4, t9
2376     and               t5, t5, t9
2377     addq.ph           t2, t2, t4
2378     addq.ph           t3, t3, t5
2379     shra_r.ph         t2, t2, 8
2380     shra_r.ph         t3, t3, 8
2381     precr.qb.ph       t0, t2, t3
2383     addu_s.qb         t2, t0, t1
2385     sb                t2, 0(a0)
2386     srl               t2, t2, 8
2387     sb                t2, 1(a0)
2388     srl               t2, t2, 8
2389     sb                t2, 2(a0)
2390     srl               t2, t2, 8
2391     sb                t2, 3(a0)
2392     addiu             a3, a3, -4
2393     b                 0b
2394      addiu            a0, a0, 4
2397     beqz              a3, 3f
2398      nop
2399     srl               t8, a1, 24
2401     lbu               t0, 0(a2)
2402     lbu               t1, 0(a0)
2403     addiu             a2, a2, 1
2405     mul               t2, t0, t8
2406     shra_r.ph         t3, t2, 8
2407     andi              t3, t3, 0xff
2408     addq.ph           t2, t2, t3
2409     shra_r.ph         t2, t2, 8
2410     andi              t2, t2, 0xff
2412     addu_s.qb         t2, t2, t1
2413     sb                t2, 0(a0)
2414     addiu             a3, a3, -1
2415     bnez              a3, 2b
2416      addiu            a0, a0, 1
2419     RESTORE_REGS_FROM_STACK 0, v0
2420     j                 ra
2421      nop
2423 END(pixman_composite_add_n_8_8_asm_mips)
2425 LEAF_MIPS_DSPR2(pixman_composite_add_n_8_8888_asm_mips)
2427  * a0 - dst  (a8r8g8b8)
2428  * a1 - src  (32bit constant)
2429  * a2 - mask (a8)
2430  * a3 - w
2431  */
2433     SAVE_REGS_ON_STACK 0, s0, s1, s2
2434     li       t4, 0x00ff00ff
2435     beqz     a3, 3f
2436      nop
2437     addiu    t1, a3, -1
2438     beqz     t1, 2f
2439      nop
2441                        /* a1 = source      (32bit constant) */
2442     lbu      t0, 0(a2) /* t0 = mask        (a8) */
2443     lbu      t1, 1(a2) /* t1 = mask        (a8) */
2444     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2445     lw       t3, 4(a0) /* t3 = destination (a8r8g8b8) */
2446     addiu    a2, a2, 2
2448     MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4 a1, a1, \
2449                                        t0, t1, \
2450                                        t2, t3, \
2451                                        t5, t6, \
2452                                        t4, t7, t8, t9, s0, s1, s2
2454     sw       t5, 0(a0)
2455     sw       t6, 4(a0)
2456     addiu    a3, a3, -2
2457     addiu    t1, a3, -1
2458     bgtz     t1, 1b
2459      addiu   a0, a0, 8
2461     beqz     a3, 3f
2462      nop
2463                        /* a1 = source      (32bit constant) */
2464     lbu      t0, 0(a2) /* t0 = mask        (a8) */
2465     lw       t1, 0(a0) /* t1 = destination (a8r8g8b8) */
2467     MIPS_UN8x4_MUL_UN8_ADD_UN8x4 a1, t0, t1, t2, t4, t3, t5, t6
2469     sw       t2, 0(a0)
2471     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2472     j        ra
2473      nop
2475 END(pixman_composite_add_n_8_8888_asm_mips)
2477 LEAF_MIPS_DSPR2(pixman_composite_add_0565_8_0565_asm_mips)
2479  * a0 - dst  (r5g6b5)
2480  * a1 - src  (r5g6b5)
2481  * a2 - mask (a8)
2482  * a3 - w
2483  */
2485     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7
2486     li       t4, 0xf800f800
2487     li       t5, 0x07e007e0
2488     li       t6, 0x001F001F
2489     li       t7, 0x00ff00ff
2490     beqz     a3, 3f
2491      nop
2492     addiu    t1, a3, -1
2493     beqz     t1, 2f
2494      nop
2496     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
2497     lhu      t1, 2(a1) /* t1 = source      (r5g6b5) */
2498     lbu      t2, 0(a2) /* t2 = mask        (a8) */
2499     lbu      t3, 1(a2) /* t3 = mask        (a8) */
2500     lhu      t8, 0(a0) /* t8 = destination (r5g6b5) */
2501     lhu      t9, 2(a0) /* t9 = destination (r5g6b5) */
2502     addiu    a1, a1, 4
2503     addiu    a2, a2, 2
2505     CONVERT_2x0565_TO_2x8888  t0, t1, s0, s1, t5, t6, s2, s3, s4, s5
2506     CONVERT_2x0565_TO_2x8888  t8, t9, s2, s3, t5, t6, s4, s5, s6, s7
2507     MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4  s0, s1, \
2508                                         t2, t3, \
2509                                         s2, s3, \
2510                                         t0, t1, \
2511                                         t7, s4, s5, s6, s7, t8, t9
2512     CONVERT_2x8888_TO_2x0565  t0, t1, s0, s1, t4, t5, t6, s2, s3
2514     sh       s0, 0(a0)
2515     sh       s1, 2(a0)
2516     addiu    a3, a3, -2
2517     addiu    t1, a3, -1
2518     bgtz     t1, 1b
2519      addiu   a0, a0, 4
2521     beqz     a3, 3f
2522      nop
2523     lhu      t0, 0(a1) /* t0 = source      (r5g6b5) */
2524     lbu      t1, 0(a2) /* t1 = mask        (a8) */
2525     lhu      t2, 0(a0) /* t2 = destination (r5g6b5) */
2527     CONVERT_1x0565_TO_1x8888  t0, t3, t4, t5
2528     CONVERT_1x0565_TO_1x8888  t2, t4, t5, t6
2529     MIPS_UN8x4_MUL_UN8_ADD_UN8x4  t3, t1, t4, t0, t7, t2, t5, t6
2530     CONVERT_1x8888_TO_1x0565  t0, t3, t4, t5
2532     sh       t3, 0(a0)
2534     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7
2535     j        ra
2536      nop
2538 END(pixman_composite_add_0565_8_0565_asm_mips)
2540 LEAF_MIPS_DSPR2(pixman_composite_add_8888_8_8888_asm_mips)
2542  * a0 - dst  (a8r8g8b8)
2543  * a1 - src  (a8r8g8b8)
2544  * a2 - mask (a8)
2545  * a3 - w
2546  */
2548     SAVE_REGS_ON_STACK 0, s0, s1, s2
2549     li       t4, 0x00ff00ff
2550     beqz     a3, 3f
2551      nop
2552     addiu    t1, a3, -1
2553     beqz     t1, 2f
2554      nop
2556     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2557     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
2558     lbu      t2, 0(a2) /* t2 = mask        (a8) */
2559     lbu      t3, 1(a2) /* t3 = mask        (a8) */
2560     lw       t5, 0(a0) /* t5 = destination (a8r8g8b8) */
2561     lw       t6, 4(a0) /* t6 = destination (a8r8g8b8) */
2562     addiu    a1, a1, 8
2563     addiu    a2, a2, 2
2565     MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4 t0, t1, \
2566                                        t2, t3, \
2567                                        t5, t6, \
2568                                        t7, t8, \
2569                                        t4, t9, s0, s1, s2, t0, t1
2571     sw       t7, 0(a0)
2572     sw       t8, 4(a0)
2573     addiu    a3, a3, -2
2574     addiu    t1, a3, -1
2575     bgtz     t1, 1b
2576      addiu   a0, a0, 8
2578     beqz     a3, 3f
2579      nop
2580     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2581     lbu      t1, 0(a2) /* t1 = mask        (a8) */
2582     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2584     MIPS_UN8x4_MUL_UN8_ADD_UN8x4 t0, t1, t2, t3, t4, t5, t6, t7
2586     sw       t3, 0(a0)
2588     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2589     j        ra
2590      nop
2592 END(pixman_composite_add_8888_8_8888_asm_mips)
2594 LEAF_MIPS_DSPR2(pixman_composite_add_8888_n_8888_asm_mips)
2596  * a0 - dst  (a8r8g8b8)
2597  * a1 - src  (a8r8g8b8)
2598  * a2 - mask (32bit constant)
2599  * a3 - w
2600  */
2602     SAVE_REGS_ON_STACK 0, s0, s1, s2
2603     li       t4, 0x00ff00ff
2604     beqz     a3, 3f
2605      nop
2606     srl      a2, a2, 24
2607     addiu    t1, a3, -1
2608     beqz     t1, 2f
2609      nop
2611     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2612     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
2613                        /* a2 = mask        (32bit constant) */
2614     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2615     lw       t3, 4(a0) /* t3 = destination (a8r8g8b8) */
2616     addiu    a1, a1, 8
2618     MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4 t0, t1, \
2619                                        a2, a2, \
2620                                        t2, t3, \
2621                                        t5, t6, \
2622                                        t4, t7, t8, t9, s0, s1, s2
2624     sw       t5, 0(a0)
2625     sw       t6, 4(a0)
2626     addiu    a3, a3, -2
2627     addiu    t1, a3, -1
2628     bgtz     t1, 1b
2629      addiu   a0, a0, 8
2631     beqz     a3, 3f
2632      nop
2633     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2634                        /* a2 = mask        (32bit constant) */
2635     lw       t1, 0(a0) /* t1 = destination (a8r8g8b8) */
2637     MIPS_UN8x4_MUL_UN8_ADD_UN8x4 t0, a2, t1, t3, t4, t5, t6, t7
2639     sw       t3, 0(a0)
2641     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2642     j        ra
2643      nop
2645 END(pixman_composite_add_8888_n_8888_asm_mips)
2647 LEAF_MIPS_DSPR2(pixman_composite_add_8888_8888_8888_asm_mips)
2649  * a0 - dst  (a8r8g8b8)
2650  * a1 - src  (a8r8g8b8)
2651  * a2 - mask (a8r8g8b8)
2652  * a3 - w
2653  */
2655     SAVE_REGS_ON_STACK 0, s0, s1, s2
2656     li       t4, 0x00ff00ff
2657     beqz     a3, 3f
2658      nop
2659     addiu    t1, a3, -1
2660     beqz     t1, 2f
2661      nop
2663     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2664     lw       t1, 4(a1) /* t1 = source      (a8r8g8b8) */
2665     lw       t2, 0(a2) /* t2 = mask        (a8r8g8b8) */
2666     lw       t3, 4(a2) /* t3 = mask        (a8r8g8b8) */
2667     lw       t5, 0(a0) /* t5 = destination (a8r8g8b8) */
2668     lw       t6, 4(a0) /* t6 = destination (a8r8g8b8) */
2669     addiu    a1, a1, 8
2670     addiu    a2, a2, 8
2671     srl      t2, t2, 24
2672     srl      t3, t3, 24
2674     MIPS_2xUN8x4_MUL_2xUN8_ADD_2xUN8x4 t0, t1, \
2675                                        t2, t3, \
2676                                        t5, t6, \
2677                                        t7, t8, \
2678                                        t4, t9, s0, s1, s2, t0, t1
2680     sw       t7, 0(a0)
2681     sw       t8, 4(a0)
2682     addiu    a3, a3, -2
2683     addiu    t1, a3, -1
2684     bgtz     t1, 1b
2685      addiu   a0, a0, 8
2687     beqz     a3, 3f
2688      nop
2689     lw       t0, 0(a1) /* t0 = source      (a8r8g8b8) */
2690     lw       t1, 0(a2) /* t1 = mask        (a8r8g8b8) */
2691     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2692     srl      t1, t1, 24
2694     MIPS_UN8x4_MUL_UN8_ADD_UN8x4 t0, t1, t2, t3, t4, t5, t6, t7
2696     sw       t3, 0(a0)
2698     RESTORE_REGS_FROM_STACK 0, s0, s1, s2
2699     j        ra
2700      nop
2702 END(pixman_composite_add_8888_8888_8888_asm_mips)
2704 LEAF_MIPS_DSPR2(pixman_composite_add_8_8_asm_mips)
2706  * a0 - dst  (a8)
2707  * a1 - src  (a8)
2708  * a2 - w
2709  */
2711     beqz              a2, 3f
2712      nop
2713     srl               t9, a2, 2   /* t9 = how many multiples of 4 dst pixels */
2714     beqz              t9, 1f      /* branch if less than 4 src pixels */
2715      nop
2718     beqz              t9, 1f
2719      addiu            t9, t9, -1
2720     lbu               t0, 0(a1)
2721     lbu               t1, 1(a1)
2722     lbu               t2, 2(a1)
2723     lbu               t3, 3(a1)
2724     lbu               t4, 0(a0)
2725     lbu               t5, 1(a0)
2726     lbu               t6, 2(a0)
2727     lbu               t7, 3(a0)
2729     addiu             a1, a1, 4
2731     precr_sra.ph.w    t1, t0, 0
2732     precr_sra.ph.w    t3, t2, 0
2733     precr_sra.ph.w    t5, t4, 0
2734     precr_sra.ph.w    t7, t6, 0
2736     precr.qb.ph       t0, t3, t1
2737     precr.qb.ph       t1, t7, t5
2739     addu_s.qb         t2, t0, t1
2741     sb                t2, 0(a0)
2742     srl               t2, t2, 8
2743     sb                t2, 1(a0)
2744     srl               t2, t2, 8
2745     sb                t2, 2(a0)
2746     srl               t2, t2, 8
2747     sb                t2, 3(a0)
2748     addiu             a2, a2, -4
2749     b                 0b
2750      addiu            a0, a0, 4
2753     beqz              a2, 3f
2754      nop
2756     lbu               t0, 0(a1)
2757     lbu               t1, 0(a0)
2758     addiu             a1, a1, 1
2760     addu_s.qb         t2, t0, t1
2761     sb                t2, 0(a0)
2762     addiu             a2, a2, -1
2763     bnez              a2, 2b
2764      addiu            a0, a0, 1
2767     j                 ra
2768      nop
2770 END(pixman_composite_add_8_8_asm_mips)
2772 LEAF_MIPS_DSPR2(pixman_composite_add_8888_8888_asm_mips)
2774  * a0 - dst (a8r8g8b8)
2775  * a1 - src (a8r8g8b8)
2776  * a2 - w
2777  */
2779     beqz         a2, 4f
2780      nop
2782     srl          t9, a2, 2      /* t1 = how many multiples of 4 src pixels */
2783     beqz         t9, 3f         /* branch if less than 4 src pixels */
2784      nop
2786     addiu        t9, t9, -1
2787     beqz         t9, 2f
2788      addiu       a2, a2, -4
2790     lw           t0, 0(a1)
2791     lw           t1, 4(a1)
2792     lw           t2, 8(a1)
2793     lw           t3, 12(a1)
2794     lw           t4, 0(a0)
2795     lw           t5, 4(a0)
2796     lw           t6, 8(a0)
2797     lw           t7, 12(a0)
2798     addiu        a1, a1, 16
2800     addu_s.qb    t4, t4, t0
2801     addu_s.qb    t5, t5, t1
2802     addu_s.qb    t6, t6, t2
2803     addu_s.qb    t7, t7, t3
2805     sw           t4, 0(a0)
2806     sw           t5, 4(a0)
2807     sw           t6, 8(a0)
2808     sw           t7, 12(a0)
2809     b            1b
2810      addiu       a0, a0, 16
2812     lw           t0, 0(a1)
2813     lw           t1, 4(a1)
2814     lw           t2, 8(a1)
2815     lw           t3, 12(a1)
2816     lw           t4, 0(a0)
2817     lw           t5, 4(a0)
2818     lw           t6, 8(a0)
2819     lw           t7, 12(a0)
2820     addiu        a1, a1, 16
2822     addu_s.qb    t4, t4, t0
2823     addu_s.qb    t5, t5, t1
2824     addu_s.qb    t6, t6, t2
2825     addu_s.qb    t7, t7, t3
2827     sw           t4, 0(a0)
2828     sw           t5, 4(a0)
2829     sw           t6, 8(a0)
2830     sw           t7, 12(a0)
2832     beqz         a2, 4f
2833      addiu       a0, a0, 16
2835     lw           t0, 0(a1)
2836     lw           t1, 0(a0)
2837     addiu        a1, a1, 4
2838     addiu        a2, a2, -1
2839     addu_s.qb    t1, t1, t0
2840     sw           t1, 0(a0)
2841     bnez         a2, 3b
2842      addiu       a0, a0, 4
2844     jr           ra
2845      nop
2847 END(pixman_composite_add_8888_8888_asm_mips)
2849 LEAF_MIPS_DSPR2(pixman_composite_out_reverse_8_0565_asm_mips)
2851  * a0 - dst  (r5g6b5)
2852  * a1 - src  (a8)
2853  * a2 - w
2854  */
2856     beqz     a2, 4f
2857      nop
2859     SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
2860     li       t2, 0xf800f800
2861     li       t3, 0x07e007e0
2862     li       t4, 0x001F001F
2863     li       t5, 0x00ff00ff
2865     addiu    t1, a2, -1
2866     beqz     t1, 2f
2867      nop
2869     lbu      t0, 0(a1) /* t0 = source      (a8) */
2870     lbu      t1, 1(a1) /* t1 = source      (a8) */
2871     lhu      t6, 0(a0) /* t6 = destination (r5g6b5) */
2872     lhu      t7, 2(a0) /* t7 = destination (r5g6b5) */
2873     addiu    a1, a1, 2
2875     not      t0, t0
2876     not      t1, t1
2877     andi     t0, 0xff  /* t0 = neg source1 */
2878     andi     t1, 0xff  /* t1 = neg source2 */
2879     CONVERT_2x0565_TO_2x8888 t6, t7, t8, t9, t3, t4, s0, s1, s2, s3
2880     MIPS_2xUN8x4_MUL_2xUN8   t8, t9, t0, t1, t6, t7, t5, s0, s1, s2, s3, t8, t9
2881     CONVERT_2x8888_TO_2x0565 t6, t7, t8, t9, t2, t3, t4, s0, s1
2883     sh       t8, 0(a0)
2884     sh       t9, 2(a0)
2885     addiu    a2, a2, -2
2886     addiu    t1, a2, -1
2887     bgtz     t1, 1b
2888      addiu   a0, a0, 4
2890     beqz     a2, 3f
2891      nop
2892     lbu      t0, 0(a1) /* t0 = source      (a8) */
2893     lhu      t1, 0(a0) /* t1 = destination (r5g6b5) */
2895     not      t0, t0
2896     andi     t0, 0xff  /* t0 = neg source */
2897     CONVERT_1x0565_TO_1x8888 t1, t2, t3, t4
2898     MIPS_UN8x4_MUL_UN8        t2, t0, t1, t5, t3, t4, t6
2899     CONVERT_1x8888_TO_1x0565 t1, t2, t3, t4
2901     sh       t2, 0(a0)
2903     RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
2905     j        ra
2906      nop
2908 END(pixman_composite_out_reverse_8_0565_asm_mips)
2910 LEAF_MIPS_DSPR2(pixman_composite_out_reverse_8_8888_asm_mips)
2912  * a0 - dst  (a8r8g8b8)
2913  * a1 - src  (a8)
2914  * a2 - w
2915  */
2917     beqz     a2, 3f
2918      nop
2919     li       t4, 0x00ff00ff
2920     addiu    t1, a2, -1
2921     beqz     t1, 2f
2922      nop
2924     lbu      t0, 0(a1) /* t0 = source      (a8) */
2925     lbu      t1, 1(a1) /* t1 = source      (a8) */
2926     lw       t2, 0(a0) /* t2 = destination (a8r8g8b8) */
2927     lw       t3, 4(a0) /* t3 = destination (a8r8g8b8) */
2928     addiu    a1, a1, 2
2929     not      t0, t0
2930     not      t1, t1
2931     andi     t0, 0xff  /* t0 = neg source */
2932     andi     t1, 0xff  /* t1 = neg source */
2934     MIPS_2xUN8x4_MUL_2xUN8 t2, t3, t0, t1, t5, t6, t4, t7, t8, t9, t2, t3, t0
2936     sw       t5, 0(a0)
2937     sw       t6, 4(a0)
2938     addiu    a2, a2, -2
2939     addiu    t1, a2, -1
2940     bgtz     t1, 1b
2941      addiu   a0, a0, 8
2943     beqz     a2, 3f
2944      nop
2945     lbu      t0, 0(a1) /* t0 = source      (a8) */
2946     lw       t1, 0(a0) /* t1 = destination (a8r8g8b8) */
2947     not      t0, t0
2948     andi     t0, 0xff  /* t0 = neg source */
2950     MIPS_UN8x4_MUL_UN8 t1, t0, t2, t4, t3, t5, t6
2952     sw       t2, 0(a0)
2954     j        ra
2955      nop
2957 END(pixman_composite_out_reverse_8_8888_asm_mips)
2959 LEAF_MIPS_DSPR2(pixman_composite_over_reverse_n_8888_asm_mips)
2961  * a0 - dst  (a8r8g8b8)
2962  * a1 - src  (32bit constant)
2963  * a2 - w
2964  */
2966     beqz              a2, 5f
2967      nop
2969     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7
2970     li                t0, 0x00ff00ff
2971     srl               t9, a2, 2   /* t9 = how many multiples of 4 src pixels */
2972     beqz              t9, 2f      /* branch if less than 4 src pixels */
2973      nop
2975     beqz              t9, 2f
2976      addiu            t9, t9, -1
2978     lw                t1, 0(a0)
2979     lw                t2, 4(a0)
2980     lw                t3, 8(a0)
2981     lw                t4, 12(a0)
2983     addiu             a2, a2, -4
2985     not               t5, t1
2986     not               t6, t2
2987     not               t7, t3
2988     not               t8, t4
2989     srl               t5, t5, 24
2990     srl               t6, t6, 24
2991     srl               t7, t7, 24
2992     srl               t8, t8, 24
2993     replv.ph          t5, t5
2994     replv.ph          t6, t6
2995     replv.ph          t7, t7
2996     replv.ph          t8, t8
2997     muleu_s.ph.qbl    s0, a1, t5
2998     muleu_s.ph.qbr    s1, a1, t5
2999     muleu_s.ph.qbl    s2, a1, t6
3000     muleu_s.ph.qbr    s3, a1, t6
3001     muleu_s.ph.qbl    s4, a1, t7
3002     muleu_s.ph.qbr    s5, a1, t7
3003     muleu_s.ph.qbl    s6, a1, t8
3004     muleu_s.ph.qbr    s7, a1, t8
3006     shra_r.ph         t5, s0, 8
3007     shra_r.ph         t6, s1, 8
3008     shra_r.ph         t7, s2, 8
3009     shra_r.ph         t8, s3, 8
3010     and               t5, t5, t0
3011     and               t6, t6, t0
3012     and               t7, t7, t0
3013     and               t8, t8, t0
3014     addq.ph           s0, s0, t5
3015     addq.ph           s1, s1, t6
3016     addq.ph           s2, s2, t7
3017     addq.ph           s3, s3, t8
3018     shra_r.ph         s0, s0, 8
3019     shra_r.ph         s1, s1, 8
3020     shra_r.ph         s2, s2, 8
3021     shra_r.ph         s3, s3, 8
3022     shra_r.ph         t5, s4, 8
3023     shra_r.ph         t6, s5, 8
3024     shra_r.ph         t7, s6, 8
3025     shra_r.ph         t8, s7, 8
3026     and               t5, t5, t0
3027     and               t6, t6, t0
3028     and               t7, t7, t0
3029     and               t8, t8, t0
3030     addq.ph           s4, s4, t5
3031     addq.ph           s5, s5, t6
3032     addq.ph           s6, s6, t7
3033     addq.ph           s7, s7, t8
3034     shra_r.ph         s4, s4, 8
3035     shra_r.ph         s5, s5, 8
3036     shra_r.ph         s6, s6, 8
3037     shra_r.ph         s7, s7, 8
3039     precr.qb.ph       t5, s0, s1
3040     precr.qb.ph       t6, s2, s3
3041     precr.qb.ph       t7, s4, s5
3042     precr.qb.ph       t8, s6, s7
3043     addu_s.qb         t5, t1, t5
3044     addu_s.qb         t6, t2, t6
3045     addu_s.qb         t7, t3, t7
3046     addu_s.qb         t8, t4, t8
3048     sw                t5, 0(a0)
3049     sw                t6, 4(a0)
3050     sw                t7, 8(a0)
3051     sw                t8, 12(a0)
3052     b                 1b
3053      addiu            a0, a0, 16
3056     beqz              a2, 4f
3057      nop
3059     lw                t1, 0(a0)
3061     not               t2, t1
3062     srl               t2, t2, 24
3063     replv.ph          t2, t2
3065     muleu_s.ph.qbl    t4, a1, t2
3066     muleu_s.ph.qbr    t5, a1, t2
3067     shra_r.ph         t6, t4, 8
3068     shra_r.ph         t7, t5, 8
3070     and               t6,t6,t0
3071     and               t7,t7,t0
3073     addq.ph           t8, t4, t6
3074     addq.ph           t9, t5, t7
3076     shra_r.ph         t8, t8, 8
3077     shra_r.ph         t9, t9, 8
3079     precr.qb.ph       t9, t8, t9
3081     addu_s.qb         t9, t1, t9
3082     sw                t9, 0(a0)
3084     addiu             a2, a2, -1
3085     bnez              a2, 3b
3086      addiu            a0, a0, 4
3088     RESTORE_REGS_FROM_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7
3090     j                 ra
3091      nop
3093 END(pixman_composite_over_reverse_n_8888_asm_mips)
3095 LEAF_MIPS_DSPR2(pixman_composite_in_n_8_asm_mips)
3097  * a0 - dst  (a8)
3098  * a1 - src  (32bit constant)
3099  * a2 - w
3100  */
3102     li                t9, 0x00ff00ff
3103     beqz              a2, 3f
3104      nop
3105     srl               t7, a2, 2   /* t7 = how many multiples of 4 dst pixels */
3106     beqz              t7, 1f      /* branch if less than 4 src pixels */
3107      nop
3109     srl               t8, a1, 24
3110     replv.ph          t8, t8
3113     beqz              t7, 1f
3114      addiu            t7, t7, -1
3115     lbu               t0, 0(a0)
3116     lbu               t1, 1(a0)
3117     lbu               t2, 2(a0)
3118     lbu               t3, 3(a0)
3120     precr_sra.ph.w    t1, t0, 0
3121     precr_sra.ph.w    t3, t2, 0
3122     precr.qb.ph       t0, t3, t1
3124     muleu_s.ph.qbl    t2, t0, t8
3125     muleu_s.ph.qbr    t3, t0, t8
3126     shra_r.ph         t4, t2, 8
3127     shra_r.ph         t5, t3, 8
3128     and               t4, t4, t9
3129     and               t5, t5, t9
3130     addq.ph           t2, t2, t4
3131     addq.ph           t3, t3, t5
3132     shra_r.ph         t2, t2, 8
3133     shra_r.ph         t3, t3, 8
3134     precr.qb.ph       t2, t2, t3
3136     sb                t2, 0(a0)
3137     srl               t2, t2, 8
3138     sb                t2, 1(a0)
3139     srl               t2, t2, 8
3140     sb                t2, 2(a0)
3141     srl               t2, t2, 8
3142     sb                t2, 3(a0)
3143     addiu             a2, a2, -4
3144     b                 0b
3145      addiu            a0, a0, 4
3148     beqz              a2, 3f
3149      nop
3150     srl               t8, a1, 24
3152     lbu               t0, 0(a0)
3154     mul               t2, t0, t8
3155     shra_r.ph         t3, t2, 8
3156     andi              t3, t3, 0x00ff
3157     addq.ph           t2, t2, t3
3158     shra_r.ph         t2, t2, 8
3160     sb                t2, 0(a0)
3161     addiu             a2, a2, -1
3162     bnez              a2, 2b
3163      addiu            a0, a0, 1
3166     j                 ra
3167      nop
3169 END(pixman_composite_in_n_8_asm_mips)
3171 LEAF_MIPS_DSPR2(pixman_scaled_nearest_scanline_8888_8888_OVER_asm_mips)
3173  * a0     - dst  (a8r8g8b8)
3174  * a1     - src  (a8r8g8b8)
3175  * a2     - w
3176  * a3     - vx
3177  * 16(sp) - unit_x
3178  */
3180     SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
3181     lw       t8, 16(sp) /* t8 = unit_x */
3182     li       t6, 0x00ff00ff
3183     beqz     a2, 3f
3184      nop
3185     addiu    t1, a2, -1
3186     beqz     t1, 2f
3187      nop
3189     sra      t0, a3, 16 /* t0 = vx >> 16 */
3190     sll      t0, t0, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3191     addu     t0, a1, t0
3192     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3193     addu     a3, a3, t8 /* a3 = vx + unit_x */
3195     sra      t1, a3, 16 /* t0 = vx >> 16 */
3196     sll      t1, t1, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3197     addu     t1, a1, t1
3198     lw       t1, 0(t1)  /* t1 = source      (a8r8g8b8) */
3199     addu     a3, a3, t8 /* a3 = vx + unit_x */
3201     lw       t2, 0(a0)  /* t2 = destination (a8r8g8b8) */
3202     lw       t3, 4(a0)  /* t3 = destination (a8r8g8b8) */
3204     OVER_2x8888_2x8888 t0, t1, t2, t3, t4, t5, t6, t7, t9, s0, s1, s2, s3
3206     sw       t4, 0(a0)
3207     sw       t5, 4(a0)
3208     addiu    a2, a2, -2
3209     addiu    t1, a2, -1
3210     bgtz     t1, 1b
3211      addiu   a0, a0, 8
3213     beqz     a2, 3f
3214      nop
3215     sra      t0, a3, 16 /* t0 = vx >> 16 */
3216     sll      t0, t0, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3217     addu     t0, a1, t0
3218     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3219     lw       t1, 0(a0)  /* t1 = destination (a8r8g8b8) */
3220     addu     a3, a3, t8 /* a3 = vx + unit_x */
3222     OVER_8888_8888 t0, t1, t2, t6, t4, t5, t3, t7
3224     sw       t2, 0(a0)
3226     RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
3227     j        ra
3228      nop
3230 END(pixman_scaled_nearest_scanline_8888_8888_OVER_asm_mips)
3232 LEAF_MIPS_DSPR2(pixman_scaled_nearest_scanline_8888_0565_OVER_asm_mips)
3234  * a0     - dst  (r5g6b5)
3235  * a1     - src  (a8r8g8b8)
3236  * a2     - w
3237  * a3     - vx
3238  * 16(sp) - unit_x
3239  */
3241     SAVE_REGS_ON_STACK 24, s0, s1, s2, s3, s4, v0, v1
3242     lw       t8, 40(sp) /* t8 = unit_x */
3243     li       t4, 0x00ff00ff
3244     li       t5, 0xf800f800
3245     li       t6, 0x07e007e0
3246     li       t7, 0x001F001F
3247     beqz     a2, 3f
3248      nop
3249     addiu    t1, a2, -1
3250     beqz     t1, 2f
3251      nop
3253     sra      t0, a3, 16 /* t0 = vx >> 16 */
3254     sll      t0, t0, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3255     addu     t0, a1, t0
3256     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3257     addu     a3, a3, t8 /* a3 = vx + unit_x */
3258     sra      t1, a3, 16 /* t0 = vx >> 16 */
3259     sll      t1, t1, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3260     addu     t1, a1, t1
3261     lw       t1, 0(t1)  /* t1 = source      (a8r8g8b8) */
3262     addu     a3, a3, t8 /* a3 = vx + unit_x */
3263     lhu      t2, 0(a0)  /* t2 = destination (r5g6b5) */
3264     lhu      t3, 2(a0)  /* t3 = destination (r5g6b5) */
3266     CONVERT_2x0565_TO_2x8888 t2, t3, v0, v1, t6, t7, s0, s1, s2, s3
3267     OVER_2x8888_2x8888       t0, t1, v0, v1, t2, t3, t4, t9, s0, s1, s2, s3, s4
3268     CONVERT_2x8888_TO_2x0565 t2, t3, v0, v1, t5, t6, t7, t9, s2
3270     sh       v0, 0(a0)
3271     sh       v1, 2(a0)
3272     addiu    a2, a2, -2
3273     addiu    t1, a2, -1
3274     bgtz     t1, 1b
3275      addiu   a0, a0, 4
3277     beqz     a2, 3f
3278      nop
3279     sra      t0, a3, 16 /* t0 = vx >> 16 */
3280     sll      t0, t0, 2  /* t0 = t0 * 4 (a8r8g8b8) */
3281     addu     t0, a1, t0
3282     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3283     lhu      t1, 0(a0)  /* t1 = destination (r5g6b5) */
3284     addu     a3, a3, t8 /* a3 = vx + unit_x */
3286     CONVERT_1x0565_TO_1x8888 t1, t2, t5, t6
3287     OVER_8888_8888           t0, t2, t1, t4, t3, t5, t6, t7
3288     CONVERT_1x8888_TO_1x0565 t1, t2, t5, t6
3290     sh       t2, 0(a0)
3292     RESTORE_REGS_FROM_STACK 24, s0, s1, s2, s3, s4, v0, v1
3293     j        ra
3294      nop
3296 END(pixman_scaled_nearest_scanline_8888_0565_OVER_asm_mips)
3298 LEAF_MIPS_DSPR2(pixman_scaled_nearest_scanline_0565_8888_SRC_asm_mips)
3300  * a0     - dst (a8r8g8b8)
3301  * a1     - src (r5g6b5)
3302  * a2     - w
3303  * a3     - vx
3304  * 16(sp) - unit_x
3305  */
3307     SAVE_REGS_ON_STACK 0, v0
3308     beqz     a2, 3f
3309      nop
3311     lw       v0, 16(sp) /* v0 = unit_x */
3312     addiu    t1, a2, -1
3313     beqz     t1, 2f
3314      nop
3316     li       t4, 0x07e007e0
3317     li       t5, 0x001F001F
3319     sra      t0, a3, 16 /* t0 = vx >> 16 */
3320     sll      t0, t0, 1  /* t0 = t0 * 2 ((r5g6b5)) */
3321     addu     t0, a1, t0
3322     lhu      t0, 0(t0)  /* t0 = source ((r5g6b5)) */
3323     addu     a3, a3, v0 /* a3 = vx + unit_x */
3324     sra      t1, a3, 16 /* t1 = vx >> 16 */
3325     sll      t1, t1, 1  /* t1 = t1 * 2 ((r5g6b5)) */
3326     addu     t1, a1, t1
3327     lhu      t1, 0(t1)  /* t1 = source ((r5g6b5)) */
3328     addu     a3, a3, v0 /* a3 = vx + unit_x */
3329     addiu    a2, a2, -2
3331     CONVERT_2x0565_TO_2x8888 t0, t1, t2, t3, t4, t5, t6, t7, t8, t9
3333     sw       t2, 0(a0)
3334     sw       t3, 4(a0)
3336     addiu    t2, a2, -1
3337     bgtz     t2, 1b
3338      addiu   a0, a0, 8
3340     beqz     a2, 3f
3341      nop
3342     sra      t0, a3, 16 /* t0 = vx >> 16 */
3343     sll      t0, t0, 1  /* t0 = t0 * 2 ((r5g6b5)) */
3344     addu     t0, a1, t0
3345     lhu      t0, 0(t0)  /* t0 = source ((r5g6b5)) */
3347     CONVERT_1x0565_TO_1x8888 t0, t1, t2, t3
3349     sw       t1, 0(a0)
3351     RESTORE_REGS_FROM_STACK 0, v0
3352     j        ra
3353      nop
3355 END(pixman_scaled_nearest_scanline_0565_8888_SRC_asm_mips)
3357 LEAF_MIPS_DSPR2(pixman_scaled_nearest_scanline_8888_8_0565_OVER_asm_mips)
3359  * a0     - dst  (r5g6b5)
3360  * a1     - src  (a8r8g8b8)
3361  * a2     - mask (a8)
3362  * a3     - w
3363  * 16(sp) - vx
3364  * 20(sp) - unit_x
3365  */
3366     beqz     a3, 4f
3367      nop
3369     SAVE_REGS_ON_STACK 20, v0, v1, s0, s1, s2, s3, s4, s5
3370     lw       v0, 36(sp) /* v0 = vx */
3371     lw       v1, 40(sp) /* v1 = unit_x */
3372     li       t6, 0x00ff00ff
3373     li       t7, 0xf800f800
3374     li       t8, 0x07e007e0
3375     li       t9, 0x001F001F
3377     addiu    t1, a3, -1
3378     beqz     t1, 2f
3379      nop
3381     sra      t0, v0, 16 /* t0 = vx >> 16 */
3382     sll      t0, t0, 2  /* t0 = t0 * 4      (a8r8g8b8) */
3383     addu     t0, a1, t0
3384     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3385     addu     v0, v0, v1 /* v0 = vx + unit_x */
3386     sra      t1, v0, 16 /* t1 = vx >> 16 */
3387     sll      t1, t1, 2  /* t1 = t1 * 4      (a8r8g8b8) */
3388     addu     t1, a1, t1
3389     lw       t1, 0(t1)  /* t1 = source      (a8r8g8b8) */
3390     addu     v0, v0, v1 /* v0 = vx + unit_x */
3391     lbu      t2, 0(a2)  /* t2 = mask        (a8) */
3392     lbu      t3, 1(a2)  /* t3 = mask        (a8) */
3393     lhu      t4, 0(a0)  /* t4 = destination (r5g6b5) */
3394     lhu      t5, 2(a0)  /* t5 = destination (r5g6b5) */
3395     addiu    a2, a2, 2
3397     CONVERT_2x0565_TO_2x8888 t4, t5, s0, s1, t8, t9, s2, s3, s4, s5
3398     OVER_2x8888_2x8_2x8888   t0, t1, \
3399                              t2, t3, \
3400                              s0, s1, \
3401                              t4, t5, \
3402                              t6, s2, s3, s4, s5, t2, t3
3403     CONVERT_2x8888_TO_2x0565 t4, t5, s0, s1, t7, t8, t9, s2, s3
3405     sh       s0, 0(a0)
3406     sh       s1, 2(a0)
3407     addiu    a3, a3, -2
3408     addiu    t1, a3, -1
3409     bgtz     t1, 1b
3410      addiu   a0, a0, 4
3412     beqz     a3, 3f
3413      nop
3414     sra      t0, v0, 16 /* t0 = vx >> 16 */
3415     sll      t0, t0, 2  /* t0 = t0 * 4      (a8r8g8b8) */
3416     addu     t0, a1, t0
3417     lw       t0, 0(t0)  /* t0 = source      (a8r8g8b8) */
3418     lbu      t1, 0(a2)  /* t1 = mask        (a8) */
3419     lhu      t2, 0(a0)  /* t2 = destination (r5g6b5) */
3421     CONVERT_1x0565_TO_1x8888 t2, t3, t4, t5
3422     OVER_8888_8_8888         t0, t1, t3, t2, t6, t4, t5, t7, t8
3423     CONVERT_1x8888_TO_1x0565 t2, t3, t4, t5
3425     sh       t3, 0(a0)
3427     RESTORE_REGS_FROM_STACK 20, v0, v1, s0, s1, s2, s3, s4, s5
3429     j        ra
3430      nop
3432 END(pixman_scaled_nearest_scanline_8888_8_0565_OVER_asm_mips)
3434 LEAF_MIPS_DSPR2(pixman_scaled_nearest_scanline_0565_8_0565_OVER_asm_mips)
3436  * a0     - dst  (r5g6b5)
3437  * a1     - src  (r5g6b5)
3438  * a2     - mask (a8)
3439  * a3     - w
3440  * 16(sp) - vx
3441  * 20(sp) - unit_x
3442  */
3444     beqz     a3, 4f
3445      nop
3446     SAVE_REGS_ON_STACK 20, v0, v1, s0, s1, s2, s3, s4, s5
3447     lw       v0, 36(sp) /* v0 = vx */
3448     lw       v1, 40(sp) /* v1 = unit_x */
3449     li       t4, 0xf800f800
3450     li       t5, 0x07e007e0
3451     li       t6, 0x001F001F
3452     li       t7, 0x00ff00ff
3454     addiu    t1, a3, -1
3455     beqz     t1, 2f
3456      nop
3458     sra      t0, v0, 16 /* t0 = vx >> 16 */
3459     sll      t0, t0, 1  /* t0 = t0 * 2      (r5g6b5) */
3460     addu     t0, a1, t0
3461     lhu      t0, 0(t0)  /* t0 = source      (r5g6b5) */
3462     addu     v0, v0, v1 /* v0 = vx + unit_x */
3463     sra      t1, v0, 16 /* t1 = vx >> 16 */
3464     sll      t1, t1, 1  /* t1 = t1 * 2      (r5g6b5) */
3465     addu     t1, a1, t1
3466     lhu      t1, 0(t1)  /* t1 = source      (r5g6b5) */
3467     addu     v0, v0, v1 /* v0 = vx + unit_x */
3468     lbu      t2, 0(a2)  /* t2 = mask        (a8) */
3469     lbu      t3, 1(a2)  /* t3 = mask        (a8) */
3470     lhu      t8, 0(a0)  /* t8 = destination (r5g6b5) */
3471     lhu      t9, 2(a0)  /* t9 = destination (r5g6b5) */
3472     addiu    a2, a2, 2
3474     CONVERT_2x0565_TO_2x8888 t0, t1, s0, s1, t5, t6, s2, s3, s4, s5
3475     CONVERT_2x0565_TO_2x8888 t8, t9, s2, s3, t5, t6, s4, s5, t0, t1
3476     OVER_2x8888_2x8_2x8888   s0, s1, \
3477                              t2, t3, \
3478                              s2, s3, \
3479                              t0, t1, \
3480                              t7, t8, t9, s4, s5, s0, s1
3481     CONVERT_2x8888_TO_2x0565 t0, t1, s0, s1, t4, t5, t6, s2, s3
3483     sh       s0, 0(a0)
3484     sh       s1, 2(a0)
3485     addiu    a3, a3, -2
3486     addiu    t1, a3, -1
3487     bgtz     t1, 1b
3488      addiu   a0, a0, 4
3490     beqz     a3, 3f
3491      nop
3492     sra      t0, v0, 16 /* t0 = vx >> 16 */
3493     sll      t0, t0, 1  /* t0 = t0 * 2      (r5g6b5) */
3494     addu     t0, a1, t0
3496     lhu      t0, 0(t0)  /* t0 = source      (r5g6b5) */
3497     lbu      t1, 0(a2)  /* t1 = mask        (a8) */
3498     lhu      t2, 0(a0)  /* t2 = destination (r5g6b5) */
3500     CONVERT_1x0565_TO_1x8888 t0, t3, t4, t5
3501     CONVERT_1x0565_TO_1x8888 t2, t4, t5, t6
3502     OVER_8888_8_8888         t3, t1, t4, t0, t7, t2, t5, t6, t8
3503     CONVERT_1x8888_TO_1x0565 t0, t3, t4, t5
3505     sh       t3, 0(a0)
3507     RESTORE_REGS_FROM_STACK 20, v0, v1, s0, s1, s2, s3, s4, s5
3509     j        ra
3510      nop
3512 END(pixman_scaled_nearest_scanline_0565_8_0565_OVER_asm_mips)
3514 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_mips)
3516  * a0     - *dst
3517  * a1     - *src_top
3518  * a2     - *src_bottom
3519  * a3     - w
3520  * 16(sp) - wt
3521  * 20(sp) - wb
3522  * 24(sp) - vx
3523  * 28(sp) - unit_x
3524  */
3526     beqz     a3, 1f
3527      nop
3529     SAVE_REGS_ON_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3531     lw       s0, 36(sp)     /* s0 = wt */
3532     lw       s1, 40(sp)     /* s1 = wb */
3533     lw       s2, 44(sp)     /* s2 = vx */
3534     lw       s3, 48(sp)     /* s3 = unit_x */
3535     li       v0, BILINEAR_INTERPOLATION_RANGE
3537     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3538     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3540     andi     t4, s2, 0xffff /* t4 = (short)vx */
3541     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3542     subu     t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3544     mul      s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3545     mul      s5, s0, t4     /* s5 = wt*(vx>>8) */
3546     mul      s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3547     mul      s7, s1, t4     /* s7 = wb*(vx>>8) */
3549     sra      t9, s2, 16
3550     sll      t9, t9, 2
3551     addiu    t8, t9, 4
3552     lwx      t0, t9(a1)     /* t0 = tl */
3553     lwx      t1, t8(a1)     /* t1 = tr */
3554     addiu    a3, a3, -1
3555     lwx      t2, t9(a2)     /* t2 = bl */
3556     lwx      t3, t8(a2)     /* t3 = br */
3558     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3560     addu     s2, s2, s3     /* vx += unit_x; */
3561     sw       t0, 0(a0)
3562     bnez     a3, 0b
3563      addiu   a0, a0, 4
3565     RESTORE_REGS_FROM_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3567     j        ra
3568      nop
3570 END(pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_mips)
3572 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_0565_SRC_asm_mips)
3574  * a0     - *dst
3575  * a1     - *src_top
3576  * a2     - *src_bottom
3577  * a3     - w
3578  * 16(sp) - wt
3579  * 20(sp) - wb
3580  * 24(sp) - vx
3581  * 28(sp) - unit_x
3582  */
3584     beqz     a3, 1f
3585      nop
3587     SAVE_REGS_ON_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3589     lw       s0, 36(sp)     /* s0 = wt */
3590     lw       s1, 40(sp)     /* s1 = wb */
3591     lw       s2, 44(sp)     /* s2 = vx */
3592     lw       s3, 48(sp)     /* s3 = unit_x */
3593     li       v0, BILINEAR_INTERPOLATION_RANGE
3595     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3596     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3598     andi     t4, s2, 0xffff /* t4 = (short)vx */
3599     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3600     subu     t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3602     mul      s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3603     mul      s5, s0, t4     /* s5 = wt*(vx>>8) */
3604     mul      s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3605     mul      s7, s1, t4     /* s7 = wb*(vx>>8) */
3607     sra      t9, s2, 16
3608     sll      t9, t9, 2
3609     addiu    t8, t9, 4
3610     lwx      t0, t9(a1)     /* t0 = tl */
3611     lwx      t1, t8(a1)     /* t1 = tr */
3612     addiu    a3, a3, -1
3613     lwx      t2, t9(a2)     /* t2 = bl */
3614     lwx      t3, t8(a2)     /* t3 = br */
3616     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3617     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
3619     addu     s2, s2, s3     /* vx += unit_x; */
3620     sh       t1, 0(a0)
3621     bnez     a3, 0b
3622      addiu   a0, a0, 2
3624     RESTORE_REGS_FROM_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3626     j        ra
3627      nop
3629 END(pixman_scaled_bilinear_scanline_8888_0565_SRC_asm_mips)
3631 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_0565_8888_SRC_asm_mips)
3633  * a0     - *dst
3634  * a1     - *src_top
3635  * a2     - *src_bottom
3636  * a3     - w
3637  * 16(sp) - wt
3638  * 20(sp) - wb
3639  * 24(sp) - vx
3640  * 28(sp) - unit_x
3641  */
3643     beqz     a3, 1f
3644      nop
3646     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3648     lw       s0, 44(sp)     /* s0 = wt */
3649     lw       s1, 48(sp)     /* s1 = wb */
3650     lw       s2, 52(sp)     /* s2 = vx */
3651     lw       s3, 56(sp)     /* s3 = unit_x */
3652     li       v0, BILINEAR_INTERPOLATION_RANGE
3653     li       v1, 0x07e007e0
3654     li       s8, 0x001f001f
3656     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3657     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3659     andi     t4, s2, 0xffff /* t4 = (short)vx */
3660     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3661     subu     t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3663     mul      s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3664     mul      s5, s0, t4     /* s5 = wt*(vx>>8) */
3665     mul      s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3666     mul      s7, s1, t4     /* s7 = wb*(vx>>8) */
3668     sra      t9, s2, 16
3669     sll      t9, t9, 1
3670     addiu    t8, t9, 2
3671     lhx      t0, t9(a1)     /* t0 = tl */
3672     lhx      t1, t8(a1)     /* t1 = tr */
3673     andi     t1, t1, 0xffff
3674     addiu    a3, a3, -1
3675     lhx      t2, t9(a2)     /* t2 = bl */
3676     lhx      t3, t8(a2)     /* t3 = br */
3677     andi     t3, t3, 0xffff
3679     CONVERT_2x0565_TO_2x8888 t0, t1, t0, t1, v1, s8, t4, t5, t6, t7
3680     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, v1, s8, t4, t5, t6, t7
3681     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3683     addu     s2, s2, s3     /* vx += unit_x; */
3684     sw       t0, 0(a0)
3685     bnez     a3, 0b
3686      addiu   a0, a0, 4
3688     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3690     j        ra
3691      nop
3693 END(pixman_scaled_bilinear_scanline_0565_8888_SRC_asm_mips)
3695 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_0565_0565_SRC_asm_mips)
3697  * a0     - *dst
3698  * a1     - *src_top
3699  * a2     - *src_bottom
3700  * a3     - w
3701  * 16(sp) - wt
3702  * 20(sp) - wb
3703  * 24(sp) - vx
3704  * 28(sp) - unit_x
3705  */
3707     beqz     a3, 1f
3708      nop
3710     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3712     lw       s0, 44(sp)     /* s0 = wt */
3713     lw       s1, 48(sp)     /* s1 = wb */
3714     lw       s2, 52(sp)     /* s2 = vx */
3715     lw       s3, 56(sp)     /* s3 = unit_x */
3716     li       v0, BILINEAR_INTERPOLATION_RANGE
3717     li       v1, 0x07e007e0
3718     li       s8, 0x001f001f
3720     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3721     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3723     andi     t4, s2, 0xffff /* t4 = (short)vx */
3724     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3725     subu     t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3727     mul      s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3728     mul      s5, s0, t4     /* s5 = wt*(vx>>8) */
3729     mul      s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3730     mul      s7, s1, t4     /* s7 = wb*(vx>>8) */
3732     sra      t9, s2, 16
3733     sll      t9, t9, 1
3734     addiu    t8, t9, 2
3735     lhx      t0, t9(a1)     /* t0 = tl */
3736     lhx      t1, t8(a1)     /* t1 = tr */
3737     andi     t1, t1, 0xffff
3738     addiu    a3, a3, -1
3739     lhx      t2, t9(a2)     /* t2 = bl */
3740     lhx      t3, t8(a2)     /* t3 = br */
3741     andi     t3, t3, 0xffff
3743     CONVERT_2x0565_TO_2x8888 t0, t1, t0, t1, v1, s8, t4, t5, t6, t7
3744     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, v1, s8, t4, t5, t6, t7
3745     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3746     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
3748     addu     s2, s2, s3     /* vx += unit_x; */
3749     sh       t1, 0(a0)
3750     bnez     a3, 0b
3751      addiu   a0, a0, 2
3753     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3755     j        ra
3756      nop
3758 END(pixman_scaled_bilinear_scanline_0565_0565_SRC_asm_mips)
3760 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8888_OVER_asm_mips)
3762  * a0     - *dst
3763  * a1     - *src_top
3764  * a2     - *src_bottom
3765  * a3     - w
3766  * 16(sp) - wt
3767  * 20(sp) - wb
3768  * 24(sp) - vx
3769  * 28(sp) - unit_x
3770  */
3772     beqz     a3, 1f
3773      nop
3775     SAVE_REGS_ON_STACK 24, v0, s0, s1, s2, s3, s4, s5, s6, s7, s8
3777     lw       s0, 40(sp)     /* s0 = wt */
3778     lw       s1, 44(sp)     /* s1 = wb */
3779     lw       s2, 48(sp)     /* s2 = vx */
3780     lw       s3, 52(sp)     /* s3 = unit_x */
3781     li       v0, BILINEAR_INTERPOLATION_RANGE
3782     li       s8, 0x00ff00ff
3784     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3785     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3787     andi     t4, s2, 0xffff /* t4 = (short)vx */
3788     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3789     subu     t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3791     mul      s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3792     mul      s5, s0, t4     /* s5 = wt*(vx>>8) */
3793     mul      s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3794     mul      s7, s1, t4     /* s7 = wb*(vx>>8) */
3796     sra      t9, s2, 16
3797     sll      t9, t9, 2
3798     addiu    t8, t9, 4
3799     lwx      t0, t9(a1)     /* t0 = tl */
3800     lwx      t1, t8(a1)     /* t1 = tr */
3801     addiu    a3, a3, -1
3802     lwx      t2, t9(a2)     /* t2 = bl */
3803     lwx      t3, t8(a2)     /* t3 = br */
3805     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3806     lw       t1, 0(a0)      /* t1 = dest */
3807     OVER_8888_8888 t0, t1, t2, s8, t3, t4, t5, t6
3809     addu     s2, s2, s3     /* vx += unit_x; */
3810     sw       t2, 0(a0)
3811     bnez     a3, 0b
3812      addiu   a0, a0, 4
3814     RESTORE_REGS_FROM_STACK 24, v0, s0, s1, s2, s3, s4, s5, s6, s7, s8
3816     j        ra
3817      nop
3819 END(pixman_scaled_bilinear_scanline_8888_8888_OVER_asm_mips)
3821 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8888_ADD_asm_mips)
3823  * a0     - *dst
3824  * a1     - *src_top
3825  * a2     - *src_bottom
3826  * a3     - w
3827  * 16(sp) - wt
3828  * 20(sp) - wb
3829  * 24(sp) - vx
3830  * 28(sp) - unit_x
3831  */
3833     beqz         a3, 1f
3834      nop
3836     SAVE_REGS_ON_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3838     lw           s0, 36(sp)     /* s0 = wt */
3839     lw           s1, 40(sp)     /* s1 = wb */
3840     lw           s2, 44(sp)     /* s2 = vx */
3841     lw           s3, 48(sp)     /* s3 = unit_x */
3842     li           v0, BILINEAR_INTERPOLATION_RANGE
3844     sll          s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3845     sll          s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3847     andi         t4, s2, 0xffff /* t4 = (short)vx */
3848     srl          t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3849     subu         t5, v0, t4     /* t5 = ( 256 - (vx>>8)) */
3851     mul          s4, s0, t5     /* s4 = wt*(256-(vx>>8)) */
3852     mul          s5, s0, t4     /* s5 = wt*(vx>>8) */
3853     mul          s6, s1, t5     /* s6 = wb*(256-(vx>>8)) */
3854     mul          s7, s1, t4     /* s7 = wb*(vx>>8) */
3856     sra          t9, s2, 16
3857     sll          t9, t9, 2
3858     addiu        t8, t9, 4
3859     lwx          t0, t9(a1)     /* t0 = tl */
3860     lwx          t1, t8(a1)     /* t1 = tr */
3861     addiu        a3, a3, -1
3862     lwx          t2, t9(a2)     /* t2 = bl */
3863     lwx          t3, t8(a2)     /* t3 = br */
3865     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3866     lw           t1, 0(a0)
3867     addu_s.qb    t2, t0, t1
3869     addu         s2, s2, s3     /* vx += unit_x; */
3870     sw           t2, 0(a0)
3871     bnez         a3, 0b
3872      addiu       a0, a0, 4
3874     RESTORE_REGS_FROM_STACK 20, v0, s0, s1, s2, s3, s4, s5, s6, s7
3876     j            ra
3877      nop
3879 END(pixman_scaled_bilinear_scanline_8888_8888_ADD_asm_mips)
3881 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8_8888_SRC_asm_mips)
3883  * a0     - *dst
3884  * a1     - *mask
3885  * a2     - *src_top
3886  * a3     - *src_bottom
3887  * 16(sp) - wt
3888  * 20(sp) - wb
3889  * 24(sp) - vx
3890  * 28(sp) - unit_x
3891  * 32(sp) - w
3892  */
3894     lw       v1, 32(sp)
3895     beqz     v1, 1f
3896      nop
3898     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3900     lw       s0, 44(sp)        /* s0 = wt */
3901     lw       s1, 48(sp)        /* s1 = wb */
3902     lw       s2, 52(sp)        /* s2 = vx */
3903     lw       s3, 56(sp)        /* s3 = unit_x */
3904     li       v0, BILINEAR_INTERPOLATION_RANGE
3905     li       s8, 0x00ff00ff
3907     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3908     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3910     andi     t4, s2, 0xffff    /* t4 = (short)vx */
3911     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3912     subu     t5, v0, t4        /* t5 = ( 256 - (vx>>8)) */
3914     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
3915     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
3916     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
3917     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
3919     sra      t9, s2, 16
3920     sll      t9, t9, 2
3921     addiu    t8, t9, 4
3922     lwx      t0, t9(a2)        /* t0 = tl */
3923     lwx      t1, t8(a2)        /* t1 = tr */
3924     addiu    v1, v1, -1
3925     lwx      t2, t9(a3)        /* t2 = bl */
3926     lwx      t3, t8(a3)        /* t3 = br */
3928     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3929     lbu      t1, 0(a1)         /* t1 = mask */
3930     addiu    a1, a1, 1
3931     MIPS_UN8x4_MUL_UN8 t0, t1, t0, s8, t2, t3, t4
3933     addu     s2, s2, s3        /* vx += unit_x; */
3934     sw       t0, 0(a0)
3935     bnez     v1, 0b
3936      addiu   a0, a0, 4
3938     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3940     j        ra
3941      nop
3943 END(pixman_scaled_bilinear_scanline_8888_8_8888_SRC_asm_mips)
3945 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8_0565_SRC_asm_mips)
3947  * a0     - *dst
3948  * a1     - *mask
3949  * a2     - *src_top
3950  * a3     - *src_bottom
3951  * 16(sp) - wt
3952  * 20(sp) - wb
3953  * 24(sp) - vx
3954  * 28(sp) - unit_x
3955  * 32(sp) - w
3956  */
3958     lw       v1, 32(sp)
3959     beqz     v1, 1f
3960      nop
3962     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
3964     lw       s0, 44(sp)        /* s0 = wt */
3965     lw       s1, 48(sp)        /* s1 = wb */
3966     lw       s2, 52(sp)        /* s2 = vx */
3967     lw       s3, 56(sp)        /* s3 = unit_x */
3968     li       v0, BILINEAR_INTERPOLATION_RANGE
3969     li       s8, 0x00ff00ff
3971     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3972     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
3974     andi     t4, s2, 0xffff    /* t4 = (short)vx */
3975     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
3976     subu     t5, v0, t4        /* t5 = ( 256 - (vx>>8)) */
3978     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
3979     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
3980     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
3981     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
3983     sra      t9, s2, 16
3984     sll      t9, t9, 2
3985     addiu    t8, t9, 4
3986     lwx      t0, t9(a2)        /* t0 = tl */
3987     lwx      t1, t8(a2)        /* t1 = tr */
3988     addiu    v1, v1, -1
3989     lwx      t2, t9(a3)        /* t2 = bl */
3990     lwx      t3, t8(a3)        /* t3 = br */
3992     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
3993     lbu      t1, 0(a1)         /* t1 = mask */
3994     addiu    a1, a1, 1
3995     MIPS_UN8x4_MUL_UN8 t0, t1, t0, s8, t2, t3, t4
3996     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
3998     addu     s2, s2, s3        /* vx += unit_x; */
3999     sh       t1, 0(a0)
4000     bnez     v1, 0b
4001      addiu   a0, a0, 2
4003     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
4005     j        ra
4006      nop
4008 END(pixman_scaled_bilinear_scanline_8888_8_0565_SRC_asm_mips)
4010 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_0565_8_x888_SRC_asm_mips)
4012  * a0     - *dst
4013  * a1     - *mask
4014  * a2     - *src_top
4015  * a3     - *src_bottom
4016  * 16(sp) - wt
4017  * 20(sp) - wb
4018  * 24(sp) - vx
4019  * 28(sp) - unit_x
4020  * 32(sp) - w
4021  */
4023     lw       t0, 32(sp)
4024     beqz     t0, 1f
4025      nop
4027     SAVE_REGS_ON_STACK 32, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8, ra
4029     lw       s0, 48(sp)        /* s0 = wt */
4030     lw       s1, 52(sp)        /* s1 = wb */
4031     lw       s2, 56(sp)        /* s2 = vx */
4032     lw       s3, 60(sp)        /* s3 = unit_x */
4033     lw       ra, 64(sp)        /* ra = w */
4034     li       v0, 0x00ff00ff
4035     li       v1, 0x07e007e0
4036     li       s8, 0x001f001f
4038     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4039     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4041     andi     t4, s2, 0xffff    /* t4 = (short)vx */
4042     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
4043     li       t5, BILINEAR_INTERPOLATION_RANGE
4044     subu     t5, t5, t4        /* t5 = ( 256 - (vx>>8)) */
4046     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
4047     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
4048     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
4049     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
4051     sra      t9, s2, 16
4052     sll      t9, t9, 1
4053     addiu    t8, t9, 2
4054     lhx      t0, t9(a2)        /* t0 = tl */
4055     lhx      t1, t8(a2)        /* t1 = tr */
4056     andi     t1, t1, 0xffff
4057     addiu    ra, ra, -1
4058     lhx      t2, t9(a3)        /* t2 = bl */
4059     lhx      t3, t8(a3)        /* t3 = br */
4060     andi     t3, t3, 0xffff
4062     CONVERT_2x0565_TO_2x8888 t0, t1, t0, t1, v1, s8, t4, t5, t6, t7
4063     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, v1, s8, t4, t5, t6, t7
4064     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
4065     lbu      t1, 0(a1)         /* t1 = mask */
4066     addiu    a1, a1, 1
4067     MIPS_UN8x4_MUL_UN8 t0, t1, t0, v0, t2, t3, t4
4069     addu     s2, s2, s3        /* vx += unit_x; */
4070     sw       t0, 0(a0)
4071     bnez     ra, 0b
4072      addiu   a0, a0, 4
4074     RESTORE_REGS_FROM_STACK 32, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8, ra
4076     j        ra
4077      nop
4079 END(pixman_scaled_bilinear_scanline_0565_8_x888_SRC_asm_mips)
4081 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_0565_8_0565_SRC_asm_mips)
4083  * a0     - *dst
4084  * a1     - *mask
4085  * a2     - *src_top
4086  * a3     - *src_bottom
4087  * 16(sp) - wt
4088  * 20(sp) - wb
4089  * 24(sp) - vx
4090  * 28(sp) - unit_x
4091  * 32(sp) - w
4092  */
4094     lw       t0, 32(sp)
4095     beqz     t0, 1f
4096      nop
4098     SAVE_REGS_ON_STACK 32, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8, ra
4100     lw       s0, 48(sp)        /* s0 = wt */
4101     lw       s1, 52(sp)        /* s1 = wb */
4102     lw       s2, 56(sp)        /* s2 = vx */
4103     lw       s3, 60(sp)        /* s3 = unit_x */
4104     lw       ra, 64(sp)        /* ra = w */
4105     li       v0, 0x00ff00ff
4106     li       v1, 0x07e007e0
4107     li       s8, 0x001f001f
4109     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4110     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4112     andi     t4, s2, 0xffff    /* t4 = (short)vx */
4113     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
4114     li       t5, BILINEAR_INTERPOLATION_RANGE
4115     subu     t5, t5, t4        /* t5 = ( 256 - (vx>>8)) */
4117     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
4118     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
4119     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
4120     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
4122     sra      t9, s2, 16
4123     sll      t9, t9, 1
4124     addiu    t8, t9, 2
4125     lhx      t0, t9(a2)        /* t0 = tl */
4126     lhx      t1, t8(a2)        /* t1 = tr */
4127     andi     t1, t1, 0xffff
4128     addiu    ra, ra, -1
4129     lhx      t2, t9(a3)        /* t2 = bl */
4130     lhx      t3, t8(a3)        /* t3 = br */
4131     andi     t3, t3, 0xffff
4133     CONVERT_2x0565_TO_2x8888 t0, t1, t0, t1, v1, s8, t4, t5, t6, t7
4134     CONVERT_2x0565_TO_2x8888 t2, t3, t2, t3, v1, s8, t4, t5, t6, t7
4135     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
4136     lbu      t1, 0(a1)         /* t1 = mask */
4137     addiu    a1, a1, 1
4138     MIPS_UN8x4_MUL_UN8 t0, t1, t0, v0, t2, t3, t4
4139     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
4141     addu     s2, s2, s3        /* vx += unit_x; */
4142     sh       t1, 0(a0)
4143     bnez     ra, 0b
4144      addiu   a0, a0, 2
4146     RESTORE_REGS_FROM_STACK 32, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8, ra
4148     j        ra
4149      nop
4151 END(pixman_scaled_bilinear_scanline_0565_8_0565_SRC_asm_mips)
4153 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8_8888_OVER_asm_mips)
4155  * a0     - dst        (a8r8g8b8)
4156  * a1     - mask       (a8)
4157  * a2     - src_top    (a8r8g8b8)
4158  * a3     - src_bottom (a8r8g8b8)
4159  * 16(sp) - wt
4160  * 20(sp) - wb
4161  * 24(sp) - vx
4162  * 28(sp) - unit_x
4163  * 32(sp) - w
4164  */
4166     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
4168     lw       v1, 60(sp)        /* v1 = w(sp + 32 + 28 save regs stack offset)*/
4169     beqz     v1, 1f
4170      nop
4172     lw       s0, 44(sp)        /* s0 = wt */
4173     lw       s1, 48(sp)        /* s1 = wb */
4174     lw       s2, 52(sp)        /* s2 = vx */
4175     lw       s3, 56(sp)        /* s3 = unit_x */
4176     li       v0, BILINEAR_INTERPOLATION_RANGE
4177     li       s8, 0x00ff00ff
4179     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4180     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4183     andi     t4, s2, 0xffff    /* t4 = (short)vx */
4184     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
4185     subu     t5, v0, t4        /* t5 = ( 256 - (vx>>8)) */
4187     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
4188     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
4189     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
4190     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
4192     sra      t9, s2, 16
4193     sll      t9, t9, 2
4194     addiu    t8, t9, 4
4195     lwx      t0, t9(a2)        /* t0 = tl */
4196     lwx      t1, t8(a2)        /* t1 = tr */
4197     addiu    v1, v1, -1
4198     lwx      t2, t9(a3)        /* t2 = bl */
4199     lwx      t3, t8(a3)        /* t3 = br */
4201     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, \
4202                                       t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
4203     lbu      t1, 0(a1)         /* t1 = mask */
4204     lw       t2, 0(a0)         /* t2 = dst */
4205     addiu    a1, a1, 1
4206     OVER_8888_8_8888 t0, t1, t2, t0, s8, t3, t4, t5, t6
4208     addu     s2, s2, s3        /* vx += unit_x; */
4209     sw       t0, 0(a0)
4210     bnez     v1, 0b
4211      addiu   a0, a0, 4
4214     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
4215     j        ra
4216      nop
4218 END(pixman_scaled_bilinear_scanline_8888_8_8888_OVER_asm_mips)
4220 LEAF_MIPS_DSPR2(pixman_scaled_bilinear_scanline_8888_8_8888_ADD_asm_mips)
4222  * a0     - *dst
4223  * a1     - *mask
4224  * a2     - *src_top
4225  * a3     - *src_bottom
4226  * 16(sp) - wt
4227  * 20(sp) - wb
4228  * 24(sp) - vx
4229  * 28(sp) - unit_x
4230  * 32(sp) - w
4231  */
4233     lw       v1, 32(sp)
4234     beqz     v1, 1f
4235      nop
4237     SAVE_REGS_ON_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
4239     lw       s0, 44(sp)        /* s0 = wt */
4240     lw       s1, 48(sp)        /* s1 = wb */
4241     lw       s2, 52(sp)        /* s2 = vx */
4242     lw       s3, 56(sp)        /* s3 = unit_x */
4243     li       v0, BILINEAR_INTERPOLATION_RANGE
4244     li       s8, 0x00ff00ff
4246     sll      s0, s0, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4247     sll      s1, s1, (2 * (8 - BILINEAR_INTERPOLATION_BITS))
4249     andi     t4, s2, 0xffff    /* t4 = (short)vx */
4250     srl      t4, t4, (16 - BILINEAR_INTERPOLATION_BITS) /* t4 = vx >> 8 */
4251     subu     t5, v0, t4        /* t5 = ( 256 - (vx>>8)) */
4253     mul      s4, s0, t5        /* s4 = wt*(256-(vx>>8)) */
4254     mul      s5, s0, t4        /* s5 = wt*(vx>>8) */
4255     mul      s6, s1, t5        /* s6 = wb*(256-(vx>>8)) */
4256     mul      s7, s1, t4        /* s7 = wb*(vx>>8) */
4258     sra      t9, s2, 16
4259     sll      t9, t9, 2
4260     addiu    t8, t9, 4
4261     lwx      t0, t9(a2)        /* t0 = tl */
4262     lwx      t1, t8(a2)        /* t1 = tr */
4263     addiu    v1, v1, -1
4264     lwx      t2, t9(a3)        /* t2 = bl */
4265     lwx      t3, t8(a3)        /* t3 = br */
4267     BILINEAR_INTERPOLATE_SINGLE_PIXEL t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, s4, s5, s6, s7
4268     lbu      t1, 0(a1)         /* t1 = mask */
4269     lw       t2, 0(a0)         /* t2 = dst */
4270     addiu    a1, a1, 1
4271     MIPS_UN8x4_MUL_UN8_ADD_UN8x4 t0, t1, t2, t0, s8, t3, t4, t5
4273     addu     s2, s2, s3        /* vx += unit_x; */
4274     sw       t0, 0(a0)
4275     bnez     v1, 0b
4276      addiu   a0, a0, 4
4278     RESTORE_REGS_FROM_STACK 28, v0, v1, s0, s1, s2, s3, s4, s5, s6, s7, s8
4280     j        ra
4281      nop
4283 END(pixman_scaled_bilinear_scanline_8888_8_8888_ADD_asm_mips)