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 + -
显示快捷键?