@ -1,18 +1,21 @@
# ifndef _SOFT_FLOAT
.global feclearexcept
.type feclearexcept , @function
feclearexcept:
andis. 3 , 3 , 0x3e00
# if ( r3 & FE_INVALID ) r3 | = all_invalid_flags
/ * if ( r3 & FE_INVALID ) r3 | = all_invalid_flags * /
andis. 0 , 3 , 0x2000
stwu 1 ,- 16 ( 1 )
beq- 0 , 1 f
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
# fpscr & = ~ r3
/ *
* 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 )
@ -21,7 +24,7 @@ feclearexcept:
lfd 0 , 8 ( 1 )
mtfsf 255 , 0
# return 0
/ * return 0 * /
li 3 , 0
addi 1 , 1 , 16
blr
@ -30,13 +33,13 @@ feclearexcept:
.type feraiseexcept , @function
feraiseexcept:
andis. 3 , 3 , 0x3e00
# if ( r3 & FE_INVALID ) r3 | = software_invalid_flag
/ * if ( r3 & FE_INVALID ) r3 | = software_invalid_flag * /
andis. 0 , 3 , 0x2000
stwu 1 ,- 16 ( 1 )
beq- 0 , 1 f
ori 3 , 3 , 0x0400
1 :
# fpscr | = r3
/ * fpscr | = r3 * /
mffs 0
stfd 0 , 8 ( 1 )
lwz 9 , 12 ( 1 )
@ -45,7 +48,7 @@ feraiseexcept:
lfd 0 , 8 ( 1 )
mtfsf 255 , 0
# return 0
/ * return 0 * /
li 3 , 0
addi 1 , 1 , 16
blr
@ -54,7 +57,7 @@ feraiseexcept:
.type fetestexcept , @function
fetestexcept:
andis. 3 , 3 , 0x3e00
# return r3 & fpscr
/ * return r3 & fpscr * /
stwu 1 ,- 16 ( 1 )
mffs 0
stfd 0 , 8 ( 1 )
@ -66,7 +69,7 @@ fetestexcept:
.global fegetround
.type fegetround , @function
fegetround:
# return fpscr & 3
/ * return fpscr & 3 * /
stwu 1 ,- 16 ( 1 )
mffs 0
stfd 0 , 8 ( 1 )
@ -78,8 +81,10 @@ fegetround:
.global __fesetround
.type __fesetround , @function
__fesetround:
# note: invalid input is not checked , r3 < 4 must hold
# fpscr = ( fpscr & - 4 U ) | r3
/ *
* note: invalid input is not checked , r3 < 4 must hold
* fpscr = ( fpscr & - 4 U ) | r3
* /
stwu 1 ,- 16 ( 1 )
mffs 0
stfd 0 , 8 ( 1 )
@ -90,7 +95,7 @@ __fesetround:
lfd 0 , 8 ( 1 )
mtfsf 255 , 0
# return 0
/ * return 0 * /
li 3 , 0
addi 1 , 1 , 16
blr
@ -98,10 +103,10 @@ __fesetround:
.global fegetenv
.type fegetenv , @function
fegetenv:
# * r3 = fpscr
/ * * r3 = fpscr * /
mffs 0
stfd 0 , 0 ( 3 )
# return 0
/ * return 0 * /
li 3 , 0
blr
@ -115,9 +120,10 @@ fesetenv:
.zero 8
2 : mflr 3
mtlr 4
1 : # fpscr = * r3
1 : / * fpscr = * r3 * /
lfd 0 , 0 ( 3 )
mtfsf 255 , 0
# return 0
/ * return 0 * /
li 3 , 0
blr
# endif