Skip to content

Commit

Permalink
[builtins][ARM] Select correct code fragments when compiling for Thum…
Browse files Browse the repository at this point in the history
…b1/Thum2/ARM ISA

Summary:
Value of __ARM_ARCH_ISA_THUMB isn't based on the actual compilation
 mode (-mthumb, -marm), it reflect's capability of given CPU.

Due to this:
•use tbumb and thumb2 insteand of __ARM_ARCH_ISA_THUMB
•use '.thumb' directive consistently in all affected files
•decorate all thumb functions using DEFINE_COMPILERRT_THUMB_FUNCTION()

(This is based off  Michal's patch https://reviews.llvm.org/D30938)

Reviewers: dim, rengolin, compnerd, strejda

Reviewed By: compnerd

Subscribers: peter.smith, kubamracek, mgorny, javed.absar, kristof.beyls, jamesduley, aemerson, llvm-commits

Differential Revision: https://reviews.llvm.org/D31220

llvm-svn: 310884
  • Loading branch information
Weiming Zhao committed Aug 14, 2017
1 parent b52b141 commit 8bf1572
Show file tree
Hide file tree
Showing 16 changed files with 95 additions and 128 deletions.
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/aeabi_cdcmp.S
Expand Up @@ -30,7 +30,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cdcmpeq)
push {r0-r3, lr}
bl __aeabi_cdcmpeq_check_nan
cmp r0, #1
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
beq 1f
// NaN has been ruled out, so __aeabi_cdcmple can't trap
mov r0, sp
Expand Down Expand Up @@ -78,7 +78,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cdcmple)

bl __aeabi_dcmplt
cmp r0, #1
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
bne 1f
// Z = 0, C = 0
movs r0, #1
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/aeabi_cfcmp.S
Expand Up @@ -30,7 +30,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmpeq)
push {r0-r3, lr}
bl __aeabi_cfcmpeq_check_nan
cmp r0, #1
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
beq 1f
// NaN has been ruled out, so __aeabi_cfcmple can't trap
mov r0, sp
Expand Down Expand Up @@ -78,7 +78,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmple)

bl __aeabi_fcmplt
cmp r0, #1
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
bne 1f
// Z = 0, C = 0
movs r0, #1
Expand Down
8 changes: 5 additions & 3 deletions compiler-rt/lib/builtins/arm/aeabi_idivmod.S
Expand Up @@ -20,16 +20,18 @@
#endif

.syntax unified
.text
DEFINE_CODE_STATE
.p2align 2
DEFINE_COMPILERRT_FUNCTION(__aeabi_idivmod)
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
push {r0, r1, lr}
bl SYMBOL_NAME(__divsi3)
pop {r1, r2, r3} // now r0 = quot, r1 = num, r2 = denom
muls r2, r0, r2 // r2 = quot * denom
subs r1, r1, r2
JMP (r3)
#else
#else // defined(USE_THUMB_1)
push { lr }
sub sp, sp, #4
mov r2, sp
Expand All @@ -42,7 +44,7 @@ DEFINE_COMPILERRT_FUNCTION(__aeabi_idivmod)
ldr r1, [sp]
add sp, sp, #4
pop { pc }
#endif // __ARM_ARCH_ISA_THUMB == 1
#endif // defined(USE_THUMB_1)
END_COMPILERRT_FUNCTION(__aeabi_idivmod)

NO_EXEC_STACK_DIRECTIVE
Expand Down
6 changes: 4 additions & 2 deletions compiler-rt/lib/builtins/arm/aeabi_uidivmod.S
Expand Up @@ -21,9 +21,11 @@
#endif

.syntax unified
.text
DEFINE_CODE_STATE
.p2align 2
DEFINE_COMPILERRT_FUNCTION(__aeabi_uidivmod)
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
cmp r0, r1
bcc LOCAL_LABEL(case_denom_larger)
push {r0, r1, lr}
Expand All @@ -36,7 +38,7 @@ LOCAL_LABEL(case_denom_larger):
movs r1, r0
movs r0, #0
JMP (lr)
#else
#else // defined(USE_THUMB_1)
push { lr }
sub sp, sp, #4
mov r2, sp
Expand Down
8 changes: 1 addition & 7 deletions compiler-rt/lib/builtins/arm/bswapdi2.S
Expand Up @@ -11,21 +11,15 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
DEFINE_CODE_STATE

