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    /* extract red */
20606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.if \shift < 32
21606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dext   $t0,\src,\shift+11,5
22606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.else
23606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dextu  $t0,\src,\shift+11,5
24606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.endif
25606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul    $t0,$t0,\f
26606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
27606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* extract green */
28606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.if \shift < 32
29606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dext   $t1,\src,\shift+5,6
30606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.else
31606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dextu  $t1,\src,\shift+5,6
32606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.endif
33606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul    $t1,$t1,\f
34606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
35606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* extract blue */
36606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.if \shift < 32
37606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dext   $t2,\src,\shift,5
38606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.else
39606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dextu  $t2,\src,\shift,5
40606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.endif
41606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    mul    $t2,$t2,\f
42606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
43606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl    $t0,$t0,8
44606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl    $t1,$t1,8
45606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl    $t2,$t2,8
46606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu   $t0,$t0,\sR
47606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu   $t1,$t1,\sG
48606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu   \dreg,$t2,\sB
49606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll    $t0,$t0,11
50606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sll    $t1,$t1,5
51606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or     \dreg,\dreg,$t0
52606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    or     \dreg,\dreg,$t1
53606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .endm
54606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
55606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .text
561109f115bd016e82a4d8304b17fdaa4d3e577ba4Nikola Veljkovic    .balign 4
57606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
58606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .global scanline_col32cb16blend_mips64
59606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .ent    scanline_col32cb16blend_mips64
60606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesscanline_col32cb16blend_mips64:
61606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
62606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* check if count is zero */
63606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl     $v0,$a1,24 /* sA */
64606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz    $a2,done
65606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    li      $t0, 0x100
66606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    srl     $v1,$v0,7
67606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addu    $v0,$v1,$v0
68606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    subu    $v0,$t0,$v0 /* f */
69606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext     $a3,$a1,3,5 /* sR */
70606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext     $a4,$a1,10,6 /* sG */
71606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ext     $a5,$a1,19,5 /* sB */
72606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
73606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* check if cnt is at least 4 */
74606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addiu   $a2,$a2,-4
75606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bltz    $a2,tail
76606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
77606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesloop_4pixels:
78606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    ld      $t3,0($a0)
79606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    daddiu  $a0,$a0,8
80606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addiu   $a2,$a2,-4
81606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel   $a6 $t3 $v0 $a3 $a4 $a5 0
82606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel   $a7 $t3 $v0 $a3 $a4 $a5 16
83606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel   $t8 $t3 $v0 $a3 $a4 $a5 32
84606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel   $t9 $t3 $v0 $a3 $a4 $a5 48
85606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dins    $a6,$a7,16,16
86606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dinsu   $a6,$t8,32,16
87606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    dinsu   $a6,$t9,48,16
88606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sd      $a6,-8($a0)
89606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bgez    $a2, loop_4pixels
90606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
91606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughestail:
92606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* the pixel count underran, restore it now */
93606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addiu   $a2,$a2,4
94606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
95606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    /* handle the last 0..3 pixels */
96606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    beqz    $a2,done
97606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
98606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesloop_1pixel:
99606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    lhu     $t3,0($a0)
100606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    daddiu  $a0,$a0,2
101606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    addiu   $a2,$a2,-1
102606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    pixel   $a6 $t3 $v0 $a3 $a4 $a5 0
103606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    sh      $a6, -2($a0)
104606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    bnez    $a2,loop_1pixel
105606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
106606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughesdone:
107606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    j       $ra
108606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    .end    scanline_col32cb16blend_mips64
109