aboutsummaryrefslogtreecommitdiffstats
path: root/code/unix/ftol.nasm
diff options
context:
space:
mode:
Diffstat (limited to 'code/unix/ftol.nasm')
-rwxr-xr-xcode/unix/ftol.nasm151
1 files changed, 151 insertions, 0 deletions
diff --git a/code/unix/ftol.nasm b/code/unix/ftol.nasm
new file mode 100755
index 0000000..772e6a0
--- /dev/null
+++ b/code/unix/ftol.nasm
@@ -0,0 +1,151 @@
+;===========================================================================
+;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
+