forked from OSchip/llvm-project
Revert r213467, it breaks non-thumb mode.
llvm-svn: 213479
This commit is contained in:
parent
7d602f7a77
commit
8f6cf7085a
|
@ -16,9 +16,6 @@
|
|||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.p2align 2
|
||||
DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
||||
|
@ -41,15 +38,11 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
|||
*
|
||||
* r0 is the numerator, r1 the denominator.
|
||||
*
|
||||
* ARM:
|
||||
* The code before JMP computes the correct shift I, so that
|
||||
* r0 and (r1 << I) have the highest bit set in the same position.
|
||||
* At the time of JMP, ip := .Ldiv0block - 12 * I.
|
||||
* This depends on the fixed instruction size of block.
|
||||
*
|
||||
* Thumb 2:
|
||||
* Uses a jumptable to jump to the appropriate block.
|
||||
*
|
||||
* block(shift) implements the test-and-update-quotient core.
|
||||
* It assumes (r0 << shift) can be computed without overflow and
|
||||
* that (r0 << shift) < 2 * r1. The quotient is stored in r3.
|
||||
|
@ -59,59 +52,17 @@ DEFINE_COMPILERRT_FUNCTION(__udivmodsi4)
|
|||
clz ip, r0
|
||||
clz r3, r1
|
||||
/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
sub ip, r3, ip
|
||||
mov r3, #0
|
||||
tbb [pc, ip]
|
||||
LOCAL_LABEL(JT):
|
||||
.byte (LOCAL_LABEL( 0) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 1) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 2) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 3) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 4) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 5) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 6) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 7) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 8) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 9) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(10) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(11) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(12) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(13) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(14) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(15) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(16) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(17) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(18) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(19) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(20) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(21) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(22) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(23) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(24) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(25) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(26) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(27) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(28) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(29) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(30) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(31) - LOCAL_LABEL(JT)) / 2
|
||||
#else
|
||||
sub r3, r3, ip
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
sub ip, ip, r3, lsl #2
|
||||
sub ip, ip, r3, lsl #3
|
||||
mov r3, #0
|
||||
bx ip
|
||||
#endif
|
||||
# else
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#error unsupported configuration
|
||||
#endif
|
||||
str r4, [sp, #-8]!
|
||||
|
||||
mov r4, r0
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
|
||||
lsr r3, r4, #16
|
||||
cmp r3, r1
|
||||
|
@ -145,11 +96,9 @@ LOCAL_LABEL(JT):
|
|||
|
||||
#define IMM #
|
||||
|
||||
#define block(shift) \
|
||||
LOCAL_LABEL(shift): \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
ITT hs; \
|
||||
addhs r3, r3, IMM (1 << shift); \
|
||||
#define block(shift) \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
addhs r3, r3, IMM (1 << shift); \
|
||||
subhs r0, r0, r1, lsl IMM shift
|
||||
|
||||
block(31)
|
||||
|
@ -183,6 +132,7 @@ LOCAL_LABEL(shift): \
|
|||
block(3)
|
||||
block(2)
|
||||
block(1)
|
||||
LOCAL_LABEL(div0block):
|
||||
block(0)
|
||||
|
||||
str r0, [r2]
|
||||
|
|
|
@ -16,9 +16,6 @@
|
|||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.p2align 2
|
||||
DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_uidiv, __udivsi3)
|
||||
|
@ -35,7 +32,6 @@ DEFINE_COMPILERRT_FUNCTION(__udivsi3)
|
|||
bcc LOCAL_LABEL(divby0)
|
||||
JMPc(lr, eq)
|
||||
cmp r0, r1
|
||||
IT cc
|
||||
movcc r0, #0
|
||||
JMPc(lr, cc)
|
||||
/*
|
||||
|
@ -43,15 +39,11 @@ DEFINE_COMPILERRT_FUNCTION(__udivsi3)
|
|||
*
|
||||
* r0 is the numerator, r1 the denominator.
|
||||
*
|
||||
* ARM:
|
||||
* The code before JMP computes the correct shift I, so that
|
||||
* r0 and (r1 << I) have the highest bit set in the same position.
|
||||
* At the time of JMP, ip := .Ldiv0block - 12 * I.
|
||||
* This depends on the fixed instruction size of block.
|
||||
*
|
||||
* Thumb 2:
|
||||
* Uses a jumptable to jump to the appropriate block.
|
||||
*
|
||||
* block(shift) implements the test-and-update-quotient core.
|
||||
* It assumes (r0 << shift) can be computed without overflow and
|
||||
* that (r0 << shift) < 2 * r1. The quotient is stored in r3.
|
||||
|
@ -61,57 +53,15 @@ DEFINE_COMPILERRT_FUNCTION(__udivsi3)
|
|||
clz ip, r0
|
||||
clz r3, r1
|
||||
/* r0 >= r1 implies clz(r0) <= clz(r1), so ip <= r3. */
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
sub ip, r3, ip
|
||||
mov r3, #0
|
||||
tbb [pc, ip]
|
||||
LOCAL_LABEL(JT):
|
||||
.byte (LOCAL_LABEL( 0) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 1) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 2) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 3) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 4) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 5) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 6) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 7) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 8) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 9) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(10) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(11) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(12) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(13) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(14) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(15) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(16) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(17) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(18) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(19) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(20) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(21) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(22) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(23) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(24) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(25) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(26) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(27) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(28) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(29) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(30) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(31) - LOCAL_LABEL(JT)) / 2
|
||||
#else
|
||||
sub r3, r3, ip
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
sub ip, ip, r3, lsl #2
|
||||
sub ip, ip, r3, lsl #3
|
||||
mov r3, #0
|
||||
bx ip
|
||||
#endif
|
||||
# else
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#error unsupported configuration
|
||||
#endif
|
||||
mov r2, r0
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
|
||||
lsr r3, r2, #16
|
||||
cmp r3, r1
|
||||
|
@ -144,12 +94,10 @@ LOCAL_LABEL(JT):
|
|||
|
||||
#define IMM #
|
||||
|
||||
#define block(shift) \
|
||||
LOCAL_LABEL(shift): \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
ITT hs; \
|
||||
addhs r3, r3, IMM(1 << shift); \
|
||||
subhs r0, r0, r1, lsl IMM shift
|
||||
#define block(shift) \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
addhs r3, r3, IMM (1 << shift); \
|
||||
subhs r0, r0, r1, lsl IMM shift
|
||||
|
||||
block(31)
|
||||
block(30)
|
||||
|
@ -182,6 +130,7 @@ LOCAL_LABEL(shift): \
|
|||
block(3)
|
||||
block(2)
|
||||
block(1)
|
||||
LOCAL_LABEL(div0block):
|
||||
block(0)
|
||||
|
||||
mov r0, r3
|
||||
|
|
|
@ -16,9 +16,6 @@
|
|||
|
||||
.syntax unified
|
||||
.text
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.p2align 2
|
||||
DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
||||
|
@ -33,7 +30,6 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
|||
#else
|
||||
cmp r1, #1
|
||||
bcc LOCAL_LABEL(divby0)
|
||||
IT eq
|
||||
moveq r0, #0
|
||||
JMPc(lr, eq)
|
||||
cmp r0, r1
|
||||
|
@ -43,15 +39,11 @@ DEFINE_COMPILERRT_FUNCTION(__umodsi3)
|
|||
*
|
||||
* r0 is the numerator, r1 the denominator.
|
||||
*
|
||||
* For ARM:
|
||||
* The code before JMP computes the correct shift I, so that
|
||||
* r0 and (r1 << I) have the highest bit set in the same position.
|
||||
* At the time of JMP, ip := .Ldiv0block - 8 * I.
|
||||
* This depends on the fixed instruction size of block.
|
||||
*
|
||||
* For Thumb:
|
||||
* Uses a jumptable to jump to the appropriate block.
|
||||
*
|
||||
* block(shift) implements the test-and-update-quotient core.
|
||||
* It assumes (r0 << shift) can be computed without overflow and
|
||||
* that (r0 << shift) < 2 * r1. The quotient is stored in r3.
|
||||
|
@ -62,52 +54,12 @@ 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
|
||||
tbb [pc, r3]
|
||||
LOCAL_LABEL(JT):
|
||||
.byte (LOCAL_LABEL( 0) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 1) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 2) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 3) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 4) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 5) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 6) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 7) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 8) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL( 9) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(10) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(11) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(12) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(13) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(14) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(15) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(16) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(17) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(18) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(19) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(20) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(21) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(22) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(23) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(24) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(25) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(26) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(27) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(28) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(29) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(30) - LOCAL_LABEL(JT)) / 2
|
||||
.byte (LOCAL_LABEL(31) - LOCAL_LABEL(JT)) / 2
|
||||
#else
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
sub ip, ip, r3, lsl #3
|
||||
bx ip
|
||||
#endif
|
||||
# else
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#error unsupported configuration
|
||||
#endif
|
||||
mov r2, r0
|
||||
adr ip, LOCAL_LABEL(0)
|
||||
adr ip, LOCAL_LABEL(div0block)
|
||||
|
||||
lsr r3, r2, #16
|
||||
cmp r3, r1
|
||||
|
@ -138,11 +90,9 @@ LOCAL_LABEL(JT):
|
|||
|
||||
#define IMM #
|
||||
|
||||
#define block(shift) \
|
||||
LOCAL_LABEL(shift): \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
IT hs; \
|
||||
subhs r0, r0, r1, lsl IMM shift
|
||||
#define block(shift) \
|
||||
cmp r0, r1, lsl IMM shift; \
|
||||
subhs r0, r0, r1, lsl IMM shift
|
||||
|
||||
block(31)
|
||||
block(30)
|
||||
|
@ -175,6 +125,7 @@ LOCAL_LABEL(shift): \
|
|||
block(3)
|
||||
block(2)
|
||||
block(1)
|
||||
LOCAL_LABEL(div0block):
|
||||
block(0)
|
||||
JMP(lr)
|
||||
#endif /* __ARM_ARCH_EXT_IDIV__ */
|
||||
|
|
|
@ -22,16 +22,6 @@
|
|||
#define SEPARATOR ;
|
||||
#endif
|
||||
|
||||
#if defined(__arm__)
|
||||
#if __ARM_ARCH_ISA_THUMB == 2
|
||||
#define IT it
|
||||
#define ITT itt
|
||||
#else
|
||||
#define IT @
|
||||
#define ITT @
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#define HIDDEN(name) .private_extern name
|
||||
#define LOCAL_LABEL(name) L_##name
|
||||
|
@ -96,9 +86,7 @@
|
|||
|
||||
#ifdef ARM_HAS_BX
|
||||
#define JMP(r) bx r
|
||||
#define JMPc(r, c) \
|
||||
IT c; \
|
||||
bx##c r
|
||||
#define JMPc(r, c) bx##c r
|
||||
#else
|
||||
#define JMP(r) mov pc, r
|
||||
#define JMPc(r, c) mov##c pc, r
|
||||
|
|
Loading…
Reference in New Issue