forked from OSchip/llvm-project
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:
parent
efb6eb2697
commit
6063983c30
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue