132 lines
2.1 KiB
NASM
132 lines
2.1 KiB
NASM
|
;
|
||
|
; qftol -- fast floating point to long conversion.
|
||
|
;
|
||
|
|
||
|
segment .data
|
||
|
|
||
|
temp dd 0.0
|
||
|
fpucw dd 0
|
||
|
|
||
|
; Precision Control Field , 2 bits / 0x0300
|
||
|
; PC24 0x0000 Single precision (24 bits).
|
||
|
; PC53 0x0200 Double precision (53 bits).
|
||
|
; PC64 0x0300 Extended precision (64 bits).
|
||
|
|
||
|
; Rounding Control Field, 2 bits / 0x0C00
|
||
|
; RCN 0x0000 Rounding to nearest (even).
|
||
|
; RCD 0x0400 Rounding down (directed, minus).
|
||
|
; RCU 0x0800 Rounding up (directed plus).
|
||
|
; RC0 0x0C00 Rounding towards zero (chop mode).
|
||
|
|
||
|
|
||
|
; rounding towards nearest (even)
|
||
|
cw027F dd 0x027F ; double precision
|
||
|
cw037F dd 0x037F ; extended precision
|
||
|
|
||
|
; rounding towards zero (chop mode)
|
||
|
cw0E7F dd 0x0E7F ; double precision
|
||
|
cw0F7F dd 0x0F7F ; extended precision
|
||
|
|
||
|
|
||
|
segment .text
|
||
|
|
||
|
;
|
||
|
; int qftol( void ) - default control word
|
||
|
;
|
||
|
|
||
|
global qftol
|
||
|
|
||
|
qftol:
|
||
|
fistp dword [temp]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
|
||
|
;
|
||
|
; int qftol027F( void ) - DirectX FPU
|
||
|
;
|
||
|
|
||
|
global qftol027F
|
||
|
|
||
|
qftol027F:
|
||
|
fnstcw [fpucw]
|
||
|
fldcw [cw027F]
|
||
|
fistp dword [temp]
|
||
|
fldcw [fpucw]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
;
|
||
|
; int qftol037F( void ) - Linux FPU
|
||
|
;
|
||
|
|
||
|
global qftol037F
|
||
|
|
||
|
qftol037F:
|
||
|
fnstcw [fpucw]
|
||
|
fldcw [cw037F]
|
||
|
fistp dword [temp]
|
||
|
fldcw [fpucw]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
|
||
|
;
|
||
|
; int qftol0F7F( void ) - ANSI
|
||
|
;
|
||
|
|
||
|
global qftol0F7F
|
||
|
|
||
|
qftol0F7F:
|
||
|
fnstcw [fpucw]
|
||
|
fldcw [cw0F7F]
|
||
|
fistp dword [temp]
|
||
|
fldcw [fpucw]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
;
|
||
|
; int qftol0E7F( void )
|
||
|
;
|
||
|
|
||
|
global qftol0E7F
|
||
|
|
||
|
qftol0E7F:
|
||
|
fnstcw [fpucw]
|
||
|
fldcw [cw0E7F]
|
||
|
fistp dword [temp]
|
||
|
fldcw [fpucw]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
;
|
||
|
; long Q_ftol( float q )
|
||
|
;
|
||
|
|
||
|
global Q_ftol
|
||
|
|
||
|
Q_ftol:
|
||
|
fld dword [esp+4]
|
||
|
fistp dword [temp]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|
||
|
|
||
|
;
|
||
|
; long qftol0F7F( float q ) - Linux FPU
|
||
|
;
|
||
|
|
||
|
global Q_ftol0F7F
|
||
|
|
||
|
Q_ftol0F7F:
|
||
|
fnstcw [fpucw]
|
||
|
fld dword [esp+4]
|
||
|
fldcw [cw0F7F]
|
||
|
fistp dword [temp]
|
||
|
fldcw [fpucw]
|
||
|
mov eax, [temp]
|
||
|
ret
|
||
|
|