Go to the source code of this file.
|
|
Definition at line 22 of file x86span555.h. |
|
|
Definition at line 23 of file x86span555.h. |
|
||||||||||||
|
Definition at line 47 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
00048 {
00049 TDest =Dest;
00050 Red =Green =0;
00051 _asm
00052 {
00053 push ebx
00054 push ecx
00055 push esi
00056 push edi
00057
00058 mov ebx,pLeft
00059 mov ecx,pRight
00060 mov eax,[ebx]EdgeAsmFPU.X
00061 mov edx,[ecx]EdgeAsmFPU.X
00062 sub edx,eax
00063 jle GouraudReturnNoZ
00064
00065 mov esi,eax
00066 inc edx
00067 shl eax,1
00068 add TDest,eax
00069 test esi,1 //dword align left side
00070 jz NoSinglePixie
00071
00072 //odd sized spans write one pixel to dword align
00073 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
00074 fmul [Real65536] ; UL16
00075 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
00076 fmul [Real65536] ; VL16 UL16
00077 fld dword ptr [ebx]EdgeAsmFPU.r ; RL VL16 UL16
00078 fld dword ptr [ebx]EdgeAsmFPU.g ; GL RL VL16 UL16
00079 fld dword ptr [ebx]EdgeAsmFPU.b ; BL GL RL VL16 UL16
00080 fxch st(4) ; UL16 GL RL VL16 BL
00081 fistp [u16] ; GL RL VL16 BL
00082 fxch st(2) ; VL16 RL GL BL
00083 fistp [v16] ; RL GL BL
00084
00085 mov [widTemp],edx
00086
00087 mov ecx,[VShift]
00088 mov ebx,[GHMaskShifted]
00089
00090 mov esi,[GWMask]
00091 mov edi,[v16]
00092
00093 mov edx,dword ptr[u16]
00094
00095 shr edi,cl
00096
00097 shr edx,16
00098 xor eax,eax
00099
00100 and edi,ebx
00101 and edx,esi
00102
00103 add edi,edx
00104
00105 add edi,GBitPtrHalf
00106 mov ax,word ptr[edi*2]
00107
00108 mov ebx,eax
00109 and eax,REDMASK2
00110
00111 mov ecx,ebx
00112 and ebx,GREENMASK2
00113
00114 mov dword ptr[Red],eax
00115 and ecx,BLUEMASK2
00116
00117 mov dword ptr[Green],ebx
00118 mov dword ptr[Blue],ecx
00119
00120 fimul dword ptr[Red] ; R GL BL
00121 fxch st(1) ; GL R BL
00122 fimul dword ptr[Green] ; G R BL
00123 fxch st(1) ; R G BL
00124 fadd qword ptr[Magic] ; Rk G BL
00125 fxch st(2) ; BL G Rk
00126 fimul [Blue] ; B G Rk
00127 fxch st(1) ; G B Rk
00128 fadd qword ptr[Magic] ; Gk B Rk
00129 fxch st(2) ; Rk B Gk
00130 fstp qword ptr[Bucket] ; B Gk
00131 fadd qword ptr[Magic] ; Bk Gk
00132 fxch st(1) ; Gk Bk
00133 fstp qword ptr[Bucket2] ; Bk
00134
00135 mov edx,dword ptr[Bucket]
00136 mov eax,dword ptr[Bucket2]
00137
00138 and edx,REDMASK2
00139 and eax,GREENMASK2
00140
00141 fstp qword ptr[Bucket]
00142
00143 mov ecx,TDest
00144 mov ebx,dword ptr[Bucket]
00145
00146 and ebx,BLUEMASK2
00147 or edx,eax
00148
00149 add TDest,2
00150 or edx,ebx
00151
00152 mov ebx,pLeft
00153 mov word ptr[ecx],dx
00154 mov edx,[widTemp]
00155 mov ecx,pRight
00156 dec edx
00157 jz GouraudReturnNoZ
00158 mov esi,edx
00159 and esi,1
00160 sub edx,esi
00161 jz GouraudReturnNoZ
00162
00163 NoSinglePixie:
00164 mov [widTemp],edx ; just for a temp
00165 shr edx,1
00166
00167 ; try to keep fmul fxch pairs seperated to avoid stalling
00168 ; calc this scanlines steps ; FPU Stack
00169 ; st0 st1 st2 st3 st4 st5 st6 st7
00170 fild dword ptr [widTemp] ; WID
00171
00172 mov [widTemp],edx ; Color interps doubled
00173
00174 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
00175 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
00176 fsub st(1), st ; UL UD WID
00177 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
00178 fxch st(1) ; UL VR UD WID
00179 fmul [Real65536] ; UL16 VR UD WID
00180 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
00181 fsub st(2), st ; VL UL16 VD UD WID
00182 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
00183 fxch st(3) ; VD VL UL16 RR UD WID
00184 fmul [Real65536] ; VD16 VL UL16 RR UD WID
00185 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
00186 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
00187 fxch st(5) ; UD VD16 VL UL16 RD RL WID
00188 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
00189 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
00190 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
00191 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
00192 fistp [u16] ; VD16 UD16 VL16 RD RL WID
00193 fxch st(2) ; VL16 UD16 VD16 RD RL WID
00194 fistp [v16] ; UD16 VD16 RD RL WID
00195 fld1 ; 1 UD16 VD16 RD RL WID
00196 fdivrp st(5),st ; UD16 VD16 RD RL DWID
00197
00198 //let that cook
00199
00200 fmul st,st(4) ; USTP VD16 RD RL DWID
00201 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
00202 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
00203 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
00204 fxch st(2) ; USTP GD LG VD16 RD RL DWID
00205 fistp [UStep] ; GD LG VD16 RD RL DWID
00206 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
00207 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
00208 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
00209 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
00210 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
00211 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
00212 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
00213 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
00214 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
00215 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
00216 frndint
00217 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
00218 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
00219 frndint
00220 fxch st(7) ; DW2 BD RI LG LB VSTP RL GI
00221 fmulp st(1),st ; BI RI LG LB VSTP RL GI
00222 frndint
00223 fxch st(4) ; VSTP RI LG LB BI RL GI
00224 fistp [VStep] ; RI LG LB BI RL GI
00225
00226 push ebp
00227
00228 PixieLoop:
00229 mov ecx,[VShift]
00230 mov ebx,[GHMaskShifted]
00231
00232 mov ebp,[GWMask]
00233 mov edi,[v16]
00234
00235 mov edx,dword ptr[u16]
00236 mov esi,edi
00237
00238 mov eax,edx
00239
00240 shr edi,cl
00241 add esi,[VStep]
00242
00243 shr edx,16
00244 add eax,[UStep]
00245
00246 and edi,ebx
00247 and edx,ebp
00248
00249 add edi,edx
00250 mov edx,eax
00251
00252 add edi,GBitPtrHalf
00253 add eax,[UStep]
00254
00255 mov [u16],eax
00256 mov ax,word ptr[edi*2]
00257
00258 mov edi,esi
00259 add esi,[VStep]
00260
00261 shr edx,16
00262 mov [v16],esi
00263
00264 shr edi,cl
00265 and edx,ebp
00266
00267 mov esi,GBitPtrHalf
00268 and edi,ebx
00269
00270 shl eax,16
00271 add esi,edx
00272
00273 add esi,edi
00274
00275 mov ax,word ptr[esi*2]
00276
00277 mov ebx,eax
00278 and eax,REDMASK2
00279
00280 mov ecx,ebx
00281 and ebx,GREENMASK2
00282
00283 mov dword ptr[Red],eax
00284 and ecx,BLUEMASK2
00285
00286 mov dword ptr[Green],ebx
00287 mov dword ptr[Blue],ecx
00288
00289 fild qword ptr[Red] ; r RI LG LB BI RL GI
00290 fmul st,st(5) ; R RI LG LB BI RL GI
00291 fild qword ptr[Green] ; g R RI LG LB BI RL GI
00292 fmul st,st(3) ; G R RI LG LB BI RL GI
00293 fxch st(6) ; RL R RI LG LB BI G GI
00294 fadd st,st(2) ; RL2 R RI LG LB BI G GI
00295 fxch st(3) ; LG R RI RL2 LB BI G GI
00296 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
00297 fxch st(6) ; G R RI RL2 LB BI LG2 GI
00298 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
00299 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
00300 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
00301 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
00302 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
00303 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
00304
00305 mov edx,dword ptr[Bucket]
00306 mov eax,dword ptr[Bucket2]
00307
00308 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
00309 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
00310 fxch st(3) ; LB RI RL2 B BI LG2 GI
00311 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
00312 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
00313 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
00314
00315 and edx,GREENMASK2
00316 and eax,REDMASK2
00317
00318 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
00319 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
00320
00321 mov edi,edx
00322 mov ebx,dword ptr[Bucket]
00323 or edi,eax
00324 mov ebp,TDest
00325 and ebx,BLUEMASK2
00326
00327 fxch st(3) ; LG2 LB2 BI RL2 GI
00328 or edi,ebx
00329
00330 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
00331
00332 rol edi,16
00333 add TDest,4
00334
00335 mov [ebp],edi
00336 dec [widTemp]
00337
00338 jnz PixieLoop
00339
00340 pop ebp
00341
00342 fstp [u16]
00343 fstp [v16]
00344 fstp [u16]
00345 fstp [v16]
00346 fstp [u16]
00347 fstp [v16]
00348
00349 GouraudReturnNoZ:
00350 pop edi
00351 pop esi
00352 pop ecx
00353 pop ebx
00354 }
00355 }
|
|
||||||||||||
|
|
|
||||||||||||
|
Definition at line 1381 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
01382 {
01383 TDest =Dest;
01384 Red =Green =0;
01385 _asm
01386 {
01387 push ebx
01388 push ecx
01389 push esi
01390 push edi
01391
01392 mov ebx,pLeft
01393 mov ecx,pRight
01394 mov eax,[ebx]EdgeAsmFPU.X
01395 mov edx,[ecx]EdgeAsmFPU.X
01396 sub edx,eax
01397 jle GouraudReturnNoZ
01398
01399 mov esi,eax
01400 inc edx
01401 shl eax,1
01402 add TDest,eax
01403 add pZBufferPtr,eax
01404 test esi,1 //dword align left
01405 jz NoSinglePixie
01406
01407 //odd sized spans write one pixel to dword align
01408 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
01409 fmul [Real65536] ; UL16
01410 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
01411 fmul [Real65536] ; VL16 UL16
01412 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
01413 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
01414 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
01415 fxch st(4) ; UL16 GL RL VL16 BL
01416 fistp [u16] ; GL RL VL16 BL
01417 fxch st(2) ; VL16 RL GL BL
01418 fistp [v16] ; RL GL BL
01419 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
01420 fistp [z16] ; RL GL BL
01421
01422 mov [widTemp],edx
01423
01424 mov ecx,[VShift]
01425 mov ebx,[GHMaskShifted]
01426
01427 mov esi,[GWMask]
01428 mov edi,[v16]
01429
01430 mov edx,dword ptr[u16]
01431
01432 shr edi,cl
01433
01434 shr edx,16
01435 xor eax,eax
01436
01437 and edi,ebx
01438 and edx,esi
01439
01440 add edi,edx
01441
01442 add edi,GBitPtrHalf
01443 mov ax,word ptr[edi*2]
01444
01445 mov ebx,eax
01446 and eax,REDMASK2
01447
01448 mov ecx,ebx
01449 and ebx,GREENMASK2
01450
01451 mov dword ptr[Red],eax
01452 and ecx,BLUEMASK2
01453
01454 mov dword ptr[Green],ebx
01455 mov dword ptr[Blue],ecx
01456
01457 fimul dword ptr[Red] ; R GL BL
01458 fxch st(1) ; GL R BL
01459 fimul dword ptr[Green] ; G R BL
01460 fxch st(1) ; R G BL
01461 fadd qword ptr[Magic] ; Rk G BL
01462 fxch st(2) ; BL G Rk
01463 fimul [Blue] ; B G Rk
01464 fxch st(1) ; G B Rk
01465 fadd qword ptr[Magic] ; Gk B Rk
01466 fxch st(2) ; Rk B Gk
01467 fstp qword ptr[Bucket] ; B Gk
01468 fadd qword ptr[Magic] ; Bk Gk
01469 fxch st(1) ; Gk Bk
01470 fstp qword ptr[Bucket2] ; Bk
01471
01472 mov edx,dword ptr[Bucket]
01473 mov eax,dword ptr[Bucket2]
01474
01475 and edx,REDMASK2
01476 and eax,GREENMASK2
01477
01478 fstp qword ptr[Bucket]
01479
01480 mov ecx,TDest
01481 mov ebx,dword ptr[Bucket]
01482
01483 mov esi,[z16]
01484 and ebx,BLUEMASK2
01485
01486 shr esi,16
01487 or edx,eax
01488
01489 mov eax,pZBufferPtr
01490 add TDest,2
01491
01492 or edx,ebx
01493 mov word ptr[eax],si
01494
01495 mov word ptr[ecx],dx
01496
01497 mov ebx,pLeft
01498 mov edx,[widTemp]
01499 add pZBufferPtr,2
01500 mov ecx,pRight
01501 dec edx
01502 jz GouraudReturnNoZ
01503 mov esi,edx
01504 and esi,1
01505 sub edx,esi
01506 jz GouraudReturnNoZ
01507
01508 NoSinglePixie:
01509 mov [widTemp],edx ; just for a temp
01510 shr edx,1
01511
01512 ; try to keep fmul fxch pairs seperated to avoid stalling
01513 ; calc this scanlines steps ; FPU Stack
01514 ; st0 st1 st2 st3 st4 st5 st6 st7
01515 fild dword ptr [widTemp] ; WID
01516
01517 mov [widTemp],edx ; Color interps doubled
01518
01519 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
01520 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
01521 fsub st(1), st ; UL UD WID
01522 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
01523 fxch st(1) ; UL VR UD WID
01524 fmul [Real65536] ; UL16 VR UD WID
01525 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
01526 fsub st(2), st ; VL UL16 VD UD WID
01527 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
01528 fxch st(3) ; VD VL UL16 RR UD WID
01529 fmul [Real65536] ; VD16 VL UL16 RR UD WID
01530 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
01531 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
01532 fxch st(5) ; UD VD16 VL UL16 RD RL WID
01533 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
01534 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
01535 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
01536 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
01537 fistp [u16] ; VD16 UD16 VL16 RD RL WID
01538 fxch st(2) ; VL16 UD16 VD16 RD RL WID
01539 fistp [v16] ; UD16 VD16 RD RL WID
01540 fld1 ; 1 UD16 VD16 RD RL WID
01541 fdivrp st(5),st ; UD16 VD16 RD RL DWID
01542
01543 //let that cook
01544
01545 fmul st,st(4) ; USTP VD16 RD RL DWID
01546 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
01547 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
01548 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
01549 fxch st(2) ; USTP GD LG VD16 RD RL DWID
01550 fistp [UStep] ; GD LG VD16 RD RL DWID
01551 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
01552 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
01553 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
01554 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
01555 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
01556 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
01557 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
01558 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
01559 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
01560 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
01561 frndint
01562 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
01563 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
01564 frndint
01565 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
01566 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
01567 frndint
01568 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
01569 fistp [VStep] ; GI RI LG LB BD RL DW2
01570 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
01571 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
01572 fxch st(7) ; DW2 GI RI LG LB BD RL zd
01573 fmulp st(7),st ; GI RI LG LB BD RL zd
01574 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
01575 fxch st(7) ; zd GI RI LG LB BD RL lz
01576 fistp [ZStep] ; GI RI LG LB BD RL lz
01577 fxch st(6) ; lz RI LG LB BD RL GI
01578 fistp [z16] ; RI LG LB BD RL GI
01579
01580 push ebp
01581
01582 PixieLoop:
01583 mov ebx,[ZStep]
01584
01585 add [z16],ebx
01586 mov ecx,[VShift]
01587
01588 mov edi,[z16]
01589
01590 shr edi,16
01591 mov ebx,[GHMaskShifted]
01592
01593 mov ebp,[GWMask]
01594 mov edx,dword ptr[u16]
01595
01596 mov word ptr[Z32],di
01597 mov eax,edx
01598
01599 shr edx,16
01600 mov edi,[v16]
01601
01602 add eax,[UStep]
01603 mov esi,edi
01604
01605 shr edi,cl
01606 add esi,[VStep]
01607
01608 and edi,ebx
01609 and edx,ebp
01610
01611 add edi,edx
01612 mov edx,eax
01613
01614 add edi,GBitPtrHalf
01615 add eax,[UStep]
01616
01617 mov [u16],eax
01618 mov ax,word ptr[edi*2]
01619
01620 mov edi,esi
01621 add esi,[VStep]
01622
01623 shr edx,16
01624 mov [v16],esi
01625
01626 shr edi,cl
01627 and edx,ebp
01628
01629 mov esi,GBitPtrHalf
01630 and edi,ebx
01631
01632 shl eax,16
01633 add esi,edx
01634
01635 add esi,edi
01636
01637 mov ax,word ptr[esi*2]
01638
01639 mov ebx,eax
01640 and eax,REDMASK2
01641
01642 mov ecx,ebx
01643 and ebx,GREENMASK2
01644
01645 mov dword ptr[Red],eax
01646 and ecx,BLUEMASK2
01647
01648 mov dword ptr[Green],ebx
01649 mov dword ptr[Blue],ecx
01650
01651 fild qword ptr[Red] ; r RI LG LB BI RL GI
01652 fmul st,st(5) ; R RI LG LB BI RL GI
01653 fild qword ptr[Green] ; g R RI LG LB BI RL GI
01654 fmul st,st(3) ; G R RI LG LB BI RL GI
01655 fxch st(6) ; RL R RI LG LB BI G GI
01656 fadd st,st(2) ; RL2 R RI LG LB BI G GI
01657 fxch st(3) ; LG R RI RL2 LB BI G GI
01658 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
01659 fxch st(6) ; G R RI RL2 LB BI LG2 GI
01660 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
01661 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
01662 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
01663 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
01664 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
01665 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
01666
01667 mov edx,dword ptr[Bucket]
01668 mov eax,dword ptr[Bucket2]
01669
01670 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
01671 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
01672 fxch st(3) ; LB RI RL2 B BI LG2 GI
01673 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
01674 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
01675 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
01676
01677 and edx,GREENMASK2
01678 and eax,REDMASK2
01679
01680 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
01681 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
01682
01683 mov edi,edx
01684 mov ebx,dword ptr[Bucket]
01685 or edi,eax
01686 mov ebp,TDest
01687 and ebx,BLUEMASK2
01688
01689 fxch st(3) ; LG2 LB2 BI RL2 GI
01690 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
01691
01692 mov si,word ptr[Z32]
01693 add TDest,4
01694
01695 mov ecx,pZBufferPtr
01696 or edi,ebx
01697
01698 mov [ecx],si
01699 rol edi,16
01700
01701 mov dword ptr[ebp],edi
01702 mov [ecx+2],si
01703
01704 add pZBufferPtr,4
01705 dec [widTemp]
01706
01707 jnz PixieLoop
01708
01709 pop ebp
01710
01711 fstp [u16]
01712 fstp [v16]
01713 fstp [u16]
01714 fstp [v16]
01715 fstp [u16]
01716 fstp [v16]
01717
01718 GouraudReturnNoZ:
01719 pop edi
01720 pop esi
01721 pop ecx
01722 pop ebx
01723 }
01724 }
|
|
||||||||||||
|
|
|
||||||||||||
|
Definition at line 2970 of file x86span555.c. References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderGouraudPoly().
02971 {
02972 TDest =Dest;
02973 Red =Green =0;
02974 _asm
02975 {
02976 push ebx
02977 push ecx
02978 push esi
02979 push edi
02980
02981 mov ebx,pLeft
02982 mov ecx,pRight
02983 mov eax,[ebx]EdgeAsmFPU.X
02984 mov edx,[ecx]EdgeAsmFPU.X
02985 sub edx,eax
02986 jle GouraudReturnNoZ
02987
02988 mov esi,eax
02989 inc edx
02990 shl eax,1
02991 add TDest,eax
02992 add pZBufferPtr,eax
02993 test esi,1 //dword align left side
02994 jz NoSinglePixie
02995
02996 //odd sized spans write one pixel to dword align
02997 fild dword ptr [ebx]EdgeAsmFPU.B ; BL
02998 fmul dword ptr[BlueMask]
02999 fadd qword ptr[Magic] ; Bk
03000 fild dword ptr [ebx]EdgeAsmFPU.G ; GL Bk
03001 fmul dword ptr[GreenMask2]
03002 fadd qword ptr[Magic] ; Gk Bk
03003 fild dword ptr [ebx]EdgeAsmFPU.R ; RL Gk Bk
03004 fmul dword ptr[MiniRedMask2]
03005 fadd qword ptr[Magic] ; Rk Gk Bk
03006 fxch st(2) ; Bk Gk Rk
03007 fstp qword ptr[Bucket] ; Gk Rk
03008 fstp qword ptr[Bucket2] ; Rk
03009 fld dword ptr[ebx]EdgeAsmFPU.z ; z
03010 fistp [z16] ;
03011
03012 mov esi,dword ptr[Bucket]
03013 mov eax,dword ptr[Bucket2]
03014
03015 and esi,BLUEMASK2
03016 and eax,GREENMASK2
03017
03018 fstp qword ptr[Bucket]
03019
03020 mov ecx,TDest
03021 mov ebx,dword ptr[Bucket]
03022
03023 and ebx,REDMASK2
03024 or esi,eax
03025
03026 mov edi,[z16]
03027 mov eax,pZBufferPtr
03028
03029 add TDest,2
03030 or esi,ebx
03031
03032 shr edi,16
03033 mov ebx,pLeft
03034
03035 mov word ptr[eax],di
03036 mov word ptr[ecx],si
03037
03038 mov ecx,pRight
03039 dec edx
03040
03041 jz GouraudReturnNoZ
03042 mov esi,edx
03043 add pZBufferPtr,2
03044 and esi,1
03045 sub edx,esi
03046 jz GouraudReturnNoZ
03047
03048 NoSinglePixie:
03049 shr edx,1
03050 fld1
03051 mov [widTemp],edx ; just for a temp
03052
03053
03054 ; try to keep fmul fxch pairs seperated to avoid stalling
03055 ; calc this scanlines steps ; FPU Stack
03056 ; st0 st1 st2 st3 st4 st5 st6 st7
03057 fidiv dword ptr [widTemp] ; WID
03058 fild dword ptr [ecx]EdgeAsmFPU.R ; RR WID
03059 fild dword ptr [ebx]EdgeAsmFPU.R ; RL RR WID
03060 fsub st(1),st ; RL RD WID
03061 fild [ecx]EdgeAsmFPU.G ; GR RL RD WID
03062 fild [ebx]EdgeAsmFPU.G ; GL GR RL RD WID
03063 fsub st(1),st ; GL GD RL RD WID
03064 fild [ecx]EdgeAsmFPU.B ; BR GL GD RL RD WID
03065 fild [ebx]EdgeAsmFPU.B ; BL BR GL GD RL RD WID
03066 fsub st(1),st ; BL BD GL GD RL RD WID
03067 fxch st(5) ; RD BD GL GD RL BL WID
03068 fmul st,st(6) ; RI BD GL GD RL BL WID
03069 frndint
03070 fxch st(3) ; GD BD GL RI RL BL WID
03071 fmul st,st(6) ; GI BD GL RI RL BL WID
03072 frndint
03073 fxch st(6) ; WID BD GL RI RL BL GI
03074 fmulp st(1),st ; BI GL RI RL BL GI
03075 frndint
03076 fld qword ptr[RedMask2] ; rm BI GL RI RL BL GI
03077 fmul st(3),st ; rm BI GL RI RL BL GI
03078 fmulp st(4),st ; BI GL RI RL BL GI
03079 fld dword ptr[GreenMask2] ; gm BI GL RI RL BL GI
03080 fmul st(2),st ; gm BI GL RI RL BL GI
03081 fmulp st(6),st ; BI GL RI RL BL GI
03082 fld dword ptr[BlueMask] ; bm BI GL RI RL BL GI
03083 fmul st(1),st ; bm BI GL RI RL BL GI
03084 fmulp st(5),st ; BI GL RI RL BL GI
03085 fld [ecx]EdgeAsmFPU.z ; rz BI GL RI RL BL GI
03086 fsub [ebx]EdgeAsmFPU.z ; zd BI GL RI RL BL GI
03087 fld [ebx]EdgeAsmFPU.z ; lz zd BI GL RI RL BL GI
03088 fistp [z16] ; zd BI GL RI RL BL GI
03089 fistp [ZStep] ; BI GL RI RL BL GI
03090
03091 PixieLoop:
03092
03093 fld st(3) ; r BI GL RI RL BL GI
03094 fadd qword ptr[Magic] ; rk BI GL RI RL BL GI
03095 fld st(2) ; g rk BI GL RI RL BL GI
03096 fadd qword ptr[Magic] ; gk rk BI GL RI RL BL GI
03097 fxch st(1) ; rk gk BI GL RI RL BL GI
03098 fstp qword ptr[Bucket] ; gk BI GL RI RL BL GI
03099
03100 mov edi,[z16]
03101 mov esi,pZBufferPtr
03102
03103 shr edi,16
03104 mov ebx,[ZStep]
03105
03106 mov word ptr[esi],di
03107 add [z16],ebx
03108
03109 fstp qword ptr[Bucket2] ; BI GL RI RL BL GI
03110 fld st(4) ; b BI GL RI RL BL GI
03111 fadd qword ptr[Magic] ; bk BI GL RI RL BL GI
03112
03113 mov word ptr[esi+2],di
03114
03115 mov ecx,dword ptr[Bucket]
03116 mov eax,dword ptr[Bucket2]
03117
03118 fstp qword ptr[Bucket] ; BI GL RI RL BL GI
03119 fadd st(4),st ; BI GL RI RL BL2 GI
03120
03121 and ecx,REDMASK2
03122 and eax,GREENMASK2
03123
03124 mov ebx,dword ptr[Bucket]
03125 or ecx,eax
03126
03127 fstp qword ptr[Bucket] ; GL RI RL BL2 GI
03128 fadd st,st(4) ; GL2 RI RL BL2 GI
03129 fstp qword ptr[Bucket2] ; RI RL BL2 GI
03130 fadd st(1),st ; RI RL2 BL2 GI
03131 fld qword ptr[Bucket2] ; GL2 RI RL2 BL2 GI
03132 fld qword ptr[Bucket] ; BI GL2 RI RL2 BL2 GI
03133
03134 and ebx,BLUEMASK2
03135 mov edi,TDest
03136
03137 or ecx,ebx
03138 add TDest,4
03139
03140 rol ecx,16
03141
03142 mov [edi],ecx
03143
03144 add pZBufferPtr,4
03145
03146 dec edx
03147
03148 jnz PixieLoop
03149
03150
03151 fstp [u16]
03152 fstp [v16]
03153 fstp [u16]
03154 fstp [v16]
03155 fstp [u16]
03156 fstp [v16]
03157
03158 GouraudReturnNoZ:
03159 pop edi
03160 pop esi
03161 pop ecx
03162 pop ebx
03163 }
03164 }
|
|
||||||||||||
|
Definition at line 2448 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
02449 {
02450 TDest =Dest;
02451 Red =Green =0;
02452 _asm
02453 {
02454 push ebx
02455 push ecx
02456 push esi
02457 push edi
02458
02459 mov ebx,pLeft
02460 mov ecx,pRight
02461 mov eax,[ebx]EdgeAsmFPU.X
02462 mov edx,[ecx]EdgeAsmFPU.X
02463 sub edx,eax
02464 jle GouraudReturnNoZ
02465
02466 mov esi,eax
02467 inc edx
02468 shl eax,1
02469 add TDest,eax
02470 add pZBufferPtr,eax
02471 test esi,1 //dword align left
02472 jz NoSinglePixie
02473
02474 //odd sized spans write one pixel to dword align
02475 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
02476 fmul [Real65536] ; UL16
02477 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
02478 fmul [Real65536] ; VL16 UL16
02479 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
02480 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
02481 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
02482 fxch st(4) ; UL16 GL RL VL16 BL
02483 fistp [u16] ; GL RL VL16 BL
02484 fxch st(2) ; VL16 RL GL BL
02485 fistp [v16] ; RL GL BL
02486 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
02487 fistp [z16] ; RL GL BL
02488
02489 mov [widTemp],edx
02490
02491 mov ecx,[VShift]
02492 mov ebx,[GHMaskShifted]
02493
02494 mov esi,[GWMask]
02495 mov edi,[v16]
02496
02497 mov edx,dword ptr[u16]
02498
02499 shr edi,cl
02500
02501 shr edx,16
02502 xor eax,eax
02503
02504 and edi,ebx
02505 and edx,esi
02506
02507 add edi,edx
02508
02509 add edi,GBitPtrHalf
02510 mov ax,word ptr[edi*2]
02511
02512 mov word ptr[TempPix],ax
02513
02514 mov ebx,eax
02515 and eax,REDMASK2
02516
02517 mov ecx,ebx
02518 and ebx,GREENMASK2
02519
02520 mov dword ptr[Red],eax
02521 and ecx,BLUEMASK2
02522
02523 mov dword ptr[Green],ebx
02524 mov dword ptr[Blue],ecx
02525
02526 fimul dword ptr[Red] ; R GL BL
02527 fxch st(1) ; GL R BL
02528 fimul dword ptr[Green] ; G R BL
02529 fxch st(1) ; R G BL
02530 fadd qword ptr[Magic] ; Rk G BL
02531 fxch st(2) ; BL G Rk
02532 fimul [Blue] ; B G Rk
02533 fxch st(1) ; G B Rk
02534 fadd qword ptr[Magic] ; Gk B Rk
02535 fxch st(2) ; Rk B Gk
02536 fstp qword ptr[Bucket] ; B Gk
02537 fadd qword ptr[Magic] ; Bk Gk
02538 fxch st(1) ; Gk Bk
02539 fstp qword ptr[Bucket2] ; Bk
02540
02541 mov edx,dword ptr[Bucket]
02542 mov eax,dword ptr[Bucket2]
02543
02544 and edx,REDMASK2
02545 and eax,GREENMASK2
02546
02547 fstp qword ptr[Bucket]
02548
02549 mov ecx,TDest
02550 mov ebx,dword ptr[Bucket]
02551
02552 mov esi,[z16]
02553 and ebx,BLUEMASK2
02554
02555 shr esi,16
02556 or edx,eax
02557
02558 mov eax,pZBufferPtr
02559 add TDest,2
02560
02561 cmp word ptr[TempPix],01h
02562 je SkipSinglePixie
02563
02564 or edx,ebx
02565 mov word ptr[eax],si
02566
02567 mov word ptr[ecx],dx
02568
02569 SkipSinglePixie:
02570 mov ebx,pLeft
02571 mov edx,[widTemp]
02572 add pZBufferPtr,2
02573 mov ecx,pRight
02574 dec edx
02575 jz GouraudReturnNoZ
02576 mov esi,edx
02577 and esi,1
02578 sub edx,esi
02579 jz GouraudReturnNoZ
02580
02581 NoSinglePixie:
02582 mov [widTemp],edx ; just for a temp
02583 shr edx,1
02584
02585 ; try to keep fmul fxch pairs seperated to avoid stalling
02586 ; calc this scanlines steps ; FPU Stack
02587 ; st0 st1 st2 st3 st4 st5 st6 st7
02588 fild dword ptr [widTemp] ; WID
02589
02590 mov [widTemp],edx ; Color interps doubled
02591
02592 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
02593 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
02594 fsub st(1), st ; UL UD WID
02595 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
02596 fxch st(1) ; UL VR UD WID
02597 fmul [Real65536] ; UL16 VR UD WID
02598 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
02599 fsub st(2), st ; VL UL16 VD UD WID
02600 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
02601 fxch st(3) ; VD VL UL16 RR UD WID
02602 fmul [Real65536] ; VD16 VL UL16 RR UD WID
02603 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
02604 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
02605 fxch st(5) ; UD VD16 VL UL16 RD RL WID
02606 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
02607 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
02608 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
02609 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
02610 fistp [u16] ; VD16 UD16 VL16 RD RL WID
02611 fxch st(2) ; VL16 UD16 VD16 RD RL WID
02612 fistp [v16] ; UD16 VD16 RD RL WID
02613 fld1 ; 1 UD16 VD16 RD RL WID
02614 fdivrp st(5),st ; UD16 VD16 RD RL DWID
02615
02616 //let that cook
02617
02618 fmul st,st(4) ; USTP VD16 RD RL DWID
02619 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
02620 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
02621 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
02622 fxch st(2) ; USTP GD LG VD16 RD RL DWID
02623 fistp [UStep] ; GD LG VD16 RD RL DWID
02624 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
02625 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
02626 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
02627 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
02628 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
02629 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
02630 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
02631 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
02632 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
02633 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
02634 frndint
02635 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
02636 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
02637 frndint
02638 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
02639 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
02640 frndint
02641 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
02642 fistp [VStep] ; GI RI LG LB BD RL DW2
02643 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
02644 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
02645 fxch st(7) ; DW2 GI RI LG LB BD RL zd
02646 fmulp st(7),st ; GI RI LG LB BD RL zd
02647 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
02648 fxch st(7) ; zd GI RI LG LB BD RL lz
02649 fistp [ZStep] ; GI RI LG LB BD RL lz
02650 fxch st(6) ; lz RI LG LB BD RL GI
02651 fistp [z16] ; RI LG LB BD RL GI
02652
02653 push ebp
02654
02655 PixieLoop:
02656 mov ebx,[ZStep]
02657
02658 add [z16],ebx
02659 mov ecx,[VShift]
02660
02661 mov edi,[z16]
02662
02663 shr edi,16
02664 mov ebx,[GHMaskShifted]
02665
02666 mov ebp,[GWMask]
02667 mov edx,dword ptr[u16]
02668
02669 mov word ptr[Z32],di
02670 mov eax,edx
02671
02672 shr edx,16
02673 mov edi,[v16]
02674
02675 add eax,[UStep]
02676 mov esi,edi
02677
02678 shr edi,cl
02679 add esi,[VStep]
02680
02681 and edi,ebx
02682 and edx,ebp
02683
02684 add edi,edx
02685 mov edx,eax
02686
02687 add edi,GBitPtrHalf
02688 add eax,[UStep]
02689
02690 mov [u16],eax
02691 mov ax,word ptr[edi*2]
02692
02693 mov edi,esi
02694 add esi,[VStep]
02695
02696 shr edx,16
02697 mov [v16],esi
02698
02699 shr edi,cl
02700 and edx,ebp
02701
02702 mov esi,GBitPtrHalf
02703 and edi,ebx
02704
02705 shl eax,16
02706 add esi,edx
02707
02708 add esi,edi
02709
02710 mov ax,word ptr[esi*2]
02711
02712 mov [TempPix],eax
02713
02714 mov ebx,eax
02715 and eax,REDMASK2
02716
02717 mov ecx,ebx
02718 and ebx,GREENMASK2
02719
02720 mov dword ptr[Red],eax
02721 and ecx,BLUEMASK2
02722
02723 mov dword ptr[Green],ebx
02724 mov dword ptr[Blue],ecx
02725
02726 fild qword ptr[Red] ; r RI LG LB BI RL GI
02727 fmul st,st(5) ; R RI LG LB BI RL GI
02728 fild qword ptr[Green] ; g R RI LG LB BI RL GI
02729 fmul st,st(3) ; G R RI LG LB BI RL GI
02730 fxch st(6) ; RL R RI LG LB BI G GI
02731 fadd st,st(2) ; RL2 R RI LG LB BI G GI
02732 fxch st(3) ; LG R RI RL2 LB BI G GI
02733 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
02734 fxch st(6) ; G R RI RL2 LB BI LG2 GI
02735 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
02736 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
02737 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
02738 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
02739 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
02740 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
02741
02742 mov edx,dword ptr[Bucket]
02743 mov eax,dword ptr[Bucket2]
02744
02745 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
02746 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
02747 fxch st(3) ; LB RI RL2 B BI LG2 GI
02748 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
02749 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
02750 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
02751
02752 and edx,GREENMASK2
02753 and eax,REDMASK2
02754
02755 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
02756 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
02757
02758 mov edi,edx
02759 mov ebx,dword ptr[Bucket]
02760 or edi,eax
02761 mov ebp,TDest
02762 and ebx,BLUEMASK2
02763
02764 fxch st(3) ; LG2 LB2 BI RL2 GI
02765 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
02766
02767 mov si,word ptr[Z32]
02768 add TDest,4
02769
02770 mov ecx,pZBufferPtr
02771 or edi,ebx
02772
02773 cmp [TempPix],010001h
02774 je SkipPixie
02775
02776 mov [ecx],si
02777 rol edi,16
02778
02779 mov dword ptr[ebp],edi
02780 mov [ecx+2],si
02781 SkipPixie:
02782 add pZBufferPtr,4
02783 dec [widTemp]
02784
02785 jnz PixieLoop
02786
02787 pop ebp
02788
02789 fstp [u16]
02790 fstp [v16]
02791 fstp [u16]
02792 fstp [v16]
02793 fstp [u16]
02794 fstp [v16]
02795
02796 GouraudReturnNoZ:
02797 pop edi
02798 pop esi
02799 pop ecx
02800 pop ebx
02801 }
02802 }
|
|
||||||||||||
|
Definition at line 2804 of file x86span555.c. References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderGouraudPoly().
02805 {
02806 TDest =Dest;
02807 Red =Green =0;
02808 _asm
02809 {
02810 push ebx
02811 push ecx
02812 push esi
02813 push edi
02814
02815 mov ebx,pLeft
02816 mov ecx,pRight
02817 mov eax,[ebx]EdgeAsmFPU.X
02818 mov edx,[ecx]EdgeAsmFPU.X
02819 sub edx,eax
02820 jle GouraudReturnNoZ
02821
02822 mov esi,eax
02823 inc edx
02824 shl eax,1
02825 add TDest,eax
02826 test esi,1 //dword align left side
02827 jz NoSinglePixie
02828
02829 //odd sized spans write one pixel to dword align
02830 fild dword ptr [ebx]EdgeAsmFPU.B ; BL
02831 fmul dword ptr[BlueMask]
02832 fadd qword ptr[Magic] ; Bk
02833 fild dword ptr [ebx]EdgeAsmFPU.G ; GL Bk
02834 fmul dword ptr[GreenMask2]
02835 fadd qword ptr[Magic] ; Gk Bk
02836 fild dword ptr [ebx]EdgeAsmFPU.R ; RL Gk Bk
02837 fmul dword ptr[MiniRedMask2]
02838 fadd qword ptr[Magic] ; Rk Gk Bk
02839 fxch st(2) ; Bk Gk Rk
02840 fstp qword ptr[Bucket] ; Gk Rk
02841 fstp qword ptr[Bucket2] ; Rk
02842
02843 mov esi,dword ptr[Bucket]
02844 mov eax,dword ptr[Bucket2]
02845
02846 and esi,BLUEMASK2
02847 and eax,GREENMASK2
02848
02849 fstp qword ptr[Bucket]
02850
02851 mov ecx,TDest
02852 mov ebx,dword ptr[Bucket]
02853
02854 and ebx,REDMASK2
02855 or esi,eax
02856
02857 add TDest,2
02858 or esi,ebx
02859
02860 mov ebx,pLeft
02861 mov word ptr[ecx],si
02862
02863 mov ecx,pRight
02864 dec edx
02865
02866 jz GouraudReturnNoZ
02867 mov esi,edx
02868 and esi,1
02869 sub edx,esi
02870 jz GouraudReturnNoZ
02871
02872 NoSinglePixie:
02873 shr edx,1
02874 fld1
02875 mov [widTemp],edx ; just for a temp
02876
02877
02878 ; try to keep fmul fxch pairs seperated to avoid stalling
02879 ; calc this scanlines steps ; FPU Stack
02880 ; st0 st1 st2 st3 st4 st5 st6 st7
02881 fidiv dword ptr [widTemp] ; WID
02882 fild dword ptr [ecx]EdgeAsmFPU.R ; RR WID
02883 fild dword ptr [ebx]EdgeAsmFPU.R ; RL RR WID
02884 fsub st(1),st ; RL RD WID
02885 fild [ecx]EdgeAsmFPU.G ; GR RL RD WID
02886 fild [ebx]EdgeAsmFPU.G ; GL GR RL RD WID
02887 fsub st(1),st ; GL GD RL RD WID
02888 fild [ecx]EdgeAsmFPU.B ; BR GL GD RL RD WID
02889 fild [ebx]EdgeAsmFPU.B ; BL BR GL GD RL RD WID
02890 fsub st(1),st ; BL BD GL GD RL RD WID
02891 fxch st(5) ; RD BD GL GD RL BL WID
02892 fmul st,st(6) ; RI BD GL GD RL BL WID
02893 frndint
02894 fxch st(3) ; GD BD GL RI RL BL WID
02895 fmul st,st(6) ; GI BD GL RI RL BL WID
02896 frndint
02897 fxch st(6) ; WID BD GL RI RL BL GI
02898 fmulp st(1),st ; BI GL RI RL BL GI
02899 frndint
02900 fld qword ptr[RedMask2] ; rm BI GL RI RL BL GI
02901 fmul st(3),st ; rm BI GL RI RL BL GI
02902 fmulp st(4),st ; BI GL RI RL BL GI
02903 fld dword ptr[GreenMask2] ; gm BI GL RI RL BL GI
02904 fmul st(2),st ; gm BI GL RI RL BL GI
02905 fmulp st(6),st ; BI GL RI RL BL GI
02906 fld dword ptr[BlueMask] ; bm BI GL RI RL BL GI
02907 fmul st(1),st ; bm BI GL RI RL BL GI
02908 fmulp st(5),st ; BI GL RI RL BL GI
02909
02910 PixieLoop:
02911
02912 fld st(3) ; r BI GL RI RL BL GI
02913 fadd qword ptr[Magic] ; rk BI GL RI RL BL GI
02914 fld st(2) ; g rk BI GL RI RL BL GI
02915 fadd qword ptr[Magic] ; gk rk BI GL RI RL BL GI
02916 fxch st(1) ; rk gk BI GL RI RL BL GI
02917 fstp qword ptr[Bucket] ; gk BI GL RI RL BL GI
02918 fstp qword ptr[Bucket2] ; BI GL RI RL BL GI
02919 fld st(4) ; b BI GL RI RL BL GI
02920 fadd qword ptr[Magic] ; bk BI GL RI RL BL GI
02921
02922 mov ecx,dword ptr[Bucket]
02923 mov eax,dword ptr[Bucket2]
02924
02925 fstp qword ptr[Bucket] ; BI GL RI RL BL GI
02926 fadd st(4),st ; BI GL RI RL BL2 GI
02927
02928 and ecx,REDMASK2
02929 and eax,GREENMASK2
02930
02931 mov ebx,dword ptr[Bucket]
02932 or ecx,eax
02933
02934 fstp qword ptr[Bucket] ; GL RI RL BL2 GI
02935 fadd st,st(4) ; GL2 RI RL BL2 GI
02936 fstp qword ptr[Bucket2] ; RI RL BL2 GI
02937 fadd st(1),st ; RI RL2 BL2 GI
02938 fld qword ptr[Bucket2] ; GL2 RI RL2 BL2 GI
02939 fld qword ptr[Bucket] ; BI GL2 RI RL2 BL2 GI
02940
02941 and ebx,BLUEMASK2
02942 mov edi,TDest
02943
02944 or ecx,ebx
02945 add TDest,4
02946
02947 rol ecx,16
02948
02949 mov [edi],ecx
02950 dec edx
02951
02952 jnz PixieLoop
02953
02954
02955 fstp [u16]
02956 fstp [v16]
02957 fstp [u16]
02958 fstp [v16]
02959 fstp [u16]
02960 fstp [v16]
02961
02962 GouraudReturnNoZ:
02963 pop edi
02964 pop esi
02965 pop ecx
02966 pop ebx
02967 }
02968 }
|
|
||||||||||||
|
Definition at line 357 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
00358 {
00359 TDest =Dest;
00360 Red =Green =0;
00361 _asm
00362 {
00363 push ebx
00364 push ecx
00365 push esi
00366 push edi
00367
00368 mov ebx,pLeft
00369 mov ecx,pRight
00370 mov eax,[ebx]EdgeAsmFPU.X
00371 mov edx,[ecx]EdgeAsmFPU.X
00372 sub edx,eax
00373 jle GouraudReturnNoZ
00374
00375 mov esi,eax
00376 inc edx
00377 shl eax,1
00378 add TDest,eax
00379 test esi,1 //dword align left side
00380 jz NoSinglePixie
00381
00382 //odd sized spans write one pixel to dword align
00383 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
00384 fmul [Real65536] ; UL16
00385 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
00386 fmul [Real65536] ; VL16 UL16
00387 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
00388 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
00389 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
00390 fxch st(4) ; UL16 GL RL VL16 BL
00391 fistp [u16] ; GL RL VL16 BL
00392 fxch st(2) ; VL16 RL GL BL
00393 fistp [v16] ; RL GL BL
00394
00395 mov [widTemp],edx
00396
00397 mov ecx,[VShift]
00398 mov ebx,[GHMaskShifted]
00399
00400 mov esi,[GWMask]
00401 mov edi,[v16]
00402
00403 mov edx,dword ptr[u16]
00404
00405 shr edi,cl
00406
00407 shr edx,16
00408 xor eax,eax
00409
00410 and edi,ebx
00411 and edx,esi
00412
00413 add edi,edx
00414
00415 add edi,GBitPtrHalf
00416 mov ax,word ptr[edi*2]
00417
00418 mov word ptr[TempPix],ax
00419
00420 mov ebx,eax
00421 and eax,REDMASK2
00422
00423 mov ecx,ebx
00424 and ebx,GREENMASK2
00425
00426 mov dword ptr[Red],eax
00427 and ecx,BLUEMASK2
00428
00429 mov dword ptr[Green],ebx
00430 mov dword ptr[Blue],ecx
00431
00432 fimul dword ptr[Red] ; R GL BL
00433 fxch st(1) ; GL R BL
00434 fimul dword ptr[Green] ; G R BL
00435 fxch st(1) ; R G BL
00436 fadd qword ptr[Magic] ; Rk G BL
00437 fxch st(2) ; BL G Rk
00438 fimul [Blue] ; B G Rk
00439 fxch st(1) ; G B Rk
00440 fadd qword ptr[Magic] ; Gk B Rk
00441 fxch st(2) ; Rk B Gk
00442 fstp qword ptr[Bucket] ; B Gk
00443 fadd qword ptr[Magic] ; Bk Gk
00444 fxch st(1) ; Gk Bk
00445 fstp qword ptr[Bucket2] ; Bk
00446
00447 mov edx,dword ptr[Bucket]
00448 mov eax,dword ptr[Bucket2]
00449
00450 and edx,REDMASK2
00451 and eax,GREENMASK2
00452
00453 fstp qword ptr[Bucket]
00454
00455 mov ecx,TDest
00456 mov ebx,dword ptr[Bucket]
00457
00458 and ebx,BLUEMASK2
00459 or edx,eax
00460
00461 add TDest,2
00462 or edx,ebx
00463
00464 mov ebx,pLeft
00465 cmp word ptr[TempPix],01h
00466 je SkipSinglePixie
00467
00468 mov word ptr[ecx],dx
00469
00470 SkipSinglePixie:
00471 mov edx,[widTemp]
00472 mov ecx,pRight
00473 dec edx
00474 jz GouraudReturnNoZ
00475 mov esi,edx
00476 and esi,1
00477 sub edx,esi
00478 jz GouraudReturnNoZ
00479
00480 NoSinglePixie:
00481 mov [widTemp],edx ; just for a temp
00482 shr edx,1
00483
00484 ; try to keep fmul fxch pairs seperated to avoid stalling
00485 ; calc this scanlines steps ; FPU Stack
00486 ; st0 st1 st2 st3 st4 st5 st6 st7
00487 fild dword ptr [widTemp] ; WID
00488
00489 mov [widTemp],edx ; Color interps doubled
00490
00491 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
00492 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
00493 fsub st(1), st ; UL UD WID
00494 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
00495 fxch st(1) ; UL VR UD WID
00496 fmul [Real65536] ; UL16 VR UD WID
00497 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
00498 fsub st(2), st ; VL UL16 VD UD WID
00499 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
00500 fxch st(3) ; VD VL UL16 RR UD WID
00501 fmul [Real65536] ; VD16 VL UL16 RR UD WID
00502 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
00503 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
00504 fxch st(5) ; UD VD16 VL UL16 RD RL WID
00505 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
00506 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
00507 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
00508 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
00509 fistp [u16] ; VD16 UD16 VL16 RD RL WID
00510 fxch st(2) ; VL16 UD16 VD16 RD RL WID
00511 fistp [v16] ; UD16 VD16 RD RL WID
00512 fld1 ; 1 UD16 VD16 RD RL WID
00513 fdivrp st(5),st ; UD16 VD16 RD RL DWID
00514
00515 //let that cook
00516
00517 fmul st,st(4) ; USTP VD16 RD RL DWID
00518 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
00519 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
00520 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
00521 fxch st(2) ; USTP GD LG VD16 RD RL DWID
00522 fistp [UStep] ; GD LG VD16 RD RL DWID
00523 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
00524 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
00525 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
00526 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
00527 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
00528 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
00529 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
00530 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
00531 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
00532 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
00533 frndint
00534 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
00535 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
00536 frndint
00537 fxch st(7) ; DW2 BD RI LG LB VSTP RL GI
00538 fmulp st(1),st ; BI RI LG LB VSTP RL GI
00539 frndint
00540 fxch st(4) ; VSTP RI LG LB BI RL GI
00541 fistp [VStep] ; RI LG LB BI RL GI
00542
00543 push ebp
00544
00545 PixieLoop:
00546 mov ecx,[VShift]
00547 mov ebx,[GHMaskShifted]
00548
00549 mov ebp,[GWMask]
00550 mov edi,[v16]
00551
00552 mov edx,dword ptr[u16]
00553 mov esi,edi
00554
00555 mov eax,edx
00556
00557 shr edi,cl
00558 add esi,[VStep]
00559
00560 shr edx,16
00561 add eax,[UStep]
00562
00563 and edi,ebx
00564 and edx,ebp
00565
00566 add edi,edx
00567 mov edx,eax
00568
00569 add edi,GBitPtrHalf
00570 add eax,[UStep]
00571
00572 mov [u16],eax
00573 mov ax,word ptr[edi*2]
00574
00575 mov edi,esi
00576 add esi,[VStep]
00577
00578 shr edx,16
00579 mov [v16],esi
00580
00581 shr edi,cl
00582 and edx,ebp
00583
00584 mov esi,GBitPtrHalf
00585 and edi,ebx
00586
00587 shl eax,16
00588 add esi,edx
00589
00590 add esi,edi
00591
00592 mov ax,word ptr[esi*2]
00593
00594 mov [TempPix],eax
00595
00596 mov ebx,eax
00597 and eax,REDMASK2
00598
00599 mov ecx,ebx
00600 and ebx,GREENMASK2
00601
00602 mov dword ptr[Red],eax
00603 and ecx,BLUEMASK2
00604
00605 mov dword ptr[Green],ebx
00606 mov dword ptr[Blue],ecx
00607
00608 fild qword ptr[Red] ; r RI LG LB BI RL GI
00609 fmul st,st(5) ; R RI LG LB BI RL GI
00610 fild qword ptr[Green] ; g R RI LG LB BI RL GI
00611 fmul st,st(3) ; G R RI LG LB BI RL GI
00612 fxch st(6) ; RL R RI LG LB BI G GI
00613 fadd st,st(2) ; RL2 R RI LG LB BI G GI
00614 fxch st(3) ; LG R RI RL2 LB BI G GI
00615 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
00616 fxch st(6) ; G R RI RL2 LB BI LG2 GI
00617 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
00618 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
00619 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
00620 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
00621 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
00622 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
00623
00624 mov edx,dword ptr[Bucket]
00625 mov eax,dword ptr[Bucket2]
00626
00627 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
00628 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
00629 fxch st(3) ; LB RI RL2 B BI LG2 GI
00630 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
00631 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
00632 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
00633
00634 and edx,GREENMASK2
00635 and eax,REDMASK2
00636
00637 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
00638 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
00639
00640 mov edi,edx
00641 mov ebx,dword ptr[Bucket]
00642 or edi,eax
00643 mov ebp,TDest
00644 and ebx,BLUEMASK2
00645
00646 fxch st(3) ; LG2 LB2 BI RL2 GI
00647 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
00648
00649 or edi,ebx
00650 add TDest,4
00651
00652 cmp [TempPix],010001h
00653 je SkipPixie
00654
00655 mov [ebp],edi
00656
00657 SkipPixie:
00658 dec [widTemp]
00659
00660 jnz PixieLoop
00661
00662 pop ebp
00663
00664 fstp [u16]
00665 fstp [v16]
00666 fstp [u16]
00667 fstp [v16]
00668 fstp [u16]
00669 fstp [v16]
00670
00671 GouraudReturnNoZ:
00672 pop edi
00673 pop esi
00674 pop ecx
00675 pop ebx
00676 }
00677 }
|
|
||||||||||||
|
(DRV_RENDER_NO_ZMASK | DRV_RENDER_NO_ZWRITE)
Definition at line 679 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
00680 {
00681 TDest =Dest;
00682 Red =Green =0;
00683 _asm
00684 {
00685 push ebx
00686 push ecx
00687 push esi
00688 push edi
00689
00690 mov ebx,pLeft
00691 mov ecx,pRight
00692 mov eax,[ebx]EdgeAsmFPU.X
00693 mov edx,[ecx]EdgeAsmFPU.X
00694 sub edx,eax
00695 jle GouraudReturnNoZ
00696
00697 mov esi,eax
00698 inc edx
00699 shl eax,1
00700 add TDest,eax
00701 add pZBufferPtr,eax
00702 test esi,1 //dword align left
00703 jz NoSinglePixie
00704
00705 //odd sized spans write one pixel to dword align
00706 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
00707 fmul [Real65536] ; UL16
00708 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
00709 fmul [Real65536] ; VL16 UL16
00710 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
00711 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
00712 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
00713 fxch st(4) ; UL16 GL RL VL16 BL
00714 fistp [u16] ; GL RL VL16 BL
00715 fxch st(2) ; VL16 RL GL BL
00716 fistp [v16] ; RL GL BL
00717 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
00718 fistp [z16] ; RL GL BL
00719
00720 mov [widTemp],edx
00721
00722 mov ecx,[VShift]
00723 mov ebx,[GHMaskShifted]
00724
00725 mov esi,[GWMask]
00726 mov edi,[v16]
00727
00728 mov edx,dword ptr[u16]
00729
00730 shr edi,cl
00731
00732 shr edx,16
00733 xor eax,eax
00734
00735 and edi,ebx
00736 and edx,esi
00737
00738 add edi,edx
00739
00740 add edi,GBitPtrHalf
00741 mov ax,word ptr[edi*2]
00742
00743 mov ebx,eax
00744 and eax,REDMASK2
00745
00746 mov ecx,ebx
00747 and ebx,GREENMASK2
00748
00749 mov dword ptr[Red],eax
00750 and ecx,BLUEMASK2
00751
00752 mov dword ptr[Green],ebx
00753 mov dword ptr[Blue],ecx
00754
00755 fimul dword ptr[Red] ; R GL BL
00756 fxch st(1) ; GL R BL
00757 fimul dword ptr[Green] ; G R BL
00758 fxch st(1) ; R G BL
00759 fadd qword ptr[Magic] ; Rk G BL
00760 fxch st(2) ; BL G Rk
00761 fimul [Blue] ; B G Rk
00762 fxch st(1) ; G B Rk
00763 fadd qword ptr[Magic] ; Gk B Rk
00764 fxch st(2) ; Rk B Gk
00765 fstp qword ptr[Bucket] ; B Gk
00766 fadd qword ptr[Magic] ; Bk Gk
00767 fxch st(1) ; Gk Bk
00768 fstp qword ptr[Bucket2] ; Bk
00769
00770 mov edx,dword ptr[Bucket]
00771 mov eax,dword ptr[Bucket2]
00772
00773 and edx,REDMASK2
00774 and eax,GREENMASK2
00775
00776 fstp qword ptr[Bucket]
00777
00778 mov ecx,TDest
00779 mov ebx,dword ptr[Bucket]
00780
00781 mov esi,[z16]
00782 and ebx,BLUEMASK2
00783
00784 shr esi,16
00785 or edx,eax
00786
00787 mov eax,pZBufferPtr
00788 add TDest,2
00789
00790 cmp word ptr[eax],si
00791 jg SkipSinglePixie
00792
00793 or edx,ebx
00794 mov word ptr[eax],si
00795
00796 mov word ptr[ecx],dx
00797
00798 SkipSinglePixie:
00799 mov ebx,pLeft
00800 mov edx,[widTemp]
00801 add pZBufferPtr,2
00802 mov ecx,pRight
00803 dec edx
00804 jz GouraudReturnNoZ
00805 mov esi,edx
00806 and esi,1
00807 sub edx,esi
00808 jz GouraudReturnNoZ
00809
00810 NoSinglePixie:
00811 mov [widTemp],edx ; just for a temp
00812 shr edx,1
00813
00814 ; try to keep fmul fxch pairs seperated to avoid stalling
00815 ; calc this scanlines steps ; FPU Stack
00816 ; st0 st1 st2 st3 st4 st5 st6 st7
00817 fild dword ptr [widTemp] ; WID
00818
00819 mov [widTemp],edx ; Color interps doubled
00820
00821 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
00822 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
00823 fsub st(1), st ; UL UD WID
00824 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
00825 fxch st(1) ; UL VR UD WID
00826 fmul [Real65536] ; UL16 VR UD WID
00827 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
00828 fsub st(2), st ; VL UL16 VD UD WID
00829 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
00830 fxch st(3) ; VD VL UL16 RR UD WID
00831 fmul [Real65536] ; VD16 VL UL16 RR UD WID
00832 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
00833 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
00834 fxch st(5) ; UD VD16 VL UL16 RD RL WID
00835 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
00836 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
00837 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
00838 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
00839 fistp [u16] ; VD16 UD16 VL16 RD RL WID
00840 fxch st(2) ; VL16 UD16 VD16 RD RL WID
00841 fistp [v16] ; UD16 VD16 RD RL WID
00842 fld1 ; 1 UD16 VD16 RD RL WID
00843 fdivrp st(5),st ; UD16 VD16 RD RL DWID
00844
00845 //let that cook
00846
00847 fmul st,st(4) ; USTP VD16 RD RL DWID
00848 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
00849 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
00850 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
00851 fxch st(2) ; USTP GD LG VD16 RD RL DWID
00852 fistp [UStep] ; GD LG VD16 RD RL DWID
00853 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
00854 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
00855 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
00856 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
00857 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
00858 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
00859 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
00860 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
00861 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
00862 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
00863 frndint
00864 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
00865 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
00866 frndint
00867 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
00868 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
00869 frndint
00870 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
00871 fistp [VStep] ; GI RI LG LB BD RL DW2
00872 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
00873 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
00874 fxch st(7) ; DW2 GI RI LG LB BD RL zd
00875 fmulp st(7),st ; GI RI LG LB BD RL zd
00876 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
00877 fxch st(7) ; zd GI RI LG LB BD RL lz
00878 fistp [ZStep] ; GI RI LG LB BD RL lz
00879 fxch st(6) ; lz RI LG LB BD RL GI
00880 fistp [z16] ; RI LG LB BD RL GI
00881
00882 push ebp
00883
00884 PixieLoop:
00885 mov ebx,[ZStep]
00886
00887 add [z16],ebx
00888 mov ecx,[VShift]
00889
00890 mov edi,[z16]
00891
00892 shr edi,16
00893 mov ebx,[GHMaskShifted]
00894
00895 mov ebp,[GWMask]
00896 mov edx,dword ptr[u16]
00897
00898 mov word ptr[Z32],di
00899 mov eax,edx
00900
00901 shr edx,16
00902 mov edi,[v16]
00903
00904 add eax,[UStep]
00905 mov esi,edi
00906
00907 shr edi,cl
00908 add esi,[VStep]
00909
00910 and edi,ebx
00911 and edx,ebp
00912
00913 add edi,edx
00914 mov edx,eax
00915
00916 add edi,GBitPtrHalf
00917 add eax,[UStep]
00918
00919 mov [u16],eax
00920 mov ax,word ptr[edi*2]
00921
00922 mov edi,esi
00923 add esi,[VStep]
00924
00925 shr edx,16
00926 mov [v16],esi
00927
00928 shr edi,cl
00929 and edx,ebp
00930
00931 mov esi,GBitPtrHalf
00932 and edi,ebx
00933
00934 shl eax,16
00935 add esi,edx
00936
00937 add esi,edi
00938
00939 mov ax,word ptr[esi*2]
00940
00941 mov ebx,eax
00942 and eax,REDMASK2
00943
00944 mov ecx,ebx
00945 and ebx,GREENMASK2
00946
00947 mov dword ptr[Red],eax
00948 and ecx,BLUEMASK2
00949
00950 mov dword ptr[Green],ebx
00951 mov dword ptr[Blue],ecx
00952
00953 fild qword ptr[Red] ; r RI LG LB BI RL GI
00954 fmul st,st(5) ; R RI LG LB BI RL GI
00955 fild qword ptr[Green] ; g R RI LG LB BI RL GI
00956 fmul st,st(3) ; G R RI LG LB BI RL GI
00957 fxch st(6) ; RL R RI LG LB BI G GI
00958 fadd st,st(2) ; RL2 R RI LG LB BI G GI
00959 fxch st(3) ; LG R RI RL2 LB BI G GI
00960 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
00961 fxch st(6) ; G R RI RL2 LB BI LG2 GI
00962 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
00963 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
00964 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
00965 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
00966 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
00967 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
00968
00969 mov edx,dword ptr[Bucket]
00970 mov eax,dword ptr[Bucket2]
00971
00972 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
00973 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
00974 fxch st(3) ; LB RI RL2 B BI LG2 GI
00975 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
00976 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
00977 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
00978
00979 and edx,GREENMASK2
00980 and eax,REDMASK2
00981
00982 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
00983 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
00984
00985 mov edi,edx
00986 mov ebx,dword ptr[Bucket]
00987 or edi,eax
00988 mov ebp,TDest
00989 and ebx,BLUEMASK2
00990
00991 fxch st(3) ; LG2 LB2 BI RL2 GI
00992 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
00993
00994 mov si,word ptr[Z32]
00995 add TDest,4
00996
00997 mov ecx,pZBufferPtr
00998 or edi,ebx
00999
01000 cmp word ptr[ecx],si
01001 jg SkipPixie
01002
01003 rol edi,16
01004
01005 mov [ecx],si
01006 mov dword ptr[ebp],edi
01007 mov [ecx+2],si
01008 SkipPixie:
01009 add pZBufferPtr,4
01010 dec [widTemp]
01011
01012 jnz PixieLoop
01013 // mov dword ptr[ebp],0ffffffffh
01014
01015 pop ebp
01016
01017 fstp [u16]
01018 fstp [v16]
01019 fstp [u16]
01020 fstp [v16]
01021 fstp [u16]
01022 fstp [v16]
01023
01024 GouraudReturnNoZ:
01025 pop edi
01026 pop esi
01027 pop ecx
01028 pop ebx
01029 }
01030 }
|
|
||||||||||||
|
|
|
||||||||||||
|
Definition at line 1032 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
01033 {
01034 TDest =Dest;
01035 Red =Green =0;
01036 _asm
01037 {
01038 push ebx
01039 push ecx
01040 push esi
01041 push edi
01042
01043 mov ebx,pLeft
01044 mov ecx,pRight
01045 mov eax,[ebx]EdgeAsmFPU.X
01046 mov edx,[ecx]EdgeAsmFPU.X
01047 sub edx,eax
01048 jle GouraudReturnNoZ
01049
01050 mov esi,eax
01051 inc edx
01052 shl eax,1
01053 add TDest,eax
01054 add pZBufferPtr,eax
01055 test esi,1 //dword align left
01056 jz NoSinglePixie
01057
01058 //odd sized spans write one pixel to dword align
01059 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
01060 fmul [Real65536] ; UL16
01061 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
01062 fmul [Real65536] ; VL16 UL16
01063 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
01064 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
01065 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
01066 fxch st(4) ; UL16 GL RL VL16 BL
01067 fistp [u16] ; GL RL VL16 BL
01068 fxch st(2) ; VL16 RL GL BL
01069 fistp [v16] ; RL GL BL
01070 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
01071 fistp [z16] ; RL GL BL
01072
01073 mov [widTemp],edx
01074
01075 mov ecx,[VShift]
01076 mov ebx,[GHMaskShifted]
01077
01078 mov esi,[GWMask]
01079 mov edi,[v16]
01080
01081 mov edx,dword ptr[u16]
01082
01083 shr edi,cl
01084
01085 shr edx,16
01086 xor eax,eax
01087
01088 and edi,ebx
01089 and edx,esi
01090
01091 add edi,edx
01092
01093 add edi,GBitPtrHalf
01094 mov ax,word ptr[edi*2]
01095
01096 mov ebx,eax
01097 and eax,REDMASK2
01098
01099 mov ecx,ebx
01100 and ebx,GREENMASK2
01101
01102 mov dword ptr[Red],eax
01103 and ecx,BLUEMASK2
01104
01105 mov dword ptr[Green],ebx
01106 mov dword ptr[Blue],ecx
01107
01108 fimul dword ptr[Red] ; R GL BL
01109 fxch st(1) ; GL R BL
01110 fimul dword ptr[Green] ; G R BL
01111 fxch st(1) ; R G BL
01112 fadd qword ptr[Magic] ; Rk G BL
01113 fxch st(2) ; BL G Rk
01114 fimul [Blue] ; B G Rk
01115 fxch st(1) ; G B Rk
01116 fadd qword ptr[Magic] ; Gk B Rk
01117 fxch st(2) ; Rk B Gk
01118 fstp qword ptr[Bucket] ; B Gk
01119 fadd qword ptr[Magic] ; Bk Gk
01120 fxch st(1) ; Gk Bk
01121 fstp qword ptr[Bucket2] ; Bk
01122
01123 mov edx,dword ptr[Bucket]
01124 mov eax,dword ptr[Bucket2]
01125
01126 and edx,REDMASK2
01127 and eax,GREENMASK2
01128
01129 fstp qword ptr[Bucket]
01130
01131 mov ecx,TDest
01132 mov ebx,dword ptr[Bucket]
01133
01134 mov esi,[z16]
01135 and ebx,BLUEMASK2
01136
01137 shr esi,16
01138 or edx,eax
01139
01140 mov eax,pZBufferPtr
01141 add TDest,2
01142
01143 cmp word ptr[eax],si
01144 jg SkipSinglePixie
01145
01146 or edx,ebx
01147
01148 mov word ptr[ecx],dx
01149
01150 SkipSinglePixie:
01151 mov ebx,pLeft
01152 mov edx,[widTemp]
01153 add pZBufferPtr,2
01154 mov ecx,pRight
01155 dec edx
01156 jz GouraudReturnNoZ
01157 mov esi,edx
01158 and esi,1
01159 sub edx,esi
01160 jz GouraudReturnNoZ
01161
01162 NoSinglePixie:
01163 mov [widTemp],edx ; just for a temp
01164 shr edx,1
01165
01166 ; try to keep fmul fxch pairs seperated to avoid stalling
01167 ; calc this scanlines steps ; FPU Stack
01168 ; st0 st1 st2 st3 st4 st5 st6 st7
01169 fild dword ptr [widTemp] ; WID
01170
01171 mov [widTemp],edx ; Color interps doubled
01172
01173 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
01174 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
01175 fsub st(1), st ; UL UD WID
01176 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
01177 fxch st(1) ; UL VR UD WID
01178 fmul [Real65536] ; UL16 VR UD WID
01179 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
01180 fsub st(2), st ; VL UL16 VD UD WID
01181 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
01182 fxch st(3) ; VD VL UL16 RR UD WID
01183 fmul [Real65536] ; VD16 VL UL16 RR UD WID
01184 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
01185 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
01186 fxch st(5) ; UD VD16 VL UL16 RD RL WID
01187 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
01188 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
01189 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
01190 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
01191 fistp [u16] ; VD16 UD16 VL16 RD RL WID
01192 fxch st(2) ; VL16 UD16 VD16 RD RL WID
01193 fistp [v16] ; UD16 VD16 RD RL WID
01194 fld1 ; 1 UD16 VD16 RD RL WID
01195 fdivrp st(5),st ; UD16 VD16 RD RL DWID
01196
01197 //let that cook
01198
01199 fmul st,st(4) ; USTP VD16 RD RL DWID
01200 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
01201 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
01202 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
01203 fxch st(2) ; USTP GD LG VD16 RD RL DWID
01204 fistp [UStep] ; GD LG VD16 RD RL DWID
01205 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
01206 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
01207 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
01208 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
01209 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
01210 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
01211 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
01212 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
01213 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
01214 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
01215 frndint
01216 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
01217 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
01218 frndint
01219 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
01220 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
01221 frndint
01222 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
01223 fistp [VStep] ; GI RI LG LB BD RL DW2
01224 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
01225 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
01226 fxch st(7) ; DW2 GI RI LG LB BD RL zd
01227 fmulp st(7),st ; GI RI LG LB BD RL zd
01228 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
01229 fxch st(7) ; zd GI RI LG LB BD RL lz
01230 fistp [ZStep] ; GI RI LG LB BD RL lz
01231 fxch st(6) ; lz RI LG LB BD RL GI
01232 fistp [z16] ; RI LG LB BD RL GI
01233
01234 push ebp
01235
01236 PixieLoop:
01237 mov ebx,[ZStep]
01238
01239 add [z16],ebx
01240 mov ecx,[VShift]
01241
01242 mov edi,[z16]
01243
01244 shr edi,16
01245 mov ebx,[GHMaskShifted]
01246
01247 mov ebp,[GWMask]
01248 mov edx,dword ptr[u16]
01249
01250 mov word ptr[Z32],di
01251 mov eax,edx
01252
01253 shr edx,16
01254 mov edi,[v16]
01255
01256 add eax,[UStep]
01257 mov esi,edi
01258
01259 shr edi,cl
01260 add esi,[VStep]
01261
01262 and edi,ebx
01263 and edx,ebp
01264
01265 add edi,edx
01266 mov edx,eax
01267
01268 add edi,GBitPtrHalf
01269 add eax,[UStep]
01270
01271 mov [u16],eax
01272 mov ax,word ptr[edi*2]
01273
01274 mov edi,esi
01275 add esi,[VStep]
01276
01277 shr edx,16
01278 mov [v16],esi
01279
01280 shr edi,cl
01281 and edx,ebp
01282
01283 mov esi,GBitPtrHalf
01284 and edi,ebx
01285
01286 shl eax,16
01287 add esi,edx
01288
01289 add esi,edi
01290
01291 mov ax,word ptr[esi*2]
01292
01293 mov ebx,eax
01294 and eax,REDMASK2
01295
01296 mov ecx,ebx
01297 and ebx,GREENMASK2
01298
01299 mov dword ptr[Red],eax
01300 and ecx,BLUEMASK2
01301
01302 mov dword ptr[Green],ebx
01303 mov dword ptr[Blue],ecx
01304
01305 fild qword ptr[Red] ; r RI LG LB BI RL GI
01306 fmul st,st(5) ; R RI LG LB BI RL GI
01307 fild qword ptr[Green] ; g R RI LG LB BI RL GI
01308 fmul st,st(3) ; G R RI LG LB BI RL GI
01309 fxch st(6) ; RL R RI LG LB BI G GI
01310 fadd st,st(2) ; RL2 R RI LG LB BI G GI
01311 fxch st(3) ; LG R RI RL2 LB BI G GI
01312 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
01313 fxch st(6) ; G R RI RL2 LB BI LG2 GI
01314 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
01315 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
01316 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
01317 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
01318 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
01319 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
01320
01321 mov edx,dword ptr[Bucket]
01322 mov eax,dword ptr[Bucket2]
01323
01324 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
01325 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
01326 fxch st(3) ; LB RI RL2 B BI LG2 GI
01327 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
01328 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
01329 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
01330
01331 and edx,GREENMASK2
01332 and eax,REDMASK2
01333
01334 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
01335 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
01336
01337 mov edi,edx
01338 mov ebx,dword ptr[Bucket]
01339 or edi,eax
01340 mov ebp,TDest
01341 and ebx,BLUEMASK2
01342
01343 fxch st(3) ; LG2 LB2 BI RL2 GI
01344 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
01345
01346 mov si,word ptr[Z32]
01347 add TDest,4
01348
01349 mov ecx,pZBufferPtr
01350 or edi,ebx
01351
01352 cmp word ptr[ecx],si
01353 jg SkipPixie
01354
01355 rol edi,16
01356
01357 mov dword ptr[ebp],edi
01358 SkipPixie:
01359 add pZBufferPtr,4
01360 dec [widTemp]
01361
01362 jnz PixieLoop
01363
01364 pop ebp
01365
01366 fstp [u16]
01367 fstp [v16]
01368 fstp [u16]
01369 fstp [v16]
01370 fstp [u16]
01371 fstp [v16]
01372
01373 GouraudReturnNoZ:
01374 pop edi
01375 pop esi
01376 pop ecx
01377 pop ebx
01378 }
01379 }
|
|
||||||||||||
|
|
|
||||||||||||
|
Definition at line 3366 of file x86span555.c. References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderGouraudPoly().
03367 {
03368 TDest =Dest;
03369 Red =Green =0;
03370 _asm
03371 {
03372 push ebx
03373 push ecx
03374 push esi
03375 push edi
03376
03377 mov ebx,pLeft
03378 mov ecx,pRight
03379 mov eax,[ebx]EdgeAsmFPU.X
03380 mov edx,[ecx]EdgeAsmFPU.X
03381 sub edx,eax
03382 jle GouraudReturnNoZ
03383
03384 mov esi,eax
03385 inc edx
03386 shl eax,1
03387 add TDest,eax
03388 add pZBufferPtr,eax
03389 test esi,1 //dword align left side
03390 jz NoSinglePixie
03391
03392 //odd sized spans write one pixel to dword align
03393 fild dword ptr [ebx]EdgeAsmFPU.B ; BL
03394 fmul dword ptr[BlueMask]
03395 fadd qword ptr[Magic] ; Bk
03396 fild dword ptr [ebx]EdgeAsmFPU.G ; GL Bk
03397 fmul dword ptr[GreenMask2]
03398 fadd qword ptr[Magic] ; Gk Bk
03399 fild dword ptr [ebx]EdgeAsmFPU.R ; RL Gk Bk
03400 fmul dword ptr[MiniRedMask2]
03401 fadd qword ptr[Magic] ; Rk Gk Bk
03402 fxch st(2) ; Bk Gk Rk
03403 fstp qword ptr[Bucket] ; Gk Rk
03404 fstp qword ptr[Bucket2] ; Rk
03405 fld dword ptr[ebx]EdgeAsmFPU.z ; z
03406 fistp [z16] ;
03407
03408 mov esi,dword ptr[Bucket]
03409 mov eax,dword ptr[Bucket2]
03410
03411 and esi,BLUEMASK2
03412 and eax,GREENMASK2
03413
03414 fstp qword ptr[Bucket]
03415
03416 mov ecx,TDest
03417 mov ebx,dword ptr[Bucket]
03418
03419 and ebx,REDMASK2
03420 or esi,eax
03421
03422 mov edi,[z16]
03423 mov eax,pZBufferPtr
03424
03425 add TDest,2
03426 or esi,ebx
03427
03428 shr edi,16
03429 mov ebx,pLeft
03430
03431 cmp word ptr[eax],di
03432 jg SkipSinglePixie
03433
03434 mov word ptr[ecx],si
03435
03436 SkipSinglePixie:
03437 mov ecx,pRight
03438 add pZBufferPtr,2
03439 dec edx
03440
03441 jz GouraudReturnNoZ
03442 mov esi,edx
03443 and esi,1
03444 sub edx,esi
03445 jz GouraudReturnNoZ
03446
03447 NoSinglePixie:
03448 shr edx,1
03449 fld1
03450 mov [widTemp],edx ; just for a temp
03451
03452
03453 ; try to keep fmul fxch pairs seperated to avoid stalling
03454 ; calc this scanlines steps ; FPU Stack
03455 ; st0 st1 st2 st3 st4 st5 st6 st7
03456 fidiv dword ptr [widTemp] ; WID
03457 fild dword ptr [ecx]EdgeAsmFPU.R ; RR WID
03458 fild dword ptr [ebx]EdgeAsmFPU.R ; RL RR WID
03459 fsub st(1),st ; RL RD WID
03460 fild [ecx]EdgeAsmFPU.G ; GR RL RD WID
03461 fild [ebx]EdgeAsmFPU.G ; GL GR RL RD WID
03462 fsub st(1),st ; GL GD RL RD WID
03463 fild [ecx]EdgeAsmFPU.B ; BR GL GD RL RD WID
03464 fild [ebx]EdgeAsmFPU.B ; BL BR GL GD RL RD WID
03465 fsub st(1),st ; BL BD GL GD RL RD WID
03466 fxch st(5) ; RD BD GL GD RL BL WID
03467 fmul st,st(6) ; RI BD GL GD RL BL WID
03468 frndint
03469 fxch st(3) ; GD BD GL RI RL BL WID
03470 fmul st,st(6) ; GI BD GL RI RL BL WID
03471 frndint
03472 fxch st(6) ; WID BD GL RI RL BL GI
03473 fmulp st(1),st ; BI GL RI RL BL GI
03474 frndint
03475 fld qword ptr[RedMask2] ; rm BI GL RI RL BL GI
03476 fmul st(3),st ; rm BI GL RI RL BL GI
03477 fmulp st(4),st ; BI GL RI RL BL GI
03478 fld dword ptr[GreenMask2] ; gm BI GL RI RL BL GI
03479 fmul st(2),st ; gm BI GL RI RL BL GI
03480 fmulp st(6),st ; BI GL RI RL BL GI
03481 fld dword ptr[BlueMask] ; bm BI GL RI RL BL GI
03482 fmul st(1),st ; bm BI GL RI RL BL GI
03483 fmulp st(5),st ; BI GL RI RL BL GI
03484 fld [ecx]EdgeAsmFPU.z ; rz BI GL RI RL BL GI
03485 fsub [ebx]EdgeAsmFPU.z ; zd BI GL RI RL BL GI
03486 fld [ebx]EdgeAsmFPU.z ; lz zd BI GL RI RL BL GI
03487 fistp [z16] ; zd BI GL RI RL BL GI
03488 fistp [ZStep] ; BI GL RI RL BL GI
03489
03490 PixieLoop:
03491
03492 fld st(3) ; r BI GL RI RL BL GI
03493 fadd qword ptr[Magic] ; rk BI GL RI RL BL GI
03494 fld st(2) ; g rk BI GL RI RL BL GI
03495 fadd qword ptr[Magic] ; gk rk BI GL RI RL BL GI
03496 fxch st(1) ; rk gk BI GL RI RL BL GI
03497 fstp qword ptr[Bucket] ; gk BI GL RI RL BL GI
03498 fstp qword ptr[Bucket2] ; BI GL RI RL BL GI
03499 fld st(4) ; b BI GL RI RL BL GI
03500 fadd qword ptr[Magic] ; bk BI GL RI RL BL GI
03501
03502 mov ecx,dword ptr[Bucket]
03503 mov eax,dword ptr[Bucket2]
03504
03505 fstp qword ptr[Bucket] ; BI GL RI RL BL GI
03506 fadd st(4),st ; BI GL RI RL BL2 GI
03507
03508 and ecx,REDMASK2
03509 and eax,GREENMASK2
03510
03511 mov ebx,dword ptr[Bucket]
03512 or ecx,eax
03513
03514 fstp qword ptr[Bucket] ; GL RI RL BL2 GI
03515 fadd st,st(4) ; GL2 RI RL BL2 GI
03516 fstp qword ptr[Bucket2] ; RI RL BL2 GI
03517 fadd st(1),st ; RI RL2 BL2 GI
03518 fld qword ptr[Bucket2] ; GL2 RI RL2 BL2 GI
03519 fld qword ptr[Bucket] ; BI GL2 RI RL2 BL2 GI
03520
03521 and ebx,BLUEMASK2
03522 mov edi,TDest
03523
03524 or ecx,ebx
03525 add TDest,4
03526
03527 mov eax,[z16]
03528 mov esi,pZBufferPtr
03529
03530 shr eax,16
03531 mov ebx,[ZStep]
03532
03533 cmp word ptr[esi],ax
03534 jg SkipPixie
03535
03536 rol ecx,16
03537 add [z16],ebx
03538
03539 mov [edi],ecx
03540 SkipPixie:
03541 add pZBufferPtr,4
03542 dec edx
03543
03544 jnz PixieLoop
03545
03546
03547 fstp [u16]
03548 fstp [v16]
03549 fstp [u16]
03550 fstp [v16]
03551 fstp [u16]
03552 fstp [v16]
03553
03554 GouraudReturnNoZ:
03555 pop edi
03556 pop esi
03557 pop ecx
03558 pop ebx
03559 }
03560 }
|
|
||||||||||||
|
Definition at line 2089 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
02090 {
02091 TDest =Dest;
02092 Red =Green =0;
02093 _asm
02094 {
02095 push ebx
02096 push ecx
02097 push esi
02098 push edi
02099
02100 mov ebx,pLeft
02101 mov ecx,pRight
02102 mov eax,[ebx]EdgeAsmFPU.X
02103 mov edx,[ecx]EdgeAsmFPU.X
02104 sub edx,eax
02105 jle GouraudReturnNoZ
02106
02107 mov esi,eax
02108 inc edx
02109 shl eax,1
02110 add TDest,eax
02111 add pZBufferPtr,eax
02112 test esi,1 //dword align left
02113 jz NoSinglePixie
02114
02115 //odd sized spans write one pixel to dword align
02116 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
02117 fmul [Real65536] ; UL16
02118 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
02119 fmul [Real65536] ; VL16 UL16
02120 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
02121 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
02122 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
02123 fxch st(4) ; UL16 GL RL VL16 BL
02124 fistp [u16] ; GL RL VL16 BL
02125 fxch st(2) ; VL16 RL GL BL
02126 fistp [v16] ; RL GL BL
02127 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
02128 fistp [z16] ; RL GL BL
02129
02130 mov [widTemp],edx
02131
02132 mov ecx,[VShift]
02133 mov ebx,[GHMaskShifted]
02134
02135 mov esi,[GWMask]
02136 mov edi,[v16]
02137
02138 mov edx,dword ptr[u16]
02139
02140 shr edi,cl
02141
02142 shr edx,16
02143 xor eax,eax
02144
02145 and edi,ebx
02146 and edx,esi
02147
02148 add edi,edx
02149
02150 add edi,GBitPtrHalf
02151 mov ax,word ptr[edi*2]
02152
02153 mov word ptr[TempPix],ax
02154
02155 mov ebx,eax
02156 and eax,REDMASK2
02157
02158 mov ecx,ebx
02159 and ebx,GREENMASK2
02160
02161 mov dword ptr[Red],eax
02162 and ecx,BLUEMASK2
02163
02164 mov dword ptr[Green],ebx
02165 mov dword ptr[Blue],ecx
02166
02167 fimul dword ptr[Red] ; R GL BL
02168 fxch st(1) ; GL R BL
02169 fimul dword ptr[Green] ; G R BL
02170 fxch st(1) ; R G BL
02171 fadd qword ptr[Magic] ; Rk G BL
02172 fxch st(2) ; BL G Rk
02173 fimul [Blue] ; B G Rk
02174 fxch st(1) ; G B Rk
02175 fadd qword ptr[Magic] ; Gk B Rk
02176 fxch st(2) ; Rk B Gk
02177 fstp qword ptr[Bucket] ; B Gk
02178 fadd qword ptr[Magic] ; Bk Gk
02179 fxch st(1) ; Gk Bk
02180 fstp qword ptr[Bucket2] ; Bk
02181
02182 mov edx,dword ptr[Bucket]
02183 mov eax,dword ptr[Bucket2]
02184
02185 and edx,REDMASK2
02186 and eax,GREENMASK2
02187
02188 fstp qword ptr[Bucket]
02189
02190 mov ecx,TDest
02191 mov ebx,dword ptr[Bucket]
02192
02193 mov esi,[z16]
02194 and ebx,BLUEMASK2
02195
02196 shr esi,16
02197 or edx,eax
02198
02199 mov eax,pZBufferPtr
02200 add TDest,2
02201
02202 cmp word ptr[TempPix],01h
02203 je SkipSinglePixie
02204
02205 cmp word ptr[eax],si
02206 jg SkipSinglePixie
02207
02208 or edx,ebx
02209
02210 mov word ptr[ecx],dx
02211
02212 SkipSinglePixie:
02213 mov ebx,pLeft
02214 mov edx,[widTemp]
02215 add pZBufferPtr,2
02216 mov ecx,pRight
02217 dec edx
02218 jz GouraudReturnNoZ
02219 mov esi,edx
02220 and esi,1
02221 sub edx,esi
02222 jz GouraudReturnNoZ
02223
02224 NoSinglePixie:
02225 mov [widTemp],edx ; just for a temp
02226 shr edx,1
02227
02228 ; try to keep fmul fxch pairs seperated to avoid stalling
02229 ; calc this scanlines steps ; FPU Stack
02230 ; st0 st1 st2 st3 st4 st5 st6 st7
02231 fild dword ptr [widTemp] ; WID
02232
02233 mov [widTemp],edx ; Color interps doubled
02234
02235 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
02236 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
02237 fsub st(1), st ; UL UD WID
02238 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
02239 fxch st(1) ; UL VR UD WID
02240 fmul [Real65536] ; UL16 VR UD WID
02241 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
02242 fsub st(2), st ; VL UL16 VD UD WID
02243 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
02244 fxch st(3) ; VD VL UL16 RR UD WID
02245 fmul [Real65536] ; VD16 VL UL16 RR UD WID
02246 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
02247 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
02248 fxch st(5) ; UD VD16 VL UL16 RD RL WID
02249 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
02250 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
02251 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
02252 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
02253 fistp [u16] ; VD16 UD16 VL16 RD RL WID
02254 fxch st(2) ; VL16 UD16 VD16 RD RL WID
02255 fistp [v16] ; UD16 VD16 RD RL WID
02256 fld1 ; 1 UD16 VD16 RD RL WID
02257 fdivrp st(5),st ; UD16 VD16 RD RL DWID
02258
02259 //let that cook
02260
02261 fmul st,st(4) ; USTP VD16 RD RL DWID
02262 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
02263 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
02264 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
02265 fxch st(2) ; USTP GD LG VD16 RD RL DWID
02266 fistp [UStep] ; GD LG VD16 RD RL DWID
02267 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
02268 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
02269 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
02270 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
02271 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
02272 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
02273 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
02274 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
02275 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
02276 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
02277 frndint
02278 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
02279 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
02280 frndint
02281 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
02282 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
02283 frndint
02284 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
02285 fistp [VStep] ; GI RI LG LB BD RL DW2
02286 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
02287 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
02288 fxch st(7) ; DW2 GI RI LG LB BD RL zd
02289 fmulp st(7),st ; GI RI LG LB BD RL zd
02290 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
02291 fxch st(7) ; zd GI RI LG LB BD RL lz
02292 fistp [ZStep] ; GI RI LG LB BD RL lz
02293 fxch st(6) ; lz RI LG LB BD RL GI
02294 fistp [z16] ; RI LG LB BD RL GI
02295
02296 push ebp
02297
02298 PixieLoop:
02299 mov ebx,[ZStep]
02300
02301 add [z16],ebx
02302 mov ecx,[VShift]
02303
02304 mov edi,[z16]
02305
02306 shr edi,16
02307 mov ebx,[GHMaskShifted]
02308
02309 mov ebp,[GWMask]
02310 mov edx,dword ptr[u16]
02311
02312 mov word ptr[Z32],di
02313 mov eax,edx
02314
02315 shr edx,16
02316 mov edi,[v16]
02317
02318 add eax,[UStep]
02319 mov esi,edi
02320
02321 shr edi,cl
02322 add esi,[VStep]
02323
02324 and edi,ebx
02325 and edx,ebp
02326
02327 add edi,edx
02328 mov edx,eax
02329
02330 add edi,GBitPtrHalf
02331 add eax,[UStep]
02332
02333 mov [u16],eax
02334 mov ax,word ptr[edi*2]
02335
02336 mov edi,esi
02337 add esi,[VStep]
02338
02339 shr edx,16
02340 mov [v16],esi
02341
02342 shr edi,cl
02343 and edx,ebp
02344
02345 mov esi,GBitPtrHalf
02346 and edi,ebx
02347
02348 shl eax,16
02349 add esi,edx
02350
02351 add esi,edi
02352
02353 mov ax,word ptr[esi*2]
02354
02355 mov [TempPix],eax
02356
02357 mov ebx,eax
02358 and eax,REDMASK2
02359
02360 mov ecx,ebx
02361 and ebx,GREENMASK2
02362
02363 mov dword ptr[Red],eax
02364 and ecx,BLUEMASK2
02365
02366 mov dword ptr[Green],ebx
02367 mov dword ptr[Blue],ecx
02368
02369 fild qword ptr[Red] ; r RI LG LB BI RL GI
02370 fmul st,st(5) ; R RI LG LB BI RL GI
02371 fild qword ptr[Green] ; g R RI LG LB BI RL GI
02372 fmul st,st(3) ; G R RI LG LB BI RL GI
02373 fxch st(6) ; RL R RI LG LB BI G GI
02374 fadd st,st(2) ; RL2 R RI LG LB BI G GI
02375 fxch st(3) ; LG R RI RL2 LB BI G GI
02376 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
02377 fxch st(6) ; G R RI RL2 LB BI LG2 GI
02378 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
02379 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
02380 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
02381 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
02382 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
02383 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
02384
02385 mov edx,dword ptr[Bucket]
02386 mov eax,dword ptr[Bucket2]
02387
02388 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
02389 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
02390 fxch st(3) ; LB RI RL2 B BI LG2 GI
02391 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
02392 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
02393 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
02394
02395 and edx,GREENMASK2
02396 and eax,REDMASK2
02397
02398 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
02399 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
02400
02401 mov edi,edx
02402 mov ebx,dword ptr[Bucket]
02403 or edi,eax
02404 mov ebp,TDest
02405 and ebx,BLUEMASK2
02406
02407 fxch st(3) ; LG2 LB2 BI RL2 GI
02408 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
02409
02410 mov si,word ptr[Z32]
02411 add TDest,4
02412
02413 mov ecx,pZBufferPtr
02414 or edi,ebx
02415
02416 cmp [TempPix],010001h
02417 je SkipPixie
02418
02419 rol edi,16
02420
02421 cmp word ptr[ecx],si
02422 jg SkipPixie
02423
02424 mov dword ptr[ebp],edi
02425 SkipPixie:
02426 add pZBufferPtr,4
02427 dec [widTemp]
02428
02429 jnz PixieLoop
02430
02431 pop ebp
02432
02433 fstp [u16]
02434 fstp [v16]
02435 fstp [u16]
02436 fstp [v16]
02437 fstp [u16]
02438 fstp [v16]
02439
02440 GouraudReturnNoZ:
02441 pop edi
02442 pop esi
02443 pop ecx
02444 pop ebx
02445 }
02446 }
|
|
||||||||||||
|
Definition at line 3166 of file x86span555.c. References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderGouraudPoly().
03167 {
03168 TDest =Dest;
03169 Red =Green =0;
03170 _asm
03171 {
03172 push ebx
03173 push ecx
03174 push esi
03175 push edi
03176
03177 mov ebx,pLeft
03178 mov ecx,pRight
03179 mov eax,[ebx]EdgeAsmFPU.X
03180 mov edx,[ecx]EdgeAsmFPU.X
03181 sub edx,eax
03182 jle GouraudReturnNoZ
03183
03184 mov esi,eax
03185 inc edx
03186 shl eax,1
03187 add TDest,eax
03188 add pZBufferPtr,eax
03189 test esi,1 //dword align left side
03190 jz NoSinglePixie
03191
03192 //odd sized spans write one pixel to dword align
03193 fild dword ptr [ebx]EdgeAsmFPU.B ; BL
03194 fmul dword ptr[BlueMask]
03195 fadd qword ptr[Magic] ; Bk
03196 fild dword ptr [ebx]EdgeAsmFPU.G ; GL Bk
03197 fmul dword ptr[GreenMask2]
03198 fadd qword ptr[Magic] ; Gk Bk
03199 fild dword ptr [ebx]EdgeAsmFPU.R ; RL Gk Bk
03200 fmul dword ptr[MiniRedMask2]
03201 fadd qword ptr[Magic] ; Rk Gk Bk
03202 fxch st(2) ; Bk Gk Rk
03203 fstp qword ptr[Bucket] ; Gk Rk
03204 fstp qword ptr[Bucket2] ; Rk
03205 fld dword ptr[ebx]EdgeAsmFPU.z ; z
03206 fistp [z16] ;
03207
03208 mov esi,dword ptr[Bucket]
03209 mov eax,dword ptr[Bucket2]
03210
03211 and esi,BLUEMASK2
03212 and eax,GREENMASK2
03213
03214 fstp qword ptr[Bucket]
03215
03216 mov ecx,TDest
03217 mov ebx,dword ptr[Bucket]
03218
03219 and ebx,REDMASK2
03220 or esi,eax
03221
03222 mov edi,[z16]
03223 mov eax,pZBufferPtr
03224
03225 add TDest,2
03226 or esi,ebx
03227
03228 shr edi,16
03229 mov ebx,pLeft
03230
03231 cmp word ptr[eax],di
03232 jg SkipSinglePixie
03233
03234 mov word ptr[eax],di
03235 mov word ptr[ecx],si
03236
03237 SkipSinglePixie:
03238 mov ecx,pRight
03239 add pZBufferPtr,2
03240 dec edx
03241
03242 jz GouraudReturnNoZ
03243 mov esi,edx
03244 and esi,1
03245 sub edx,esi
03246 jz GouraudReturnNoZ
03247
03248 NoSinglePixie:
03249 shr edx,1
03250 fld1
03251 mov [widTemp],edx ; just for a temp
03252
03253
03254 ; try to keep fmul fxch pairs seperated to avoid stalling
03255 ; calc this scanlines steps ; FPU Stack
03256 ; st0 st1 st2 st3 st4 st5 st6 st7
03257 fidiv dword ptr [widTemp] ; WID
03258 fild dword ptr [ecx]EdgeAsmFPU.R ; RR WID
03259 fild dword ptr [ebx]EdgeAsmFPU.R ; RL RR WID
03260 fsub st(1),st ; RL RD WID
03261 fild [ecx]EdgeAsmFPU.G ; GR RL RD WID
03262 fild [ebx]EdgeAsmFPU.G ; GL GR RL RD WID
03263 fsub st(1),st ; GL GD RL RD WID
03264 fild [ecx]EdgeAsmFPU.B ; BR GL GD RL RD WID
03265 fild [ebx]EdgeAsmFPU.B ; BL BR GL GD RL RD WID
03266 fsub st(1),st ; BL BD GL GD RL RD WID
03267 fxch st(5) ; RD BD GL GD RL BL WID
03268 fmul st,st(6) ; RI BD GL GD RL BL WID
03269 frndint
03270 fxch st(3) ; GD BD GL RI RL BL WID
03271 fmul st,st(6) ; GI BD GL RI RL BL WID
03272 frndint
03273 fxch st(6) ; WID BD GL RI RL BL GI
03274 fmulp st(1),st ; BI GL RI RL BL GI
03275 frndint
03276 fld qword ptr[RedMask2] ; rm BI GL RI RL BL GI
03277 fmul st(3),st ; rm BI GL RI RL BL GI
03278 fmulp st(4),st ; BI GL RI RL BL GI
03279 fld dword ptr[GreenMask2] ; gm BI GL RI RL BL GI
03280 fmul st(2),st ; gm BI GL RI RL BL GI
03281 fmulp st(6),st ; BI GL RI RL BL GI
03282 fld dword ptr[BlueMask] ; bm BI GL RI RL BL GI
03283 fmul st(1),st ; bm BI GL RI RL BL GI
03284 fmulp st(5),st ; BI GL RI RL BL GI
03285 fld [ecx]EdgeAsmFPU.z ; rz BI GL RI RL BL GI
03286 fsub [ebx]EdgeAsmFPU.z ; zd BI GL RI RL BL GI
03287 fld [ebx]EdgeAsmFPU.z ; lz zd BI GL RI RL BL GI
03288 fistp [z16] ; zd BI GL RI RL BL GI
03289 fistp [ZStep] ; BI GL RI RL BL GI
03290
03291 PixieLoop:
03292
03293 fld st(3) ; r BI GL RI RL BL GI
03294 fadd qword ptr[Magic] ; rk BI GL RI RL BL GI
03295 fld st(2) ; g rk BI GL RI RL BL GI
03296 fadd qword ptr[Magic] ; gk rk BI GL RI RL BL GI
03297 fxch st(1) ; rk gk BI GL RI RL BL GI
03298 fstp qword ptr[Bucket] ; gk BI GL RI RL BL GI
03299 fstp qword ptr[Bucket2] ; BI GL RI RL BL GI
03300 fld st(4) ; b BI GL RI RL BL GI
03301 fadd qword ptr[Magic] ; bk BI GL RI RL BL GI
03302
03303 mov ecx,dword ptr[Bucket]
03304 mov eax,dword ptr[Bucket2]
03305
03306 fstp qword ptr[Bucket] ; BI GL RI RL BL GI
03307 fadd st(4),st ; BI GL RI RL BL2 GI
03308
03309 and ecx,REDMASK2
03310 and eax,GREENMASK2
03311
03312 mov ebx,dword ptr[Bucket]
03313 or ecx,eax
03314
03315 fstp qword ptr[Bucket] ; GL RI RL BL2 GI
03316 fadd st,st(4) ; GL2 RI RL BL2 GI
03317 fstp qword ptr[Bucket2] ; RI RL BL2 GI
03318 fadd st(1),st ; RI RL2 BL2 GI
03319 fld qword ptr[Bucket2] ; GL2 RI RL2 BL2 GI
03320 fld qword ptr[Bucket] ; BI GL2 RI RL2 BL2 GI
03321
03322 and ebx,BLUEMASK2
03323 mov edi,TDest
03324
03325 or ecx,ebx
03326 add TDest,4
03327
03328 mov eax,[z16]
03329 mov esi,pZBufferPtr
03330
03331 shr eax,16
03332 mov ebx,[ZStep]
03333
03334 cmp word ptr[esi],ax
03335 jg SkipPixie
03336
03337 mov word ptr[esi],ax
03338 rol ecx,16
03339
03340 add [z16],ebx
03341 mov word ptr[esi+2],ax
03342
03343 mov [edi],ecx
03344 SkipPixie:
03345 add pZBufferPtr,4
03346 dec edx
03347
03348 jnz PixieLoop
03349
03350
03351 fstp [u16]
03352 fstp [v16]
03353 fstp [u16]
03354 fstp [v16]
03355 fstp [u16]
03356 fstp [v16]
03357
03358 GouraudReturnNoZ:
03359 pop edi
03360 pop esi
03361 pop ecx
03362 pop ebx
03363 }
03364 }
|
|
||||||||||||
|
Definition at line 1726 of file x86span555.c. References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X. Referenced by RenderMiscTexturePoly().
01727 {
01728 TDest =Dest;
01729 Red =Green =0;
01730 _asm
01731 {
01732 push ebx
01733 push ecx
01734 push esi
01735 push edi
01736
01737 mov ebx,pLeft
01738 mov ecx,pRight
01739 mov eax,[ebx]EdgeAsmFPU.X
01740 mov edx,[ecx]EdgeAsmFPU.X
01741 sub edx,eax
01742 jle GouraudReturnNoZ
01743
01744 mov esi,eax
01745 inc edx
01746 shl eax,1
01747 add TDest,eax
01748 add pZBufferPtr,eax
01749 test esi,1 //dword align left
01750 jz NoSinglePixie
01751
01752 //odd sized spans write one pixel to dword align
01753 fld dword ptr [ebx]EdgeAsmFPU.u ; UL
01754 fmul [Real65536] ; UL16
01755 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16
01756 fmul [Real65536] ; VL16 UL16
01757 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VL16 UL16
01758 fild dword ptr [ebx]EdgeAsmFPU.G ; GL RL VL16 UL16
01759 fild dword ptr [ebx]EdgeAsmFPU.B ; BL GL RL VL16 UL16
01760 fxch st(4) ; UL16 GL RL VL16 BL
01761 fistp [u16] ; GL RL VL16 BL
01762 fxch st(2) ; VL16 RL GL BL
01763 fistp [v16] ; RL GL BL
01764 fld dword ptr[ebx]EdgeAsmFPU.z ; z RL GL BL
01765 fistp [z16] ; RL GL BL
01766
01767 mov [widTemp],edx
01768
01769 mov ecx,[VShift]
01770 mov ebx,[GHMaskShifted]
01771
01772 mov esi,[GWMask]
01773 mov edi,[v16]
01774
01775 mov edx,dword ptr[u16]
01776
01777 shr edi,cl
01778
01779 shr edx,16
01780 xor eax,eax
01781
01782 and edi,ebx
01783 and edx,esi
01784
01785 add edi,edx
01786
01787 add edi,GBitPtrHalf
01788 mov ax,word ptr[edi*2]
01789
01790 mov word ptr[TempPix],ax
01791
01792 mov ebx,eax
01793 and eax,REDMASK2
01794
01795 mov ecx,ebx
01796 and ebx,GREENMASK2
01797
01798 mov dword ptr[Red],eax
01799 and ecx,BLUEMASK2
01800
01801 mov dword ptr[Green],ebx
01802 mov dword ptr[Blue],ecx
01803
01804 fimul dword ptr[Red] ; R GL BL
01805 fxch st(1) ; GL R BL
01806 fimul dword ptr[Green] ; G R BL
01807 fxch st(1) ; R G BL
01808 fadd qword ptr[Magic] ; Rk G BL
01809 fxch st(2) ; BL G Rk
01810 fimul [Blue] ; B G Rk
01811 fxch st(1) ; G B Rk
01812 fadd qword ptr[Magic] ; Gk B Rk
01813 fxch st(2) ; Rk B Gk
01814 fstp qword ptr[Bucket] ; B Gk
01815 fadd qword ptr[Magic] ; Bk Gk
01816 fxch st(1) ; Gk Bk
01817 fstp qword ptr[Bucket2] ; Bk
01818
01819 mov edx,dword ptr[Bucket]
01820 mov eax,dword ptr[Bucket2]
01821
01822 and edx,REDMASK2
01823 and eax,GREENMASK2
01824
01825 fstp qword ptr[Bucket]
01826
01827 mov ecx,TDest
01828 mov ebx,dword ptr[Bucket]
01829
01830 mov esi,[z16]
01831 and ebx,BLUEMASK2
01832
01833 shr esi,16
01834 or edx,eax
01835
01836 mov eax,pZBufferPtr
01837 add TDest,2
01838
01839 cmp word ptr[TempPix],01h
01840 je SkipSinglePixie
01841
01842 cmp word ptr[eax],si
01843 jg SkipSinglePixie
01844
01845 or edx,ebx
01846 mov word ptr[eax],si
01847
01848 mov word ptr[ecx],dx
01849
01850 SkipSinglePixie:
01851 mov ebx,pLeft
01852 mov edx,[widTemp]
01853 add pZBufferPtr,2
01854 mov ecx,pRight
01855 dec edx
01856 jz GouraudReturnNoZ
01857 mov esi,edx
01858 and esi,1
01859 sub edx,esi
01860 jz GouraudReturnNoZ
01861
01862 NoSinglePixie:
01863 mov [widTemp],edx ; just for a temp
01864 shr edx,1
01865
01866 ; try to keep fmul fxch pairs seperated to avoid stalling
01867 ; calc this scanlines steps ; FPU Stack
01868 ; st0 st1 st2 st3 st4 st5 st6 st7
01869 fild dword ptr [widTemp] ; WID
01870
01871 mov [widTemp],edx ; Color interps doubled
01872
01873 fld dword ptr [ecx]EdgeAsmFPU.u ; UR WID
01874 fld dword ptr [ebx]EdgeAsmFPU.u ; UL UR WID
01875 fsub st(1), st ; UL UD WID
01876 fld dword ptr [ecx]EdgeAsmFPU.v ; VR UL UD WID
01877 fxch st(1) ; UL VR UD WID
01878 fmul [Real65536] ; UL16 VR UD WID
01879 fld dword ptr [ebx]EdgeAsmFPU.v ; VL UL16 VR UD WID
01880 fsub st(2), st ; VL UL16 VD UD WID
01881 fild dword ptr [ecx]EdgeAsmFPU.R ; RR VL UL16 VD UD WID
01882 fxch st(3) ; VD VL UL16 RR UD WID
01883 fmul [Real65536] ; VD16 VL UL16 RR UD WID
01884 fild dword ptr [ebx]EdgeAsmFPU.R ; RL VD16 VL UL16 RR UD WID
01885 fsub st(4),st ; RL VD16 VL UL16 RD UD WID
01886 fxch st(5) ; UD VD16 VL UL16 RD RL WID
01887 fmul [Real65536] ; UD16 VD16 VL UL16 RD RL WID
01888 fxch st(2) ; VL VD16 UD16 UL16 RD RL WID
01889 fmul [Real65536] ; VL16 VD16 UD16 UL16 RD RL WID
01890 fxch st(3) ; UL16 VD16 UD16 VL16 RD RL WID
01891 fistp [u16] ; VD16 UD16 VL16 RD RL WID
01892 fxch st(2) ; VL16 UD16 VD16 RD RL WID
01893 fistp [v16] ; UD16 VD16 RD RL WID
01894 fld1 ; 1 UD16 VD16 RD RL WID
01895 fdivrp st(5),st ; UD16 VD16 RD RL DWID
01896
01897 //let that cook
01898
01899 fmul st,st(4) ; USTP VD16 RD RL DWID
01900 fild [ecx]EdgeAsmFPU.G ; RG USTP VD16 RD RL DWID
01901 fild [ebx]EdgeAsmFPU.G ; LG RG USTP VD16 RD RL DWID
01902 fsub st(1),st ; LG GD USTP VD16 RD RL DWID
01903 fxch st(2) ; USTP GD LG VD16 RD RL DWID
01904 fistp [UStep] ; GD LG VD16 RD RL DWID
01905 fild [ecx]EdgeAsmFPU.B ; RB GD LG VD16 RD RL DWID
01906 fild [ebx]EdgeAsmFPU.B ; LB RB GD LG VD16 RD RL DWID
01907 fsub st(1),st ; LB BD GD LG VD16 RD RL DWID
01908 fxch st(4) ; VD16 BD GD LG LB RD RL DWID
01909 fmul st,st(7) ; VSTP BD GD LG LB RD RL DWID
01910 fxch st(7) ; DWID BD GD LG LB RD RL VSTP
01911 fmul dword ptr[Two] ; DW2 BD GD LG LB RD RL VSTP
01912 fxch st(7) ; VSTP BD GD LG LB RD RL DW2
01913 fxch st(5) ; RD BD GD LG LB VSTP RL DW2
01914 fmul st,st(7) ; RI BD GD LG LB VSTP RL DW2
01915 frndint
01916 fxch st(2) ; GD BD RI LG LB VSTP RL DW2
01917 fmul st,st(7) ; GI BD RI LG LB VSTP RL DW2
01918 frndint
01919 fxch st(1) ; BD GI RI LG LB VSTP RL DW2
01920 fmul st,st(7) ; BD GI RI LG LB VSTP RL DW2
01921 frndint
01922 fxch st(5) ; VSTP GI RI LG LB BD RL DW2
01923 fistp [VStep] ; GI RI LG LB BD RL DW2
01924 fld [ecx]EdgeAsmFPU.z ; rz GI RI LG LB BD RL DW2
01925 fsub [ebx]EdgeAsmFPU.z ; zd GI RI LG LB BD RL DW2
01926 fxch st(7) ; DW2 GI RI LG LB BD RL zd
01927 fmulp st(7),st ; GI RI LG LB BD RL zd
01928 fld [ebx]EdgeAsmFPU.z ; lz GI RI LG LB BD RL zd
01929 fxch st(7) ; zd GI RI LG LB BD RL lz
01930 fistp [ZStep] ; GI RI LG LB BD RL lz
01931 fxch st(6) ; lz RI LG LB BD RL GI
01932 fistp [z16] ; RI LG LB BD RL GI
01933
01934 push ebp
01935
01936 PixieLoop:
01937 mov ebx,[ZStep]
01938
01939 add [z16],ebx
01940 mov ecx,[VShift]
01941
01942 mov edi,[z16]
01943
01944 shr edi,16
01945 mov ebx,[GHMaskShifted]
01946
01947 mov ebp,[GWMask]
01948 mov edx,dword ptr[u16]
01949
01950 mov word ptr[Z32],di
01951 mov eax,edx
01952
01953 shr edx,16
01954 mov edi,[v16]
01955
01956 add eax,[UStep]
01957 mov esi,edi
01958
01959 shr edi,cl
01960 add esi,[VStep]
01961
01962 and edi,ebx
01963 and edx,ebp
01964
01965 add edi,edx
01966 mov edx,eax
01967
01968 add edi,GBitPtrHalf
01969 add eax,[UStep]
01970
01971 mov [u16],eax
01972 mov ax,word ptr[edi*2]
01973
01974 mov edi,esi
01975 add esi,[VStep]
01976
01977 shr edx,16
01978 mov [v16],esi
01979
01980 shr edi,cl
01981 and edx,ebp
01982
01983 mov esi,GBitPtrHalf
01984 and edi,ebx
01985
01986 shl eax,16
01987 add esi,edx
01988
01989 add esi,edi
01990
01991 mov ax,word ptr[esi*2]
01992
01993 mov [TempPix],eax
01994
01995 mov ebx,eax
01996 and eax,REDMASK2
01997
01998 mov ecx,ebx
01999 and ebx,GREENMASK2
02000
02001 mov dword ptr[Red],eax
02002 and ecx,BLUEMASK2
02003
02004 mov dword ptr[Green],ebx
02005 mov dword ptr[Blue],ecx
02006
02007 fild qword ptr[Red] ; r RI LG LB BI RL GI
02008 fmul st,st(5) ; R RI LG LB BI RL GI
02009 fild qword ptr[Green] ; g R RI LG LB BI RL GI
02010 fmul st,st(3) ; G R RI LG LB BI RL GI
02011 fxch st(6) ; RL R RI LG LB BI G GI
02012 fadd st,st(2) ; RL2 R RI LG LB BI G GI
02013 fxch st(3) ; LG R RI RL2 LB BI G GI
02014 fadd st,st(7) ; LG2 R RI RL2 LB BI G GI
02015 fxch st(6) ; G R RI RL2 LB BI LG2 GI
02016 fadd qword ptr[Magic] ; Gk R RI RL2 LB BI LG2 GI
02017 fxch st(1) ; R Gk RI RL2 LB BI LG2 GI
02018 fadd qword ptr[Magic] ; Rk Gk RI RL2 LB BI LG2 GI
02019 fxch st(1) ; Gk Rk RI RL2 LB BI LG2 GI
02020 fstp qword ptr[Bucket] ; Rk RI RL2 LB BI LG2 GI
02021 fstp qword ptr[Bucket2] ; RI RL2 LB BI LG2 GI
02022
02023 mov edx,dword ptr[Bucket]
02024 mov eax,dword ptr[Bucket2]
02025
02026 fild dword ptr[Blue] ; b RI RL2 LB BI LG2 GI
02027 fmul st,st(3) ; B RI RL2 LB BI LG2 GI
02028 fxch st(3) ; LB RI RL2 B BI LG2 GI
02029 fadd st,st(4) ; LB2 RI RL2 B BI LG2 GI
02030 fxch st(3) ; B RI RL2 LB2 BI LG2 GI
02031 fadd qword ptr[Magic] ; Bk RI RL2 LB2 BI LG2 GI
02032
02033 and edx,GREENMASK2
02034 and eax,REDMASK2
02035
02036 fstp qword ptr[Bucket] ; RI RL2 LB2 BI LG2 GI
02037 fstp qword ptr[Bucket2] ; RL2 LB2 BI LG2 GI
02038
02039 mov edi,edx
02040 mov ebx,dword ptr[Bucket]
02041 or edi,eax
02042 mov ebp,TDest
02043 and ebx,BLUEMASK2
02044
02045 fxch st(3) ; LG2 LB2 BI RL2 GI
02046 fld qword ptr[Bucket2] ; RI LG2 LB2 BI RL2 GI
02047
02048 mov si,word ptr[Z32]
02049 add TDest,4
02050
02051 mov ecx,pZBufferPtr
02052 or edi,ebx
02053
02054 cmp [TempPix],010001h
02055 je SkipPixie
02056
02057 rol edi,16
02058
02059 cmp word ptr[ecx],si
02060 jg SkipPixie
02061
02062 mov [ecx],si
02063 mov dword ptr[ebp],edi
02064 mov [ecx+2],si
02065 SkipPixie:
02066 add pZBufferPtr,4
02067 dec [widTemp]
02068
02069 jnz PixieLoop
02070 // mov dword ptr[ebp],0ffffffffh
02071
02072 pop ebp
02073
02074 fstp [u16]
02075 fstp [v16]
02076 fstp [u16]
02077 fstp [v16]
02078 fstp [u16]
02079 fstp [v16]
02080
02081 GouraudReturnNoZ:
02082 pop edi
02083 pop esi
02084 pop ecx
02085 pop ebx
02086 }
02087 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 6731 of file x86span555.c. References B, BB1, Blue, BlueDelta, BLUEMASK, Bucket, Bucket2, DeltaU, DeltaV, Dest, FloatTemp, FTemp0, FTemp1, FTemp2, FTemp3, FTemp4, FTemp5, G, GBitPtr16, GG1, GHMaskShifted16, GLMapMulU, GLMapMulV, Green, GreenDelta, GREENMASK2, GWMaskShifted, Magic, MaxU, MaxV, MipMagic, MipMagic2, NumASpans, or, pointer, pTex, pZBufferPtr, R, r, Red, RedDelta, REDMASK2, RemainingCount, RR1, TDest, Two, U1, UAdjust, UAdjust2, UAdjustL, UDivZ16StepX, UDivZOrigin, UDivZStepX, UDivZStepY, UFixed, V1, VAdjust, VAdjust2, VAdjustL, VDivZ16StepX, VDivZOrigin, VDivZStepX, VDivZStepY, VFixed, VShift, widTemp, y, ZBufferPrec, ZDelta, Zi, Zi16StepX, ZiOrigin, ZiStepX, ZiStepY, and ZVal. Referenced by AddSpanDraw(), and RenderWorldPoly().
06732 {
06733 RR1 =r1;
06734 GG1 =g1;
06735 BB1 =b1;
06736 TDest =Dest;
06737 _asm
06738 {
06739 push ebx
06740 push ecx
06741 push esi
06742 push edi
06743
06744 mov eax,x1
06745 mov ecx,x2
06746 sub ecx,eax
06747 jle Return16
06748
06749 mov edi,[GBitPtr16]
06750 mov pTex,edi
06751
06752 fild [y] ; y
06753 mov [widTemp],ecx
06754
06755 fild [x1] ; x y
06756 fild [widTemp]
06757
06758 fld1
06759 fdivrp st(1),st
06760
06761 mov esi,x1
06762 mov edi,[TDest]
06763
06764 shl esi,1
06765 mov eax,ecx
06766
06767 add edi,esi
06768 add pZBufferPtr,esi
06769
06770 mov eax,ecx
06771 shr ecx,4
06772 and eax,15
06773 _emit 75h
06774 _emit 06h
06775 dec ecx
06776 mov eax,16
06777
06778 mov [NumASpans],ecx
06779 mov [RemainingCount],eax
06780
06781 fild [r2]
06782 fisub [r1]
06783 fild [g2]
06784 fisub [g1]
06785 fild [b2]
06786 fisub [b1]
06787 fxch st(2)
06788 fmul st,st(3)
06789 fxch st(1)
06790 fmul st,st(3)
06791 fxch st(2)
06792 fmul st,st(3)
06793 frndint
06794 fstp qword ptr[BlueDelta]
06795 frndint
06796 fstp qword ptr[RedDelta]
06797 frndint
06798 fstp qword ptr[GreenDelta]
06799 fstp qword ptr[FTemp0]
06800
06801
06802 //decoder won't keep up with these huge instructions
06803 //need to find some int instructions to cram in here somewhere
06804 fld [UDivZStepY] ; UZdY x y
06805 fld [UDivZStepX] ; UZdX UZdY x y
06806 fmul st,st(2) ; UZX UZdY x y
06807 fld [VDivZStepY] ; VZdY UZX UZdY x y
06808 fld [VDivZStepX] ; VZdX VZdY UZX UZdY x y
06809 fxch st(3) ; UZdy VZdY UZX VZdX x y
06810 fmul st,st(5) ; UZY VZdY UZX VZdX x y
06811 fxch st(2) ; UZX VZdY UZY VZdX x y
06812 fadd [UDivZOrigin] ; UZXS VZdY UZY VZdX x y
06813 fxch st(3) ; VZdX VZdY UZY UZXS x y
06814 fmul st,st(4) ; VZX VZdY UZY UZXS x y
06815 fxch st(2) ; UZY VZdY VZX UZXS x y
06816 faddp st(3),st ; VZdY VZX UZ x y
06817 fmul st,st(4) ; VZY VZX UZ x y
06818 fxch st(1) ; VZX VZY UZ x y
06819 fadd [VDivZOrigin] ; VZXS VZY UZ x y
06820 fld [ZiStepX] ; ZdX VZXS VZY UZ x y
06821
06822 //zbuffer step action
06823 fld [ZiStepX]
06824 fmul dword ptr[ZBufferPrec]
06825 fmul dword ptr[Two]
06826 fistp dword ptr[ZDelta]
06827
06828 fmulp st(4),st ; VZXS VZY UZ ZX y
06829 faddp st(1),st ; VZ UZ ZX y
06830 fld [ZiStepY] ; ZdY VZ UZ ZX y
06831 fmulp st(4),st ; VZ UZ ZX ZY
06832 fxch st(2) ; ZX UZ VZ ZY
06833 fadd [ZiOrigin] ; ZXS UZ VZ ZY
06834
06835 //room for two cycles of int instructions here
06836
06837 faddp st(3),st ; UZ VZ Zi
06838 fld1 ; 1 UZ VZ Zi
06839 fdiv st,st(3) ; ZL UZ VZ Zi
06840
06841 //room for 18 cycles of int instructions here
06842
06843 fld st ; ZL ZL UZ VZ Zi
06844 fmul st,st(3) ; VL ZL UZ VZ Zi
06845 fxch st(4) ; Zi ZL UZ VZ VL
06846
06847 //zbuffer action
06848 fld st
06849 fmul dword ptr[ZBufferPrec]
06850 fistp dword ptr[ZVal]
06851
06852 fadd [Zi16StepX] ; ZRi ZL UZ VZ VL
06853 fxch st(1) ; ZL ZRi UZ VZ VL
06854 fmul st,st(2) ; UL ZRi UZ VZ VL
06855 fxch st(3) ; VZ ZRi UZ UL VL
06856 fadd [VDivZ16StepX] ; VZR ZRi UZ UL VL
06857 fxch st(2) ; UZ ZRi VZR UL VL
06858 fadd [UDivZ16StepX] ; UZR ZRi VZR UL VL
06859 fld1 ; 1 UZR ZRi VZR UL VL
06860 fdiv st,st(2) ; ZR UZR ZRi VZR UL VL
06861
06862 //room for 18 cycles of int stuff here
06863
06864 fld st ; ZR ZR UZR ZRi VZR UL VL
06865 fmul st,st(4) ; VR ZR UZR ZRi VZR UL VL
06866 fxch st(1) ; ZR VR UZR ZRi VZR UL VL
06867 //fmul stall one cycle
06868 fmul st,st(2) ; UR VR UZR ZRi VZR UL VL
06869
06870 test ecx,ecx
06871 jz HandleLeftoverPixels16
06872
06873 SpanLoop16:
06874 //need one more stack spot
06875 fstp dword ptr[FloatTemp] ; VR UZR ZRi VZR UL VL
06876 fld st(4) ; UL VR UZR ZRi VZR UL VL
06877 fmul [GLMapMulU] ; ULL VR UZR ZRi VZR UL VL
06878 fld st(5) ; UL ULL VR UZR ZRi VZR UL VL
06879 fadd qword ptr[MipMagic] ; ULk ULL VR UZR ZRi VZR UL VL
06880 fxch st(1) ; ULL ULk VR UZR ZRi VZR UL VL
06881 fadd qword ptr[MipMagic] ; ULLk ULk VR UZR ZRi VZR UL VL
06882 fxch st(1) ; ULk ULLk VR UZR ZRi VZR UL VL
06883 fstp qword ptr[Bucket] ; ULLk VR UZR ZRi VZR UL VL
06884 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
06885
06886 mov ebx,dword ptr[Bucket]
06887 mov eax,dword ptr[Bucket2]
06888
06889 fld st(5) ; VL VR UZR ZRi VZR UL VL
06890 fmul [GLMapMulV] ; VLL VR UZR ZRi VZR UL VL
06891
06892 add ebx,dword ptr[UAdjust]
06893 add eax,dword ptr[UAdjustL]
06894
06895 mov [U1],ebx
06896 mov [UFixed],eax
06897
06898 fld st(6) ; VL VLL VR UZR ZRi VZR UL VL
06899 fadd qword ptr[MipMagic] ; VLk VLL VR UZR ZRi VZR UL VL
06900 fxch st(1) ; VLL VLk VR UZR ZRi VZR UL VL
06901 fadd qword ptr[MipMagic] ; VLLk VLk VR UZR ZRi VZR UL VL
06902 fxch st(1) ; VLk VLLk VR UZR ZRi VZR UL VL
06903 fstp qword ptr[Bucket] ; VLLk VR UZR ZRi VZR UL VL
06904 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
06905 fsubr st(5),st ; VR UZR ZRi VZR UL dV
06906
06907 mov ebx,dword ptr[Bucket]
06908 mov eax,dword ptr[Bucket2]
06909
06910 fld dword ptr[FloatTemp] ; UR VR UZR ZRi VZR UL dV
06911
06912 add ebx,dword ptr[VAdjust]
06913 add eax,dword ptr[VAdjustL]
06914
06915 mov [V1],ebx
06916 mov [VFixed],eax
06917
06918 fsubr st(5),st ; UR VR UZR ZRi VZR dU dV
06919 fxch st(6) ; dV VR UZR ZRi VZR dU UR
06920 fadd qword ptr[MipMagic2] ; dVk VR UZR ZRi VZR dU UR
06921 fxch st(5) ; dU VR UZR ZRi VZR dVk UR
06922 fadd qword ptr[MipMagic2] ; dUk VR UZR ZRi VZR dVk UR
06923 fxch st(5) ; dVk VR UZR ZRi VZR dUk UR
06924 fstp qword ptr[DeltaV] ; VR UZR ZRi VZR dUk UR
06925 fxch st(5) ; UR UZR ZRi VZR dUk VR
06926 //gotta do this to get em lined back up right
06927 fxch st(4) ; dUk UZR ZRi VZR UR VR
06928 fstp qword ptr[DeltaU] ; UZR ZRi VZR UR VR
06929
06930 //right becomes left ; UZL ZLi VZL UL VL
06931 fadd [UDivZ16StepX] ; UZR ZLi VZL UL VL
06932 fxch st(1) ; ZLi UZR VZL UL VL
06933 fadd [Zi16StepX] ; ZRi UZR VZL UL VL
06934 fxch st(2) ; VZL UZR ZRi UL VL
06935 fadd [VDivZ16StepX] ; VZR UZR ZRi UL VL
06936 fxch st(2) ; ZRi UZR VZR UL VL
06937 fxch st(1) ; UZR ZRi VZR UL VL
06938 fld1 ; 1 UZR ZRi VZR UL VL
06939 fdiv st,st(2) ; ZR UZR ZRi VZR UL VL
06940
06941 // Clamp U/V
06942 mov ebx,[UFixed]
06943 cmp ebx,MaxU
06944 jle TryClampU016
06945 mov ecx,MaxU
06946 mov dword ptr[UFixed],ecx
06947 jmp NoClampU016
06948
06949 TryClampU016:
06950 cmp ebx,0
06951 jge NoClampU016
06952 mov dword ptr[UFixed],0
06953 NoClampU016:
06954 mov eax,[VFixed]
06955 cmp eax,MaxV
06956 jle TryClampV016
06957 mov ecx,MaxV
06958 mov dword ptr[VFixed],ecx
06959 jmp NoClampV016
06960
06961 TryClampV016:
06962 cmp eax,0
06963 jge NoClampV016
06964 mov dword ptr[VFixed],0
06965
06966 NoClampV016:
06967
06968 fstp [FTemp0] ; UZR ZRi VZR UL VL
06969 fstp [FTemp1] ; ZRi VZR UL VL
06970 fstp [FTemp2] ; VZR UL VL
06971 fstp [FTemp3] ; UL VL
06972 fstp [FTemp4] ; VL
06973 fstp [FTemp5] ;
06974
06975
06976 fild [RR1] ; LR
06977 fild [GG1] ; LG LR
06978 fild [BB1] ; LB LG LR
06979
06980
06981 mov ebx,dword ptr[U1]
06982 mov eax,dword ptr[V1]
06983
06984 add ebx,dword ptr[UAdjust2]
06985 add eax,dword ptr[VAdjust2]
06986
06987 mov ecx,[VShift]
06988 mov dword ptr[Bucket],ebx
06989
06990 shl eax,cl
06991
06992 push ebp
06993
06994 mov dword ptr[Bucket2],eax
06995 mov ebp,dword ptr[DeltaV]
06996
06997 and eax,[GHMaskShifted16]
06998 and ebx,[GWMaskShifted]
06999
07000 shl ebp,cl
07001 add eax,ebx
07002
07003 mov edx,dword ptr[Bucket2]
07004 mov esi,pTex
07005
07006 shr eax,16
07007 mov dword ptr[DeltaV],ebp
07008
07009 mov ebx,dword ptr[Bucket]
07010
07011 mov ax,word ptr[2*eax+esi]
07012 add edx,dword ptr[DeltaV]
07013
07014 xor eax,0
07015 mov ecx,edx
07016
07017 add ebx,dword ptr[DeltaU]
07018 and ecx,[GHMaskShifted16]
07019
07020 rol eax,16
07021 and ebx,[GWMaskShifted]
07022
07023 xor eax,0
07024 add ecx,ebx
07025
07026 add edx,dword ptr[DeltaV]
07027 mov esi,pTex
07028
07029 shr ecx,16
07030 add ebx,dword ptr[DeltaU]
07031
07032 mov ax,word ptr[2*ecx+esi]
07033 mov ecx,edx
07034
07035 xor eax,0
07036 and ecx,[GHMaskShifted16]
07037
07038 mov esi,eax
07039 mov ebp,eax
07040
07041 and esi,REDMASK2
07042 and ebp,GREENMASK2
07043
07044 mov dword ptr[Red],esi
07045 mov dword ptr[Green],ebp
07046
07047 fild qword ptr[Red] ; r LB LG LR
07048
07049 mov ebp,eax
07050
07051 fmul st,st(3) ; R LB LG LR
07052 fild qword ptr[Green] ; g R LB LG LR
07053
07054 and ebp,BLUEMASK
07055 and ebx,[GWMaskShifted]
07056
07057 mov dword ptr[Blue],ebp
07058
07059 fmul st,st(3) ; G R LB LG LR
07060 fild [Blue] ; b G R LB LG LR
07061 fmul st,st(3) ; B G R LB LG LR
07062 fxch st(2) ; R G B LB LG LR
07063 fadd qword ptr[Magic] ; Rk G B LB LG LR
07064 fxch st(1) ; G Rk B LB LG LR
07065 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07066 fxch st(2) ; B Rk Gk LB LG LR
07067 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07068 fxch st(1) ; Rk Bk Gk LB LG LR
07069 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07070 fstp qword ptr[Bucket2] ; Gk LB LG LR
07071
07072 mov eax,dword ptr[Bucket]
07073 mov ebp,dword ptr[Bucket2]
07074
07075 fstp qword ptr[Bucket] ; LB LG LR
07076 fxch st(1)
07077 fadd qword ptr[GreenDelta]
07078 fxch st(1)
07079 fadd qword ptr[BlueDelta]
07080 fxch st(2)
07081 fadd qword ptr[RedDelta]
07082 fxch st(2)
07083
07084 and eax,REDMASK2
07085 and ebp,BLUEMASK
07086
07087 mov esi,dword ptr[Bucket]
07088 or ebp,eax
07089
07090 add ecx,ebx
07091 and esi,GREENMASK2
07092
07093 shr ecx,16
07094 or ebp,esi
07095
07096 xor eax,0
07097 mov esi,pTex
07098
07099 rol ebp,16
07100 add edx,dword ptr[DeltaV]
07101
07102 mov ax,word ptr[2*ecx+esi]
07103 mov ecx,[ZVal]
07104
07105 mov esi,[ZVal]
07106 add ecx,[ZDelta]
07107
07108 shr esi,16
07109 mov [ZVal],ecx
07110
07111 mov ecx,pZBufferPtr
07112
07113 cmp si,word ptr[ecx+0]
07114 jle Skip0
07115
07116 mov [edi+0],ebp
07117 mov word ptr[ecx+0],si
07118 mov word ptr[ecx+2],si
07119
07120 Skip0:
07121 mov ecx,edx
07122 mov esi,pTex
07123
07124 add ebx,dword ptr[DeltaU]
07125 and ecx,[GHMaskShifted16]
07126
07127 and ebx,[GWMaskShifted]
07128 xor eax,0
07129
07130 add ecx,ebx
07131
07132 rol eax,16
07133 add edx,dword ptr[DeltaV]
07134
07135 shr ecx,16
07136 add ebx,dword ptr[DeltaU]
07137
07138 mov ax,word ptr[2*ecx+esi]
07139
07140 mov ecx,edx
07141 xor eax,0
07142
07143 and ecx,[GHMaskShifted16]
07144 mov esi,eax
07145
07146 mov ebp,eax
07147 and esi,REDMASK2
07148
07149 and ebp,GREENMASK2
07150 mov dword ptr[Red],esi
07151
07152 mov dword ptr[Green],ebp
07154
07155
07156 fild qword ptr[Red] ; r LB LG LR
07157
07158 mov ebp,eax
07159
07160 fmul st,st(3) ; R LB LG LR
07161 fild qword ptr[Green] ; g R LB LG LR
07162
07163 and ebp,BLUEMASK
07164 and ebx,[GWMaskShifted]
07165
07166 mov dword ptr[Blue],ebp
07167
07168 fmul st,st(3) ; G R LB LG LR
07169 fild [Blue] ; b G R LB LG LR
07170 fmul st,st(3) ; B G R LB LG LR
07171 fxch st(2) ; R G B LB LG LR
07172 fadd qword ptr[Magic] ; Rk G B LB LG LR
07173 fxch st(1) ; G Rk B LB LG LR
07174 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07175 fxch st(2) ; B Rk Gk LB LG LR
07176 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07177 fxch st(1) ; Rk Bk Gk LB LG LR
07178 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07179 fstp qword ptr[Bucket2] ; Gk LB LG LR
07180
07181 mov eax,dword ptr[Bucket]
07182 mov ebp,dword ptr[Bucket2]
07183
07184 fstp qword ptr[Bucket] ; LB LG LR
07185 fxch st(1)
07186 fadd qword ptr[GreenDelta]
07187 fxch st(1)
07188 fadd qword ptr[BlueDelta]
07189 fxch st(2)
07190 fadd qword ptr[RedDelta]
07191 fxch st(2)
07192
07193 and eax,REDMASK2
07194 and ebp,BLUEMASK
07195
07196 mov esi,dword ptr[Bucket]
07197 or ebp,eax
07198
07199 add ecx,ebx
07200 and esi,GREENMASK2
07201
07202 shr ecx,16
07203 or ebp,esi
07204
07205 xor eax,0
07206 mov esi,pTex
07207
07208 rol ebp,16
07209 add edx,dword ptr[DeltaV]
07210
07211 mov ax,word ptr[2*ecx+esi]
07212 mov ecx,[ZVal]
07213
07214 mov esi,[ZVal]
07215 add ecx,[ZDelta]
07216
07217 shr esi,16
07218 mov [ZVal],ecx
07219
07220 mov ecx,pZBufferPtr
07221
07222 cmp si,word ptr[ecx+4]
07223 jle Skip1
07224
07225 mov [edi+4],ebp
07226 mov word ptr[ecx+4],si
07227 mov word ptr[ecx+6],si
07228
07229 Skip1:
07230 mov ecx,edx
07231 mov esi,pTex
07232
07233 add ebx,dword ptr[DeltaU]
07234 and ecx,[GHMaskShifted16]
07235
07236 and ebx,[GWMaskShifted]
07237 xor eax,0
07238
07239 add ecx,ebx
07240
07241 rol eax,16
07242 add edx,dword ptr[DeltaV]
07243
07244 shr ecx,16
07245 add ebx,dword ptr[DeltaU]
07246
07247 mov ax,word ptr[2*ecx+esi]
07248
07249 mov ecx,edx
07250 xor eax,0
07251
07252 and ecx,[GHMaskShifted16]
07253 mov esi,eax
07254
07255 mov ebp,eax
07256 and esi,REDMASK2
07257
07258 and ebp,GREENMASK2
07259 mov dword ptr[Red],esi
07260
07261 mov dword ptr[Green],ebp
07263
07264
07265 fild qword ptr[Red] ; r LB LG LR
07266
07267 mov ebp,eax
07268
07269 fmul st,st(3) ; R LB LG LR
07270 fild qword ptr[Green] ; g R LB LG LR
07271
07272 and ebp,BLUEMASK
07273 and ebx,[GWMaskShifted]
07274
07275 mov dword ptr[Blue],ebp
07276
07277 fmul st,st(3) ; G R LB LG LR
07278 fild [Blue] ; b G R LB LG LR
07279 fmul st,st(3) ; B G R LB LG LR
07280 fxch st(2) ; R G B LB LG LR
07281 fadd qword ptr[Magic] ; Rk G B LB LG LR
07282 fxch st(1) ; G Rk B LB LG LR
07283 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07284 fxch st(2) ; B Rk Gk LB LG LR
07285 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07286 fxch st(1) ; Rk Bk Gk LB LG LR
07287 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07288 fstp qword ptr[Bucket2] ; Gk LB LG LR
07289
07290 mov eax,dword ptr[Bucket]
07291 mov ebp,dword ptr[Bucket2]
07292
07293 fstp qword ptr[Bucket] ; LB LG LR
07294 fxch st(1)
07295 fadd qword ptr[GreenDelta]
07296 fxch st(1)
07297 fadd qword ptr[BlueDelta]
07298 fxch st(2)
07299 fadd qword ptr[RedDelta]
07300 fxch st(2)
07301
07302 and eax,REDMASK2
07303 and ebp,BLUEMASK
07304
07305 mov esi,dword ptr[Bucket]
07306 or ebp,eax
07307
07308 add ecx,ebx
07309 and esi,GREENMASK2
07310
07311 shr ecx,16
07312 or ebp,esi
07313
07314 xor eax,0
07315 mov esi,pTex
07316
07317 rol ebp,16
07318 add edx,dword ptr[DeltaV]
07319
07320 mov ax,word ptr[2*ecx+esi]
07321 mov ecx,[ZVal]
07322
07323 mov esi,[ZVal]
07324 add ecx,[ZDelta]
07325
07326 shr esi,16
07327 mov [ZVal],ecx
07328
07329 mov ecx,pZBufferPtr
07330
07331 cmp si,word ptr[ecx+8]
07332 jle Skip2
07333
07334 mov [edi+8],ebp
07335 mov word ptr[ecx+8],si
07336 mov word ptr[ecx+10],si
07337
07338 Skip2:
07339 mov ecx,edx
07340 mov esi,pTex
07341
07342 add ebx,dword ptr[DeltaU]
07343 and ecx,[GHMaskShifted16]
07344
07345 and ebx,[GWMaskShifted]
07346 xor eax,0
07347
07348 add ecx,ebx
07349
07350 shr ecx,16
07351 add edx,dword ptr[DeltaV]
07352
07353 rol eax,16
07354 mov ax,word ptr[2*ecx+esi]
07355
07356 mov ecx,edx
07357 xor eax,0
07358
07359 and ecx,[GHMaskShifted16]
07360 mov esi,eax
07361
07362 mov ebp,eax
07363 and esi,REDMASK2
07364
07365 and ebp,GREENMASK2
07366 mov dword ptr[Red],esi
07367
07368 mov dword ptr[Green],ebp
07369 add ebx,dword ptr[DeltaU]
07371
07372
07373 fild qword ptr[Red] ; r LB LG LR
07374
07375 mov ebp,eax
07376
07377 fmul st,st(3) ; R LB LG LR
07378 fild qword ptr[Green] ; g R LB LG LR
07379
07380 and ebp,BLUEMASK
07381 and ebx,[GWMaskShifted]
07382
07383 mov dword ptr[Blue],ebp
07384
07385 fmul st,st(3) ; G R LB LG LR
07386 fild [Blue] ; b G R LB LG LR
07387 fmul st,st(3) ; B G R LB LG LR
07388 fxch st(2) ; R G B LB LG LR
07389 fadd qword ptr[Magic] ; Rk G B LB LG LR
07390 fxch st(1) ; G Rk B LB LG LR
07391 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07392 fxch st(2) ; B Rk Gk LB LG LR
07393 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07394 fxch st(1) ; Rk Bk Gk LB LG LR
07395 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07396 fstp qword ptr[Bucket2] ; Gk LB LG LR
07397
07398 mov eax,dword ptr[Bucket]
07399 mov ebp,dword ptr[Bucket2]
07400
07401 fstp qword ptr[Bucket] ; LB LG LR
07402 fxch st(1)
07403 fadd qword ptr[GreenDelta]
07404 fxch st(1)
07405 fadd qword ptr[BlueDelta]
07406 fxch st(2)
07407 fadd qword ptr[RedDelta]
07408 fxch st(2)
07409
07410 and eax,REDMASK2
07411 and ebp,BLUEMASK
07412
07413 mov esi,dword ptr[Bucket]
07414 or ebp,eax
07415
07416 add ecx,ebx
07417 and esi,GREENMASK2
07418
07419 shr ecx,16
07420 or ebp,esi
07421
07422 xor eax,0
07423 mov esi,pTex
07424
07425 rol ebp,16
07426 add edx,dword ptr[DeltaV]
07427
07428 mov ax,word ptr[2*ecx+esi]
07429 mov ecx,[ZVal]
07430
07431 mov esi,[ZVal]
07432 add ecx,[ZDelta]
07433
07434 shr esi,16
07435 mov [ZVal],ecx
07436
07437 mov ecx,pZBufferPtr
07438
07439 cmp si,word ptr[ecx+12]
07440 jle Skip3
07441
07442 mov [edi+12],ebp
07443 mov word ptr[ecx+12],si
07444 mov word ptr[ecx+14],si
07445
07446 Skip3:
07447 mov ecx,edx
07448 mov esi,pTex
07449
07450 add ebx,dword ptr[DeltaU]
07451 and ecx,[GHMaskShifted16]
07452
07453 and ebx,[GWMaskShifted]
07454 xor eax,0
07455
07456 add ecx,ebx
07457
07458 shr ecx,16
07459 add edx,dword ptr[DeltaV]
07460
07461 rol eax,16
07462 mov ax,word ptr[2*ecx+esi]
07463
07464 mov ecx,edx
07465 xor eax,0
07466
07467 and ecx,[GHMaskShifted16]
07468 mov esi,eax
07469
07470 mov ebp,eax
07471 and esi,REDMASK2
07472
07473 and ebp,GREENMASK2
07474 mov dword ptr[Red],esi
07475
07476 mov dword ptr[Green],ebp
07477 add ebx,dword ptr[DeltaU]
07479
07480
07481 fild qword ptr[Red] ; r LB LG LR
07482
07483 mov ebp,eax
07484
07485 fmul st,st(3) ; R LB LG LR
07486 fild qword ptr[Green] ; g R LB LG LR
07487
07488 and ebp,BLUEMASK
07489 and ebx,[GWMaskShifted]
07490
07491 mov dword ptr[Blue],ebp
07492
07493 fmul st,st(3) ; G R LB LG LR
07494 fild [Blue] ; b G R LB LG LR
07495 fmul st,st(3) ; B G R LB LG LR
07496 fxch st(2) ; R G B LB LG LR
07497 fadd qword ptr[Magic] ; Rk G B LB LG LR
07498 fxch st(1) ; G Rk B LB LG LR
07499 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07500 fxch st(2) ; B Rk Gk LB LG LR
07501 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07502 fxch st(1) ; Rk Bk Gk LB LG LR
07503 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07504 fstp qword ptr[Bucket2] ; Gk LB LG LR
07505
07506 mov eax,dword ptr[Bucket]
07507 mov ebp,dword ptr[Bucket2]
07508
07509 fstp qword ptr[Bucket] ; LB LG LR
07510 fxch st(1)
07511 fadd qword ptr[GreenDelta]
07512 fxch st(1)
07513 fadd qword ptr[BlueDelta]
07514 fxch st(2)
07515 fadd qword ptr[RedDelta]
07516 fxch st(2)
07517
07518 and eax,REDMASK2
07519 and ebp,BLUEMASK
07520
07521 mov esi,dword ptr[Bucket]
07522 or ebp,eax
07523
07524 add ecx,ebx
07525 and esi,GREENMASK2
07526
07527 shr ecx,16
07528 or ebp,esi
07529
07530 xor eax,0
07531 mov esi,pTex
07532
07533 rol ebp,16
07534 add edx,dword ptr[DeltaV]
07535
07536 mov ax,word ptr[2*ecx+esi]
07537 mov ecx,[ZVal]
07538
07539 mov esi,[ZVal]
07540 add ecx,[ZDelta]
07541
07542 shr esi,16
07543 mov [ZVal],ecx
07544
07545 mov ecx,pZBufferPtr
07546
07547 cmp si,word ptr[ecx+16]
07548 jle Skip4
07549
07550 mov [edi+16],ebp
07551 mov word ptr[ecx+16],si
07552 mov word ptr[ecx+18],si
07553
07554 Skip4:
07555 mov ecx,edx
07556 mov esi,pTex
07557
07558 add ebx,dword ptr[DeltaU]
07559 and ecx,[GHMaskShifted16]
07560
07561 and ebx,[GWMaskShifted]
07562 xor eax,0
07563
07564 add ecx,ebx
07565
07566 shr ecx,16
07567 add edx,dword ptr[DeltaV]
07568
07569 rol eax,16
07570 mov ax,word ptr[2*ecx+esi]
07571
07572 mov ecx,edx
07573 xor eax,0
07574
07575 and ecx,[GHMaskShifted16]
07576 mov esi,eax
07577
07578 mov ebp,eax
07579 and esi,REDMASK2
07580
07581 and ebp,GREENMASK2
07582 mov dword ptr[Red],esi
07583
07584 mov dword ptr[Green],ebp
07585 add ebx,dword ptr[DeltaU]
07587
07588
07589 fild qword ptr[Red] ; r LB LG LR
07590
07591 mov ebp,eax
07592
07593 fmul st,st(3) ; R LB LG LR
07594 fild qword ptr[Green] ; g R LB LG LR
07595
07596 and ebp,BLUEMASK
07597 and ebx,[GWMaskShifted]
07598
07599 mov dword ptr[Blue],ebp
07600
07601 fmul st,st(3) ; G R LB LG LR
07602 fild [Blue] ; b G R LB LG LR
07603 fmul st,st(3) ; B G R LB LG LR
07604 fxch st(2) ; R G B LB LG LR
07605 fadd qword ptr[Magic] ; Rk G B LB LG LR
07606 fxch st(1) ; G Rk B LB LG LR
07607 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07608 fxch st(2) ; B Rk Gk LB LG LR
07609 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07610 fxch st(1) ; Rk Bk Gk LB LG LR
07611 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07612 fstp qword ptr[Bucket2] ; Gk LB LG LR
07613
07614 mov eax,dword ptr[Bucket]
07615 mov ebp,dword ptr[Bucket2]
07616
07617 fstp qword ptr[Bucket] ; LB LG LR
07618 fxch st(1)
07619 fadd qword ptr[GreenDelta]
07620 fxch st(1)
07621 fadd qword ptr[BlueDelta]
07622 fxch st(2)
07623 fadd qword ptr[RedDelta]
07624 fxch st(2)
07625
07626 and eax,REDMASK2
07627 and ebp,BLUEMASK
07628
07629 mov esi,dword ptr[Bucket]
07630 or ebp,eax
07631
07632 add ecx,ebx
07633 and esi,GREENMASK2
07634
07635 shr ecx,16
07636 or ebp,esi
07637
07638 xor eax,0
07639 mov esi,pTex
07640
07641 rol ebp,16
07642 add edx,dword ptr[DeltaV]
07643
07644 mov ax,word ptr[2*ecx+esi]
07645 mov ecx,[ZVal]
07646
07647 mov esi,[ZVal]
07648 add ecx,[ZDelta]
07649
07650 shr esi,16
07651 mov [ZVal],ecx
07652
07653 mov ecx,pZBufferPtr
07654
07655 cmp si,word ptr[ecx+20]
07656 jle Skip5
07657
07658 mov [edi+20],ebp
07659 mov word ptr[ecx+20],si
07660 mov word ptr[ecx+22],si
07661
07662 Skip5:
07663 mov ecx,edx
07664 mov esi,pTex
07665
07666 add ebx,dword ptr[DeltaU]
07667 and ecx,[GHMaskShifted16]
07668
07669 and ebx,[GWMaskShifted]
07670 xor eax,0
07671
07672 add ecx,ebx
07673
07674 shr ecx,16
07675 add edx,dword ptr[DeltaV]
07676
07677 rol eax,16
07678 mov ax,word ptr[2*ecx+esi]
07679
07680 mov ecx,edx
07681 xor eax,0
07682
07683 and ecx,[GHMaskShifted16]
07684 mov esi,eax
07685
07686 mov ebp,eax
07687 and esi,REDMASK2
07688
07689 and ebp,GREENMASK2
07690 mov dword ptr[Red],esi
07691
07692 mov dword ptr[Green],ebp
07693 add ebx,dword ptr[DeltaU]
07695
07696
07697 fild qword ptr[Red] ; r LB LG LR
07698
07699 mov ebp,eax
07700
07701 fmul st,st(3) ; R LB LG LR
07702 fild qword ptr[Green] ; g R LB LG LR
07703
07704 and ebp,BLUEMASK
07705 and ebx,[GWMaskShifted]
07706
07707 mov dword ptr[Blue],ebp
07708
07709 fmul st,st(3) ; G R LB LG LR
07710 fild [Blue] ; b G R LB LG LR
07711 fmul st,st(3) ; B G R LB LG LR
07712 fxch st(2) ; R G B LB LG LR
07713 fadd qword ptr[Magic] ; Rk G B LB LG LR
07714 fxch st(1) ; G Rk B LB LG LR
07715 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07716 fxch st(2) ; B Rk Gk LB LG LR
07717 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07718 fxch st(1) ; Rk Bk Gk LB LG LR
07719 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07720 fstp qword ptr[Bucket2] ; Gk LB LG LR
07721
07722 mov eax,dword ptr[Bucket]
07723 mov ebp,dword ptr[Bucket2]
07724
07725 fstp qword ptr[Bucket] ; LB LG LR
07726 fxch st(1)
07727 fadd qword ptr[GreenDelta]
07728 fxch st(1)
07729 fadd qword ptr[BlueDelta]
07730 fxch st(2)
07731 fadd qword ptr[RedDelta]
07732 fxch st(2)
07733
07734 and eax,REDMASK2
07735 and ebp,BLUEMASK
07736
07737 mov esi,dword ptr[Bucket]
07738 or ebp,eax
07739
07740 add ecx,ebx
07741 and esi,GREENMASK2
07742
07743 shr ecx,16
07744 or ebp,esi
07745
07746 xor eax,0
07747 mov esi,pTex
07748
07749 rol ebp,16
07750 add edx,dword ptr[DeltaV]
07751
07752 mov ax,word ptr[2*ecx+esi]
07753 mov ecx,[ZVal]
07754
07755 mov esi,[ZVal]
07756 add ecx,[ZDelta]
07757
07758 shr esi,16
07759 mov [ZVal],ecx
07760
07761 mov ecx,pZBufferPtr
07762
07763 cmp si,word ptr[ecx+24]
07764 jle Skip6
07765
07766 mov [edi+24],ebp
07767 mov word ptr[ecx+24],si
07768 mov word ptr[ecx+26],si
07769
07770 Skip6:
07771 mov ecx,edx
07772 mov esi,pTex
07773
07774 add ebx,dword ptr[DeltaU]
07775 and ecx,[GHMaskShifted16]
07776
07777 and ebx,[GWMaskShifted]
07778 xor eax,0
07779
07780 add ecx,ebx
07781
07782 shr ecx,16
07783 add edx,dword ptr[DeltaV]
07784
07785 rol eax,16
07786 mov ax,word ptr[2*ecx+esi]
07787
07788 mov ecx,edx
07789 xor eax,0
07790
07791 and ecx,[GHMaskShifted16]
07792 mov esi,eax
07793
07794 mov ebp,eax
07795 and esi,REDMASK2
07796
07797 and ebp,GREENMASK2
07798 mov dword ptr[Red],esi
07799
07800 mov dword ptr[Green],ebp
07801 add ebx,dword ptr[DeltaU]
07803 fild qword ptr[Red] ; r LB LG LR
07804
07805 mov ebp,eax
07806
07807 fmul st,st(3) ; R LB LG LR
07808 fild qword ptr[Green] ; g R LB LG LR
07809
07810 and ebp,BLUEMASK
07811 and ebx,[GWMaskShifted]
07812
07813 mov dword ptr[Blue],ebp
07814
07815 fmul st,st(3) ; G R LB LG LR
07816 fild [Blue] ; b G R LB LG LR
07817 fmul st,st(3) ; B G R LB LG LR
07818 fxch st(2) ; R G B LB LG LR
07819 fadd qword ptr[Magic] ; Rk G B LB LG LR
07820 fxch st(1) ; G Rk B LB LG LR
07821 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
07822 fxch st(2) ; B Rk Gk LB LG LR
07823 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
07824 fxch st(1) ; Rk Bk Gk LB LG LR
07825 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
07826 fstp qword ptr[Bucket2] ; Gk LB LG LR
07827
07828 mov eax,dword ptr[Bucket]
07829 mov ebp,dword ptr[Bucket2]
07830
07831 fstp qword ptr[Bucket] ; LB LG LR
07832 fadd qword ptr[BlueDelta]
07833 fistp dword ptr[BB1]
07834 fadd qword ptr[GreenDelta]
07835 fistp dword ptr[GG1]
07836 fadd qword ptr[RedDelta]
07837 fistp dword ptr[RR1]
07838
07839 and eax,REDMASK2
07840 and ebp,BLUEMASK
07841
07842 mov esi,dword ptr[Bucket]
07843 or ebp,eax
07844
07845 fstp dword ptr[Bucket]
07846 fstp dword ptr[Bucket2]
07847 fstp dword ptr[Bucket]
07848
07849 and esi,GREENMASK2
07850
07851 fld dword ptr[FTemp5]
07852 fld dword ptr[FTemp4]
07853
07854 or ebp,esi
07855
07856 fld dword ptr[FTemp3]
07857 fld dword ptr[FTemp2]
07858
07859 rol ebp,16
07860
07861 fld dword ptr[FTemp1]
07862 fld dword ptr[FTemp0]
07863
07864 mov ecx,[ZVal]
07865
07866 mov esi,[ZVal]
07867 add ecx,[ZDelta]
07868
07869 shr esi,16
07870 mov [ZVal],ecx
07871
07872 mov ecx,pZBufferPtr
07873
07874 cmp si,word ptr[ecx+28]
07875 jle Skip7
07876
07877 mov [edi+28],ebp
07878 mov word ptr[ecx+28],si
07879 mov word ptr[ecx+30],si
07880
07881 Skip7:
07882 pop ebp
07883
07884
07885 ; get corrected right side deltas ; st0 st1 st2 st3 st4 st5 st6 st7
07886 ; ZR UZR ZRi VZR UL VL
07887 fld st ; ZR ZR UZR ZRi VZR UL VL
07888 fmul st,st(4) ; VR ZR UZR ZRi VZR UL VL
07889 fxch st(1) ; ZR VR UZR ZRi VZR UL VL
07890 fmul st,st(2) ; UR VR UZR ZRi VZR UL VL
07891
07892 add edi,32 ; move screen pointer to start of next aspan
07893 add [pZBufferPtr],32
07894 dec [NumASpans] ; dec num affine spans
07895 jnz SpanLoop16
07896
07897 HandleLeftoverPixels16:
07898
07899 mov esi,[pTex]
07900
07901
07902 cmp [RemainingCount],0
07903 jz FPUReturn16
07904
07905 //need one more stack spot
07906 fstp dword ptr[FloatTemp] ; VR UZR ZRi VZR UL VL
07907 fld st(4) ; UL VR UZR ZRi VZR UL VL
07908 fmul [GLMapMulU] ; ULL VR UZR ZRi VZR UL VL
07909 fld st(5) ; UL ULL VR UZR ZRi VZR UL VL
07910 fadd qword ptr[MipMagic] ; ULk ULL VR UZR ZRi VZR UL VL
07911 fxch st(1) ; ULL ULk VR UZR ZRi VZR UL VL
07912 fadd qword ptr[MipMagic] ; ULLk ULk VR UZR ZRi VZR UL VL
07913 fxch st(1) ; ULk ULLk VR UZR ZRi VZR UL VL
07914 fstp qword ptr[Bucket] ; ULLk VR UZR ZRi VZR UL VL
07915 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
07916
07917 mov ebx,dword ptr[Bucket]
07918 mov eax,dword ptr[Bucket2]
07919
07920 fld st(5) ; VL VR UZR ZRi VZR UL VL
07921 fmul [GLMapMulV] ; VLL VR UZR ZRi VZR UL VL
07922
07923 add ebx,dword ptr[UAdjust]
07924 add eax,dword ptr[UAdjustL]
07925
07926 mov [U1],ebx
07927 mov [UFixed],eax
07928
07929 fld st(6) ; VL VLL VR UZR ZRi VZR UL VL
07930 fadd qword ptr[MipMagic] ; VLk VLL VR UZR ZRi VZR UL VL
07931 fxch st(1) ; VLL VLk VR UZR ZRi VZR UL VL
07932 fadd qword ptr[MipMagic] ; VLLk VLk VR UZR ZRi VZR UL VL
07933 fxch st(1) ; VLk VLLk VR UZR ZRi VZR UL VL
07934 fstp qword ptr[Bucket] ; VLLk VR UZR ZRi VZR UL VL
07935 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
07936
07937 mov ebx,dword ptr[Bucket]
07938 mov eax,dword ptr[Bucket2]
07939
07940 fld dword ptr[FloatTemp] ; UR VR UZR ZRi VZR UL dV
07941
07942 add ebx,dword ptr[VAdjust]
07943 add eax,dword ptr[VAdjustL]
07944
07945 mov [V1],ebx
07946 mov [VFixed],eax
07947
07948 dec [RemainingCount]
07949 jz OnePixelSpan16
07950
07951
07952 //must get rid of this wasted time
07953 fstp [FloatTemp] ; inv. inv. inv. inv. UL VL
07954 fstp [FloatTemp] ; inv. inv. inv. UL VL
07955 fstp [FloatTemp] ; inv. inv. UL VL
07956 fstp [FloatTemp] ; inv. UL VL
07957 fstp [FloatTemp] ; UL VL
07958 fild [y] ; y UL VL
07959 fild [x2] ; xr y UL VL
07960
07961 fld [UDivZStepY] ; UZdY xr y UL VL
07962 fld [UDivZStepX] ; UZdX UZdY xr y UL VL
07963 fmul st,st(2) ; UZX UZdY xr y UL VL
07964 fld [VDivZStepY] ; VZdY UZX UZdY xr y UL VL
07965 fld [VDivZStepX] ; VZdX VZdY UZX UZdY xr y UL VL
07966 fxch st(3) ; UZdy VZdY UZX VZdX xr y UL VL
07967 fmul st,st(5) ; UZY VZdY UZX VZdX xr y UL VL
07968 fxch st(2) ; UZX VZdY UZY VZdX xr y UL VL
07969 fadd [UDivZOrigin] ; UZXS VZdY UZY VZdX xr y UL VL
07970 fxch st(3) ; VZdX VZdY UZY UZXS xr y UL VL
07971 fmul st,st(4) ; VZX VZdY UZY UZXS xr y UL VL
07972 fxch st(2) ; UZY VZdY VZX UZXS xr y UL VL
07973 faddp st(3),st ; VZdY VZX UZ xr y UL VL
07974 fmul st,st(4) ; VZY VZX UZ xr y UL VL
07975 fxch st(1) ; VZX VZY UZ xr y UL VL
07976 fadd [VDivZOrigin] ; VZXS VZY UZ xr y UL VL
07977 fld [ZiStepX] ; ZdX VZXS VZY UZ xr y UL VL
07978 fmulp st(4),st ; VZXS VZY UZ ZX y UL VL
07979 faddp st(1),st ; VZ UZ ZX y UL VL
07980 fld [ZiStepY] ; ZdY VZ UZ ZX y UL VL
07981 fmulp st(4),st ; VZ UZ ZX ZY UL VL
07982 fxch st(2) ; ZX UZ VZ ZY UL VL
07983 fadd [ZiOrigin] ; ZXS UZ VZ ZY UL VL
07984
07985 faddp st(3),st ; UZ VZ Zi UL VL
07986 fld1 ; 1 UZ VZ Zi UL VL
07987 fdiv st,st(3) ; ZR UZ VZ Zi UL VL
07988
07989 fld st ; ZR ZR UZ VZ Zi UL VL
07990 fmul st,st(3) ; VR ZR UZ VZ Zi UL VL
07991 fxch st(1) ; ZR VR UZ VZ Zi UL VL
07992 fmul st,st(2) ; UR VR UZ VZ Zi UL VL
07993
07994 //lazy idiv below... should 1/int mul mul
07995
07996 ; calculate deltas ; st0 st1 st2 st3 st4 st5 st6 st7
07997 fsubr st(5),st ; UR VR inv. inv. inv. dU VL
07998 fxch st(1) ; VR UR inv. inv. inv. dU VL
07999 fsubr st(6),st ; VR UR inv. inv. inv. dU dV
08000 fxch st(6) ; dV UR inv. inv. inv. dU VR
08001 fidiv dword ptr[RemainingCount];dv UR inv. inv. inv. dU VR
08002 fadd qword ptr[MipMagic] ; dvk UR inv. inv. inv. dU VR
08003 fxch st(5) ; dU UR inv. inv. inv. dvk VR
08004 fidiv dword ptr[RemainingCount];du UR inv. inv. inv. dvk VR
08005 fadd qword ptr[MipMagic] ; duk UR inv. inv. inv. dvk VR
08006 fxch st(5) ; dvk UR inv. inv. inv. duk VR
08007 fstp qword ptr[DeltaV] ; UR inv. inv. inv. duk VR
08008 fxch st(4) ; duk inv. inv. inv. UR VR
08009 fstp qword ptr[DeltaU] ; inv. inv. inv. UR VR
08010 fld st(1) ; inv. inv. inv. inv. UR VR
08011 fld st(2) ; inv. inv. inv. inv. inv. UR VR
08012
08013 OnePixelSpan16:
08014 // Clamp U/V
08015 mov ebx,[UFixed]
08016 cmp ebx,MaxU
08017 jle TryClampU116
08018 mov ecx,MaxU
08019 mov dword ptr[UFixed],ecx
08020 jmp NoClampU116
08021
08022 TryClampU116:
08023 cmp ebx,0
08024 jge NoClampU116
08025 mov dword ptr[UFixed],0
08026 NoClampU116:
08027 mov eax,[VFixed]
08028 cmp eax,MaxV
08029 jle TryClampV116
08030 mov ecx,MaxV
08031 mov dword ptr[VFixed],ecx
08032 jmp NoClampV116
08033
08034 TryClampV116:
08035 cmp eax,0
08036 jge NoClampV116
08037 mov dword ptr[VFixed],0
08038
08039 NoClampV116:
08040
08041 fstp [FTemp0]
08042 fstp [FTemp1]
08043 fstp [FTemp2]
08044 fstp [FTemp3]
08045 fstp [FTemp4]
08046 fstp [FTemp5]
08047
08048 mov ebx,dword ptr[U1]
08049 mov edx,dword ptr[V1]
08050
08051 fild [RR1] ; LR
08052 fild [GG1] ; LG LR
08053 fild [BB1] ; LB LG LR
08054
08055 mov ecx,[VShift]
08056 add edx,dword ptr[VAdjust2]
08057
08058 add ebx,dword ptr[UAdjust2]
08059 mov eax,dword ptr[DeltaV]
08060
08061 shl eax,cl
08062 mov esi,pTex
08063
08064 shl edx,cl
08065 mov dword ptr[DeltaV],eax
08066
08067 mov eax,[ZDelta]
08068 mov ecx,[ZVal]
08069
08070 sar eax,1
08071 push ebp
08072
08073 mov [ZDelta],eax
08074
08075 LeftoverLoop16:
08076 mov eax,edx
08077 and ebx,[GWMaskShifted]
08078
08079 and eax,[GHMaskShifted16]
08080
08081 add eax,ebx
08082 add ebx,dword ptr[DeltaU]
08083
08084 shr eax,16
08085 add edi,2
08086
08087 mov ax,word ptr[2*eax+esi]
08088 add edx,dword ptr[DeltaV]
08089
08090 xor eax,0
08091
08092 mov esi,eax
08093 mov ebp,eax
08094
08095 and esi,REDMASK2
08096 and ebp,GREENMASK2
08097
08098 mov dword ptr[Red],esi
08099 mov dword ptr[Green],ebp
08100
08101 fild qword ptr[Red] ; r LB LG LR
08102
08103 mov ebp,eax
08104
08105 fmul st,st(3) ; R LB LG LR
08106 fild qword ptr[Green] ; g R LB LG LR
08107
08108 and ebp,BLUEMASK
08109
08110 mov dword ptr[Blue],ebp
08111
08112 fmul st,st(3) ; G R LB LG LR
08113 fild [Blue] ; b G R LB LG LR
08114 fmul st,st(3) ; B G R LB LG LR
08115 fxch st(2) ; R G B LB LG LR
08116 fadd qword ptr[Magic] ; Rk G B LB LG LR
08117 fxch st(1) ; G Rk B LB LG LR
08118 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
08119 fxch st(2) ; B Rk Gk LB LG LR
08120 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
08121 fxch st(1) ; Rk Bk Gk LB LG LR
08122 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
08123 fstp qword ptr[Bucket2] ; Gk LB LG LR
08124
08125 mov eax,dword ptr[Bucket]
08126 mov ebp,dword ptr[Bucket2]
08127
08128 fstp qword ptr[Bucket] ; LB LG LR
08129
08130 and eax,REDMASK2
08131 and ebp,BLUEMASK
08132
08133 mov esi,dword ptr[Bucket]
08134 or ebp,eax
08135
08136 and esi,GREENMASK2
08137 mov eax,ecx
08138
08139 or ebp,esi
08140
08141 shr eax,16
08142 mov esi,pZBufferPtr
08143
08144 cmp ax,word ptr[esi]
08145 jle SkipLeftOver
08146
08147 mov word ptr[edi-2],bp
08148 mov word ptr[esi],ax
08149
08150 SkipLeftOver:
08151 add ecx,[ZDelta]
08152 mov esi,pTex
08153
08154 add pZBufferPtr,2
08155
08156 dec [RemainingCount]
08157 jge LeftoverLoop16
08158
08159 pop ebp
08160
08161
08162 FPUReturn16:
08163 ffree st(0)
08164 ffree st(1)
08165 ffree st(2)
08166 ffree st(3)
08167 ffree st(4)
08168 ffree st(5)
08169 ffree st(6)
08170
08171 Return16:
08172 pop edi
08173 pop esi
08174 pop ecx
08175 pop ebx
08176 }
08177 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 11017 of file x86span555.c. References B, BB1, Blue, BlueDelta, BLUEMASK, Bucket, Bucket2, CKeyTest, DeltaU, DeltaV, Dest, FloatTemp, FTemp0, FTemp1, FTemp2, FTemp3, FTemp4, FTemp5, G, GBitPtr16, GG1, GHMaskShifted16, GLMapMulU, GLMapMulV, Green, GreenDelta, GREENMASK2, GWMaskShifted, Magic, MaxU, MaxV, MipMagic, MipMagic2, NumASpans, or, pointer, pTex, pZBufferPtr, R, r, Red, RedDelta, REDMASK2, RemainingCount, RR1, TDest, Two, U1, UAdjust, UAdjust2, UAdjustL, UDivZ16StepX, UDivZOrigin, UDivZStepX, UDivZStepY, UFixed, V1, VAdjust, VAdjust2, VAdjustL, VDivZ16StepX, VDivZOrigin, VDivZStepX, VDivZStepY, VFixed, VShift, widTemp, y, ZBufferPrec, ZDelta, Zi, Zi16StepX, ZiOrigin, ZiStepX, ZiStepY, and ZVal. Referenced by RenderWorldPoly().
11018 {
11019 RR1 =r1;
11020 GG1 =g1;
11021 BB1 =b1;
11022 TDest =Dest;
11023 _asm
11024 {
11025 push ebx
11026 push ecx
11027 push esi
11028 push edi
11029
11030 mov eax,x1
11031 mov ecx,x2
11032 sub ecx,eax
11033 jle Return16
11034
11035 mov edi,[GBitPtr16]
11036 mov pTex,edi
11037
11038 fild [y] ; y
11039 mov [widTemp],ecx
11040
11041 fild [x1] ; x y
11042 fild [widTemp]
11043
11044 fld1
11045 fdivrp st(1),st
11046
11047 mov esi,x1
11048 mov edi,[TDest]
11049
11050 shl esi,1
11051 mov eax,ecx
11052
11053 add edi,esi
11054 add pZBufferPtr,esi
11055
11056 mov eax,ecx
11057 shr ecx,4
11058 and eax,15
11059 _emit 75h
11060 _emit 06h
11061 dec ecx
11062 mov eax,16
11063
11064 mov [NumASpans],ecx
11065 mov [RemainingCount],eax
11066
11067 fild [r2]
11068 fisub [r1]
11069 fild [g2]
11070 fisub [g1]
11071 fild [b2]
11072 fisub [b1]
11073 fxch st(2)
11074 fmul st,st(3)
11075 fxch st(1)
11076 fmul st,st(3)
11077 fxch st(2)
11078 fmul st,st(3)
11079 frndint
11080 fstp qword ptr[BlueDelta]
11081 frndint
11082 fstp qword ptr[RedDelta]
11083 frndint
11084 fstp qword ptr[GreenDelta]
11085 fstp qword ptr[FTemp0]
11086
11087
11088 //decoder won't keep up with these huge instructions
11089 //need to find some int instructions to cram in here somewhere
11090 fld [UDivZStepY] ; UZdY x y
11091 fld [UDivZStepX] ; UZdX UZdY x y
11092 fmul st,st(2) ; UZX UZdY x y
11093 fld [VDivZStepY] ; VZdY UZX UZdY x y
11094 fld [VDivZStepX] ; VZdX VZdY UZX UZdY x y
11095 fxch st(3) ; UZdy VZdY UZX VZdX x y
11096 fmul st,st(5) ; UZY VZdY UZX VZdX x y
11097 fxch st(2) ; UZX VZdY UZY VZdX x y
11098 fadd [UDivZOrigin] ; UZXS VZdY UZY VZdX x y
11099 fxch st(3) ; VZdX VZdY UZY UZXS x y
11100 fmul st,st(4) ; VZX VZdY UZY UZXS x y
11101 fxch st(2) ; UZY VZdY VZX UZXS x y
11102 faddp st(3),st ; VZdY VZX UZ x y
11103 fmul st,st(4) ; VZY VZX UZ x y
11104 fxch st(1) ; VZX VZY UZ x y
11105 fadd [VDivZOrigin] ; VZXS VZY UZ x y
11106 fld [ZiStepX] ; ZdX VZXS VZY UZ x y
11107
11108 //zbuffer step action
11109 fld [ZiStepX]
11110 fmul dword ptr[ZBufferPrec]
11111 fmul dword ptr[Two]
11112 fistp dword ptr[ZDelta]
11113
11114 fmulp st(4),st ; VZXS VZY UZ ZX y
11115 faddp st(1),st ; VZ UZ ZX y
11116 fld [ZiStepY] ; ZdY VZ UZ ZX y
11117 fmulp st(4),st ; VZ UZ ZX ZY
11118 fxch st(2) ; ZX UZ VZ ZY
11119 fadd [ZiOrigin] ; ZXS UZ VZ ZY
11120
11121 //room for two cycles of int instructions here
11122
11123 faddp st(3),st ; UZ VZ Zi
11124 fld1 ; 1 UZ VZ Zi
11125 fdiv st,st(3) ; ZL UZ VZ Zi
11126
11127 //room for 18 cycles of int instructions here
11128
11129 fld st ; ZL ZL UZ VZ Zi
11130 fmul st,st(3) ; VL ZL UZ VZ Zi
11131 fxch st(4) ; Zi ZL UZ VZ VL
11132
11133 //zbuffer action
11134 fld st
11135 fmul dword ptr[ZBufferPrec]
11136 fistp dword ptr[ZVal]
11137
11138 fadd [Zi16StepX] ; ZRi ZL UZ VZ VL
11139 fxch st(1) ; ZL ZRi UZ VZ VL
11140 fmul st,st(2) ; UL ZRi UZ VZ VL
11141 fxch st(3) ; VZ ZRi UZ UL VL
11142 fadd [VDivZ16StepX] ; VZR ZRi UZ UL VL
11143 fxch st(2) ; UZ ZRi VZR UL VL
11144 fadd [UDivZ16StepX] ; UZR ZRi VZR UL VL
11145 fld1 ; 1 UZR ZRi VZR UL VL
11146 fdiv st,st(2) ; ZR UZR ZRi VZR UL VL
11147
11148 //room for 18 cycles of int stuff here
11149
11150 fld st ; ZR ZR UZR ZRi VZR UL VL
11151 fmul st,st(4) ; VR ZR UZR ZRi VZR UL VL
11152 fxch st(1) ; ZR VR UZR ZRi VZR UL VL
11153 //fmul stall one cycle
11154 fmul st,st(2) ; UR VR UZR ZRi VZR UL VL
11155
11156 test ecx,ecx
11157 jz HandleLeftoverPixels16
11158
11159 SpanLoop16:
11160 //need one more stack spot
11161 fstp dword ptr[FloatTemp] ; VR UZR ZRi VZR UL VL
11162 fld st(4) ; UL VR UZR ZRi VZR UL VL
11163 fmul [GLMapMulU] ; ULL VR UZR ZRi VZR UL VL
11164 fld st(5) ; UL ULL VR UZR ZRi VZR UL VL
11165 fadd qword ptr[MipMagic] ; ULk ULL VR UZR ZRi VZR UL VL
11166 fxch st(1) ; ULL ULk VR UZR ZRi VZR UL VL
11167 fadd qword ptr[MipMagic] ; ULLk ULk VR UZR ZRi VZR UL VL
11168 fxch st(1) ; ULk ULLk VR UZR ZRi VZR UL VL
11169 fstp qword ptr[Bucket] ; ULLk VR UZR ZRi VZR UL VL
11170 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
11171
11172 mov ebx,dword ptr[Bucket]
11173 mov eax,dword ptr[Bucket2]
11174
11175 fld st(5) ; VL VR UZR ZRi VZR UL VL
11176 fmul [GLMapMulV] ; VLL VR UZR ZRi VZR UL VL
11177
11178 add ebx,dword ptr[UAdjust]
11179 add eax,dword ptr[UAdjustL]
11180
11181 mov [U1],ebx
11182 mov [UFixed],eax
11183
11184 fld st(6) ; VL VLL VR UZR ZRi VZR UL VL
11185 fadd qword ptr[MipMagic] ; VLk VLL VR UZR ZRi VZR UL VL
11186 fxch st(1) ; VLL VLk VR UZR ZRi VZR UL VL
11187 fadd qword ptr[MipMagic] ; VLLk VLk VR UZR ZRi VZR UL VL
11188 fxch st(1) ; VLk VLLk VR UZR ZRi VZR UL VL
11189 fstp qword ptr[Bucket] ; VLLk VR UZR ZRi VZR UL VL
11190 fstp qword ptr[Bucket2] ; VR UZR ZRi VZR UL VL
11191 fsubr st(5),st ; VR UZR ZRi VZR UL dV
11192
11193 mov ebx,dword ptr[Bucket]
11194 mov eax,dword ptr[Bucket2]
11195
11196 fld dword ptr[FloatTemp] ; UR VR UZR ZRi VZR UL dV
11197
11198 add ebx,dword ptr[VAdjust]
11199 add eax,dword ptr[VAdjustL]
11200
11201 mov [V1],ebx
11202 mov [VFixed],eax
11203
11204 fsubr st(5),st ; UR VR UZR ZRi VZR dU dV
11205 fxch st(6) ; dV VR UZR ZRi VZR dU UR
11206 fadd qword ptr[MipMagic2] ; dVk VR UZR ZRi VZR dU UR
11207 fxch st(5) ; dU VR UZR ZRi VZR dVk UR
11208 fadd qword ptr[MipMagic2] ; dUk VR UZR ZRi VZR dVk UR
11209 fxch st(5) ; dVk VR UZR ZRi VZR dUk UR
11210 fstp qword ptr[DeltaV] ; VR UZR ZRi VZR dUk UR
11211 fxch st(5) ; UR UZR ZRi VZR dUk VR
11212 //gotta do this to get em lined back up right
11213 fxch st(4) ; dUk UZR ZRi VZR UR VR
11214 fstp qword ptr[DeltaU] ; UZR ZRi VZR UR VR
11215
11216 //right becomes left ; UZL ZLi VZL UL VL
11217 fadd [UDivZ16StepX] ; UZR ZLi VZL UL VL
11218 fxch st(1) ; ZLi UZR VZL UL VL
11219 fadd [Zi16StepX] ; ZRi UZR VZL UL VL
11220 fxch st(2) ; VZL UZR ZRi UL VL
11221 fadd [VDivZ16StepX] ; VZR UZR ZRi UL VL
11222 fxch st(2) ; ZRi UZR VZR UL VL
11223 fxch st(1) ; UZR ZRi VZR UL VL
11224 fld1 ; 1 UZR ZRi VZR UL VL
11225 fdiv st,st(2) ; ZR UZR ZRi VZR UL VL
11226
11227 // Clamp U/V
11228 mov ebx,[UFixed]
11229 cmp ebx,MaxU
11230 jle TryClampU016
11231 mov ecx,MaxU
11232 mov dword ptr[UFixed],ecx
11233 jmp NoClampU016
11234
11235 TryClampU016:
11236 cmp ebx,0
11237 jge NoClampU016
11238 mov dword ptr[UFixed],0
11239 NoClampU016:
11240 mov eax,[VFixed]
11241 cmp eax,MaxV
11242 jle TryClampV016
11243 mov ecx,MaxV
11244 mov dword ptr[VFixed],ecx
11245 jmp NoClampV016
11246
11247 TryClampV016:
11248 cmp eax,0
11249 jge NoClampV016
11250 mov dword ptr[VFixed],0
11251
11252 NoClampV016:
11253
11254 fstp [FTemp0] ; UZR ZRi VZR UL VL
11255 fstp [FTemp1] ; ZRi VZR UL VL
11256 fstp [FTemp2] ; VZR UL VL
11257 fstp [FTemp3] ; UL VL
11258 fstp [FTemp4] ; VL
11259 fstp [FTemp5] ;
11260
11261
11262 fild [RR1] ; LR
11263 fild [GG1] ; LG LR
11264 fild [BB1] ; LB LG LR
11265
11266
11267 mov ebx,dword ptr[U1]
11268 mov eax,dword ptr[V1]
11269
11270 add ebx,dword ptr[UAdjust2]
11271 add eax,dword ptr[VAdjust2]
11272
11273 mov ecx,[VShift]
11274 mov dword ptr[Bucket],ebx
11275
11276 shl eax,cl
11277
11278 push ebp
11279
11280 mov dword ptr[Bucket2],eax
11281 mov ebp,dword ptr[DeltaV]
11282
11283 and eax,[GHMaskShifted16]
11284 and ebx,[GWMaskShifted]
11285
11286 shl ebp,cl
11287 add eax,ebx
11288
11289 mov edx,dword ptr[Bucket2]
11290 mov esi,pTex
11291
11292 shr eax,16
11293 mov dword ptr[DeltaV],ebp
11294
11295 mov ebx,dword ptr[Bucket]
11296
11297 mov ax,word ptr[2*eax+esi]
11298 add edx,dword ptr[DeltaV]
11299
11300 xor eax,0
11301 mov ecx,edx
11302
11303 mov ebp,eax
11304 add ebx,dword ptr[DeltaU]
11305
11306 shr ebp,1
11307 and ecx,[GHMaskShifted16]
11308
11309 rol eax,16
11310 mov [CKeyTest],ebp
11311
11312 and ebx,[GWMaskShifted]
11313
11314 xor eax,0
11315 add ecx,ebx
11316
11317 add edx,dword ptr[DeltaV]
11318 mov esi,pTex
11319
11320 shr ecx,16
11321 add ebx,dword ptr[DeltaU]
11322
11323 mov ax,word ptr[2*ecx+esi]
11324 mov ecx,edx
11325
11326 xor eax,0
11327 and ecx,[GHMaskShifted16]
11328
11329 mov esi,eax
11330 mov ebp,eax
11331
11332 and esi,REDMASK2
11333 and ebp,GREENMASK2
11334
11335 mov dword ptr[Red],esi
11336 mov dword ptr[Green],ebp
11337
11338 fild qword ptr[Red] ; r LB LG LR
11339
11340 mov ebp,eax
11341 shr eax,1
11342
11343 fmul st,st(3) ; R LB LG LR
11344 fild qword ptr[Green] ; g R LB LG LR
11345
11346 and [CKeyTest],eax
11347
11348 and ebp,BLUEMASK
11349 and ebx,[GWMaskShifted]
11350
11351 mov dword ptr[Blue],ebp
11352
11353 fmul st,st(3) ; G R LB LG LR
11354 fild [Blue] ; b G R LB LG LR
11355 fmul st,st(3) ; B G R LB LG LR
11356 fxch st(2) ; R G B LB LG LR
11357 fadd qword ptr[Magic] ; Rk G B LB LG LR
11358 fxch st(1) ; G Rk B LB LG LR
11359 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11360 fxch st(2) ; B Rk Gk LB LG LR
11361 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11362 fxch st(1) ; Rk Bk Gk LB LG LR
11363 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11364 fstp qword ptr[Bucket2] ; Gk LB LG LR
11365
11366 mov eax,dword ptr[Bucket]
11367 mov ebp,dword ptr[Bucket2]
11368
11369 fstp qword ptr[Bucket] ; LB LG LR
11370 fxch st(1)
11371 fadd qword ptr[GreenDelta]
11372 fxch st(1)
11373 fadd qword ptr[BlueDelta]
11374 fxch st(2)
11375 fadd qword ptr[RedDelta]
11376 fxch st(2)
11377
11378 and eax,REDMASK2
11379 and ebp,BLUEMASK
11380
11381 mov esi,dword ptr[Bucket]
11382 or ebp,eax
11383
11384 add ecx,ebx
11385 and esi,GREENMASK2
11386
11387 shr ecx,16
11388 or ebp,esi
11389
11390 xor eax,0
11391 mov esi,pTex
11392
11393 rol ebp,16
11394 add edx,dword ptr[DeltaV]
11395
11396 mov ax,word ptr[2*ecx+esi]
11397 mov ecx,[ZVal]
11398
11399 mov esi,[ZVal]
11400 add ecx,[ZDelta]
11401
11402 shr esi,16
11403 mov [ZVal],ecx
11404
11405 dec [CKeyTest]
11406 jl Skip0
11407
11408 mov ecx,pZBufferPtr
11409
11410 cmp si,word ptr[ecx+0]
11411 jle Skip0
11412
11413 mov [edi+0],ebp
11414 mov word ptr[ecx+0],si
11415 mov word ptr[ecx+2],si
11416
11417 Skip0:
11418 mov ecx,edx
11419
11420 mov esi,pTex
11421 xor eax,0
11422
11423 add ebx,dword ptr[DeltaU]
11424 and ecx,[GHMaskShifted16]
11425
11426 mov ebp,eax
11427 and ebx,[GWMaskShifted]
11428
11429 shr ebp,1
11430 add ecx,ebx
11431
11432 rol eax,16
11433 add edx,dword ptr[DeltaV]
11434
11435 shr ecx,16
11436 add ebx,dword ptr[DeltaU]
11437
11438 mov ax,word ptr[2*ecx+esi]
11439 mov [CKeyTest],ebp
11440
11441 mov ecx,edx
11442 xor eax,0
11443
11444 and ecx,[GHMaskShifted16]
11445 mov esi,eax
11446
11447 mov ebp,eax
11448 and esi,REDMASK2
11449
11450 and ebp,GREENMASK2
11451 mov dword ptr[Red],esi
11452
11453 mov dword ptr[Green],ebp
11455
11456
11457 fild qword ptr[Red] ; r LB LG LR
11458
11459 mov ebp,eax
11460 shr eax,1
11461
11462 fmul st,st(3) ; R LB LG LR
11463 fild qword ptr[Green] ; g R LB LG LR
11464
11465 and [CKeyTest],eax
11466
11467 and ebp,BLUEMASK
11468 and ebx,[GWMaskShifted]
11469
11470 mov dword ptr[Blue],ebp
11471
11472 fmul st,st(3) ; G R LB LG LR
11473 fild [Blue] ; b G R LB LG LR
11474 fmul st,st(3) ; B G R LB LG LR
11475 fxch st(2) ; R G B LB LG LR
11476 fadd qword ptr[Magic] ; Rk G B LB LG LR
11477 fxch st(1) ; G Rk B LB LG LR
11478 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11479 fxch st(2) ; B Rk Gk LB LG LR
11480 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11481 fxch st(1) ; Rk Bk Gk LB LG LR
11482 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11483 fstp qword ptr[Bucket2] ; Gk LB LG LR
11484
11485 mov eax,dword ptr[Bucket]
11486 mov ebp,dword ptr[Bucket2]
11487
11488 fstp qword ptr[Bucket] ; LB LG LR
11489 fxch st(1)
11490 fadd qword ptr[GreenDelta]
11491 fxch st(1)
11492 fadd qword ptr[BlueDelta]
11493 fxch st(2)
11494 fadd qword ptr[RedDelta]
11495 fxch st(2)
11496
11497 and eax,REDMASK2
11498 and ebp,BLUEMASK
11499
11500 mov esi,dword ptr[Bucket]
11501 or ebp,eax
11502
11503 add ecx,ebx
11504 and esi,GREENMASK2
11505
11506 shr ecx,16
11507 or ebp,esi
11508
11509 xor eax,0
11510 mov esi,pTex
11511
11512 rol ebp,16
11513 add edx,dword ptr[DeltaV]
11514
11515 mov ax,word ptr[2*ecx+esi]
11516 mov ecx,[ZVal]
11517
11518 mov esi,[ZVal]
11519 add ecx,[ZDelta]
11520
11521 shr esi,16
11522 mov [ZVal],ecx
11523
11524 dec [CKeyTest]
11525 jl Skip1
11526
11527 mov ecx,pZBufferPtr
11528
11529 cmp si,word ptr[ecx+4]
11530 jle Skip1
11531
11532 mov [edi+4],ebp
11533 mov word ptr[ecx+4],si
11534 mov word ptr[ecx+6],si
11535
11536 Skip1:
11537 mov ecx,edx
11538
11539 mov esi,pTex
11540 xor eax,0
11541
11542 add ebx,dword ptr[DeltaU]
11543 and ecx,[GHMaskShifted16]
11544
11545 mov ebp,eax
11546 and ebx,[GWMaskShifted]
11547
11548 shr ebp,1
11549 add ecx,ebx
11550
11551 rol eax,16
11552 add edx,dword ptr[DeltaV]
11553
11554 shr ecx,16
11555 add ebx,dword ptr[DeltaU]
11556
11557 mov ax,word ptr[2*ecx+esi]
11558 mov [CKeyTest],ebp
11559
11560 mov ecx,edx
11561 xor eax,0
11562
11563 and ecx,[GHMaskShifted16]
11564 mov esi,eax
11565
11566 mov ebp,eax
11567 and esi,REDMASK2
11568
11569 and ebp,GREENMASK2
11570 mov dword ptr[Red],esi
11571
11572 mov dword ptr[Green],ebp
11574
11575
11576 fild qword ptr[Red] ; r LB LG LR
11577
11578 mov ebp,eax
11579 shr eax,1
11580
11581 fmul st,st(3) ; R LB LG LR
11582 fild qword ptr[Green] ; g R LB LG LR
11583
11584 and [CKeyTest],eax
11585
11586 and ebp,BLUEMASK
11587 and ebx,[GWMaskShifted]
11588
11589 mov dword ptr[Blue],ebp
11590
11591 fmul st,st(3) ; G R LB LG LR
11592 fild [Blue] ; b G R LB LG LR
11593 fmul st,st(3) ; B G R LB LG LR
11594 fxch st(2) ; R G B LB LG LR
11595 fadd qword ptr[Magic] ; Rk G B LB LG LR
11596 fxch st(1) ; G Rk B LB LG LR
11597 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11598 fxch st(2) ; B Rk Gk LB LG LR
11599 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11600 fxch st(1) ; Rk Bk Gk LB LG LR
11601 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11602 fstp qword ptr[Bucket2] ; Gk LB LG LR
11603
11604 mov eax,dword ptr[Bucket]
11605 mov ebp,dword ptr[Bucket2]
11606
11607 fstp qword ptr[Bucket] ; LB LG LR
11608 fxch st(1)
11609 fadd qword ptr[GreenDelta]
11610 fxch st(1)
11611 fadd qword ptr[BlueDelta]
11612 fxch st(2)
11613 fadd qword ptr[RedDelta]
11614 fxch st(2)
11615
11616 and eax,REDMASK2
11617 and ebp,BLUEMASK
11618
11619 mov esi,dword ptr[Bucket]
11620 or ebp,eax
11621
11622 add ecx,ebx
11623 and esi,GREENMASK2
11624
11625 shr ecx,16
11626 or ebp,esi
11627
11628 xor eax,0
11629 mov esi,pTex
11630
11631 rol ebp,16
11632 add edx,dword ptr[DeltaV]
11633
11634 mov ax,word ptr[2*ecx+esi]
11635 mov ecx,[ZVal]
11636
11637 mov esi,[ZVal]
11638 add ecx,[ZDelta]
11639
11640 shr esi,16
11641 mov [ZVal],ecx
11642
11643 dec [CKeyTest]
11644 jl Skip2
11645
11646 mov ecx,pZBufferPtr
11647
11648 cmp si,word ptr[ecx+8]
11649 jle Skip2
11650
11651 mov [edi+8],ebp
11652 mov word ptr[ecx+8],si
11653 mov word ptr[ecx+10],si
11654
11655 Skip2:
11656 mov ecx,edx
11657
11658 mov esi,pTex
11659 xor eax,0
11660
11661 add ebx,dword ptr[DeltaU]
11662 and ecx,[GHMaskShifted16]
11663
11664 mov ebp,eax
11665 and ebx,[GWMaskShifted]
11666
11667 shr ebp,1
11668 add ecx,ebx
11669
11670 rol eax,16
11671 add edx,dword ptr[DeltaV]
11672
11673 shr ecx,16
11674 add ebx,dword ptr[DeltaU]
11675
11676 mov ax,word ptr[2*ecx+esi]
11677 mov [CKeyTest],ebp
11678
11679 mov ecx,edx
11680 xor eax,0
11681
11682 and ecx,[GHMaskShifted16]
11683 mov esi,eax
11684
11685 mov ebp,eax
11686 and esi,REDMASK2
11687
11688 and ebp,GREENMASK2
11689 mov dword ptr[Red],esi
11690
11691 mov dword ptr[Green],ebp
11692 add ebx,dword ptr[DeltaU]
11694
11695
11696 fild qword ptr[Red] ; r LB LG LR
11697
11698 mov ebp,eax
11699 shr eax,1
11700
11701 fmul st,st(3) ; R LB LG LR
11702 fild qword ptr[Green] ; g R LB LG LR
11703
11704 and [CKeyTest],eax
11705
11706 and ebp,BLUEMASK
11707 and ebx,[GWMaskShifted]
11708
11709 mov dword ptr[Blue],ebp
11710
11711 fmul st,st(3) ; G R LB LG LR
11712 fild [Blue] ; b G R LB LG LR
11713 fmul st,st(3) ; B G R LB LG LR
11714 fxch st(2) ; R G B LB LG LR
11715 fadd qword ptr[Magic] ; Rk G B LB LG LR
11716 fxch st(1) ; G Rk B LB LG LR
11717 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11718 fxch st(2) ; B Rk Gk LB LG LR
11719 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11720 fxch st(1) ; Rk Bk Gk LB LG LR
11721 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11722 fstp qword ptr[Bucket2] ; Gk LB LG LR
11723
11724 mov eax,dword ptr[Bucket]
11725 mov ebp,dword ptr[Bucket2]
11726
11727 fstp qword ptr[Bucket] ; LB LG LR
11728 fxch st(1)
11729 fadd qword ptr[GreenDelta]
11730 fxch st(1)
11731 fadd qword ptr[BlueDelta]
11732 fxch st(2)
11733 fadd qword ptr[RedDelta]
11734 fxch st(2)
11735
11736 and eax,REDMASK2
11737 and ebp,BLUEMASK
11738
11739 mov esi,dword ptr[Bucket]
11740 or ebp,eax
11741
11742 add ecx,ebx
11743 and esi,GREENMASK2
11744
11745 shr ecx,16
11746 or ebp,esi
11747
11748 xor eax,0
11749 mov esi,pTex
11750
11751 rol ebp,16
11752 add edx,dword ptr[DeltaV]
11753
11754 mov ax,word ptr[2*ecx+esi]
11755 mov ecx,[ZVal]
11756
11757 mov esi,[ZVal]
11758 add ecx,[ZDelta]
11759
11760 shr esi,16
11761 mov [ZVal],ecx
11762
11763 dec [CKeyTest]
11764 jl Skip3
11765
11766 mov ecx,pZBufferPtr
11767
11768 cmp si,word ptr[ecx+12]
11769 jle Skip3
11770
11771 mov [edi+12],ebp
11772 mov word ptr[ecx+12],si
11773 mov word ptr[ecx+14],si
11774
11775 Skip3:
11776 mov ecx,edx
11777
11778 mov esi,pTex
11779 xor eax,0
11780
11781 add ebx,dword ptr[DeltaU]
11782 and ecx,[GHMaskShifted16]
11783
11784 mov ebp,eax
11785 and ebx,[GWMaskShifted]
11786
11787 shr ebp,1
11788 add ecx,ebx
11789
11790 rol eax,16
11791 add edx,dword ptr[DeltaV]
11792
11793 shr ecx,16
11794 add ebx,dword ptr[DeltaU]
11795
11796 mov ax,word ptr[2*ecx+esi]
11797 mov [CKeyTest],ebp
11798
11799 mov ecx,edx
11800 xor eax,0
11801
11802 and ecx,[GHMaskShifted16]
11803 mov esi,eax
11804
11805 mov ebp,eax
11806 and esi,REDMASK2
11807
11808 and ebp,GREENMASK2
11809 mov dword ptr[Red],esi
11810
11811 mov dword ptr[Green],ebp
11812 add ebx,dword ptr[DeltaU]
11814
11815
11816 fild qword ptr[Red] ; r LB LG LR
11817
11818 mov ebp,eax
11819 shr eax,1
11820
11821 fmul st,st(3) ; R LB LG LR
11822 fild qword ptr[Green] ; g R LB LG LR
11823
11824 and [CKeyTest],eax
11825
11826 and ebp,BLUEMASK
11827 and ebx,[GWMaskShifted]
11828
11829 mov dword ptr[Blue],ebp
11830
11831 fmul st,st(3) ; G R LB LG LR
11832 fild [Blue] ; b G R LB LG LR
11833 fmul st,st(3) ; B G R LB LG LR
11834 fxch st(2) ; R G B LB LG LR
11835 fadd qword ptr[Magic] ; Rk G B LB LG LR
11836 fxch st(1) ; G Rk B LB LG LR
11837 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11838 fxch st(2) ; B Rk Gk LB LG LR
11839 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11840 fxch st(1) ; Rk Bk Gk LB LG LR
11841 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11842 fstp qword ptr[Bucket2] ; Gk LB LG LR
11843
11844 mov eax,dword ptr[Bucket]
11845 mov ebp,dword ptr[Bucket2]
11846
11847 fstp qword ptr[Bucket] ; LB LG LR
11848 fxch st(1)
11849 fadd qword ptr[GreenDelta]
11850 fxch st(1)
11851 fadd qword ptr[BlueDelta]
11852 fxch st(2)
11853 fadd qword ptr[RedDelta]
11854 fxch st(2)
11855
11856 and eax,REDMASK2
11857 and ebp,BLUEMASK
11858
11859 mov esi,dword ptr[Bucket]
11860 or ebp,eax
11861
11862 add ecx,ebx
11863 and esi,GREENMASK2
11864
11865 shr ecx,16
11866 or ebp,esi
11867
11868 xor eax,0
11869 mov esi,pTex
11870
11871 rol ebp,16
11872 add edx,dword ptr[DeltaV]
11873
11874 mov ax,word ptr[2*ecx+esi]
11875 mov ecx,[ZVal]
11876
11877 mov esi,[ZVal]
11878 add ecx,[ZDelta]
11879
11880 shr esi,16
11881 mov [ZVal],ecx
11882
11883 dec [CKeyTest]
11884 jl Skip4
11885
11886 mov ecx,pZBufferPtr
11887
11888 cmp si,word ptr[ecx+16]
11889 jle Skip4
11890
11891 mov [edi+16],ebp
11892 mov word ptr[ecx+16],si
11893 mov word ptr[ecx+18],si
11894
11895 Skip4:
11896 mov ecx,edx
11897
11898 mov esi,pTex
11899 xor eax,0
11900
11901 add ebx,dword ptr[DeltaU]
11902 and ecx,[GHMaskShifted16]
11903
11904 mov ebp,eax
11905 and ebx,[GWMaskShifted]
11906
11907 shr ebp,1
11908 add ecx,ebx
11909
11910 rol eax,16
11911 add edx,dword ptr[DeltaV]
11912
11913 shr ecx,16
11914 add ebx,dword ptr[DeltaU]
11915
11916 mov ax,word ptr[2*ecx+esi]
11917 mov [CKeyTest],ebp
11918
11919 mov ecx,edx
11920 xor eax,0
11921
11922 and ecx,[GHMaskShifted16]
11923 mov esi,eax
11924
11925 mov ebp,eax
11926 and esi,REDMASK2
11927
11928 and ebp,GREENMASK2
11929 mov dword ptr[Red],esi
11930
11931 mov dword ptr[Green],ebp
11932 add ebx,dword ptr[DeltaU]
11934
11935
11936 fild qword ptr[Red] ; r LB LG LR
11937
11938 mov ebp,eax
11939 shr eax,1
11940
11941 fmul st,st(3) ; R LB LG LR
11942 fild qword ptr[Green] ; g R LB LG LR
11943
11944 and [CKeyTest],eax
11945
11946 and ebp,BLUEMASK
11947 and ebx,[GWMaskShifted]
11948
11949 mov dword ptr[Blue],ebp
11950
11951 fmul st,st(3) ; G R LB LG LR
11952 fild [Blue] ; b G R LB LG LR
11953 fmul st,st(3) ; B G R LB LG LR
11954 fxch st(2) ; R G B LB LG LR
11955 fadd qword ptr[Magic] ; Rk G B LB LG LR
11956 fxch st(1) ; G Rk B LB LG LR
11957 fadd qword ptr[Magic] ; Gk Rk B LB LG LR
11958 fxch st(2) ; B Rk Gk LB LG LR
11959 fadd qword ptr[Magic] ; Bk Rk Gk LB LG LR
11960 fxch st(1) ; Rk Bk Gk LB LG LR
11961 fstp qword ptr[Bucket] ; Bk Gk LB LG LR
11962 fstp qword ptr[Bucket2] ; Gk LB LG LR
11963
11964 mov eax,dword ptr[Bucket]
11965 mov ebp,dword ptr[Bucket2]
11966
11967 fstp qword ptr[Bucket] ; LB LG LR
11968 fxch st(1)
11969 fadd qword ptr[GreenDelta]
11970 fxch st(1)
11971 fadd qword ptr[BlueDelta]
11972 fxch st(2)
11973 fadd qword ptr[RedDelta]
11974 fxch st(2)
11975
11976 and eax,REDMASK2
11977 and ebp,BLUEMASK
11978
11979 mov esi,dword ptr[Bucket]
11980 or ebp,eax
11981
11982 add ecx,ebx
11983 and esi,GREENMASK2
11984
11985 shr ecx,16
11986 or ebp,esi
11987
11988 xor eax,0
11989 mov esi,pTex
11990
11991 rol ebp,16
11992 add edx,dword ptr[DeltaV]
11993
11994 mov ax,word ptr[2*ecx+esi]
11995 mov ecx,[ZVal]
11996
11997 mov esi,[ZVal]
11998 add ecx,[ZDelta]
11999
12000 shr esi,16
12001 mov [ZVal],ecx
12002
12003 dec [CKeyTest]
12004 jl Skip5
12005
12006 mov ecx,pZBufferPtr
12007
12008 cmp si,word ptr[ecx+20]
12009 jle Skip5
12010
12011 mov [edi+20],ebp
12012 mov word ptr[ecx+20],si
12013 mov word ptr[ecx+22],si
12014
12015 Skip5:
12016 mov ecx,edx
12017
12018 mov esi,pTex
12019 xor eax,0
12020
12021 add ebx,dword ptr[DeltaU]
12022 and ecx,[GHMaskShifted16]
12023
12024 mov ebp,eax
12025 and ebx,[GWMaskShifted]
12026
12027 shr ebp,1
12028 add ecx,ebx
12029
12030 rol eax,16
12031 add edx,dword ptr[DeltaV]
12032
12033 shr ecx,16
12034 add ebx,dword ptr[DeltaU]
12035
12036 mov ax,word ptr[2*ecx+esi]
12037 mov [CKeyTest],ebp
12038
12039 mov ecx,edx
12040 xor eax,0
12041
12042 and ecx,[GHMaskShifted16]
12043 mov esi,eax
12044
12045 mov ebp,eax
12046 and esi,REDMASK2
12047
12048 and ebp,GREENMASK2
12049 mov dword ptr[Red],esi
12050
12051 mov dword ptr[Green],ebp
12052 add ebx,dword ptr[DeltaU]
12054
12055
12056 fild qword ptr[Red] ; r LB LG LR
12057
12058 mov ebp,eax
12059 shr eax,1
12060
12061 fmul st,st(3) ; R LB LG LR
12062 fild qword ptr[Green] ; g R LB LG LR
12063
12064 and [CKeyTest],eax
12065
12066 and ebp,BLUEMASK
12067 and ebx,[GWMaskShifted]
12068
12069 mov dword ptr[Blue],ebp
12070
12071 fmul st,st(3) ; G R LB LG LR
12072 fild [Blue] ; b G R LB LG LR
12073 fmul st,st(3) ; B G R LB LG LR
12074 fxch st(2) ; R G B LB LG LR
12075 fadd qword ptr[Magic] ; Rk G B LB LG LR
12076 fxch st(1) ; G Rk B |