//
// extern uint64_t __bswapdi2(uint64_t);
//
// Reverse all the bytes in a 64-bit integer.
//
.p2align 2
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__bswapdi2)
#else
DEFINE_COMPILERRT_FUNCTION(__bswapdi2)
#endif
#if __ARM_ARCH < 6
// before armv6 does not have "rev" instruction
// r2 = rev(r0)
Expand Down
8 changes: 1 addition & 7 deletions compiler-rt/lib/builtins/arm/bswapsi2.S
Expand Up @@ -11,21 +11,15 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
DEFINE_CODE_STATE

//
// extern uint32_t __bswapsi2(uint32_t);
//
// Reverse all the bytes in a 32-bit integer.
//
.p2align 2
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__bswapsi2)
#else
DEFINE_COMPILERRT_FUNCTION(__bswapsi2)
#endif
#if __ARM_ARCH < 6
// before armv6 does not have "rev" instruction
eor r1, r0, r0, ror #16
Expand Down
9 changes: 1 addition & 8 deletions compiler-rt/lib/builtins/arm/clzdi2.S
Expand Up @@ -15,17 +15,10 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif

DEFINE_CODE_STATE

.p2align 2
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__clzdi2)
#else
DEFINE_COMPILERRT_FUNCTION(__clzdi2)
#endif
#ifdef __ARM_FEATURE_CLZ
#ifdef __ARMEB__
cmp r0, 0
Expand Down
8 changes: 1 addition & 7 deletions compiler-rt/lib/builtins/arm/clzsi2.S
Expand Up @@ -15,16 +15,10 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
DEFINE_CODE_STATE

.p2align 2
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__clzsi2)
#else
DEFINE_COMPILERRT_FUNCTION(__clzsi2)
#endif
#ifdef __ARM_FEATURE_CLZ
clz r0, r0
JMP(lr)
Expand Down
28 changes: 14 additions & 14 deletions compiler-rt/lib/builtins/arm/comparesf2.S
Expand Up @@ -38,10 +38,9 @@
//===----------------------------------------------------------------------===//

#include "../assembly.h"
.syntax unified
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
.syntax unified
.text
DEFINE_CODE_STATE

@ int __eqsf2(float a, float b)

Expand All @@ -53,7 +52,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
#endif
// Make copies of a and b with the sign bit shifted off the top. These will
// be used to detect zeros and NaNs.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
push {r6, lr}
lsls r2, r0, #1
lsls r3, r1, #1
Expand All @@ -67,15 +66,15 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
// flag if both a and b are zero (of either sign). The shift of r3 doesn't
// effect this at all, but it *does* make sure that the C flag is clear for
// the subsequent operations.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
lsrs r6, r3, #1
orrs r6, r2
#else
orrs r12, r2, r3, lsr #1
#endif
// Next, we check if a and b have the same or different signs. If they have
// opposite signs, this eor will set the N flag.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
beq 1f
movs r6, r0
eors r6, r1
Expand All @@ -89,7 +88,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
// ignoring NaNs for now), this subtract will zero out r0. If they have the
// same sign, the flags are updated as they would be for a comparison of the
// absolute values of a and b.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
bmi 1f
subs r0, r2, r3
1:
Expand All @@ -108,7 +107,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
// still clear from the shift argument in orrs; if a is positive and b
// negative, this places 0 in r0; if a is negative and b positive, -1 is
// placed in r0.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
bhs 1f
// Here if a and b have the same sign and absA < absB, the result is thus
// b < 0 ? 1 : -1. Same if a and b have the opposite sign (ignoring Nan).
Expand All @@ -127,7 +126,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
// the sign of b in r0. Thus, if both are negative and a < b, -1 is placed
// in r0, which is the desired result. Conversely, if both are positive
// and a > b, zero is placed in r0.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
bls 1f
// Here both have the same sign and absA > absB.
movs r0, #1
Expand All @@ -145,14 +144,14 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
// If a == b, then the Z flag is set, so we can get the correct final value
// into r0 by simply or'ing with 1 if Z is clear.
// For Thumb-1, r0 contains -1 if a < b, 0 if a > b and 0 if a == b.
#if __ARM_ARCH_ISA_THUMB != 1
#if !defined(USE_THUMB_1)
it ne
orrne r0, r0, #1
#endif

