Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 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