[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