1.hidden __hwcap 2 3.global feclearexcept 4.type feclearexcept,@function 5feclearexcept: 6 mov 4(%esp),%ecx 7 and $0x3f,%ecx 8 fnstsw %ax 9 # consider sse fenv as well if the cpu has XMM capability 10 call 1f 111: addl $__hwcap-1b,(%esp) 12 pop %edx 13 testl $0x02000000,(%edx) 14 jz 2f 15 # maintain exceptions in the sse mxcsr, clear x87 exceptions 16 test %eax,%ecx 17 jz 1f 18 fnclex 191: push %edx 20 stmxcsr (%esp) 21 pop %edx 22 and $0x3f,%eax 23 or %eax,%edx 24 test %edx,%ecx 25 jz 1f 26 not %ecx 27 and %ecx,%edx 28 push %edx 29 ldmxcsr (%esp) 30 pop %edx 311: xor %eax,%eax 32 ret 33 # only do the expensive x87 fenv load/store when needed 342: test %eax,%ecx 35 jz 1b 36 not %ecx 37 and %ecx,%eax 38 test $0x3f,%eax 39 jz 1f 40 fnclex 41 jmp 1b 421: sub $32,%esp 43 fnstenv (%esp) 44 mov %al,4(%esp) 45 fldenv (%esp) 46 add $32,%esp 47 xor %eax,%eax 48 ret 49 50.global feraiseexcept 51.type feraiseexcept,@function 52feraiseexcept: 53 mov 4(%esp),%eax 54 and $0x3f,%eax 55 sub $32,%esp 56 fnstenv (%esp) 57 or %al,4(%esp) 58 fldenv (%esp) 59 add $32,%esp 60 xor %eax,%eax 61 ret 62 63.global __fesetround 64.hidden __fesetround 65.type __fesetround,@function 66__fesetround: 67 mov 4(%esp),%ecx 68 push %eax 69 xor %eax,%eax 70 fnstcw (%esp) 71 andb $0xf3,1(%esp) 72 or %ch,1(%esp) 73 fldcw (%esp) 74 # consider sse fenv as well if the cpu has XMM capability 75 call 1f 761: addl $__hwcap-1b,(%esp) 77 pop %edx 78 testl $0x02000000,(%edx) 79 jz 1f 80 stmxcsr (%esp) 81 shl $3,%ch 82 andb $0x9f,1(%esp) 83 or %ch,1(%esp) 84 ldmxcsr (%esp) 851: pop %ecx 86 ret 87 88.global fegetround 89.type fegetround,@function 90fegetround: 91 push %eax 92 fnstcw (%esp) 93 pop %eax 94 and $0xc00,%eax 95 ret 96 97.global fegetenv 98.type fegetenv,@function 99fegetenv: 100 mov 4(%esp),%ecx 101 xor %eax,%eax 102 fnstenv (%ecx) 103 # consider sse fenv as well if the cpu has XMM capability 104 call 1f 1051: addl $__hwcap-1b,(%esp) 106 pop %edx 107 testl $0x02000000,(%edx) 108 jz 1f 109 push %eax 110 stmxcsr (%esp) 111 pop %edx 112 and $0x3f,%edx 113 or %edx,4(%ecx) 1141: ret 115 116.global fesetenv 117.type fesetenv,@function 118fesetenv: 119 mov 4(%esp),%ecx 120 xor %eax,%eax 121 inc %ecx 122 jz 1f 123 fldenv -1(%ecx) 124 movl -1(%ecx),%ecx 125 jmp 2f 1261: push %eax 127 push %eax 128 push %eax 129 push %eax 130 pushl $0xffff 131 push %eax 132 pushl $0x37f 133 fldenv (%esp) 134 add $28,%esp 135 # consider sse fenv as well if the cpu has XMM capability 1362: call 1f 1371: addl $__hwcap-1b,(%esp) 138 pop %edx 139 testl $0x02000000,(%edx) 140 jz 1f 141 # mxcsr := same rounding mode, cleared exceptions, default mask 142 and $0xc00,%ecx 143 shl $3,%ecx 144 or $0x1f80,%ecx 145 mov %ecx,4(%esp) 146 ldmxcsr 4(%esp) 1471: ret 148 149.global fetestexcept 150.type fetestexcept,@function 151fetestexcept: 152 mov 4(%esp),%ecx 153 and $0x3f,%ecx 154 fnstsw %ax 155 # consider sse fenv as well if the cpu has XMM capability 156 call 1f 1571: addl $__hwcap-1b,(%esp) 158 pop %edx 159 testl $0x02000000,(%edx) 160 jz 1f 161 stmxcsr 4(%esp) 162 or 4(%esp),%eax 1631: and %ecx,%eax 164 ret 165