mmx: Use Loongson pextrh instruction in expand565
[profile/ivi/pixman.git] / pixman / pixman-mips-dspr2-asm.S
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 (nlukic@mips.com)
30  */
31
32 #include "pixman-mips-dspr2-asm.h"
33
34 LEAF_MIPS_DSPR2(pixman_fill_buff16_mips)
35 /*
36  * a0 - *dest
37  * a1 - count (bytes)
38  * a2 - value to fill buffer with
39  */
40
41     beqz     a1, 3f
42      andi    t1, a0, 0x0002
43     beqz     t1, 0f          /* check if address is 4-byte aligned */
44      nop
45     sh       a2, 0(a0)
46     addiu    a0, a0, 2
47     addiu    a1, a1, -2
48 0:
49     srl      t1, a1, 5       /* t1 how many multiples of 32 bytes */
50     replv.ph a2, a2          /* replicate fill value (16bit) in a2 */
51     beqz     t1, 2f
52      nop
53 1:
54     addiu    t1, t1, -1
55     beqz     t1, 11f
56      addiu   a1, a1, -32
57     pref     30, 32(a0)
58     sw       a2, 0(a0)
59     sw       a2, 4(a0)
60     sw       a2, 8(a0)
61     sw       a2, 12(a0)
62     sw       a2, 16(a0)
63     sw       a2, 20(a0)
64     sw       a2, 24(a0)
65     sw       a2, 28(a0)
66     b        1b
67      addiu   a0, a0, 32
68 11:
69     sw       a2, 0(a0)
70     sw       a2, 4(a0)
71     sw       a2, 8(a0)
72     sw       a2, 12(a0)
73     sw       a2, 16(a0)
74     sw       a2, 20(a0)
75     sw       a2, 24(a0)
76     sw       a2, 28(a0)
77     addiu    a0, a0, 32
78 2:
79     blez     a1, 3f
80      addiu   a1, a1, -2
81     sh       a2, 0(a0)
82     b        2b
83      addiu   a0, a0, 2
84 3:
85     jr       ra
86      nop
87
88 END(pixman_fill_buff16_mips)
89
90 LEAF_MIPS32R2(pixman_fill_buff32_mips)
91 /*
92  * a0 - *dest
93  * a1 - count (bytes)
94  * a2 - value to fill buffer with
95  */
96
97     beqz     a1, 3f
98      nop
99     srl      t1, a1, 5 /* t1 how many multiples of 32 bytes */
100     beqz     t1, 2f
101      nop
102 1:
103     addiu    t1, t1, -1
104     beqz     t1, 11f
105      addiu   a1, a1, -32
106     pref     30, 32(a0)
107     sw       a2, 0(a0)
108     sw       a2, 4(a0)
109     sw       a2, 8(a0)
110     sw       a2, 12(a0)
111     sw       a2, 16(a0)
112     sw       a2, 20(a0)
113     sw       a2, 24(a0)
114     sw       a2, 28(a0)
115     b        1b
116      addiu   a0, a0, 32
117 11:
118     sw       a2, 0(a0)
119     sw       a2, 4(a0)
120     sw       a2, 8(a0)
121     sw       a2, 12(a0)
122     sw       a2, 16(a0)
123     sw       a2, 20(a0)
124     sw       a2, 24(a0)
125     sw       a2, 28(a0)
126     addiu    a0, a0, 32
127 2:
128     blez     a1, 3f
129      addiu   a1, a1, -4
130     sw       a2, 0(a0)
131     b        2b
132      addiu   a0, a0, 4
133 3:
134     jr       ra
135      nop
136
137 END(pixman_fill_buff32_mips)
138
139 LEAF_MIPS_DSPR2(pixman_composite_src_8888_0565_asm_mips)
140 /*
141  * a0 - dst (r5g6b5)
142  * a1 - src (a8r8g8b8)
143  * a2 - w
144  */
145
146     beqz     a2, 3f
147      nop
148     addiu    t1, a2, -1
149     beqz     t1, 2f
150      nop
151     li       t4, 0xf800f800
152     li       t5, 0x07e007e0
153     li       t6, 0x001f001f
154 1:
155     lw       t0, 0(a1)
156     lw       t1, 4(a1)
157     addiu    a1, a1, 8
158     addiu    a2, a2, -2
159
160     CONVERT_2x8888_TO_2x0565 t0, t1, t2, t3, t4, t5, t6, t7, t8
161
162     sh       t2, 0(a0)
163     sh       t3, 2(a0)
164
165     addiu    t2, a2, -1
166     bgtz     t2, 1b
167      addiu   a0, a0, 4
168 2:
169     beqz     a2, 3f
170      nop
171     lw       t0, 0(a1)
172
173     CONVERT_1x8888_TO_1x0565 t0, t1, t2, t3
174
175     sh       t1, 0(a0)
176 3:
177     j        ra
178      nop
179
180 END(pixman_composite_src_8888_0565_asm_mips)
181
182 LEAF_MIPS_DSPR2(pixman_composite_src_0565_8888_asm_mips)
183 /*
184  * a0 - dst (a8r8g8b8)
185  * a1 - src (r5g6b5)
186  * a2 - w
187  */
188
189     beqz     a2, 3f
190      nop
191     addiu    t1, a2, -1
192     beqz     t1, 2f
193      nop
194     li       t4, 0x07e007e0
195     li       t5, 0x001F001F
196 1:
197     lhu      t0, 0(a1)
198     lhu      t1, 2(a1)
199     addiu    a1, a1, 4
200     addiu    a2, a2, -2
201
202     CONVERT_2x0565_TO_2x8888 t0, t1, t2, t3, t4, t5, t6, t7, t8, t9
203
204     sw       t2, 0(a0)
205     sw       t3, 4(a0)
206
207     addiu    t2, a2, -1
208     bgtz     t2, 1b
209      addiu   a0, a0, 8
210 2:
211     beqz     a2, 3f
212      nop
213     lhu      t0, 0(a1)
214
215     CONVERT_1x0565_TO_1x8888 t0, t1, t2, t3
216
217     sw       t1, 0(a0)
218 3:
219     j        ra
220      nop
221
222 END(pixman_composite_src_0565_8888_asm_mips)
223
224 LEAF_MIPS_DSPR2(pixman_composite_src_x888_8888_asm_mips)
225 /*
226  * a0 - dst (a8r8g8b8)
227  * a1 - src (x8r8g8b8)
228  * a2 - w
229  */
230
231     beqz     a2, 4f
232      nop
233     li       t9, 0xff000000
234     srl      t8, a2, 3    /* t1 = how many multiples of 8 src pixels */
235     beqz     t8, 3f       /* branch if less than 8 src pixels */
236      nop
237 1:
238     addiu    t8, t8, -1
239     beqz     t8, 2f
240      addiu   a2, a2, -8
241     pref     0, 32(a1)
242     lw       t0, 0(a1)
243     lw       t1, 4(a1)
244     lw       t2, 8(a1)
245     lw       t3, 12(a1)
246     lw       t4, 16(a1)
247     lw       t5, 20(a1)
248     lw       t6, 24(a1)
249     lw       t7, 28(a1)
250     addiu    a1, a1, 32
251     or       t0, t0, t9
252     or       t1, t1, t9
253     or       t2, t2, t9
254     or       t3, t3, t9
255     or       t4, t4, t9
256     or       t5, t5, t9
257     or       t6, t6, t9
258     or       t7, t7, t9
259     pref     30, 32(a0)
260     sw       t0, 0(a0)
261     sw       t1, 4(a0)
262     sw       t2, 8(a0)
263     sw       t3, 12(a0)
264     sw       t4, 16(a0)
265     sw       t5, 20(a0)
266     sw       t6, 24(a0)
267     sw       t7, 28(a0)
268     b        1b
269      addiu   a0, a0, 32
270 2:
271     lw       t0, 0(a1)
272     lw       t1, 4(a1)
273     lw       t2, 8(a1)
274     lw       t3, 12(a1)
275     lw       t4, 16(a1)
276     lw       t5, 20(a1)
277     lw       t6, 24(a1)
278     lw       t7, 28(a1)
279     addiu    a1, a1, 32
280     or       t0, t0, t9
281     or       t1, t1, t9
282     or       t2, t2, t9
283     or       t3, t3, t9
284     or       t4, t4, t9
285     or       t5, t5, t9
286     or       t6, t6, t9
287     or       t7, t7, t9
288     sw       t0, 0(a0)
289     sw       t1, 4(a0)
290     sw       t2, 8(a0)
291     sw       t3, 12(a0)
292     sw       t4, 16(a0)
293     sw       t5, 20(a0)
294     sw       t6, 24(a0)
295     sw       t7, 28(a0)
296     beqz     a2, 4f
297      addiu   a0, a0, 32
298 3:
299     lw       t0, 0(a1)
300     addiu    a1, a1, 4
301     addiu    a2, a2, -1
302     or       t1, t0, t9
303     sw       t1, 0(a0)
304     bnez     a2, 3b
305      addiu   a0, a0, 4
306 4:
307     jr       ra
308      nop
309
310 END(pixman_composite_src_x888_8888_asm_mips)
311
312 LEAF_MIPS_DSPR2(pixman_composite_over_n_8888_8888_ca_asm_mips)
313 /*
314  * a0 - dst  (a8r8g8b8)
315  * a1 - src  (32bit constant)
316  * a2 - mask (a8r8g8b8)
317  * a3 - w
318  */
319
320     SAVE_REGS_ON_STACK 16, s0, s1, s2, s3, s4, s5, s6, s7
321     beqz         a3, 4f
322      nop
323     li           t6, 0xff
324     addiu        t7, zero, -1 /* t7 = 0xffffffff */
325     srl          t8, a1, 24   /* t8 = srca */
326     li           t9, 0x00ff00ff
327     addiu        t1, a3, -1
328     beqz         t1, 3f       /* last pixel */
329      nop
330     beq          t8, t6, 2f   /* if (srca == 0xff) */
331      nop
332 1:
333                               /* a1 = src */
334     lw           t0, 0(a2)    /* t0 = mask */
335     lw           t1, 4(a2)    /* t1 = mask */
336     or           t2, t0, t1
337     beqz         t2, 12f      /* if (t0 == 0) && (t1 == 0) */
338      addiu       a2, a2, 8
339     and          t3, t0, t1
340     move         s0, t8       /* s0 = srca */
341     move         s1, t8       /* s1 = srca */
342     move         t4, a1       /* t4 = src */
343     move         t5, a1       /* t5 = src */
344     lw           t2, 0(a0)    /* t2 = dst */
345     beq          t3, t7, 11f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
346      lw          t3, 4(a0)    /* t0 = dst */
347     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, t4, t5, t9, s0, s1, s2, s3, s4, s5
348     MIPS_2xUN8x4_MUL_2xUN8   t0, t1, t8, t8, s0, s1, t9, s2, s3, s4, s5, s6, s7
349 11:
350     not          s0, s0
351     not          s1, s1
352     MIPS_2xUN8x4_MUL_2xUN8x4 t2, t3, s0, s1, s2, s3, t9, t0, t1, s4, s5, s6, s7
353     addu_s.qb    t0, t4, s2
354     addu_s.qb    t1, t5, s3
355     sw           t0, 0(a0)
356     sw           t1, 4(a0)
357 12:
358     addiu        a3, a3, -2
359     addiu        t1, a3, -1
360     bgtz         t1, 1b
361      addiu       a0, a0, 8
362     b            3f
363      nop
364 2:
365                               /* a1 = src */
366     lw           t0, 0(a2)    /* t0 = mask */
367     lw           t1, 4(a2)    /* t1 = mask */
368     or           t2, t0, t1
369     beqz         t2, 22f      /* if (t0 == 0) & (t1 == 0) */
370      addiu       a2, a2, 8
371     and          t2, t0, t1
372     move         s0, a1
373     beq          t2, t7, 21f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
374      move        s1, a1
375     lw           t2, 0(a0)    /* t2 = dst */
376     lw           t3, 4(a0)    /* t3 = dst */
377     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, t4, t5, t9, s0, s1, s2, s3, s4, s5
378     not          t0, t0
379     not          t1, t1
380     MIPS_2xUN8x4_MUL_2xUN8x4 t2, t3, t0, t1, s0, s1, t9, s2, s3, s4, s5, s6, s7
381     addu_s.qb    s0, t4, s0
382     addu_s.qb    s1, t5, s1
383 21:
384     sw           s0, 0(a0)
385     sw           s1, 4(a0)
386 22:
387     addiu        a3, a3, -2
388     addiu        t1, a3, -1
389     bgtz         t1, 2b
390      addiu       a0, a0, 8
391 3:
392     blez         a3, 4f
393      nop
394                               /* a1 = src */
395     lw           t1, 0(a2)    /* t1 = mask */
396     beqz         t1, 4f
397      nop
398     move         s0, t8       /* s0 = srca */
399     move         t2, a1       /* t2 = src */
400     beq          t1, t7, 31f
401      lw          t0, 0(a0)    /* t0 = dst */
402
403     MIPS_UN8x4_MUL_UN8x4  a1, t1, t2, t9, t3, t4, t5, t6
404     MIPS_UN8x4_MUL_UN8    t1, t8, s0, t9, t3, t4, t5
405 31:
406     not          s0, s0
407     MIPS_UN8x4_MUL_UN8x4  t0, s0, t3, t9, t4, t5, t6, t1
408     addu_s.qb    t0, t2, t3
409     sw           t0, 0(a0)
410 4:
411     RESTORE_REGS_FROM_STACK 16, s0, s1, s2, s3, s4, s5, s6, s7
412     j            ra
413      nop
414
415 END(pixman_composite_over_n_8888_8888_ca_asm_mips)
416
417 LEAF_MIPS_DSPR2(pixman_composite_over_n_8888_0565_ca_asm_mips)
418 /*
419  * a0 - dst  (r5g6b5)
420  * a1 - src  (32bit constant)
421  * a2 - mask (a8r8g8b8)
422  * a3 - w
423  */
424
425     SAVE_REGS_ON_STACK 20, s0, s1, s2, s3, s4, s5, s6, s7, s8
426     beqz         a3, 4f
427      nop
428     li           t5, 0xf800f800
429     li           t6, 0x07e007e0
430     li           t7, 0x001F001F
431     li           t9, 0x00ff00ff
432
433     srl          t8, a1, 24   /* t8 = srca */
434     addiu        t1, a3, -1
435     beqz         t1, 3f       /* last pixel */
436      nop
437     li           s0, 0xff     /* s0 = 0xff */
438     addiu        s1, zero, -1 /* s1 = 0xffffffff */
439
440     beq          t8, s0, 2f   /* if (srca == 0xff) */
441      nop
442 1:
443                               /* a1 = src */
444     lw           t0, 0(a2)    /* t0 = mask */
445     lw           t1, 4(a2)    /* t1 = mask */
446     or           t2, t0, t1
447     beqz         t2, 12f      /* if (t0 == 0) && (t1 == 0) */
448      addiu       a2, a2, 8
449     and          t3, t0, t1
450     move         t0, t8
451     move         t1, a1
452     lhu          t2, 0(a0)    /* t2 = dst */
453     beq          t3, s1, 11f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
454      lhu         t3, 2(a0)    /* t3 = dst */
455     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, s2, s3, t9, t4, s4, s5, s6, s7, s8
456     MIPS_2xUN8x4_MUL_2xUN8   t0, t1, t8, t8, t0, t1, t9, t4, s4, s5, s6, s7, s8
457 11:
458     not          t0, t0
459     not          t1, t1
460     CONVERT_2x0565_TO_2x8888 t2, t3, s4, s5, t6, t7, t4, s6, s7, s8
461     MIPS_2xUN8x4_MUL_2xUN8x4 s4, s5, t0, t1, s4, s5, t9, t4, s6, s7, s8, t0, t1
462     addu_s.qb    s2, s2, s4
463     addu_s.qb    s3, s3, s5
464     CONVERT_2x8888_TO_2x0565 s2, s3, t2, t3, t5, t6, t7, s1, s2
465     sh           t2, 0(a0)
466     sh           t3, 2(a0)
467 12:
468     addiu        a3, a3, -2
469     addiu        t1, a3, -1
470     bgtz         t1, 1b
471      addiu       a0, a0, 4
472     b            3f
473      nop
474 2:
475                               /* a1 = src */
476     lw           t0, 0(a2)    /* t0 = mask */
477     lw           t1, 4(a2)    /* t1 = mask */
478     or           t2, t0, t1
479     beqz         t2, 22f      /* if (t0 == 0) & (t1 == 0) */
480      addiu       a2, a2, 8
481     and          t3, t0, t1
482     move         t2, a1
483     beq          t3, s1, 21f  /* if (t0 == 0xffffffff) && (t1 == 0xffffffff) */
484      move        t3, a1
485     lhu          t2, 0(a0)    /* t2 = dst */
486     lhu          t3, 2(a0)    /* t3 = dst */
487     MIPS_2xUN8x4_MUL_2xUN8x4 a1, a1, t0, t1, s2, s3, t9, t4, s4, s5, s6, s7, s8
488     not          t0, t0
489     not          t1, t1
490     CONVERT_2x0565_TO_2x8888 t2, t3, s4, s5, t6, t7, t4, s6, s7, s8
491     MIPS_2xUN8x4_MUL_2xUN8x4 s4, s5, t0, t1, s4, s5, t9, t4, s6, s7, s8, t2, t3
492     addu_s.qb    t2, s2, s4
493     addu_s.qb    t3, s3, s5
494 21:
495     CONVERT_2x8888_TO_2x0565 t2, t3, t0, t1, t5, t6, t7, s2, s3
496     sh           t0, 0(a0)
497     sh           t1, 2(a0)
498 22:
499     addiu        a3, a3, -2
500     addiu        t1, a3, -1
501     bgtz         t1, 2b
502      addiu       a0, a0, 4
503 3:
504     blez         a3, 4f
505      nop
506                               /* a1 = src */
507     lw           t1, 0(a2)    /* t1 = mask */
508     beqz         t1, 4f
509      nop
510     move         s0, t8       /* s0 = srca */
511     move         t2, a1       /* t2 = src */
512     beq          t1, t7, 31f
513      lhu         t0, 0(a0)    /* t0 = dst */
514
515     MIPS_UN8x4_MUL_UN8x4     a1, t1, t2, t9, t3, t4, t5, t6
516     MIPS_UN8x4_MUL_UN8       t1, t8, s0, t9, t3, t4, t5
517 31:
518     not          s0, s0
519     CONVERT_1x0565_TO_1x8888 t0, s1, s2, s3
520     MIPS_UN8x4_MUL_UN8x4     s1, s0, t3, t9, t4, t5, t6, t1
521     addu_s.qb    t0, t2, t3
522     CONVERT_1x8888_TO_1x0565 t0, s1, s2, s3
523     sh           s1, 0(a0)
524 4:
525     RESTORE_REGS_FROM_STACK  20, s0, s1, s2, s3, s4, s5, s6, s7, s8
526     j            ra
527      nop
528
529 END(pixman_composite_over_n_8888_0565_ca_asm_mips)