lib1funcs.asm (__udivsi3, __divsi3): Rearrange special case code to avoid one move instruction.
* config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Rearrange special case code to avoid one move instruction. (__umodsi3, __modsi3): Merge duplicated code sequences. From-SVN: r99520
This commit is contained in:
parent
ee58dffdbc
commit
53e0077e6f
|
@ -1,3 +1,9 @@
|
|||
2005-05-10 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Rearrange special
|
||||
case code to avoid one move instruction.
|
||||
(__umodsi3, __modsi3): Merge duplicated code sequences.
|
||||
|
||||
2005-05-10 Kazu Hirata <kazu@cs.umass.edu>
|
||||
|
||||
* config/mips/24k.md, config/sh/divtab.c, config/sh/sh.c,
|
||||
|
|
|
@ -299,19 +299,21 @@ __udivsi3:
|
|||
.Lreturn:
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
# return dividend >= divisor
|
||||
movi a2, 0
|
||||
bltu a6, a3, .Lreturn2
|
||||
movi a2, 1
|
||||
.Lreturn2:
|
||||
abi_return
|
||||
|
||||
.Lle_one:
|
||||
beqz a3, .Lerror # if divisor == 1, return the dividend
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
# return dividend >= divisor
|
||||
bltu a6, a3, .Lreturn0
|
||||
movi a2, 1
|
||||
abi_return
|
||||
|
||||
.Lerror:
|
||||
movi a2, 0 # just return 0; could throw an exception
|
||||
# just return 0; could throw an exception
|
||||
|
||||
.Lreturn0:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
.size __udivsi3,.-__udivsi3
|
||||
|
||||
|
@ -361,22 +363,24 @@ __divsi3:
|
|||
movltz a2, a5, a7 # return (sign < 0) ? -quotient : quotient
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
movi a2, 0
|
||||
bltu a6, a3, .Lreturn2 # if dividend < divisor, return 0
|
||||
movi a2, 1
|
||||
movi a4, -1
|
||||
movltz a2, a4, a7 # else return (sign < 0) ? -1 : 1
|
||||
.Lreturn2:
|
||||
abi_return
|
||||
|
||||
.Lle_one:
|
||||
beqz a3, .Lerror
|
||||
neg a2, a6 # if udivisor == 1, then return...
|
||||
movgez a2, a6, a7 # (sign < 0) ? -udividend : udividend
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
bltu a6, a3, .Lreturn0 # if dividend < divisor, return 0
|
||||
movi a2, 1
|
||||
movi a4, -1
|
||||
movltz a2, a4, a7 # else return (sign < 0) ? -1 : 1
|
||||
abi_return
|
||||
|
||||
.Lerror:
|
||||
movi a2, 0 # just return 0; could throw an exception
|
||||
# just return 0; could throw an exception
|
||||
|
||||
.Lreturn0:
|
||||
movi a2, 0
|
||||
abi_return
|
||||
.size __divsi3,.-__divsi3
|
||||
|
||||
|
@ -414,17 +418,12 @@ __umodsi3:
|
|||
#endif /* !XCHAL_HAVE_LOOPS */
|
||||
.Lloopend:
|
||||
|
||||
.Lspecial:
|
||||
bltu a2, a3, .Lreturn
|
||||
sub a2, a2, a3 # subtract once more if dividend >= divisor
|
||||
.Lreturn:
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
bltu a2, a3, .Lreturn2
|
||||
sub a2, a2, a3 # subtract once if dividend >= divisor
|
||||
.Lreturn2:
|
||||
abi_return
|
||||
|
||||
.Lle_one:
|
||||
# the divisor is either 0 or 1, so just return 0.
|
||||
# someday we may want to throw an exception if the divisor is 0.
|
||||
|
@ -468,6 +467,7 @@ __modsi3:
|
|||
#endif /* !XCHAL_HAVE_LOOPS */
|
||||
.Lloopend:
|
||||
|
||||
.Lspecial:
|
||||
bltu a2, a3, .Lreturn
|
||||
sub a2, a2, a3 # subtract once more if udividend >= udivisor
|
||||
.Lreturn:
|
||||
|
@ -476,15 +476,6 @@ __modsi3:
|
|||
.Lpositive:
|
||||
abi_return
|
||||
|
||||
.Lspecial:
|
||||
bltu a2, a3, .Lreturn2
|
||||
sub a2, a2, a3 # subtract once if dividend >= divisor
|
||||
.Lreturn2:
|
||||
bgez a7, .Lpositive2
|
||||
neg a2, a2 # if (dividend < 0), return -udividend
|
||||
.Lpositive2:
|
||||
abi_return
|
||||
|
||||
.Lle_one:
|
||||
# udivisor is either 0 or 1, so just return 0.
|
||||
# someday we may want to throw an exception if udivisor is 0.
|
||||
|
|
Loading…
Reference in New Issue