| #if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__) |
| .global feclearexcept |
| .type feclearexcept,@function |
| feclearexcept: |
| andis. 3,3,0x3e00 |
| /* if (r3 & FE_INVALID) r3 |= all_invalid_flags */ |
| andis. 0,3,0x2000 |
| stwu 1,-16(1) |
| beq- 0,1f |
| oris 3,3,0x01f8 |
| ori 3,3,0x0700 |
| 1: |
| /* |
| * note: fpscr contains various fpu status and control |
| * flags and we dont check if r3 may alter other flags |
| * than the exception related ones |
| * ufpscr &= ~r3 |
| */ |
| mffs 0 |
| stfd 0,8(1) |
| lwz 9,12(1) |
| andc 9,9,3 |
| stw 9,12(1) |
| lfd 0,8(1) |
| mtfsf 255,0 |
| |
| /* return 0 */ |
| li 3,0 |
| addi 1,1,16 |
| blr |
| |
| .global feraiseexcept |
| .type feraiseexcept,@function |
| feraiseexcept: |
| andis. 3,3,0x3e00 |
| /* if (r3 & FE_INVALID) r3 |= software_invalid_flag */ |
| andis. 0,3,0x2000 |
| stwu 1,-16(1) |
| beq- 0,1f |
| ori 3,3,0x0400 |
| 1: |
| /* fpscr |= r3 */ |
| mffs 0 |
| stfd 0,8(1) |
| lwz 9,12(1) |
| or 9,9,3 |
| stw 9,12(1) |
| lfd 0,8(1) |
| mtfsf 255,0 |
| |
| /* return 0 */ |
| li 3,0 |
| addi 1,1,16 |
| blr |
| |
| .global fetestexcept |
| .type fetestexcept,@function |
| fetestexcept: |
| andis. 3,3,0x3e00 |
| /* return r3 & fpscr */ |
| stwu 1,-16(1) |
| mffs 0 |
| stfd 0,8(1) |
| lwz 9,12(1) |
| addi 1,1,16 |
| and 3,3,9 |
| blr |
| |
| .global fegetround |
| .type fegetround,@function |
| fegetround: |
| /* return fpscr & 3 */ |
| stwu 1,-16(1) |
| mffs 0 |
| stfd 0,8(1) |
| lwz 3,12(1) |
| addi 1,1,16 |
| clrlwi 3,3,30 |
| blr |
| |
| .global __fesetround |
| .hidden __fesetround |
| .type __fesetround,@function |
| __fesetround: |
| /* |
| * note: invalid input is not checked, r3 < 4 must hold |
| * fpscr = (fpscr & -4U) | r3 |
| */ |
| stwu 1,-16(1) |
| mffs 0 |
| stfd 0,8(1) |
| lwz 9,12(1) |
| clrrwi 9,9,2 |
| or 9,9,3 |
| stw 9,12(1) |
| lfd 0,8(1) |
| mtfsf 255,0 |
| |
| /* return 0 */ |
| li 3,0 |
| addi 1,1,16 |
| blr |
| |
| .global fegetenv |
| .type fegetenv,@function |
| fegetenv: |
| /* *r3 = fpscr */ |
| mffs 0 |
| stfd 0,0(3) |
| /* return 0 */ |
| li 3,0 |
| blr |
| |
| .global fesetenv |
| .type fesetenv,@function |
| fesetenv: |
| cmpwi 3, -1 |
| bne 1f |
| mflr 4 |
| bl 2f |
| .zero 8 |
| 2: mflr 3 |
| mtlr 4 |
| 1: /* fpscr = *r3 */ |
| lfd 0,0(3) |
| mtfsf 255,0 |
| /* return 0 */ |
| li 3,0 |
| blr |
| #endif |