Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5131 | clevermous | 1 | // |
2 | // sys_dosa.s |
||
3 | // x86 assembly-language DOS-dependent routines. |
||
4 | |||
5 | #include "asm_i386.h" |
||
6 | #include "quakeasm.h" |
||
7 | |||
8 | |||
9 | #if id386 |
||
10 | |||
11 | .data |
||
12 | |||
13 | .align 4 |
||
14 | fpenv: |
||
15 | .long 0, 0, 0, 0, 0, 0, 0, 0 |
||
16 | |||
17 | .text |
||
18 | |||
19 | .globl C(MaskExceptions) |
||
20 | C(MaskExceptions): |
||
21 | fnstenv fpenv |
||
22 | orl $0x3F,fpenv |
||
23 | fldenv fpenv |
||
24 | |||
25 | ret |
||
26 | |||
27 | #if 0 |
||
28 | .globl C(unmaskexceptions) |
||
29 | C(unmaskexceptions): |
||
30 | fnstenv fpenv |
||
31 | andl $0xFFFFFFE0,fpenv |
||
32 | fldenv fpenv |
||
33 | |||
34 | ret |
||
35 | #endif |
||
36 | |||
37 | .data |
||
38 | |||
39 | .align 4 |
||
40 | .globl ceil_cw, single_cw, full_cw, cw, pushed_cw |
||
41 | ceil_cw: .long 0 |
||
42 | single_cw: .long 0 |
||
43 | full_cw: .long 0 |
||
44 | cw: .long 0 |
||
45 | pushed_cw: .long 0 |
||
46 | |||
47 | .text |
||
48 | |||
49 | .globl C(Sys_LowFPPrecision) |
||
50 | C(Sys_LowFPPrecision): |
||
51 | fldcw single_cw |
||
52 | |||
53 | ret |
||
54 | |||
55 | .globl C(Sys_HighFPPrecision) |
||
56 | C(Sys_HighFPPrecision): |
||
57 | fldcw full_cw |
||
58 | |||
59 | ret |
||
60 | |||
61 | .globl C(Sys_PushFPCW_SetHigh) |
||
62 | C(Sys_PushFPCW_SetHigh): |
||
63 | fnstcw pushed_cw |
||
64 | fldcw full_cw |
||
65 | |||
66 | ret |
||
67 | |||
68 | .globl C(Sys_PopFPCW) |
||
69 | C(Sys_PopFPCW): |
||
70 | fldcw pushed_cw |
||
71 | |||
72 | ret |
||
73 | |||
74 | .globl C(Sys_SetFPCW) |
||
75 | C(Sys_SetFPCW): |
||
76 | fnstcw cw |
||
77 | movl cw,%eax |
||
78 | #if id386 |
||
79 | andb $0xF0,%ah |
||
80 | orb $0x03,%ah // round mode, 64-bit precision |
||
81 | #endif |
||
82 | movl %eax,full_cw |
||
83 | |||
84 | #if id386 |
||
85 | andb $0xF0,%ah |
||
86 | orb $0x0C,%ah // chop mode, single precision |
||
87 | #endif |
||
88 | movl %eax,single_cw |
||
89 | |||
90 | #if id386 |
||
91 | andb $0xF0,%ah |
||
92 | orb $0x08,%ah // ceil mode, single precision |
||
93 | #endif |
||
94 | movl %eax,ceil_cw |
||
95 | |||
96 | ret |
||
97 | |||
98 | #endif |