diff options
author | bwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-10 15:56:54 +0000 |
---|---|---|
committer | bwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-10 15:56:54 +0000 |
commit | 324c3b05da99cf3c15014f16caea6f882d7f488c (patch) | |
tree | 4715ee966d698dfff465a73c768442861f0c32b7 /gcc/config/xtensa/lib1funcs.asm | |
parent | 95b8d1bcbb4add3edbf7f6e54ecf9a9b2a0955e4 (diff) | |
download | gcc-324c3b05da99cf3c15014f16caea6f882d7f488c.tar.gz |
* config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Rearrange special
case code to avoid one move instruction.
(__umodsi3, __modsi3): Merge duplicated code sequences.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99520 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/xtensa/lib1funcs.asm')
-rw-r--r-- | gcc/config/xtensa/lib1funcs.asm | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/gcc/config/xtensa/lib1funcs.asm b/gcc/config/xtensa/lib1funcs.asm index 1b11dafdca4..bc3c45218f0 100644 --- a/gcc/config/xtensa/lib1funcs.asm +++ b/gcc/config/xtensa/lib1funcs.asm @@ -299,19 +299,21 @@ __udivsi3: .Lreturn: abi_return +.Lle_one: + beqz a3, .Lerror # if divisor == 1, return the dividend + abi_return + .Lspecial: # return dividend >= divisor - movi a2, 0 - bltu a6, a3, .Lreturn2 + bltu a6, a3, .Lreturn0 movi a2, 1 -.Lreturn2: abi_return -.Lle_one: - beqz a3, .Lerror # if divisor == 1, return the dividend - 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 +.Lle_one: + beqz a3, .Lerror + neg a2, a6 # if udivisor == 1, then return... + movgez a2, a6, a7 # (sign < 0) ? -udividend : udividend + abi_return + .Lspecial: - movi a2, 0 - bltu a6, a3, .Lreturn2 # if dividend < divisor, return 0 + 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 -.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 .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. |