1606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes/*
2606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** Copyright 2015, The Android Open Source Project
3606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes**
4606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
5606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** you may not use this file except in compliance with the License.
6606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** You may obtain a copy of the License at
7606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes**
8606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
9606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes**
10606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** Unless required by applicable law or agreed to in writing, software
11606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
12606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** See the License for the specific language governing permissions and
14606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes** limitations under the License.
15606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes*/
16606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
17606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .macro pixel dreg src f sR sG sB shift
18606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
19606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if __mips==32 && __mips_isa_rev>=2
20606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract red */
21606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext $t4,\src,\shift+11,5
22606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t4,$t4,\f
23606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
24606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract green */
25606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext $t5,\src,\shift+5,6
26606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t5,$t5,\f
27606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
28606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract blue */
29606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext $t6,\src,\shift,5
30606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t6,$t6,\f
31606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#else
32606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract red */
33606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t4,\src,\shift+11
34606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi $t4, 0x1f
35606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t4,$t4,\f
36606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
37606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract green */
38606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t5,\src,\shift+5
39606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi $t5, 0x3f
40606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t5,$t5,\f
41606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
42606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* extract blue */
43606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t6,\src,\shift
44606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi $t6, 0x1f
45606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       mul $t6,$t6,\f
46606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#endif
47606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
48606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t4,$t4,8
49606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t5,$t5,8
50606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl $t6,$t6,8
51606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addu $t4,$t4,\sR
52606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addu $t5,$t5,\sG
53606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addu \dreg,$t6,\sB
54606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sll $t4,$t4,11
55606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sll $t5,$t5,5
56606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       or \dreg,\dreg,$t4
57606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       or \dreg,\dreg,$t5
58606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi \dreg, 0xffff
59606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .endm
60606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
61606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .text
62606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .align
63606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
64606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .global scanline_col32cb16blend_mips
65606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .ent    scanline_col32cb16blend_mips
66606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesscanline_col32cb16blend_mips:
67606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
68606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* check if count is zero */
69606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl     $v0,$a1,24 /* sA */
70606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       beqz    $a2,done
71606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       li      $t4, 0x100
72606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl     $v1,$v0,7
73606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addu    $v0,$v1,$v0
74606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       subu    $v0,$t4,$v0 /* f */
75606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if __mips==32 && __mips_isa_rev>=2
76606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext     $a3,$a1,3,5 /* sR */
77606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext     $t0,$a1,10,6 /* sG */
78606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ext     $t1,$a1,19,5 /* sB */
79606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#else
80606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl     $a3, $a1, 3
81606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi    $a3, 0x1f    /* sR */
82606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl     $t0, $a1, 10
83606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi    $t0, 0x3f    /* sG */
84606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       srl     $t1, $a1, 19
85606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       andi    $t1, 0x1f    /* sB */
86606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#endif
87606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
88606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* check if cnt is at least 4 */
89606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a2,$a2,-4
90606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       bltz    $a2,tail
91606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
92606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesloop_4pixels:
93606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       lw      $t7,0($a0)
94606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       lw      $t8,4($a0)
95606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a0,$a0,8
96606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a2,$a2,-4
97606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       pixel   $t2 $t7 $v0 $a3 $t0 $t1 0
98606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       pixel   $t3 $t7 $v0 $a3 $t0 $t1 16
99606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if __mips==32 && __mips_isa_rev>=2
100606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ins     $t2,$t3,16,16
101606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#else
102606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sll $t3, 16
103606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       or  $t2, $t2, $t3
104606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#endif
105606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       pixel   $t7 $t8 $v0 $a3 $t0 $t1 0
106606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       pixel   $t3 $t8 $v0 $a3 $t0 $t1 16
107606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if __mips==32 && __mips_isa_rev>=2
108606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       ins     $t7,$t3,16,16
109606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#else
110606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sll $t3, 16
111606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       or  $t7, $t7, $t3
112606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#endif
113606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sw      $t2,-8($a0)
114606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sw      $t7,-4($a0)
115606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       bgez    $a2, loop_4pixels
116606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
117606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughestail:
118606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* the pixel count underran, restore it now */
119606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a2,$a2,4
120606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
121606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       /* handle the last 0..3 pixels */
122606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       beqz    $a2,done
123606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
124606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesloop_1pixel:
125606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       lhu     $t7,0($a0)
126606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a0,$a0,2
127606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       addiu   $a2,$a2,-1
128606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       pixel   $t2 $t7 $v0 $a3 $t0 $t1 0
129606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       sh      $t2, -2($a0)
130606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       bnez    $a2,loop_1pixel
131606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
132606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesdone:
133606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       j       $ra
134606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes       .end    scanline_col32cb16blend_mips
135