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 36606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .macro pixel dreg src fb shift 37606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* 38606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * sA = s >> 24 39606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * f = 0x100 - (sA + (sA>>7)) 40606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes */ 41606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set noat 42606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $at,$2 43606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set at 44068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 45606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t7,\src,24 46606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,$t7,7 47606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t7,$t6 48606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes li $t6,0x100 49606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes subu $t7,$t6,$t7 50068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 51606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* red */ 52606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t8,\dreg,\shift+6+5,5 # dst[\shift:15..11] 53606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t6,$t8,$t7 54606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t0,\dreg,\shift+5,6 # start green extraction dst[\shift:10..5] 55606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t8,\src,3,5 # src[7..3] 56606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,8 57606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 58606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.if \shift!=0 59606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8,\shift+11 60606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb,$t8 61606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.else 62606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll \fb,$t8,11 63606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes.endif 64068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 65606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* green */ 66606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t8,$t0,$t7 67606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t0,\dreg,\shift,5 # start blue extraction dst[\shift:4..0] 68606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t6,\src,2+8,6 # src[15..10] 69606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,8 70606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 71068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 72606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* blue */ 73606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t0,$t0,$t7 74606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8, $t8, \shift+5 75606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb, \fb, $t8 76606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes ext $t6,\src,(3+8+8),5 77606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,$t0,8 78606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 79606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8, $t8, \shift 80606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb, \fb, $t8 81068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 82606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set noat 83606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $t8,$2 84606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG subu $t8,$at 85606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sltu $at,$t8,$v0 86606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn $v0,$t8,$at 87606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sgtu $at,$t8,$v1 88606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn $v1,$t8,$at 89606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set at 90606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .endm 91068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 92068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#else 93068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 94606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .macro pixel dreg src fb shift 95606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* 96606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * sA = s >> 24 97606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * f = 0x100 - (sA + (sA>>7)) 98606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes */ 99606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set push 100606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set noat 101606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set mips32r2 102606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $at,$2 103606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set pop 104068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 105606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t7,\src,24 106606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,$t7,7 107606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t7,$t6 108606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes li $t6,0x100 109606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes subu $t7,$t6,$t7 110068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 111606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* 112606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * red 113606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * dR = (d >> (6 + 5)) & 0x1f; 114606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * dR = (f*dR)>>8 115606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * sR = (s >> ( 3)) & 0x1f; 116606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * sR += dR 117606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * fb |= sR << 11 118606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes */ 119606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,\dreg,\shift+6+5 120068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift==0 121606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t8,0x1f 122068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 123606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t8,$t8,$t7 124606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,\src,3 125606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t6,0x1f 126606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,8 127606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 128068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 129606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8,\shift+11 130606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb,$t8 131068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else 132606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll \fb,$t8,11 133068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 134068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 135068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand /* 136606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * green 137606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * dG = (d >> 5) & 0x3f 138606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * dG = (f*dG) >> 8 139606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes * sG = (s >> ( 8+2))&0x3F; 140606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes */ 141606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,\dreg,\shift+5 142606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t8,0x3f 143606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t8,$t8,$t7 144606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,\src,8+2 145606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t6,0x3f 146606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,8 147606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 148606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8,\shift + 5 149606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb,$t8 150068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 151606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* blue */ 152068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 153606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,\dreg,\shift 154606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t8,0x1f 155068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.else 156606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t8,\dreg,0x1f 157068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 158606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes mul $t8,$t8,$t7 159606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t6,\src,(8+8+3) 160606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t6,0x1f 161606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes srl $t8,8 162606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $t8,$t6 163068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.if \shift!=0 164606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sll $t8,\shift 165068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand.endif 166606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or \fb,$t8 167606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set push 168606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set noat 169606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set mips32r2 170606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $t8,$2 171606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG subu $t8,$at 172606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sltu $at,$t8,$v0 173606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn $v0,$t8,$at 174606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG sgtu $at,$t8,$v1 175606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG movn $v1,$t8,$at 176606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set pop 177606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .endm 178068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand#endif 179068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 180606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .text 1811109f115bd016e82a4d8304b17fdaa4d3e577ba4Nikola Veljkovic .balign 4 182068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 183606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .global scanline_t32cb16blend_mips 184606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .ent scanline_t32cb16blend_mips 185068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandscanline_t32cb16blend_mips: 186606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG li $v0,0xffffffff 187606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG li $v1,0 188606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* Align the destination if necessary */ 189606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes and $t0,$a0,3 190606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $t0,aligned 191068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 192606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* as long as there is at least one pixel */ 193606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $a2,done 194068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 195606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t4,($a1) 196606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a0,2 197606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a1,4 198606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $t4,1f 199606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lhu $t3,-2($a0) 200606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t4,$t1,0 201606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sh $t1,-2($a0) 202606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1: subu $a2,1 203068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 204068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandaligned: 205606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* Check to see if its worth unrolling the loop */ 206606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes subu $a2,4 207606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes bltz $a2,tail 208068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 209606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* Process 4 pixels at a time */ 210068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandfourpixels: 211606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* 1st pair of pixels */ 212606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t4,0($a1) 213606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t5,4($a1) 214606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a0,8 215606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a1,16 216068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 217606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* both are zero, skip this pair */ 218606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or $t3,$t4,$t5 219606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $t3,1f 220068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 221606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* load the destination */ 222606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t3,-8($a0) 223068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 224606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t4,$t1,0 225606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes andi $t1, 0xFFFF 226606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t5,$t1,16 227606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sw $t1,-8($a0) 228068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 229068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand1: 230606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* 2nd pair of pixels */ 231606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t4,-8($a1) 232606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t5,-4($a1) 233068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 234606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* both are zero, skip this pair */ 235606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes or $t3,$t4,$t5 236606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $t3,1f 237068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 238606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* load the destination */ 239606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t3,-4($a0) 240068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 241606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t4,$t1,0 242606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes andi $t1, 0xFFFF 243606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t5,$t1,16 244606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sw $t1,-4($a0) 245068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 246606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1: subu $a2,4 247606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes bgtz $a2,fourpixels 248068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 249068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandtail: 250606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* the pixel count underran, restore it now */ 251606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a2,4 252068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sand 253606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes /* handle the last 0..3 pixels */ 254606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $a2,done 255068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sandonepixel: 256606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lw $t4,($a1) 257606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a0,2 258606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes addu $a1,4 259606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes beqz $t4,1f 260606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes lhu $t3,-2($a0) 261606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes pixel $t3,$t4,$t1,0 262606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes sh $t1,-2($a0) 263606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes1: subu $a2,1 264606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes bnez $a2,onepixel 265068f9f3bf9d09ebca0016cfcbb682d8ca27480f5Duane Sanddone: 266606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set push 267606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set mips32r2 268606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG rdhwr $a0,$3 269606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG mul $v0,$a0 270606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG mul $v1,$a0 271606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott HughesDBG .set pop 272606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes j $ra 273606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes .end scanline_t32cb16blend_mips 274