Revert r314907, and pull in r298713 from upstream compiler-rt trunk (by
Weiming Zhao): builtins: Select correct code fragments when compiling for Thumb1/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() --------- Note: This patch doesn't fix broken Thumb1 variant of __udivsi3 ! Reviewers: weimingz, rengolin, compnerd Subscribers: aemerson, dim Differential Revision: https://reviews.llvm.org/D30938 Discussed with: mmel X-MFC-With: r314564
This commit is contained in:
parent
2cb4684480
commit
cb53322fdf
@ -20,16 +20,25 @@
|
||||
#endif
|
||||
|
||||
.syntax unified
|
||||
.syntax unified
|
||||
.text
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
.p2align 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__aeabi_idivmod)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__aeabi_idivmod)
|
||||
#if __ARM_ARCH_ISA_THUMB == 1
|
||||
#endif
|
||||
#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, r2, r0 // r2 = quot * denom
|
||||
subs r1, r1, r2
|
||||
JMP (r3)
|
||||
#else
|
||||
#else // defined(USE_THUMB_1)
|
||||
push { lr }
|
||||
sub sp, sp, #4
|
||||
mov r2, sp
|
||||
@ -42,7 +51,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
|
||||
|
@ -21,8 +21,16 @@
|
||||
#endif
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
.p2align 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__aeabi_uidivmod)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__aeabi_uidivmod)
|
||||
#endif
|
||||
#if __ARM_ARCH_ISA_THUMB == 1
|
||||
cmp r0, r1
|
||||
bcc LOCAL_LABEL(case_denom_larger)
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
// Reverse all the bytes in a 64-bit integer.
|
||||
//
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__bswapdi2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__bswapdi2)
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
// Reverse all the bytes in a 32-bit integer.
|
||||
//
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__bswapsi2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__bswapsi2)
|
||||
|
@ -15,13 +15,13 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__clzdi2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__clzdi2)
|
||||
|
@ -15,12 +15,12 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__clzsi2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__clzsi2)
|
||||
|
@ -38,15 +38,20 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "../assembly.h"
|
||||
.syntax unified
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
.thumb
|
||||
.syntax unified
|
||||
.text
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ int __eqsf2(float a, float b)
|
||||
|
||||
.p2align 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__eqsf2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__eqsf2)
|
||||
#endif
|
||||
#if defined(COMPILER_RT_ARMHF_TARGET)
|
||||
vmov r0, s0
|
||||
vmov r1, s1
|
||||
@ -67,7 +72,7 @@ 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, r6
|
||||
#else
|
||||
@ -75,7 +80,7 @@ DEFINE_COMPILERRT_FUNCTION(__eqsf2)
|
||||
#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
|
||||
@ -89,7 +94,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:
|
||||
@ -108,7 +113,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).
|
||||
@ -127,7 +132,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
|
||||
@ -145,14 +150,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
|
||||
@ -180,7 +185,11 @@ DEFINE_COMPILERRT_FUNCTION_ALIAS(__nesf2, __eqsf2)
|
||||
@ int __gtsf2(float a, float b)
|
||||
|
||||
.p2align 2
|
||||
#if defined(USE_THUMB)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__gtsf2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__gtsf2)
|
||||
#endif
|
||||
// Identical to the preceding except in that we return -1 for NaN values.
|
||||
// Given that the two paths share so much code, one might be tempted to
|
||||
// unify them; however, the extra code needed to do so makes the code size
|
||||
@ -189,7 +198,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
|
||||
@ -254,7 +263,12 @@ DEFINE_COMPILERRT_FUNCTION_ALIAS(__gesf2, __gtsf2)
|
||||
@ int __unordsf2(float a, float b)
|
||||
|
||||
.p2align 2
|
||||
#if defined(USE_THUMB)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__unordsf2)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__unordsf2)
|
||||
#endif
|
||||
|
||||
#if defined(COMPILER_RT_ARMHF_TARGET)
|
||||
vmov r0, s0
|
||||
vmov r1, s1
|
||||
@ -263,7 +277,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
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
@ value is the quotient, the remainder is placed in the variable.
|
||||
|
||||
.p2align 3
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__divmodsi4)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__divmodsi4)
|
||||
|
@ -20,10 +20,10 @@
|
||||
#define CLEAR_FRAME_AND_RETURN \
|
||||
pop {r4, r7, pc}
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
.thumb
|
||||
.syntax unified
|
||||
.text
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.p2align 3
|
||||
@ -33,7 +33,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
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__divsi3)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__divsi3)
|
||||
@ -72,7 +72,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
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
@ Calculate and return the remainder of the (signed) division.
|
||||
|
||||
.p2align 3
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__modsi3)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__modsi3)
|
||||
|
@ -16,8 +16,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -27,7 +26,7 @@
|
||||
@ value is the quotient, the remainder is placed in the variable.
|
||||
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__udivmodsi4)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
||||
@ -67,7 +66,7 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
||||
clz r3, r1
|
||||
/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */
|
||||
sub r3, r3, ip
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
adr ip, LOCAL_LABEL(div0block) + 1
|
||||
sub ip, ip, r3, lsl #1
|
||||
# else
|
||||
@ -78,7 +77,7 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
||||
mov r3, #0
|
||||
bx ip
|
||||
# else
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
# error THUMB mode requires CLZ or UDIV
|
||||
# endif
|
||||
str r4, [sp, #-8]!
|
||||
|
@ -16,8 +16,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -27,7 +26,7 @@ DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_uidiv, __udivsi3)
|
||||
@ unsigned int __udivsi3(unsigned int divident, unsigned int divisor)
|
||||
@ Calculate and return the quotient of the (unsigned) division.
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__udivsi3)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__udivsi3)
|
||||
@ -40,7 +39,7 @@ DEFINE_COMPILERRT_FUNCTION(__udivsi3)
|
||||
#else
|
||||
cmp r1, #1
|
||||
bcc LOCAL_LABEL(divby0)
|
||||
#if __ARM_ARCH_ISA_THUMB == 1
|
||||
#if defined(USE_THUMB_1)
|
||||
bne LOCAL_LABEL(num_neq_denom)
|
||||
JMP(lr)
|
||||
LOCAL_LABEL(num_neq_denom):
|
||||
@ -49,7 +48,7 @@ LOCAL_LABEL(num_neq_denom):
|
||||
JMPc(lr, eq)
|
||||
#endif
|
||||
cmp r0, r1
|
||||
#if __ARM_ARCH_ISA_THUMB == 1
|
||||
#if defined(USE_THUMB_1)
|
||||
bhs LOCAL_LABEL(num_ge_denom)
|
||||
movs r0, #0
|
||||
JMP(lr)
|
||||
@ -81,7 +80,7 @@ LOCAL_LABEL(num_ge_denom):
|
||||
clz r3, r1
|
||||
/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */
|
||||
sub r3, r3, ip
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
adr ip, LOCAL_LABEL(div0block) + 1
|
||||
sub ip, ip, r3, lsl #1
|
||||
# else
|
||||
@ -92,17 +91,17 @@ LOCAL_LABEL(num_ge_denom):
|
||||
mov r3, #0
|
||||
bx ip
|
||||
# else /* No CLZ Feature */
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
# error THUMB mode requires CLZ or UDIV
|
||||
# endif
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
# define BLOCK_SIZE 10
|
||||
# else
|
||||
# define BLOCK_SIZE 12
|
||||
# endif
|
||||
|
||||
mov r2, r0
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
mov ip, r0
|
||||
adr r0, LOCAL_LABEL(div0block)
|
||||
adds r0, #1
|
||||
@ -111,7 +110,7 @@ LOCAL_LABEL(num_ge_denom):
|
||||
# endif
|
||||
lsrs r3, r2, #16
|
||||
cmp r3, r1
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
blo LOCAL_LABEL(skip_16)
|
||||
movs r2, r3
|
||||
subs r0, r0, #(16 * BLOCK_SIZE)
|
||||
@ -123,7 +122,7 @@ LOCAL_LABEL(skip_16):
|
||||
|
||||
lsrs r3, r2, #8
|
||||
cmp r3, r1
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
blo LOCAL_LABEL(skip_8)
|
||||
movs r2, r3
|
||||
subs r0, r0, #(8 * BLOCK_SIZE)
|
||||
@ -135,7 +134,7 @@ LOCAL_LABEL(skip_8):
|
||||
|
||||
lsrs r3, r2, #4
|
||||
cmp r3, r1
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
blo LOCAL_LABEL(skip_4)
|
||||
movs r2, r3
|
||||
subs r0, r0, #(4 * BLOCK_SIZE)
|
||||
@ -147,7 +146,7 @@ LOCAL_LABEL(skip_4):
|
||||
|
||||
lsrs r3, r2, #2
|
||||
cmp r3, r1
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
blo LOCAL_LABEL(skip_2)
|
||||
movs r2, r3
|
||||
subs r0, r0, #(2 * BLOCK_SIZE)
|
||||
@ -158,7 +157,7 @@ LOCAL_LABEL(skip_2):
|
||||
# endif
|
||||
|
||||
/* Last block, no need to update r2 or r3. */
|
||||
# if __ARM_ARCH_ISA_THUMB == 1
|
||||
# if defined(USE_THUMB_1)
|
||||
lsrs r3, r2, #1
|
||||
cmp r3, r1
|
||||
blo LOCAL_LABEL(skip_1)
|
||||
@ -191,7 +190,7 @@ LOCAL_LABEL(divby0):
|
||||
JMP(lr)
|
||||
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 1
|
||||
#if defined(USE_THUMB_1)
|
||||
#define block(shift) \
|
||||
lsls r2, r1, IMM shift; \
|
||||
cmp r0, r2; \
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
@ Calculate and return the remainder of the (unsigned) division.
|
||||
|
||||
.p2align 2
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#if defined(USE_THUMB_PROLOGUE)
|
||||
DEFINE_COMPILERRT_THUMB_FUNCTION(__umodsi3)
|
||||
#else
|
||||
DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
||||
@ -65,7 +65,7 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
||||
clz r3, r1
|
||||
/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */
|
||||
sub r3, r3, ip
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
adr ip, LOCAL_LABEL(div0block) + 1
|
||||
sub ip, ip, r3, lsl #1
|
||||
# else
|
||||
@ -74,7 +74,7 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
||||
sub ip, ip, r3, lsl #3
|
||||
bx ip
|
||||
# else
|
||||
# if __ARM_ARCH_ISA_THUMB == 2
|
||||
# if defined(USE_THUMB_2)
|
||||
# error THUMB mode requires CLZ or UDIV
|
||||
# endif
|
||||
mov r2, r0
|
||||
|
@ -75,9 +75,6 @@
|
||||
#define __ARM_FEATURE_CLZ
|
||||
#endif
|
||||
|
||||
#undef __ARM_ARCH_ISA_THUMB
|
||||
#define __ARM_ARCH_ISA_THUMB 0
|
||||
|
||||
#ifdef ARM_HAS_BX
|
||||
#define JMP(r) bx r
|
||||
#define JMPc(r, c) bx##c r
|
||||
@ -95,20 +92,35 @@
|
||||
JMP(ip)
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
/*
|
||||
* Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros:
|
||||
* - for '-mthumb -march=armv6' compiler defines '__thumb__'
|
||||
* - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__'
|
||||
*/
|
||||
#if defined(__thumb2__)
|
||||
#define USE_THUMB_2 1
|
||||
#elif defined(__thumb__)
|
||||
#define USE_THUMB_1 1
|
||||
#endif
|
||||
|
||||
#if defined(USE_THUMB_1) && defined(USE_THUMB_2)
|
||||
#error "USE_THUMB_1 and USE_THUMB_2 can't be defined together."
|
||||
#endif
|
||||
|
||||
#if defined(USE_THUMB_1) || defined(USE_THUMB_1)
|
||||
#define USE_THUMB_PROLOGUE 1
|
||||
#endif
|
||||
|
||||
#if defined(USE_THUMB_2)
|
||||
#define IT(cond) it cond
|
||||
#define ITT(cond) itt cond
|
||||
#define WIDE(op) op.w
|
||||
#else
|
||||
#define IT(cond)
|
||||
#define ITT(cond)
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#define WIDE(op) op.w
|
||||
#else
|
||||
#define WIDE(op) op
|
||||
#endif
|
||||
#endif
|
||||
#endif /* defined(__arm__) */
|
||||
|
||||
#define GLUE2(a, b) a##b
|
||||
#define GLUE(a, b) GLUE2(a, b)
|
||||
|
Loading…
x
Reference in New Issue
Block a user