1570af302Sopenharmony_ci.hidden __hwcap 2570af302Sopenharmony_ci 3570af302Sopenharmony_ci.global feclearexcept 4570af302Sopenharmony_ci.type feclearexcept,@function 5570af302Sopenharmony_cifeclearexcept: 6570af302Sopenharmony_ci mov 4(%esp),%ecx 7570af302Sopenharmony_ci and $0x3f,%ecx 8570af302Sopenharmony_ci fnstsw %ax 9570af302Sopenharmony_ci # consider sse fenv as well if the cpu has XMM capability 10570af302Sopenharmony_ci call 1f 11570af302Sopenharmony_ci1: addl $__hwcap-1b,(%esp) 12570af302Sopenharmony_ci pop %edx 13570af302Sopenharmony_ci testl $0x02000000,(%edx) 14570af302Sopenharmony_ci jz 2f 15570af302Sopenharmony_ci # maintain exceptions in the sse mxcsr, clear x87 exceptions 16570af302Sopenharmony_ci test %eax,%ecx 17570af302Sopenharmony_ci jz 1f 18570af302Sopenharmony_ci fnclex 19570af302Sopenharmony_ci1: push %edx 20570af302Sopenharmony_ci stmxcsr (%esp) 21570af302Sopenharmony_ci pop %edx 22570af302Sopenharmony_ci and $0x3f,%eax 23570af302Sopenharmony_ci or %eax,%edx 24570af302Sopenharmony_ci test %edx,%ecx 25570af302Sopenharmony_ci jz 1f 26570af302Sopenharmony_ci not %ecx 27570af302Sopenharmony_ci and %ecx,%edx 28570af302Sopenharmony_ci push %edx 29570af302Sopenharmony_ci ldmxcsr (%esp) 30570af302Sopenharmony_ci pop %edx 31570af302Sopenharmony_ci1: xor %eax,%eax 32570af302Sopenharmony_ci ret 33570af302Sopenharmony_ci # only do the expensive x87 fenv load/store when needed 34570af302Sopenharmony_ci2: test %eax,%ecx 35570af302Sopenharmony_ci jz 1b 36570af302Sopenharmony_ci not %ecx 37570af302Sopenharmony_ci and %ecx,%eax 38570af302Sopenharmony_ci test $0x3f,%eax 39570af302Sopenharmony_ci jz 1f 40570af302Sopenharmony_ci fnclex 41570af302Sopenharmony_ci jmp 1b 42570af302Sopenharmony_ci1: sub $32,%esp 43570af302Sopenharmony_ci fnstenv (%esp) 44570af302Sopenharmony_ci mov %al,4(%esp) 45570af302Sopenharmony_ci fldenv (%esp) 46570af302Sopenharmony_ci add $32,%esp 47570af302Sopenharmony_ci xor %eax,%eax 48570af302Sopenharmony_ci ret 49570af302Sopenharmony_ci 50570af302Sopenharmony_ci.global feraiseexcept 51570af302Sopenharmony_ci.type feraiseexcept,@function 52570af302Sopenharmony_ciferaiseexcept: 53570af302Sopenharmony_ci mov 4(%esp),%eax 54570af302Sopenharmony_ci and $0x3f,%eax 55570af302Sopenharmony_ci sub $32,%esp 56570af302Sopenharmony_ci fnstenv (%esp) 57570af302Sopenharmony_ci or %al,4(%esp) 58570af302Sopenharmony_ci fldenv (%esp) 59570af302Sopenharmony_ci add $32,%esp 60570af302Sopenharmony_ci xor %eax,%eax 61570af302Sopenharmony_ci ret 62570af302Sopenharmony_ci 63570af302Sopenharmony_ci.global __fesetround 64570af302Sopenharmony_ci.hidden __fesetround 65570af302Sopenharmony_ci.type __fesetround,@function 66570af302Sopenharmony_ci__fesetround: 67570af302Sopenharmony_ci mov 4(%esp),%ecx 68570af302Sopenharmony_ci push %eax 69570af302Sopenharmony_ci xor %eax,%eax 70570af302Sopenharmony_ci fnstcw (%esp) 71570af302Sopenharmony_ci andb $0xf3,1(%esp) 72570af302Sopenharmony_ci or %ch,1(%esp) 73570af302Sopenharmony_ci fldcw (%esp) 74570af302Sopenharmony_ci # consider sse fenv as well if the cpu has XMM capability 75570af302Sopenharmony_ci call 1f 76570af302Sopenharmony_ci1: addl $__hwcap-1b,(%esp) 77570af302Sopenharmony_ci pop %edx 78570af302Sopenharmony_ci testl $0x02000000,(%edx) 79570af302Sopenharmony_ci jz 1f 80570af302Sopenharmony_ci stmxcsr (%esp) 81570af302Sopenharmony_ci shl $3,%ch 82570af302Sopenharmony_ci andb $0x9f,1(%esp) 83570af302Sopenharmony_ci or %ch,1(%esp) 84570af302Sopenharmony_ci ldmxcsr (%esp) 85570af302Sopenharmony_ci1: pop %ecx 86570af302Sopenharmony_ci ret 87570af302Sopenharmony_ci 88570af302Sopenharmony_ci.global fegetround 89570af302Sopenharmony_ci.type fegetround,@function 90570af302Sopenharmony_cifegetround: 91570af302Sopenharmony_ci push %eax 92570af302Sopenharmony_ci fnstcw (%esp) 93570af302Sopenharmony_ci pop %eax 94570af302Sopenharmony_ci and $0xc00,%eax 95570af302Sopenharmony_ci ret 96570af302Sopenharmony_ci 97570af302Sopenharmony_ci.global fegetenv 98570af302Sopenharmony_ci.type fegetenv,@function 99570af302Sopenharmony_cifegetenv: 100570af302Sopenharmony_ci mov 4(%esp),%ecx 101570af302Sopenharmony_ci xor %eax,%eax 102570af302Sopenharmony_ci fnstenv (%ecx) 103570af302Sopenharmony_ci # consider sse fenv as well if the cpu has XMM capability 104570af302Sopenharmony_ci call 1f 105570af302Sopenharmony_ci1: addl $__hwcap-1b,(%esp) 106570af302Sopenharmony_ci pop %edx 107570af302Sopenharmony_ci testl $0x02000000,(%edx) 108570af302Sopenharmony_ci jz 1f 109570af302Sopenharmony_ci push %eax 110570af302Sopenharmony_ci stmxcsr (%esp) 111570af302Sopenharmony_ci pop %edx 112570af302Sopenharmony_ci and $0x3f,%edx 113570af302Sopenharmony_ci or %edx,4(%ecx) 114570af302Sopenharmony_ci1: ret 115570af302Sopenharmony_ci 116570af302Sopenharmony_ci.global fesetenv 117570af302Sopenharmony_ci.type fesetenv,@function 118570af302Sopenharmony_cifesetenv: 119570af302Sopenharmony_ci mov 4(%esp),%ecx 120570af302Sopenharmony_ci xor %eax,%eax 121570af302Sopenharmony_ci inc %ecx 122570af302Sopenharmony_ci jz 1f 123570af302Sopenharmony_ci fldenv -1(%ecx) 124570af302Sopenharmony_ci movl -1(%ecx),%ecx 125570af302Sopenharmony_ci jmp 2f 126570af302Sopenharmony_ci1: push %eax 127570af302Sopenharmony_ci push %eax 128570af302Sopenharmony_ci push %eax 129570af302Sopenharmony_ci push %eax 130570af302Sopenharmony_ci pushl $0xffff 131570af302Sopenharmony_ci push %eax 132570af302Sopenharmony_ci pushl $0x37f 133570af302Sopenharmony_ci fldenv (%esp) 134570af302Sopenharmony_ci add $28,%esp 135570af302Sopenharmony_ci # consider sse fenv as well if the cpu has XMM capability 136570af302Sopenharmony_ci2: call 1f 137570af302Sopenharmony_ci1: addl $__hwcap-1b,(%esp) 138570af302Sopenharmony_ci pop %edx 139570af302Sopenharmony_ci testl $0x02000000,(%edx) 140570af302Sopenharmony_ci jz 1f 141570af302Sopenharmony_ci # mxcsr := same rounding mode, cleared exceptions, default mask 142570af302Sopenharmony_ci and $0xc00,%ecx 143570af302Sopenharmony_ci shl $3,%ecx 144570af302Sopenharmony_ci or $0x1f80,%ecx 145570af302Sopenharmony_ci mov %ecx,4(%esp) 146570af302Sopenharmony_ci ldmxcsr 4(%esp) 147570af302Sopenharmony_ci1: ret 148570af302Sopenharmony_ci 149570af302Sopenharmony_ci.global fetestexcept 150570af302Sopenharmony_ci.type fetestexcept,@function 151570af302Sopenharmony_cifetestexcept: 152570af302Sopenharmony_ci mov 4(%esp),%ecx 153570af302Sopenharmony_ci and $0x3f,%ecx 154570af302Sopenharmony_ci fnstsw %ax 155570af302Sopenharmony_ci # consider sse fenv as well if the cpu has XMM capability 156570af302Sopenharmony_ci call 1f 157570af302Sopenharmony_ci1: addl $__hwcap-1b,(%esp) 158570af302Sopenharmony_ci pop %edx 159570af302Sopenharmony_ci testl $0x02000000,(%edx) 160570af302Sopenharmony_ci jz 1f 161570af302Sopenharmony_ci stmxcsr 4(%esp) 162570af302Sopenharmony_ci or 4(%esp),%eax 163570af302Sopenharmony_ci1: and %ecx,%eax 164570af302Sopenharmony_ci ret 165