mmx_blend.S revision 01bcd83defe1e258007a4449edb8bd3072f008b0
1#include "matypes.h" 2 3 4SEG_TEXT 5 6 7ALIGNTEXT16 8GLOBL GLNAME(_mesa_mmx_blend_transparency) 9 10/* 11 * void blend_transparency( GLcontext *ctx, 12 * GLuint n, 13 * const GLubyte mask[], 14 * GLchan rgba[][4], 15 * CONST GLchan dest[][4] ) 16 * 17 * Common transparency blending mode. 18 */ 19GLNAME( _mesa_mmx_blend_transparency ): 20 PUSH_L ( EBP ) 21 MOV_L ( ESP, EBP ) 22 SUB_L ( CONST(52), ESP ) 23 PUSH_L ( EBX ) 24 25 MOV_L ( CONST(16711680), REGOFF(-8, EBP) ) 26 MOV_L ( CONST(16711680), REGOFF(-4, EBP) ) 27 MOV_L ( CONST(0), REGOFF(-16, EBP) ) 28 MOV_L ( CONST(-1), REGOFF(-12, EBP) ) 29 MOV_L ( CONST(-1), REGOFF(-24, EBP) ) 30 MOV_L ( CONST(0), REGOFF(-20, EBP) ) 31 MOV_L ( REGOFF(24, EBP), EAX ) /* rgba */ 32 ADD_L ( CONST(4), EAX ) 33 MOV_L ( EAX, EDX ) 34 AND_L ( REGOFF(20, EBP), EDX ) /* mask */ 35 MOV_L ( EDX, EAX ) 36 AND_L ( CONST(4), EAX ) 37 CMP_L ( CONST(8), EAX ) 38 JNE ( LLBL(GMBT_no_align) ) 39 MOV_L ( REGOFF(20, EBP), EAX ) 40 ADD_L ( CONST(3), EAX ) 41 XOR_L ( EDX, EDX ) 42 MOV_B ( REGIND(EAX), DL ) 43 MOV_L ( EDX, REGOFF(-32, EBP) ) 44 MOV_L ( CONST(255), EAX ) 45 MOV_L ( EAX, EBX ) 46 SUB_L ( REGOFF(-32, EBP), EBX ) 47 MOV_L ( EBX, REGOFF(-36, EBP) ) 48 MOV_L ( REGOFF(20, EBP), EAX ) 49 XOR_L ( EDX, EDX ) 50 MOV_B ( REGIND(EAX), DL ) 51 MOV_L ( EDX, EAX ) 52 IMUL_L ( REGOFF(-32, EBP), EAX ) 53 MOV_L ( REGOFF(24, EBP), EDX ) 54 XOR_L ( ECX, ECX ) 55 MOV_B ( REGIND(EDX), CL ) 56 MOV_L ( ECX, EDX ) 57 IMUL_L ( REGOFF(-36, EBP), EDX ) 58 ADD_L ( EDX, EAX ) 59 MOV_L ( EAX, EBX ) 60 SAR_L ( CONST(8), EBX ) 61 MOV_L ( EBX, REGOFF(-40, EBP) ) 62 MOV_L ( REGOFF(20, EBP), EAX ) 63 INC_L ( EAX ) 64 XOR_L ( EDX, EDX ) 65 MOV_B ( REGIND(EAX), DL ) 66 MOV_L ( EDX, EAX ) 67 IMUL_L ( REGOFF(-32, EBP), EAX ) 68 MOV_L ( REGOFF(24, EBP), EDX ) 69 INC_L ( EDX ) 70 XOR_L ( ECX, ECX ) 71 MOV_B ( REGIND(EDX), CL ) 72 MOV_L ( ECX, EDX ) 73 IMUL_L ( REGOFF(-36, EBP), EDX ) 74 ADD_L ( EDX, EAX ) 75 MOV_L ( EAX, EBX ) 76 SAR_L ( CONST(8), EBX ) 77 MOV_L ( EBX, REGOFF(-44, EBP) ) 78 MOV_L ( REGOFF(20, EBP), EAX ) 79 ADD_L ( CONST(2), EAX ) 80 XOR_L ( EDX, EDX ) 81 MOV_B ( REGIND(EAX), DL ) 82 MOV_L ( EDX, EAX ) 83 IMUL_L ( REGOFF(-32, EBP), EAX ) 84 MOV_L ( REGOFF(24, EBP), EDX ) 85 ADD_L ( CONST(2), EDX ) 86 XOR_L ( ECX, ECX ) 87 MOV_B ( REGIND(EDX), CL ) 88 MOV_L ( ECX, EDX ) 89 IMUL_L ( REGOFF(-36, EBP), EDX ) 90 ADD_L ( EDX, EAX ) 91 MOV_L ( EAX, EBX ) 92 SAR_L ( CONST(8), EBX ) 93 MOV_L ( EBX, REGOFF(-48, EBP) ) 94 MOV_L ( REGOFF(20, EBP), EAX ) 95 ADD_L ( CONST(3), EAX ) 96 XOR_L ( EDX, EDX ) 97 MOV_B ( REGIND(EAX), DL ) 98 MOV_L ( EDX, EAX ) 99 IMUL_L ( REGOFF(-32, EBP), EAX ) 100 MOV_L ( REGOFF(24, EBP), EDX ) 101 ADD_L ( CONST(3), EDX ) 102 XOR_L ( ECX, ECX ) 103 MOV_B ( REGIND(EDX), CL ) 104 MOV_L ( ECX, EDX ) 105 IMUL_L ( REGOFF(-36, EBP), EDX ) 106 ADD_L ( EDX, EAX ) 107 MOV_L ( EAX, EBX ) 108 SAR_L ( CONST(8), EBX ) 109 MOV_L ( EBX, REGOFF(-52, EBP) ) 110 MOV_L ( REGOFF(20, EBP), EAX ) 111 MOV_B ( REGOFF(-40, EBP), DL ) 112 MOV_B ( DL, REGIND(EAX) ) 113 MOV_L ( REGOFF(20, EBP), EAX ) 114 INC_L ( EAX ) 115 MOV_B ( REGOFF(-44, EBP), DL ) 116 MOV_B ( DL, REGIND(EAX) ) 117 MOV_L ( REGOFF(20, EBP), EAX ) 118 ADD_L ( CONST(2), EAX ) 119 MOV_B ( REGOFF(-48, EBP), DL ) 120 MOV_B ( DL, REGIND(EAX) ) 121 MOV_L ( REGOFF(20, EBP), EAX ) 122 ADD_L ( CONST(3), EAX ) 123 MOV_B ( REGOFF(-52, EBP), DL ) 124 MOV_B ( DL, REGIND(EAX) ) 125 INC_L ( REGOFF(16, EBP) ) 126 ADD_L ( CONST(4), REGOFF(20, EBP) ) 127 ADD_L ( CONST(4), REGOFF(24, EBP) ) 128 DEC_L ( REGOFF(12, EBP) ) 129LLBL(GMBT_skip_runin): 130 131 CMP_L ( CONST(0), REGOFF(12, EBP) ) /* n == 0 */ 132 JE ( LLBL(GMBT_zero_length) ) 133 MOV_L ( CONST(0), REGOFF(-28, EBP) ) 134ALIGNTEXT4 135LLBL(GMBT_main_loop): 136 137 MOV_L ( REGOFF(12, EBP), EDX ) 138 MOV_L ( EDX, EAX ) 139 SHR_L ( CONST(1), EAX ) /* eax = n/2 */ 140 CMP_L ( EAX, REGOFF(-28, EBP) ) 141 JB ( LLBL(GMBT_no_jump) ) 142 JMP ( LLBL(GMBT_end_loop) ) 143ALIGNTEXT16 144LLBL(GMBT_nojump): 145 146 MOV_L ( REGOFF(-28, EBP), EAX ) 147 LEA_L ( REGDIS(0,EAX,2), EDX ) 148 MOV_L ( REGOFF(16, EBP), EAX ) /* mask */ 149 CMP_B ( CONST(0), REGBI(EAX,EDX) ) 150 JE ( LLBL(GMBT_masked) ) 151 MOV_L ( REGOFF(-28, EBP), EAX ) 152 MOV_L ( EAX, EDX ) 153 LEA_L ( REGDIS(0,EDX,8), ECX ) 154 MOV_L ( ECX, EAX ) 155 ADD_L ( REGOFF(20, EBP), EAX ) 156 MOV_L ( REGOFF(-28, EBP), EDX ) 157 MOV_L ( EDX, ECX ) 158 LEA_L ( REGDIS(0,ECX,8), EDX ) 159 MOV_L ( EDX, ECX ) 160 ADD_L ( REGOFF(24, EBP), ECX ) 161 162 MOVQ ( REGIND(EAX), MM4 ) 163 PXOR ( MM5, MM5 ) 164 MOVQ ( MM4, MM1 ) 165 MOVQ ( REGIND(ECX), MM7 ) 166 PUNPCKLBW ( MM5, MM1 ) 167 MOVQ ( MM7, MM6 ) 168 MOVQ ( MM1, MM0 ) 169 PUNPCKLBW ( MM5, MM6 ) 170 MOVQ ( MM1, MM2 ) 171 PSRLQ ( CONST(48), MM0 ) 172 PUNPCKHBW ( MM5, MM4 ) 173 PACKSSDW ( MM0, MM0 ) 174 MOVQ ( MM0, MM3 ) 175 PUNPCKHBW ( MM5, MM7 ) 176 PSLLQ ( CONST(16), MM3 ) 177 POR ( REGOFF(-8, EBP), MM0 ) 178 PUNPCKLWD ( MM6, MM1 ) 179 PSUBW ( MM3, MM0 ) 180 PUNPCKHWD ( MM6, MM2 ) 181 MOVQ ( MM4, MM3 ) 182 PSRLQ ( CONST(48), MM3 ) 183 PACKSSDW ( MM3, MM3 ) 184 MOVQ ( MM3, MM6 ) 185 POR ( REGOFF(-8, EBP), MM3 ) 186 PSLLQ ( CONST(16), MM6 ) 187 PSUBW ( MM6, MM3 ) 188 MOVQ ( MM4, MM5 ) 189 PUNPCKLWD ( MM7, MM4 ) 190 PUNPCKHWD ( MM7, MM5 ) 191 PMADDWD ( MM0, MM1 ) 192 PMADDWD ( MM3, MM4 ) 193 PMADDWD ( MM0, MM2 ) 194 PMADDWD ( MM3, MM5 ) 195 PSRLD ( CONST(8), MM1 ) 196 PSRLD ( CONST(8), MM2 ) 197 PSRLD ( CONST(8), MM4 ) 198 PACKSSDW ( MM2, MM1 ) 199 PSRLD ( CONST(8), MM5 ) 200 PACKUSWB ( MM1, MM1 ) 201 PACKSSDW ( MM5, MM4 ) 202 PAND ( REGOFF(-24, EBP), MM1 ) 203 PACKUSWB ( MM4, MM4 ) 204 PAND ( REGOFF(-16, EBP), MM4 ) 205 POR ( MM1, MM4 ) 206 MOVQ ( MM4, REGIND(EAX) ) 207 208LLBL(GMBT_masked): 209 210 INC_L ( REGOFF(-28, EBP) ) 211 JMP ( LLBL(GMBT_main_loop) ) 212ALIGNTEXT16 213LLBL(GMBT_end_loop): 214 215 216 EMMS 217 218LLBL(GMBT_runout): 219 220 MOV_L ( REGOFF(12, EBP), EAX ) 221 AND_L ( CONST(1), EAX ) 222 TEST_L ( EAX, EAX ) 223 JE ( LLBL(GMBT_skip_runout) ) 224 MOV_L ( REGOFF(12, EBP), EAX ) 225 LEA_L ( REGDIS(0,EAX,4), EDX ) 226 MOV_L ( EDX, EAX ) 227 ADD_L ( REGOFF(20, EBP), EAX ) 228 LEA_L ( REGOFF(-1, EAX), EDX ) 229 XOR_L ( EAX, EAX ) 230 MOV_B ( REGIND(EDX), AL ) 231 MOV_L ( EAX, REGOFF(-52, EBP) ) 232 MOV_L ( CONST(255), EAX ) 233 MOV_L ( EAX, EBX ) 234 SUB_L ( REGOFF(-52, EBP), EBX ) 235 MOV_L ( EBX, REGOFF(-48, EBP) ) 236 MOV_L ( REGOFF(12, EBP), EAX ) 237 LEA_L ( REGDIS(0,EAX,4), EDX ) 238 MOV_L ( EDX, EAX ) 239 ADD_L ( REGOFF(20, EBP), EAX ) 240 LEA_L ( REGOFF(-4, EAX), EDX ) 241 XOR_L ( ECX, ECX ) 242 MOV_B ( REGIND(EDX), CL ) 243 MOV_L ( ECX, EAX ) 244 IMUL_L ( REGOFF(-52, EBP), EAX ) 245 MOV_L ( REGOFF(12, EBP), EDX ) 246 LEA_L ( REGDIS(0,EDX,4), ECX ) 247 MOV_L ( ECX, EDX ) 248 ADD_L ( REGOFF(24, EBP), EDX ) 249 LEA_L ( REGOFF(-4, EDX), ECX ) 250 XOR_L ( EDX, EDX ) 251 MOV_B ( REGIND(ECX), DL ) 252 MOV_L ( EDX, ECX ) 253 IMUL_L ( REGOFF(-48, EBP), ECX ) 254 ADD_L ( ECX, EAX ) 255 MOV_L ( EAX, EBX ) 256 SAR_L ( CONST(8), EBX ) 257 MOV_L ( EBX, REGOFF(-44, EBP) ) 258 MOV_L ( REGOFF(12, EBP), EAX ) 259 LEA_L ( REGDIS(0,EAX,4), EDX ) 260 MOV_L ( EDX, EAX ) 261 ADD_L ( REGOFF(20, EBP), EAX ) 262 LEA_L ( REGOFF(-3, EAX), EDX ) 263 XOR_L ( ECX, ECX ) 264 MOV_B ( REGIND(EDX), CL ) 265 MOV_L ( ECX, EAX ) 266 IMUL_L ( REGOFF(-52, EBP), EAX ) 267 MOV_L ( REGOFF(12, EBP), EDX ) 268 LEA_L ( REGDIS(0,EDX,4), ECX ) 269 MOV_L ( ECX, EDX ) 270 ADD_L ( REGOFF(24, EBP), EDX ) 271 LEA_L ( REGOFF(-3, EDX), ECX ) 272 XOR_L ( EDX, EDX ) 273 MOV_B ( REGIND(ECX), DL ) 274 MOV_L ( EDX, ECX ) 275 IMUL_L ( REGOFF(-48, EBP), ECX ) 276 ADD_L ( ECX, EAX ) 277 MOV_L ( EAX, EBX ) 278 SAR_L ( CONST(8), EBX ) 279 MOV_L ( EBX, REGOFF(-40, EBP) ) 280 MOV_L ( REGOFF(12, EBP), EAX ) 281 LEA_L ( REGDIS(0,EAX,4), EDX ) 282 MOV_L ( EDX, EAX ) 283 ADD_L ( REGOFF(20, EBP), EAX ) 284 LEA_L ( REGOFF(-2, EAX), EDX ) 285 XOR_L ( ECX, ECX ) 286 MOV_B ( REGIND(EDX), CL ) 287 MOV_L ( ECX, EAX ) 288 IMUL_L ( REGOFF(-52, EBP), EAX ) 289 MOV_L ( REGOFF(12, EBP), EDX ) 290 LEA_L ( REGDIS(0,EDX,4), ECX ) 291 MOV_L ( ECX, EDX ) 292 ADD_L ( REGOFF(24, EBP), EDX ) 293 LEA_L ( REGOFF(-2, EDX), ECX ) 294 XOR_L ( EDX, EDX ) 295 MOV_B ( REGIND(ECX), DL ) 296 MOV_L ( EDX, ECX ) 297 IMUL_L ( REGOFF(-48, EBP), ECX ) 298 ADD_L ( ECX, EAX ) 299 MOV_L ( EAX, EBX ) 300 SAR_L ( CONST(8), EBX ) 301 MOV_L ( EBX, REGOFF(-36, EBP) ) 302 MOV_L ( REGOFF(12, EBP), EAX ) 303 LEA_L ( REGDIS(0,EAX,4), EDX ) 304 MOV_L ( EDX, EAX ) 305 ADD_L ( REGOFF(20, EBP), EAX ) 306 LEA_L ( REGOFF(-1, EAX), EDX ) 307 XOR_L ( ECX, ECX ) 308 MOV_B ( REGIND(EDX), CL ) 309 MOV_L ( ECX, EAX ) 310 IMUL_L ( REGOFF(-52, EBP), EAX ) 311 MOV_L ( REGOFF(12, EBP), EDX ) 312 LEA_L ( REGDIS(0,EDX,4), ECX ) 313 MOV_L ( ECX, EDX ) 314 ADD_L ( REGOFF(24, EBP), EDX ) 315 LEA_L ( REGOFF(-1, EDX), ECX ) 316 XOR_L ( EDX, EDX ) 317 MOV_B ( REGIND(ECX), DL ) 318 MOV_L ( EDX, ECX ) 319 IMUL_L ( REGOFF(-48, EBP), ECX ) 320 ADD_L ( ECX, EAX ) 321 MOV_L ( EAX, EBX ) 322 SAR_L ( CONST(8), EBX ) 323 MOV_L ( EBX, REGOFF(-32, EBP) ) 324 MOV_L ( REGOFF(12, EBP), EAX ) 325 LEA_L ( REGDIS(0,EAX,4), EDX ) 326 MOV_L ( EDX, EAX ) 327 ADD_L ( REGOFF(20, EBP), EAX ) 328 LEA_L ( REGOFF(-4, EAX), EDX ) 329 MOV_B ( REGOFF(-44, EBP), AL ) 330 MOV_B ( AL, REGIND(EDX) ) 331 MOV_L ( REGOFF(12, EBP), EAX ) 332 LEA_L ( REGDIS(0,EAX,4), EDX ) 333 MOV_L ( EDX, EAX ) 334 ADD_L ( REGOFF(20, EBP), EAX ) 335 LEA_L ( REGOFF(-3, EAX), EDX ) 336 MOV_B ( REGOFF(-40, EBP), AL ) 337 MOV_B ( AL, REGIND(EDX) ) 338 MOV_L ( REGOFF(12, EBP), EAX ) 339 LEA_L ( REGDIS(0,EAX,4), EDX ) 340 MOV_L ( EDX, EAX ) 341 ADD_L ( REGOFF(20, EBP), EAX ) 342 LEA_L ( REGOFF(-2, EAX), EDX ) 343 MOV_B ( REGOFF(-36, EBP), AL ) 344 MOV_B ( AL, REGIND(EDX) ) 345 MOV_L ( REGOFF(12, EBP), EAX ) 346 LEA_L ( REGDIS(0,EAX,4), EDX ) 347 MOV_L ( EDX, EAX ) 348 ADD_L ( REGOFF(20, EBP), EAX ) 349 LEA_L ( REGOFF(-1, EAX), EDX ) 350 MOV_B ( REGOFF(-32, EBP), AL ) 351 MOV_B ( AL, REGIND(EDX) ) 352LLBL(GMBT_skip_runout): 353 354 MOV_L ( REGOFF(-56, EBP), EBX ) 355 MOV_L ( EBP, ESP ) 356 POP_L ( EBP ) 357 RET 358