Home | History | Annotate | Download | only in WinQuake
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 //
     21 // sys_wina.s
     22 // x86 assembly-language Win-dependent routines.
     23 
     24 #define GLQUAKE	1	// don't include unneeded defs
     25 #include "asm_i386.h"
     26 #include "quakeasm.h"
     27 
     28 // LATER should be id386-dependent, and have an equivalent C path
     29 
     30 	.data
     31 
     32 	.align	4
     33 fpenv:
     34 	.long	0, 0, 0, 0, 0, 0, 0, 0
     35 
     36 	.text
     37 
     38 .globl C(MaskExceptions)
     39 C(MaskExceptions):
     40 	fnstenv	fpenv
     41 	orl		$0x3F,fpenv
     42 	fldenv	fpenv
     43 
     44 	ret
     45 
     46 #if 0
     47 .globl C(unmaskexceptions)
     48 C(unmaskexceptions):
     49 	fnstenv	fpenv
     50 	andl		$0xFFFFFFE0,fpenv
     51 	fldenv	fpenv
     52 
     53 	ret
     54 #endif
     55 
     56 	.data
     57 
     58 	.align	4
     59 .globl	ceil_cw, single_cw, full_cw, cw, pushed_cw
     60 ceil_cw:	.long	0
     61 single_cw:	.long	0
     62 full_cw:	.long	0
     63 cw:			.long	0
     64 pushed_cw:	.long	0
     65 
     66 	.text
     67 
     68 .globl C(Sys_LowFPPrecision)
     69 C(Sys_LowFPPrecision):
     70 	fldcw	single_cw
     71 
     72 	ret
     73 
     74 .globl C(Sys_HighFPPrecision)
     75 C(Sys_HighFPPrecision):
     76 	fldcw	full_cw
     77 
     78 	ret
     79 
     80 .globl C(Sys_PushFPCW_SetHigh)
     81 C(Sys_PushFPCW_SetHigh):
     82 	fnstcw	pushed_cw
     83 	fldcw	full_cw
     84 
     85 	ret
     86 
     87 .globl C(Sys_PopFPCW)
     88 C(Sys_PopFPCW):
     89 	fldcw	pushed_cw
     90 
     91 	ret
     92 
     93 .globl C(Sys_SetFPCW)
     94 C(Sys_SetFPCW):
     95 	fnstcw	cw
     96 	movl	cw,%eax
     97 #if	id386
     98 	andb	$0xF0,%ah
     99 	orb		$0x03,%ah	// round mode, 64-bit precision
    100 #endif
    101 	movl	%eax,full_cw
    102 
    103 #if	id386
    104 	andb	$0xF0,%ah
    105 	orb		$0x0C,%ah	// chop mode, single precision
    106 #endif
    107 	movl	%eax,single_cw
    108 
    109 #if	id386
    110 	andb	$0xF0,%ah
    111 	orb		$0x08,%ah	// ceil mode, single precision
    112 #endif
    113 	movl	%eax,ceil_cw
    114 
    115 	ret
    116 
    117