builtins: correct __umodsi3, __udivsi3 on ARM

When building the builtins for a modern CPU (idiv support), __umodsi3 was
completely incorrect as it would behave as __udivmosi3, which takes a tertiary
parameter which is a pointer.

__udivsi3 was also incorrect, returning the remainder in r1.  Although this
would not result in any crash or invalid behaviour as r1 is a caller saved
register in AAPCS, this is unnecessary.  Simply perform the division ignoring
the remainder.

llvm-svn: 215295
This commit is contained in:
Saleem Abdulrasool 2014-08-09 20:17:37 +00:00
parent efb6eb2697
commit 6063983c30
2 changed files with 3 additions and 7 deletions

View File

@ -27,9 +27,7 @@ DEFINE_COMPILERRT_FUNCTION(__udivsi3)
#if __ARM_ARCH_EXT_IDIV__
tst r1, r1
beq LOCAL_LABEL(divby0)
mov r3, r0
udiv r0, r3, r1
mls r1, r0, r1, r3
udiv r0, r0, r1
bx lr
#else
cmp r1, #1

View File

@ -25,10 +25,8 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)
#if __ARM_ARCH_EXT_IDIV__
tst r1, r1
beq LOCAL_LABEL(divby0)
mov r3, r0
udiv r0, r3, r1
mls r1, r0, r1, r3
str r1, [r2]
udiv r2, r0, r1
mls r0, r2, r1, r0
bx lr
#else
cmp r1, #1