<div dir="ltr">This patch actually breaks umodsi3 on devices with CLZ, but without IDIV. In umodsi3, there is a computed jump (based on 4 byte ARM instructions), which ends up overshooting the end of the function for small inputs (in my case a 17 % 2 ended up crashing LLVM compilation on an ARM device). I am going to post a revert for this patch (and the related "add it blocks for Thumb-2") until someone wants to rewrite umodsi3 in a thumb/thumb2 friendly way.<div>
<br></div><div>Steve<br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 16, 2014 at 9:05 AM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank" class="cremed">compnerd@compnerd.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Mon Jun 16 11:05:24 2014<br>
New Revision: 211032<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=211032&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project?rev=211032&view=rev</a><br>
Log:<br>
compiler-rt: prefer thumb over ARM<br>
<br>
When possible, use Thumb or Thumb-2 over ARM instructions.  This is particularly<br>
important for pure-Thumb environments (e.g. Windows on ARM).  Although, it is<br>
possible to conditionalise this for that target specifically, this is available<br>
on most newer ARM CPUs, and the code remains compatible with older CPUs with no<br>
adverse effects.  It therefore feels better to always prefer Thumb when<br>
possible.<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/builtins/arm/bswapdi2.S<br>
    compiler-rt/trunk/lib/builtins/arm/bswapsi2.S<br>
    compiler-rt/trunk/lib/builtins/arm/clzdi2.S<br>
    compiler-rt/trunk/lib/builtins/arm/clzsi2.S<br>
    compiler-rt/trunk/lib/builtins/arm/divmodsi4.S<br>
    compiler-rt/trunk/lib/builtins/arm/divsi3.S<br>
    compiler-rt/trunk/lib/builtins/arm/modsi3.S<br>
    compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S<br>
    compiler-rt/trunk/lib/builtins/arm/udivsi3.S<br>
    compiler-rt/trunk/lib/builtins/arm/umodsi3.S<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/bswapdi2.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/bswapdi2.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/bswapdi2.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/bswapdi2.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/bswapdi2.S Mon Jun 16 11:05:24 2014<br>
@@ -11,6 +11,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
 //<br>
 // extern uint64_t __bswapdi2(uint64_t);<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/bswapsi2.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/bswapsi2.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/bswapsi2.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/bswapsi2.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/bswapsi2.S Mon Jun 16 11:05:24 2014<br>
@@ -11,6 +11,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
 //<br>
 // extern uint32_t __bswapsi2(uint32_t);<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/clzdi2.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/clzdi2.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/clzdi2.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/clzdi2.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/clzdi2.S Mon Jun 16 11:05:24 2014<br>
@@ -15,6 +15,10 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
+<br>
<br>
        .p2align        2<br>
 DEFINE_COMPILERRT_FUNCTION(__clzdi2)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/clzsi2.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/clzsi2.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/clzsi2.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/clzsi2.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/clzsi2.S Mon Jun 16 11:05:24 2014<br>
@@ -15,6 +15,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align        2<br>
 DEFINE_COMPILERRT_FUNCTION(__clzsi2)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/divmodsi4.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/divmodsi4.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/divmodsi4.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/divmodsi4.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/divmodsi4.S Mon Jun 16 11:05:24 2014<br>
@@ -23,6 +23,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 3<br>
 DEFINE_COMPILERRT_FUNCTION(__divmodsi4)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/divsi3.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/divsi3.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/divsi3.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/divsi3.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/divsi3.S Mon Jun 16 11:05:24 2014<br>
@@ -22,6 +22,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 3<br>
 // Ok, APCS and AAPCS agree on 32 bit args, so it's safe to use the same routine.<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/modsi3.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/modsi3.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/modsi3.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/modsi3.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/modsi3.S Mon Jun 16 11:05:24 2014<br>
@@ -22,6 +22,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 3<br>
 DEFINE_COMPILERRT_FUNCTION(__modsi3)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/udivmodsi4.S Mon Jun 16 11:05:24 2014<br>
@@ -16,6 +16,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 2<br>
 DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/udivsi3.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/udivsi3.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/udivsi3.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/udivsi3.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/udivsi3.S Mon Jun 16 11:05:24 2014<br>
@@ -16,6 +16,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 2<br>
 DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_uidiv, __udivsi3)<br>
<br>
Modified: compiler-rt/trunk/lib/builtins/arm/umodsi3.S<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/umodsi3.S?rev=211032&r1=211031&r2=211032&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/arm/umodsi3.S?rev=211032&r1=211031&r2=211032&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/builtins/arm/umodsi3.S (original)<br>
+++ compiler-rt/trunk/lib/builtins/arm/umodsi3.S Mon Jun 16 11:05:24 2014<br>
@@ -16,6 +16,9 @@<br>
<br>
        .syntax unified<br>
        .text<br>
+#if __ARM_ARCH_ISA_THUMB == 2<br>
+       .thumb<br>
+#endif<br>
<br>
        .p2align 2<br>
 DEFINE_COMPILERRT_FUNCTION(__umodsi3)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" class="cremed">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div></div>