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