1/*
2** Copyright 2015, The Android Open Source Project
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8**     http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
17    .macro pixel dreg src f sR sG sB shift
18
19    /* extract red */
20.if \shift < 32
21    dext   $t0,\src,\shift+11,5
22.else
23    dextu  $t0,\src,\shift+11,5
24.endif
25    mul    $t0,$t0,\f
26
27    /* extract green */
28.if \shift < 32
29    dext   $t1,\src,\shift+5,6
30.else
31    dextu  $t1,\src,\shift+5,6
32.endif
33    mul    $t1,$t1,\f
34
35    /* extract blue */
36.if \shift < 32
37    dext   $t2,\src,\shift,5
38.else
39    dextu  $t2,\src,\shift,5
40.endif
41    mul    $t2,$t2,\f
42
43    srl    $t0,$t0,8
44    srl    $t1,$t1,8
45    srl    $t2,$t2,8
46    addu   $t0,$t0,\sR
47    addu   $t1,$t1,\sG
48    addu   \dreg,$t2,\sB
49    sll    $t0,$t0,11
50    sll    $t1,$t1,5
51    or     \dreg,\dreg,$t0
52    or     \dreg,\dreg,$t1
53    .endm
54
55    .text
56    .balign 4
57
58    .global scanline_col32cb16blend_mips64
59    .ent    scanline_col32cb16blend_mips64
60scanline_col32cb16blend_mips64:
61
62    /* check if count is zero */
63    srl     $v0,$a1,24 /* sA */
64    beqz    $a2,done
65    li      $t0, 0x100
66    srl     $v1,$v0,7
67    addu    $v0,$v1,$v0
68    subu    $v0,$t0,$v0 /* f */
69    ext     $a3,$a1,3,5 /* sR */
70    ext     $a4,$a1,10,6 /* sG */
71    ext     $a5,$a1,19,5 /* sB */
72
73    /* check if cnt is at least 4 */
74    addiu   $a2,$a2,-4
75    bltz    $a2,tail
76
77loop_4pixels:
78    ld      $t3,0($a0)
79    daddiu  $a0,$a0,8
80    addiu   $a2,$a2,-4
81    pixel   $a6 $t3 $v0 $a3 $a4 $a5 0
82    pixel   $a7 $t3 $v0 $a3 $a4 $a5 16
83    pixel   $t8 $t3 $v0 $a3 $a4 $a5 32
84    pixel   $t9 $t3 $v0 $a3 $a4 $a5 48
85    dins    $a6,$a7,16,16
86    dinsu   $a6,$t8,32,16
87    dinsu   $a6,$t9,48,16
88    sd      $a6,-8($a0)
89    bgez    $a2, loop_4pixels
90
91tail:
92    /* the pixel count underran, restore it now */
93    addiu   $a2,$a2,4
94
95    /* handle the last 0..3 pixels */
96    beqz    $a2,done
97
98loop_1pixel:
99    lhu     $t3,0($a0)
100    daddiu  $a0,$a0,2
101    addiu   $a2,$a2,-1
102    pixel   $a6 $t3 $v0 $a3 $a4 $a5 0
103    sh      $a6, -2($a0)
104    bnez    $a2,loop_1pixel
105
106done:
107    j       $ra
108    .end    scanline_col32cb16blend_mips64
109