1*c9945492SAndroid Build Coastguard Worker#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__) 2*c9945492SAndroid Build Coastguard Worker.global feclearexcept 3*c9945492SAndroid Build Coastguard Worker.type feclearexcept,@function 4*c9945492SAndroid Build Coastguard Workerfeclearexcept: 5*c9945492SAndroid Build Coastguard Worker andis. 3,3,0x3e00 6*c9945492SAndroid Build Coastguard Worker /* if (r3 & FE_INVALID) r3 |= all_invalid_flags */ 7*c9945492SAndroid Build Coastguard Worker andis. 0,3,0x2000 8*c9945492SAndroid Build Coastguard Worker stwu 1,-16(1) 9*c9945492SAndroid Build Coastguard Worker beq- 0,1f 10*c9945492SAndroid Build Coastguard Worker oris 3,3,0x01f8 11*c9945492SAndroid Build Coastguard Worker ori 3,3,0x0700 12*c9945492SAndroid Build Coastguard Worker1: 13*c9945492SAndroid Build Coastguard Worker /* 14*c9945492SAndroid Build Coastguard Worker * note: fpscr contains various fpu status and control 15*c9945492SAndroid Build Coastguard Worker * flags and we dont check if r3 may alter other flags 16*c9945492SAndroid Build Coastguard Worker * than the exception related ones 17*c9945492SAndroid Build Coastguard Worker * ufpscr &= ~r3 18*c9945492SAndroid Build Coastguard Worker */ 19*c9945492SAndroid Build Coastguard Worker mffs 0 20*c9945492SAndroid Build Coastguard Worker stfd 0,8(1) 21*c9945492SAndroid Build Coastguard Worker lwz 9,12(1) 22*c9945492SAndroid Build Coastguard Worker andc 9,9,3 23*c9945492SAndroid Build Coastguard Worker stw 9,12(1) 24*c9945492SAndroid Build Coastguard Worker lfd 0,8(1) 25*c9945492SAndroid Build Coastguard Worker mtfsf 255,0 26*c9945492SAndroid Build Coastguard Worker 27*c9945492SAndroid Build Coastguard Worker /* return 0 */ 28*c9945492SAndroid Build Coastguard Worker li 3,0 29*c9945492SAndroid Build Coastguard Worker addi 1,1,16 30*c9945492SAndroid Build Coastguard Worker blr 31*c9945492SAndroid Build Coastguard Worker 32*c9945492SAndroid Build Coastguard Worker.global feraiseexcept 33*c9945492SAndroid Build Coastguard Worker.type feraiseexcept,@function 34*c9945492SAndroid Build Coastguard Workerferaiseexcept: 35*c9945492SAndroid Build Coastguard Worker andis. 3,3,0x3e00 36*c9945492SAndroid Build Coastguard Worker /* if (r3 & FE_INVALID) r3 |= software_invalid_flag */ 37*c9945492SAndroid Build Coastguard Worker andis. 0,3,0x2000 38*c9945492SAndroid Build Coastguard Worker stwu 1,-16(1) 39*c9945492SAndroid Build Coastguard Worker beq- 0,1f 40*c9945492SAndroid Build Coastguard Worker ori 3,3,0x0400 41*c9945492SAndroid Build Coastguard Worker1: 42*c9945492SAndroid Build Coastguard Worker /* fpscr |= r3 */ 43*c9945492SAndroid Build Coastguard Worker mffs 0 44*c9945492SAndroid Build Coastguard Worker stfd 0,8(1) 45*c9945492SAndroid Build Coastguard Worker lwz 9,12(1) 46*c9945492SAndroid Build Coastguard Worker or 9,9,3 47*c9945492SAndroid Build Coastguard Worker stw 9,12(1) 48*c9945492SAndroid Build Coastguard Worker lfd 0,8(1) 49*c9945492SAndroid Build Coastguard Worker mtfsf 255,0 50*c9945492SAndroid Build Coastguard Worker 51*c9945492SAndroid Build Coastguard Worker /* return 0 */ 52*c9945492SAndroid Build Coastguard Worker li 3,0 53*c9945492SAndroid Build Coastguard Worker addi 1,1,16 54*c9945492SAndroid Build Coastguard Worker blr 55*c9945492SAndroid Build Coastguard Worker 56*c9945492SAndroid Build Coastguard Worker.global fetestexcept 57*c9945492SAndroid Build Coastguard Worker.type fetestexcept,@function 58*c9945492SAndroid Build Coastguard Workerfetestexcept: 59*c9945492SAndroid Build Coastguard Worker andis. 3,3,0x3e00 60*c9945492SAndroid Build Coastguard Worker /* return r3 & fpscr */ 61*c9945492SAndroid Build Coastguard Worker stwu 1,-16(1) 62*c9945492SAndroid Build Coastguard Worker mffs 0 63*c9945492SAndroid Build Coastguard Worker stfd 0,8(1) 64*c9945492SAndroid Build Coastguard Worker lwz 9,12(1) 65*c9945492SAndroid Build Coastguard Worker addi 1,1,16 66*c9945492SAndroid Build Coastguard Worker and 3,3,9 67*c9945492SAndroid Build Coastguard Worker blr 68*c9945492SAndroid Build Coastguard Worker 69*c9945492SAndroid Build Coastguard Worker.global fegetround 70*c9945492SAndroid Build Coastguard Worker.type fegetround,@function 71*c9945492SAndroid Build Coastguard Workerfegetround: 72*c9945492SAndroid Build Coastguard Worker /* return fpscr & 3 */ 73*c9945492SAndroid Build Coastguard Worker stwu 1,-16(1) 74*c9945492SAndroid Build Coastguard Worker mffs 0 75*c9945492SAndroid Build Coastguard Worker stfd 0,8(1) 76*c9945492SAndroid Build Coastguard Worker lwz 3,12(1) 77*c9945492SAndroid Build Coastguard Worker addi 1,1,16 78*c9945492SAndroid Build Coastguard Worker clrlwi 3,3,30 79*c9945492SAndroid Build Coastguard Worker blr 80*c9945492SAndroid Build Coastguard Worker 81*c9945492SAndroid Build Coastguard Worker.global __fesetround 82*c9945492SAndroid Build Coastguard Worker.hidden __fesetround 83*c9945492SAndroid Build Coastguard Worker.type __fesetround,@function 84*c9945492SAndroid Build Coastguard Worker__fesetround: 85*c9945492SAndroid Build Coastguard Worker /* 86*c9945492SAndroid Build Coastguard Worker * note: invalid input is not checked, r3 < 4 must hold 87*c9945492SAndroid Build Coastguard Worker * fpscr = (fpscr & -4U) | r3 88*c9945492SAndroid Build Coastguard Worker */ 89*c9945492SAndroid Build Coastguard Worker stwu 1,-16(1) 90*c9945492SAndroid Build Coastguard Worker mffs 0 91*c9945492SAndroid Build Coastguard Worker stfd 0,8(1) 92*c9945492SAndroid Build Coastguard Worker lwz 9,12(1) 93*c9945492SAndroid Build Coastguard Worker clrrwi 9,9,2 94*c9945492SAndroid Build Coastguard Worker or 9,9,3 95*c9945492SAndroid Build Coastguard Worker stw 9,12(1) 96*c9945492SAndroid Build Coastguard Worker lfd 0,8(1) 97*c9945492SAndroid Build Coastguard Worker mtfsf 255,0 98*c9945492SAndroid Build Coastguard Worker 99*c9945492SAndroid Build Coastguard Worker /* return 0 */ 100*c9945492SAndroid Build Coastguard Worker li 3,0 101*c9945492SAndroid Build Coastguard Worker addi 1,1,16 102*c9945492SAndroid Build Coastguard Worker blr 103*c9945492SAndroid Build Coastguard Worker 104*c9945492SAndroid Build Coastguard Worker.global fegetenv 105*c9945492SAndroid Build Coastguard Worker.type fegetenv,@function 106*c9945492SAndroid Build Coastguard Workerfegetenv: 107*c9945492SAndroid Build Coastguard Worker /* *r3 = fpscr */ 108*c9945492SAndroid Build Coastguard Worker mffs 0 109*c9945492SAndroid Build Coastguard Worker stfd 0,0(3) 110*c9945492SAndroid Build Coastguard Worker /* return 0 */ 111*c9945492SAndroid Build Coastguard Worker li 3,0 112*c9945492SAndroid Build Coastguard Worker blr 113*c9945492SAndroid Build Coastguard Worker 114*c9945492SAndroid Build Coastguard Worker.global fesetenv 115*c9945492SAndroid Build Coastguard Worker.type fesetenv,@function 116*c9945492SAndroid Build Coastguard Workerfesetenv: 117*c9945492SAndroid Build Coastguard Worker cmpwi 3, -1 118*c9945492SAndroid Build Coastguard Worker bne 1f 119*c9945492SAndroid Build Coastguard Worker mflr 4 120*c9945492SAndroid Build Coastguard Worker bl 2f 121*c9945492SAndroid Build Coastguard Worker .zero 8 122*c9945492SAndroid Build Coastguard Worker2: mflr 3 123*c9945492SAndroid Build Coastguard Worker mtlr 4 124*c9945492SAndroid Build Coastguard Worker1: /* fpscr = *r3 */ 125*c9945492SAndroid Build Coastguard Worker lfd 0,0(3) 126*c9945492SAndroid Build Coastguard Worker mtfsf 255,0 127*c9945492SAndroid Build Coastguard Worker /* return 0 */ 128*c9945492SAndroid Build Coastguard Worker li 3,0 129*c9945492SAndroid Build Coastguard Worker blr 130*c9945492SAndroid Build Coastguard Worker#endif 131