123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- Copyright (C) 1996-1997 Id Software, Inc.
- This program 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.
- This program 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 this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- //
- // sys_wina.s
- // x86 assembly-language Win-dependent routines.
- #include "asm_i386.h"
- #include "quakeasm.h"
- //@@@ should be id386-dependent, and have an equivalent C path
- .data
- .align 4
- fpenv:
- .long 0, 0, 0, 0, 0, 0, 0, 0
- .text
- .globl C(MaskExceptions)
- C(MaskExceptions):
- fnstenv fpenv
- orl $0x3F,fpenv
- fldenv fpenv
- ret
- #if 0
- .globl C(unmaskexceptions)
- C(unmaskexceptions):
- fnstenv fpenv
- andl $0xFFFFFFE0,fpenv
- fldenv fpenv
- ret
- #endif
- .data
- .align 4
- .globl ceil_cw, single_cw, full_cw, cw, pushed_cw
- ceil_cw: .long 0
- single_cw: .long 0
- full_cw: .long 0
- cw: .long 0
- pushed_cw: .long 0
- .text
- .globl C(Sys_LowFPPrecision)
- C(Sys_LowFPPrecision):
- fldcw single_cw
- ret
- .globl C(Sys_HighFPPrecision)
- C(Sys_HighFPPrecision):
- fldcw full_cw
- ret
- .globl C(Sys_PushFPCW_SetHigh)
- C(Sys_PushFPCW_SetHigh):
- fnstcw pushed_cw
- fldcw full_cw
- ret
- .globl C(Sys_PopFPCW)
- C(Sys_PopFPCW):
- fldcw pushed_cw
- ret
- .globl C(Sys_SetFPCW)
- C(Sys_SetFPCW):
- fnstcw cw
- movl cw,%eax
- #if id386
- andb $0xF0,%ah
- orb $0x03,%ah // round mode, 64-bit precision
- #endif
- movl %eax,full_cw
- #if id386
- andb $0xF0,%ah
- orb $0x0C,%ah // chop mode, single precision
- #endif
- movl %eax,single_cw
- #if id386
- andb $0xF0,%ah
- orb $0x08,%ah // ceil mode, single precision
- #endif
- movl %eax,ceil_cw
- ret
|