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