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