// Finally, we need to deal with NaNs. If either argument is NaN, replace
// the value in r0 with 1.
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
LOCAL_LABEL(CHECK_NAN):
movs r6, #0xff
lsls r6, #24
Expand Down Expand Up @@ -189,7 +188,7 @@ DEFINE_COMPILERRT_FUNCTION(__gtsf2)
vmov r0, s0
vmov r1, s1
#endif
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
push {r6, lr}
lsls r2, r0, #1
lsls r3, r1, #1
Expand Down Expand Up @@ -255,6 +254,7 @@ DEFINE_COMPILERRT_FUNCTION_ALIAS(__gesf2, __gtsf2)

.p2align 2
DEFINE_COMPILERRT_FUNCTION(__unordsf2)

#if defined(COMPILER_RT_ARMHF_TARGET)
vmov r0, s0
vmov r1, s1
Expand All @@ -263,7 +263,7 @@ DEFINE_COMPILERRT_FUNCTION(__unordsf2)
lsls r2, r0, #1
lsls r3, r1, #1
movs r0, #0
#if __ARM_ARCH_ISA_THUMB == 1
#if defined(USE_THUMB_1)
movs r1, #0xff
lsls r1, #24
cmp r2, r1
Expand Down
8 changes: 1 addition & 7 deletions compiler-rt/lib/builtins/arm/divmodsi4.S
Expand Up @@ -23,20 +23,14 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
DEFINE_CODE_STATE

@ int __divmodsi4(int divident, int divisor, int *remainder)
@ Calculate the quotient and remainder of the (signed) division. The return
@ value is the quotient, the remainder is placed in the variable.

.p2align 3
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__divmodsi4)
#else
DEFINE_COMPILERRT_FUNCTION(__divmodsi4)
#endif
#if __ARM_ARCH_EXT_IDIV__
tst r1, r1
beq LOCAL_LABEL(divzero)
Expand Down
18 changes: 6 additions & 12 deletions compiler-rt/lib/builtins/arm/divsi3.S
Expand Up @@ -20,11 +20,9 @@
#define CLEAR_FRAME_AND_RETURN \
pop {r4, r7, pc}

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
.syntax unified
.text
DEFINE_CODE_STATE

.p2align 3
// Ok, APCS and AAPCS agree on 32 bit args, so it's safe to use the same routine.
Expand All @@ -33,11 +31,7 @@ DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_idiv, __divsi3)
@ int __divsi3(int divident, int divisor)
@ Calculate and return the quotient of the (signed) division.

#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__divsi3)
#else
DEFINE_COMPILERRT_FUNCTION(__divsi3)
#endif
#if __ARM_ARCH_EXT_IDIV__
tst r1,r1
beq LOCAL_LABEL(divzero)
Expand All @@ -49,14 +43,14 @@ LOCAL_LABEL(divzero):
#else
ESTABLISH_FRAME
// Set aside the sign of the quotient.
# if __ARM_ARCH_ISA_THUMB == 1
# if defined(USE_THUMB_1)
movs r4, r0
eors r4, r1
# else
eor r4, r0, r1
# endif
// Take absolute value of a and b via abs(x) = (x^(x >> 31)) - (x >> 31).
# if __ARM_ARCH_ISA_THUMB == 1
# if defined(USE_THUMB_1)
asrs r2, r0, #31
asrs r3, r1, #31
eors r0, r2
Expand All @@ -72,7 +66,7 @@ ESTABLISH_FRAME
// abs(a) / abs(b)
bl SYMBOL_NAME(__udivsi3)
// Apply sign of quotient to result and return.
# if __ARM_ARCH_ISA_THUMB == 1
# if defined(USE_THUMB_1)
asrs r4, #31
eors r0, r4
subs r0, r0, r4
Expand Down
8 changes: 1 addition & 7 deletions compiler-rt/lib/builtins/arm/modsi3.S
Expand Up @@ -22,19 +22,13 @@

.syntax unified
.text
#if __ARM_ARCH_ISA_THUMB == 2
.thumb
#endif
DEFINE_CODE_STATE

@ int __modsi3(int divident, int divisor)
@ Calculate and return the remainder of the (signed) division.

.p2align 3
#if __ARM_ARCH_ISA_THUMB == 2
DEFINE_COMPILERRT_THUMB_FUNCTION(__modsi3)
#else
DEFINE_COMPILERRT_FUNCTION(__modsi3)
#endif
#if __ARM_ARCH_EXT_IDIV__
tst r1, r1
beq LOCAL_LABEL(divzero)
Expand Down

0 comments on commit 8bf1572

Please sign in to comment.