1570af302Sopenharmony_ci#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__) 2570af302Sopenharmony_ci.global feclearexcept 3570af302Sopenharmony_ci.type feclearexcept,@function 4570af302Sopenharmony_cifeclearexcept: 5570af302Sopenharmony_ci andis. 3,3,0x3e00 6570af302Sopenharmony_ci /* if (r3 & FE_INVALID) r3 |= all_invalid_flags */ 7570af302Sopenharmony_ci andis. 0,3,0x2000 8570af302Sopenharmony_ci stwu 1,-16(1) 9570af302Sopenharmony_ci beq- 0,1f 10570af302Sopenharmony_ci oris 3,3,0x01f8 11570af302Sopenharmony_ci ori 3,3,0x0700 12570af302Sopenharmony_ci1: 13570af302Sopenharmony_ci /* 14570af302Sopenharmony_ci * note: fpscr contains various fpu status and control 15570af302Sopenharmony_ci * flags and we dont check if r3 may alter other flags 16570af302Sopenharmony_ci * than the exception related ones 17570af302Sopenharmony_ci * ufpscr &= ~r3 18570af302Sopenharmony_ci */ 19570af302Sopenharmony_ci mffs 0 20570af302Sopenharmony_ci stfd 0,8(1) 21570af302Sopenharmony_ci lwz 9,12(1) 22570af302Sopenharmony_ci andc 9,9,3 23570af302Sopenharmony_ci stw 9,12(1) 24570af302Sopenharmony_ci lfd 0,8(1) 25570af302Sopenharmony_ci mtfsf 255,0 26570af302Sopenharmony_ci 27570af302Sopenharmony_ci /* return 0 */ 28570af302Sopenharmony_ci li 3,0 29570af302Sopenharmony_ci addi 1,1,16 30570af302Sopenharmony_ci blr 31570af302Sopenharmony_ci 32570af302Sopenharmony_ci.global feraiseexcept 33570af302Sopenharmony_ci.type feraiseexcept,@function 34570af302Sopenharmony_ciferaiseexcept: 35570af302Sopenharmony_ci andis. 3,3,0x3e00 36570af302Sopenharmony_ci /* if (r3 & FE_INVALID) r3 |= software_invalid_flag */ 37570af302Sopenharmony_ci andis. 0,3,0x2000 38570af302Sopenharmony_ci stwu 1,-16(1) 39570af302Sopenharmony_ci beq- 0,1f 40570af302Sopenharmony_ci ori 3,3,0x0400 41570af302Sopenharmony_ci1: 42570af302Sopenharmony_ci /* fpscr |= r3 */ 43570af302Sopenharmony_ci mffs 0 44570af302Sopenharmony_ci stfd 0,8(1) 45570af302Sopenharmony_ci lwz 9,12(1) 46570af302Sopenharmony_ci or 9,9,3 47570af302Sopenharmony_ci stw 9,12(1) 48570af302Sopenharmony_ci lfd 0,8(1) 49570af302Sopenharmony_ci mtfsf 255,0 50570af302Sopenharmony_ci 51570af302Sopenharmony_ci /* return 0 */ 52570af302Sopenharmony_ci li 3,0 53570af302Sopenharmony_ci addi 1,1,16 54570af302Sopenharmony_ci blr 55570af302Sopenharmony_ci 56570af302Sopenharmony_ci.global fetestexcept 57570af302Sopenharmony_ci.type fetestexcept,@function 58570af302Sopenharmony_cifetestexcept: 59570af302Sopenharmony_ci andis. 3,3,0x3e00 60570af302Sopenharmony_ci /* return r3 & fpscr */ 61570af302Sopenharmony_ci stwu 1,-16(1) 62570af302Sopenharmony_ci mffs 0 63570af302Sopenharmony_ci stfd 0,8(1) 64570af302Sopenharmony_ci lwz 9,12(1) 65570af302Sopenharmony_ci addi 1,1,16 66570af302Sopenharmony_ci and 3,3,9 67570af302Sopenharmony_ci blr 68570af302Sopenharmony_ci 69570af302Sopenharmony_ci.global fegetround 70570af302Sopenharmony_ci.type fegetround,@function 71570af302Sopenharmony_cifegetround: 72570af302Sopenharmony_ci /* return fpscr & 3 */ 73570af302Sopenharmony_ci stwu 1,-16(1) 74570af302Sopenharmony_ci mffs 0 75570af302Sopenharmony_ci stfd 0,8(1) 76570af302Sopenharmony_ci lwz 3,12(1) 77570af302Sopenharmony_ci addi 1,1,16 78570af302Sopenharmony_ci clrlwi 3,3,30 79570af302Sopenharmony_ci blr 80570af302Sopenharmony_ci 81570af302Sopenharmony_ci.global __fesetround 82570af302Sopenharmony_ci.hidden __fesetround 83570af302Sopenharmony_ci.type __fesetround,@function 84570af302Sopenharmony_ci__fesetround: 85570af302Sopenharmony_ci /* 86570af302Sopenharmony_ci * note: invalid input is not checked, r3 < 4 must hold 87570af302Sopenharmony_ci * fpscr = (fpscr & -4U) | r3 88570af302Sopenharmony_ci */ 89570af302Sopenharmony_ci stwu 1,-16(1) 90570af302Sopenharmony_ci mffs 0 91570af302Sopenharmony_ci stfd 0,8(1) 92570af302Sopenharmony_ci lwz 9,12(1) 93570af302Sopenharmony_ci clrrwi 9,9,2 94570af302Sopenharmony_ci or 9,9,3 95570af302Sopenharmony_ci stw 9,12(1) 96570af302Sopenharmony_ci lfd 0,8(1) 97570af302Sopenharmony_ci mtfsf 255,0 98570af302Sopenharmony_ci 99570af302Sopenharmony_ci /* return 0 */ 100570af302Sopenharmony_ci li 3,0 101570af302Sopenharmony_ci addi 1,1,16 102570af302Sopenharmony_ci blr 103570af302Sopenharmony_ci 104570af302Sopenharmony_ci.global fegetenv 105570af302Sopenharmony_ci.type fegetenv,@function 106570af302Sopenharmony_cifegetenv: 107570af302Sopenharmony_ci /* *r3 = fpscr */ 108570af302Sopenharmony_ci mffs 0 109570af302Sopenharmony_ci stfd 0,0(3) 110570af302Sopenharmony_ci /* return 0 */ 111570af302Sopenharmony_ci li 3,0 112570af302Sopenharmony_ci blr 113570af302Sopenharmony_ci 114570af302Sopenharmony_ci.global fesetenv 115570af302Sopenharmony_ci.type fesetenv,@function 116570af302Sopenharmony_cifesetenv: 117570af302Sopenharmony_ci cmpwi 3, -1 118570af302Sopenharmony_ci bne 1f 119570af302Sopenharmony_ci mflr 4 120570af302Sopenharmony_ci bl 2f 121570af302Sopenharmony_ci .zero 8 122570af302Sopenharmony_ci2: mflr 3 123570af302Sopenharmony_ci mtlr 4 124570af302Sopenharmony_ci1: /* fpscr = *r3 */ 125570af302Sopenharmony_ci lfd 0,0(3) 126570af302Sopenharmony_ci mtfsf 255,0 127570af302Sopenharmony_ci /* return 0 */ 128570af302Sopenharmony_ci li 3,0 129570af302Sopenharmony_ci blr 130570af302Sopenharmony_ci#endif 131