386log.inc
来自「开放源码的编译器open watcom 1.6.0版的源代码」· INC 代码 · 共 322 行 · 第 1/2 页
INC
322 行
_if e ; ...
cmp dword ptr [EDI],0F9DE6484h ; ...
_endif ; ...
_endif ; ...
_if a ; if x > sqrt(.5)
;; z -= .5;
;; } else {
;; x = z;
;; --exp;
;; }
and ESI,00000FFFFh ; - load -.5
or ESI,0BFFE0000h ; - ...
mov ECX,80000000h ; - ...
sub EBX,EBX ; - ...
call ___LDA ; - calc z = z - .5
_else ; else
mov [EDI],EAX ; - set x = z
mov 4[EDI],EDX ; - ...
mov 8[EDI],SI ; - ...
dec dword ptr [ESP] ; - decrement exponent
_endif ; endif
push EAX ; save z
push EDX ; ...
push ESI ; ...
;; z = z / (x * .5 + .5);
mov EAX,[EDI] ; load x
mov EDX,4[EDI] ; ...
mov SI,8[EDI] ; ...
dec SI ; multiply by .5
and ESI,0000FFFFh ; load .5
or ESI,3FFE0000h ; ...
mov ECX,080000000h ; ...
sub EBX,EBX ; ...
call ___LDA ; calc. x * .5 + .5
shl ESI,16 ; move result to ESI:ECX:EBX
mov ECX,EDX ; ...
mov EBX,EAX ; ...
pop EAX ; restore z
mov SI,AX ; ...
pop EDX ; ...
pop EAX ; ...
call ___LDD ; calc. z = z / (x * .5 + .5)
push EAX ; save z
push EDX ; ...
push ESI ; ...
;; x = z * z;
mov ECX,ESI ; duplicate z
shl ESI,16 ; ...
mov SI,CX ; ...
mov ECX,EDX ; ...
mov EBX,EAX ; ...
call ___LDM ; calc. x = z * z
mov [EDI],EAX ; ...
mov 4[EDI],EDX ; ...
mov 8[EDI],SI ; ...
;; x = z + z * x * _EvalPoly( x, APoly, 2 ) / _EvalPoly( x, BPoly, 3 );
mov EBX,3 ; degree
lea ECX,BPoly ; polynomial
call __poly ; evaluate polynomial
push EAX ; save result
push EDX ; ...
push ESI ; ...
mov EAX,[EDI] ; load x
mov EDX,4[EDI] ; ...
mov SI,8[EDI] ; ...
lea ECX,APoly ; polynomial
mov EBX,2 ; degree
call __poly ; evaluate polynomial
pop ECX ; load __poly(x,BPoly,3)
rol ESI,16 ; ...
mov SI,CX ; ...
rol ESI,16 ; ...
pop ECX ; ...
pop EBX ; ...
call ___LDD ; calc. APoly / BPoly
mov EBX,[EDI] ; load x
mov ECX,4[EDI] ; ...
rol ESI,16 ; ...
mov SI,8[EDI] ; ...
rol ESI,16 ; ...
call ___LDM ; calc. x * Apoly / BPoly
rol ESI,16 ; load z
mov SI,[ESP] ; ...
rol ESI,16 ; ...
mov ECX,4[ESP] ; ...
mov EBX,8[ESP] ; ...
call ___LDM ; calc. z * x * APoly / BPoly
rol ESI,16 ; load z
pop ECX ; ...
mov SI,CX ; ...
rol ESI,16 ; ...
pop ECX ; ...
pop EBX ; ...
call ___LDA ; calc. z + z * x * APoly/BPoly
;; if( exp != 0 ) {
;; z = exp;
;; x = (z * C2 + x) + z * C1;
;; }
pop ECX ; restore exponent
or ECX,ECX ; if not zero
_if ne ; then
push EAX ; - save x
push EDX ; - ...
push ESI ; - ...
mov EDX,EDI ; - convert exponent to LD
mov EAX,ECX ; - ...
call __I4LD ; - ...
mov EAX,[EDI] ; - load z
mov EDX,4[EDI] ; - ...
mov SI,8[EDI] ; - ...
and ESI,0000FFFFh ; - load C2
or ESI,0BFF20000h ; - ...
mov ECX,0DE8082E3h ; - ...
mov EBX,00865435Ch ; - ...
call ___LDM ; - calc. z * C2
pop ECX ; - load x
rol ESI,16 ; - ...
mov SI,CX ; - ...
rol ESI,16 ; - ...
pop ECX ; - ...
pop EBX ; - ...
call ___LDA ; - calc. z * C2 + x
push EAX ; - save (z * C2 + x)
push EDX ; - ...
push ESI ; - ...
mov EAX,[EDI] ; - load z
mov EDX,4[EDI] ; - ...
mov SI,8[EDI] ; - ...
and ESI,0000FFFFh ; - load C1 (355./512.)
or ESI,3FFE0000h ; - ...
mov ECX,0B1800000h ; - ...
sub EBX,EBX ; - ...
call ___LDM ; - calc. z * C1
pop ECX ; - load (z * C2 + x)
rol ESI,16 ; - ...
mov SI,CX ; - ...
rol ESI,16 ; - ...
pop ECX ; - ...
pop EBX ; - ...
call ___LDA ; - calc. (z * C2 + x) + z * C1
_endif ; endif
mov [EDI],EAX ; save in x
mov 4[EDI],EDX ; ...
mov 8[EDI],SI ; ...
;; }
;; return( x );
;;}
pop EBX ; restore registers
pop ECX ; ...
pop EDX ; ...
pop ESI ; ...
pop EDI ; ...
ret ; return
__log endp
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?