lilium-voyager/code/unix/ftol.nasm
2005-08-28 17:54:51 +00:00

151 lines
2.9 KiB
NASM

;===========================================================================
;Copyright (C) 1999-2005 Id Software, Inc.
;
;This file is part of Quake III Arena source code.
;
;Quake III Arena source code is free software; you can redistribute it
;and/or modify it under the terms of the GNU General Public License as
;published by the Free Software Foundation; either version 2 of the License,
;or (at your option) any later version.
;
;Quake III Arena source code is distributed in the hope that it will be
;useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with Foobar; if not, write to the Free Software
;Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
;===========================================================================
;
; 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