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 #if __mips==32 && __mips_isa_rev>=2 20 /* extract red */ 21 ext $t4,\src,\shift+11,5 22 mul $t4,$t4,\f 23 24 /* extract green */ 25 ext $t5,\src,\shift+5,6 26 mul $t5,$t5,\f 27 28 /* extract blue */ 29 ext $t6,\src,\shift,5 30 mul $t6,$t6,\f 31 #else 32 /* extract red */ 33 srl $t4,\src,\shift+11 34 andi $t4, 0x1f 35 mul $t4,$t4,\f 36 37 /* extract green */ 38 srl $t5,\src,\shift+5 39 andi $t5, 0x3f 40 mul $t5,$t5,\f 41 42 /* extract blue */ 43 srl $t6,\src,\shift 44 andi $t6, 0x1f 45 mul $t6,$t6,\f 46 #endif 47 48 srl $t4,$t4,8 49 srl $t5,$t5,8 50 srl $t6,$t6,8 51 addu $t4,$t4,\sR 52 addu $t5,$t5,\sG 53 addu \dreg,$t6,\sB 54 sll $t4,$t4,11 55 sll $t5,$t5,5 56 or \dreg,\dreg,$t4 57 or \dreg,\dreg,$t5 58 andi \dreg, 0xffff 59 .endm 60 61 .text 62 .align 63 64 .global scanline_col32cb16blend_mips 65 .ent scanline_col32cb16blend_mips 66 scanline_col32cb16blend_mips: 67 68 /* check if count is zero */ 69 srl $v0,$a1,24 /* sA */ 70 beqz $a2,done 71 li $t4, 0x100 72 srl $v1,$v0,7 73 addu $v0,$v1,$v0 74 subu $v0,$t4,$v0 /* f */ 75 #if __mips==32 && __mips_isa_rev>=2 76 ext $a3,$a1,3,5 /* sR */ 77 ext $t0,$a1,10,6 /* sG */ 78 ext $t1,$a1,19,5 /* sB */ 79 #else 80 srl $a3, $a1, 3 81 andi $a3, 0x1f /* sR */ 82 srl $t0, $a1, 10 83 andi $t0, 0x3f /* sG */ 84 srl $t1, $a1, 19 85 andi $t1, 0x1f /* sB */ 86 #endif 87 88 /* check if cnt is at least 4 */ 89 addiu $a2,$a2,-4 90 bltz $a2,tail 91 92 loop_4pixels: 93 lw $t7,0($a0) 94 lw $t8,4($a0) 95 addiu $a0,$a0,8 96 addiu $a2,$a2,-4 97 pixel $t2 $t7 $v0 $a3 $t0 $t1 0 98 pixel $t3 $t7 $v0 $a3 $t0 $t1 16 99 #if __mips==32 && __mips_isa_rev>=2 100 ins $t2,$t3,16,16 101 #else 102 sll $t3, 16 103 or $t2, $t2, $t3 104 #endif 105 pixel $t7 $t8 $v0 $a3 $t0 $t1 0 106 pixel $t3 $t8 $v0 $a3 $t0 $t1 16 107 #if __mips==32 && __mips_isa_rev>=2 108 ins $t7,$t3,16,16 109 #else 110 sll $t3, 16 111 or $t7, $t7, $t3 112 #endif 113 sw $t2,-8($a0) 114 sw $t7,-4($a0) 115 bgez $a2, loop_4pixels 116 117 tail: 118 /* the pixel count underran, restore it now */ 119 addiu $a2,$a2,4 120 121 /* handle the last 0..3 pixels */ 122 beqz $a2,done 123 124 loop_1pixel: 125 lhu $t7,0($a0) 126 addiu $a0,$a0,2 127 addiu $a2,$a2,-1 128 pixel $t2 $t7 $v0 $a3 $t0 $t1 0 129 sh $t2, -2($a0) 130 bnez $a2,loop_1pixel 131 132 done: 133 j $ra 134 .end scanline_col32cb16blend_mips 135