home *** CD-ROM | disk | FTP | other *** search
/ PC Media 2 / PC MEDIA CD02.iso / share / prog / realasm1 / ftmul.asm < prev    next >
Encoding:
Assembly Source File  |  1993-07-18  |  4.9 KB  |  119 lines

  1. .286
  2. ;================================================
  3. ; Multiplies REAL10's dst, src
  4. ;
  5. ;------------------------------------------------
  6. cseg          segment word public 'code'
  7.               assume  cs:cseg,ss:cseg
  8.               assume  ds:cseg,es:cseg
  9.  
  10.               include math.inc
  11.  
  12. ftmul         proc    near  dst:NPR10, src:NPR10
  13.               local   t:REAL10, dcopy[8]:WORD, result[8]:WORD
  14.  
  15.               pusha
  16.               mov     si, src
  17.               mov     di, dst
  18.  
  19.               invoke  ftzero, si                ; if src = 0.0
  20.               .IF ax == TRUE                    ;
  21.                  invoke  clrx, di, 5            ; dst = 0.0
  22.                  jmp     exit                   ;
  23.               .ENDIF                            ;
  24.  
  25.               invoke  ftzero, di                ; if dst = 0.0
  26.               .IF ax == TRUE                    ;
  27.                  jmp     exit                   ; dst unchanged
  28.               .ENDIF                            ;
  29.  
  30.               invoke  movx, addr t, si, 5       ; don't violate src
  31.               lea     si, t                     ;
  32.  
  33.               invoke  ftcomp, di, si            ;
  34.               .IF ax == 1                       ; if dst > src
  35.                  invoke  ftswap, di, si         ;
  36.               .ENDIF
  37. ;------------------------------------------------
  38. ; get resultant exponent and sign
  39. ;------------------------------------------------
  40.               mov     ax, word ptr [di]+8       ;
  41.               mov     bl, ah                    ;
  42.               and     bl, 80h                   ; BL = dst sign
  43.               and     ax, 7fffh                 ;
  44.               sub     ax, 3fffh                 ;
  45.  
  46.               mov     dx, word ptr [si]+8       ;
  47.               mov     bh, dh                    ;
  48.               and     bh, 80h                   ; BH = src sign
  49.               and     dx, 7fffh                 ;
  50.               sub     dx, 3fffh                 ;
  51.  
  52.               add     ax, dx                    ; add true binary exponents
  53.               add     ax, 3fffh                 ; add bias
  54.  
  55.               .IF ((bx == 8000h) || (bx == 80h)); if -dst, +src OR +dst, -src
  56.                  or      ax, 8000h              ; result is -ve
  57.               .ENDIF                            ;
  58.  
  59.               mov     word ptr [di]+8, ax       ;
  60. ;------------------------------------------------
  61. ; note: 64-bit x 64-bit = 128-bit result
  62. ;------------------------------------------------
  63.               invoke  clrx, addr dcopy, 8       ; clear 8-word dcopy
  64.               invoke  movx, addr dcopy, di, 4   ; load  lower 4 words
  65.               lea     di, dcopy                 ; ss::di addresses dcopy
  66.  
  67.               invoke  clrx, addr result, 8      ; clear 8-word result
  68. ;------------------------------------------------
  69. ; shift and add multiplication
  70. ;------------------------------------------------
  71.               xor     dx, dx                    ; overflow = 0
  72.               mov     cx, 64                    ; 64 bits
  73.  
  74.               .WHILE (cx)
  75.                  invoke  cmpxz, si, 4
  76.                  .BREAK .IF (ax == TRUE)        ;
  77.  
  78.                  invoke  lshx, si, 4            ; left shift t64
  79.                  .IF ax == 1                    ; if msb == 1
  80.                     invoke  addx, addr result, di, 8  ; add result, dcopy
  81.                     or      dx, ax              ; catch overflow
  82.                  .ENDIF
  83.                  invoke  lshx, addr result, 8   ; left shift result
  84.                  dec     cx                     ; continue
  85.               .ENDW
  86. ;------------------------------------------------
  87. ; adjust for overflow
  88. ;------------------------------------------------
  89.               mov     di, dst                   ; address dst
  90.               lea     si, result                ; address result
  91.  
  92.               .IF (dx)                          ; if overflow
  93.                  invoke  rshx, si, 8            ;
  94.                  or      word ptr [si]+14, 8000h
  95.                  inc     word ptr [di]+8        ;
  96.               .ENDIF                            ;
  97. ;------------------------------------------------
  98. ; normalise 128 bit result
  99. ;------------------------------------------------
  100.               .WHILE (1)                        ;
  101.                  mov     ax, word ptr [si]+14   ;
  102.                  .BREAK .IF (ax & 8000h)        ;
  103.                  invoke  lshx, si, 8            ;
  104.               .ENDW                             ;
  105.  
  106.               add     si, 8                     ; address upper 4 words
  107.               invoke  cmpx, di, si, 4           ;
  108.               .IF ax == 1                       ; if result64 < dst64
  109.                  inc     word ptr [di]+8        ; exp++
  110.               .ENDIF                            ;
  111.               invoke  movx, di, si, 4           ; dst64 <--- result
  112. exit:
  113.               popa
  114.               ret
  115. ftmul         endp
  116.  
  117. cseg          ends
  118.               end
  119.