1068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand/* libs/pixelflinger/t32cb16blend.S 2068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** 3068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Copyright 2010, The Android Open Source Project 4068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** 5068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Licensed under the Apache License, Version 2.0 (the "License"); 6068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** you may not use this file except in compliance with the License. 7068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** You may obtain a copy of the License at 8068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** 9068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** http://www.apache.org/licenses/LICENSE-2.0 10068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** 11068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** Unless required by applicable law or agreed to in writing, software 12068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** distributed under the License is distributed on an "AS IS" BASIS, 13068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** See the License for the specific language governing permissions and 15068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand** limitations under the License. 16068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand*/ 17068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 18068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#ifdef DEBUG 19068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#define DBG 20068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else 21068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#define DBG # 22068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif 23068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 24068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand/* 25068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * blend one of 2 16bpp RGB pixels held in dreg selected by shift 26068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * with the 32bpp ABGR pixel held in src and store the result in fb 27068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * 28068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * Assumes that the dreg data is little endian and that 29068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * the the second pixel (shift==16) will be merged into 30068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * the fb result 31068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * 32068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * Uses $t0,$t6,$t7,$t8 33068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */ 34068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 35068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#if __mips==32 && __mips_isa_rev>=2 36068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .macro pixel dreg src fb shift 37068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 38068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * sA = s >> 24 39068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * f = 0x100 - (sA + (sA>>7)) 40068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */ 41068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set noat 42068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG rdhwr $at,$2 43068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set at 44068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 45068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t7,\src,24 46068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,$t7,7 47068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t7,$t6 48068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand li $t6,0x100 49068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand subu $t7,$t6,$t7 50068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 51068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* red */ 52068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t8,\dreg,\shift+6+5,5 # dst[\shift:15..11] 53068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t6,$t8,$t7 54068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t0,\dreg,\shift+5,6 # start green extraction dst[\shift:10..5] 55068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t8,\src,3,5 # src[7..3] 56068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,8 57068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 58068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ins \fb,$t8,\shift+6+5,5 # dst[\shift:15..11] 59068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 60068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* green */ 61068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t8,$t0,$t7 62068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t0,\dreg,\shift,5 # start blue extraction dst[\shift:4..0] 63068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t6,\src,2+8,6 # src[15..10] 64068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,8 65068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 66068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 67068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* blue */ 68068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t0,$t0,$t7 69068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ins \fb,$t8,\shift+5,6 # finish green insertion dst[\shift:10..5] 70068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ext $t6,\src,(3+8+8),5 71068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,$t0,8 72068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 73068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand ins \fb,$t8,\shift,5 74068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 75068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set noat 76068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG rdhwr $t8,$2 77068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG subu $t8,$at 78068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG sltu $at,$t8,$v0 79068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG movn $v0,$t8,$at 80068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG sgtu $at,$t8,$v1 81068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG movn $v1,$t8,$at 82068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set at 83068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .endm 84068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 85068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else 86068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 87068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .macro pixel dreg src fb shift 88068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 89068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * sA = s >> 24 90068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * f = 0x100 - (sA + (sA>>7)) 91068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */ 92068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set push 93068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set noat 94068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set mips32r2 95068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG rdhwr $at,$2 96068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set pop 97068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 98068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t7,\src,24 99068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,$t7,7 100068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t7,$t6 101068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand li $t6,0x100 102068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand subu $t7,$t6,$t7 103068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 104068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 105068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * red 106068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * dR = (d >> (6 + 5)) & 0x1f; 107068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * dR = (f*dR)>>8 108068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * sR = (s >> ( 3)) & 0x1f; 109068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * sR += dR 110068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * fb |= sR << 11 111068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */ 112068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,\dreg,\shift+6+5 113068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift==0 114068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t8,0x1f 115068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 116068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t8,$t8,$t7 117068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,\src,3 118068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t6,0x1f 119068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,8 120068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 121068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 122068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sll $t8,\shift+11 123068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand or \fb,$t8 124068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else 125068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sll \fb,$t8,11 126068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 127068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 128068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 129068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * green 130068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * dG = (d >> 5) & 0x3f 131068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * dG = (f*dG) >> 8 132068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand * sG = (s >> ( 8+2))&0x3F; 133068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand */ 134068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,\dreg,\shift+5 135068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t8,0x3f 136068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t8,$t8,$t7 137068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,\src,8+2 138068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t6,0x3f 139068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,8 140068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 141068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sll $t8,\shift + 5 142068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand or \fb,$t8 143068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 144068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* blue */ 145068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 146068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,\dreg,\shift 147068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t8,0x1f 148068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else 149068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t8,\dreg,0x1f 150068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 151068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand mul $t8,$t8,$t7 152068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t6,\src,(8+8+3) 153068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t6,0x1f 154068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand srl $t8,8 155068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $t8,$t6 156068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 157068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sll $t8,\shift 158068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 159068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand or \fb,$t8 160068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set push 161068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set noat 162068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set mips32r2 163068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG rdhwr $t8,$2 164068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG subu $t8,$at 165068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG sltu $at,$t8,$v0 166068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG movn $v0,$t8,$at 167068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG sgtu $at,$t8,$v1 168068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG movn $v1,$t8,$at 169068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set pop 170068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .endm 171068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif 172068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 173068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .text 174068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .align 175068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 176068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .global scanline_t32cb16blend_mips 177068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .ent scanline_t32cb16blend_mips 178068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandscanline_t32cb16blend_mips: 179068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG li $v0,0xffffffff 180068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG li $v1,0 181068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* Align the destination if necessary */ 182068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand and $t0,$a0,3 183068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $t0,aligned 184068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 185068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* as long as there is at least one pixel */ 186068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $a2,done 187068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 188068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t4,($a1) 189068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a0,2 190068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a1,4 191068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $t4,1f 192068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lhu $t3,-2($a0) 193068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t4,$t1,0 194068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sh $t1,-2($a0) 195068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1: subu $a2,1 196068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 197068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandaligned: 198068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* Check to see if its worth unrolling the loop */ 199068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand subu $a2,4 200068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand bltz $a2,tail 201068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 202068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* Process 4 pixels at a time */ 203068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandfourpixels: 204068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 1st pair of pixels */ 205068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t4,0($a1) 206068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t5,4($a1) 207068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a0,8 208068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a1,16 209068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 210068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* both are zero, skip this pair */ 211068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand or $t3,$t4,$t5 212068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $t3,1f 213068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 214068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* load the destination */ 215068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t3,-8($a0) 216068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 217068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t4,$t1,0 218068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t5,$t1,16 219068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sw $t1,-8($a0) 220068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 221068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1: 222068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 2nd pair of pixels */ 223068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t4,-8($a1) 224068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t5,-4($a1) 225068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 226068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* both are zero, skip this pair */ 227068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand or $t3,$t4,$t5 228068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $t3,1f 229068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 230068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* load the destination */ 231068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t3,-4($a0) 232068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 233068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t4,$t1,0 234068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t5,$t1,16 235068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sw $t1,-4($a0) 236068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 237068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1: subu $a2,4 238068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand bgtz $a2,fourpixels 239068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 240068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandtail: 241068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* the pixel count underran, restore it now */ 242068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a2,4 243068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 244068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* handle the last 0..3 pixels */ 245068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $a2,done 246068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandonepixel: 247068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lw $t4,($a1) 248068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a0,2 249068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand addu $a1,4 250068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand beqz $t4,1f 251068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand lhu $t3,-2($a0) 252068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand pixel $t3,$t4,$t1,0 253068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand sh $t1,-2($a0) 254068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1: subu $a2,1 255068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand bnez $a2,onepixel 256068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sanddone: 257068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set push 258068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set mips32r2 259068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG rdhwr $a0,$3 260068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG mul $v0,$a0 261068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG mul $v1,$a0 262068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane SandDBG .set pop 263068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand j $ra 264068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand .end scanline_t32cb16blend_mips 265