kolibrios/programs/develop/open watcom/trunk/clib/convert/fsms386.asm

110 lines
4.5 KiB
NASM
Raw Normal View History

;*****************************************************************************
;*
;* 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
modstart fsms386
xdefp "C",_fieeetomsbin
defpe _fieeetomsbin
ifdef __STACK__
mov eax,dword ptr +4H[esp]
mov edx,dword ptr +8H[esp]
endif
; At this point:
; eax - ptr to IEEE source float
; edx - ptr to MBF dest float
mov eax,[eax] ; load IEEE float
test eax,7fe00000h ; IEEE exponent != 0 or convertable
; denormal ?
jne IEEENonZero ; :
; IEEE Zero or IEEE unconvertable denormal, store MBF Zero
xor eax,eax ; 0
mov [edx],eax ; store MBF 0.0F
ret ; return 0 (no overflow)
; At this point:
; eax - IEEE source float
; edx - ptr to MBF dest float
IEEENonZero: rol eax,9 ; rotate for exponent analysis
test al,al ; IEEE convertable denormal ?
je IEEEDenormal ; yes, jump
add al,2 ; MBF exponent = IEEE exponent + 2
jc IEEEOverflow ; jump if overflow
shr eax,1 ; rotate sign bit and exponent
adc al,al ; :
adc eax,eax ; :
ror eax,9 ; rotate so MBF float
MBFStore: mov [edx],eax ; store MBF float
xor eax,eax ; 0
ret ; return 0 (no overflow)
; One of leading 2 bits of mantissa is a 1
IEEEDenormal:
ifndef __STACK__
push ecx ; save register
endif
mov ecx,eax ; save sign bit and exponent
and ah,0FEh ; eliminate sign bit
DenormalLoop: inc ecx ; increment count
add eax,eax ; shift mantissa
jnc DenormalLoop ; loop while no implied 1
xor ecx,3h ; invert count (new exponent)
shr ecx,1 ; rotate exponent and sign bit
adc cl,cl ; :
adc ecx,ecx ; :
shrd eax,ecx,9 ; combine mantissa (eax) and
; exponent& sign bit (ecx)
ifndef __STACK__
pop ecx ; restore register
endif
jmp MBFStore ; continue
IEEEOverflow: rol eax,15 ; rotate sign bit into place
or eax,0FF7FFFFFh ; set MBF exponent and mantissa to
; maximum but preserve MBF sign
mov [edx],eax ; store MBF float
and eax,1 ; 1
ret ; return 1 (overflow)
endproc _fieeetomsbin
endmod
end