[compiler-rt] r215295 - builtins: correct __umodsi3, __udivsi3 on ARM
Saleem Abdulrasool
compnerd at compnerd.org
Sun Aug 10 13:06:13 PDT 2014
Hi Bill,
I realize that we are somewhat late in the cycle, but I think that this
should be merged into the 3.5 branch. Currently, an invocation of
__umodsi3 in a compiler-rt built with clang 3.5 for an ARM chip with idiv
may fault (if you are lucky) or plain corrupt memory.
The change is limited to ARMv7 with idiv and ARMv8 chips.
On Sat, Aug 9, 2014 at 1:17 PM, Saleem Abdulrasool <compnerd at compnerd.org>
wrote:
> Author: compnerd
> Date: Sat Aug 9 15:17:37 2014
> New Revision: 215295
>
> URL: http://llvm.org/viewvc/llvm-project?rev=215295&view=rev
> Log:
> 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
>
> Modified:
> compiler-rt/trunk/lib/builtins/arm/udivsi3.S
> compiler-rt/trunk/lib/builtins/arm/umodsi3.S
>
> Modified: compiler-rt/trunk/lib/builtins/arm/udivsi3.S
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/udivsi3.S?rev=215295&r1=215294&r2=215295&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/builtins/arm/udivsi3.S (original)
> +++ compiler-rt/trunk/lib/builtins/arm/udivsi3.S Sat Aug 9 15:17:37 2014
> @@ -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
>
> Modified: compiler-rt/trunk/lib/builtins/arm/umodsi3.S
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/umodsi3.S?rev=215295&r1=215294&r2=215295&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/builtins/arm/umodsi3.S (original)
> +++ compiler-rt/trunk/lib/builtins/arm/umodsi3.S Sat Aug 9 15:17:37 2014
> @@ -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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140810/e768ec57/attachment.html>
More information about the llvm-commits
mailing list