0,0 → 1,99 |
;***************************************************************************** |
;* |
;* Open Watcom Project |
;* |
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved. |
;* |
;* ======================================================================== |
;* |
;* This file contains Original Code and/or Modifications of Original |
;* Code as defined in and that are subject to the Sybase Open Watcom |
;* Public License version 1.0 (the 'License'). You may not use this file |
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO |
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is |
;* provided with the Original Code and Modifications, and is also |
;* available at www.sybase.com/developer/opensource. |
;* |
;* The Original Code and all software distributed under the License are |
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM |
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF |
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR |
;* NON-INFRINGEMENT. Please see the License for the specific language |
;* governing rights and limitations under the License. |
;* |
;* ======================================================================== |
;* |
;* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE |
;* DESCRIBE IT HERE! |
;* |
;***************************************************************************** |
|
|
include mdef.inc |
include struct.inc |
|
.8087 |
modstart _7fu8386 |
|
xdefp __FSU87 |
xdefp __FDU87 |
|
defpe __FSU87 |
sub esp,12 |
mov [esp],eax |
fld dword ptr [esp] |
jmp short convert |
|
defpe __FDU87 |
sub esp,12 |
mov [esp],eax |
mov 4[esp],edx |
fld qword ptr [esp] |
|
; fall through |
|
convert: |
push ecx |
fstp tbyte ptr 4[esp] ; get number out in memory |
mov ax,12[esp] ; pick up sign/exponent |
and ax,7fffh ; isolate exponent |
sub ax,16383 ; remove bias |
jl ret_zero ; if less than .5, return zero |
cmp ax,64 ; are we too big? |
jae ret_inf ; if so, return infinity |
mov cl,63 ; calculate shift count |
sub cl,al ; ... |
mov eax,4[esp] ; pick up mantissa |
mov edx,8[esp] ; ... |
je negate ; skip out if no shifting |
L2: |
shr edx,1 ; shift down one bit |
rcr eax,1 ; ... |
dec cl ; are we done? |
jne L2 ; do it again if not |
negate: |
test byte ptr 13[esp],80h ; is number negative? |
jns done ; if not, we're done |
neg edx ; negate number |
neg eax ; ... |
sbb edx,0 ; ... |
done: |
pop ecx ; ... |
add esp,12 ; outta here |
ret ; ... |
|
ret_zero: |
xor edx,edx |
xor eax,eax |
jmp done |
|
ret_inf: |
mov edx,0ffffffffh |
mov eax,edx |
jmp done |
endproc __FDU87 |
endproc __FSU87 |
|
endmod |
end |