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