aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2020-03-24 14:45:50 +0000
committerRichard Earnshaw <rearnsha@arm.com>2020-03-26 10:59:34 +0000
commite519d644999d04e0a341cb034f4d954963b1d2d2 (patch)
tree5bbe0a2a3222befaa74d229212d89eab5876ddba
parent40cdcddf274e3944205ef2d03528bd14e48a9c76 (diff)
downloadgcc-e519d644999d04e0a341cb034f4d954963b1d2d2.zip
gcc-e519d644999d04e0a341cb034f4d954963b1d2d2.tar.gz
gcc-e519d644999d04e0a341cb034f4d954963b1d2d2.tar.bz2
arm: unified syntax for libgcc when built with -Os [PR94220]
The recent patch to convert all thumb1 code in libgcc to unified syntax ommitted the conditional code that is used only when building the library for minimal size. This patch fixes this case. I've also fixed the COND macro so that a single definition is always used that is for unified syntax. This eliminates a warning that is now being seen from the assembler when compiling the ieee fp support code. PR target/94220 * config/arm/lib1funcs.asm (COND): Use a single definition for unified syntax. (aeabi_uidivmod): Unified syntax when optimizing Thumb for size. (aeabi_idivmod): Likewise. (divsi3_skip_div0_test): Likewise.
-rw-r--r--gcc/ChangeLog9
-rw-r--r--libgcc/config/arm/lib1funcs.S33
2 files changed, 26 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc7f4d4..e81e876 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2020-03-26 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/94220
+ * config/arm/lib1funcs.asm (COND): Use a single definition for
+ unified syntax.
+ (aeabi_uidivmod): Unified syntax when optimizing Thumb for size.
+ (aeabi_idivmod): Likewise.
+ (divsi3_skip_div0_test): Likewise.
+
2020-03-26 Jakub Jelinek <jakub@redhat.com>
PR debug/94323
diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S
index e8d2158..a094417 100644
--- a/libgcc/config/arm/lib1funcs.S
+++ b/libgcc/config/arm/lib1funcs.S
@@ -226,7 +226,6 @@ LSYM(Lend_fde):
.endm
#define do_push push
#define do_pop pop
-#define COND(op1, op2, cond) op1 ## op2 ## cond
/* Perform an arithmetic operation with a variable shift operand. This
requires two instructions and a scratch register on Thumb-2. */
.macro shiftop name, dest, src1, src2, shiftop, shiftreg, tmp
@@ -241,12 +240,13 @@ LSYM(Lend_fde):
.endm
#define do_push stmfd sp!,
#define do_pop ldmfd sp!,
-#define COND(op1, op2, cond) op1 ## cond ## op2
.macro shiftop name, dest, src1, src2, shiftop, shiftreg, tmp
\name \dest, \src1, \src2, \shiftop \shiftreg
.endm
#endif
+#define COND(op1, op2, cond) op1 ## op2 ## cond
+
#ifdef __ARM_EABI__
.macro ARM_LDIV0 name signed
cmp r0, #0
@@ -494,7 +494,8 @@ pc .req r15
/* ------------------------------------------------------------------------ */
/* Bodies of the division and modulo routines. */
-/* ------------------------------------------------------------------------ */
+/* ------------------------------------------------------------------------ */
+
.macro ARM_DIV_BODY dividend, divisor, result, curbit
#if defined (__ARM_FEATURE_CLZ) && ! defined (__OPTIMIZE_SIZE__)
@@ -1136,8 +1137,8 @@ FUNC_START aeabi_uidivmod
push {r0, r1, lr}
bl LSYM(udivsi3_skip_div0_test)
POP {r1, r2, r3}
- mul r2, r0
- sub r1, r1, r2
+ muls r2, r0
+ subs r1, r1, r2
bx r3
# else
/* Both the quotient and remainder are calculated simultaneously
@@ -1151,7 +1152,7 @@ FUNC_START aeabi_uidivmod
ARM_FUNC_START aeabi_uidivmod
cmp r1, #0
beq LSYM(Ldiv0)
- mov r2, r0
+ mov r2, r0
udiv r0, r0, r1
mls r1, r0, r1, r2
RET
@@ -1235,29 +1236,29 @@ LSYM(Lover10):
beq LSYM(Ldiv0)
LSYM(divsi3_skip_div0_test):
push { work }
- mov work, dividend
- eor work, divisor @ Save the sign of the result.
+ movs work, dividend
+ eors work, divisor @ Save the sign of the result.
mov ip, work
- mov curbit, #1
- mov result, #0
+ movs curbit, #1
+ movs result, #0
cmp divisor, #0
bpl LSYM(Lover10)
- neg divisor, divisor @ Loops below use unsigned.
+ negs divisor, divisor @ Loops below use unsigned.
LSYM(Lover10):
cmp dividend, #0
bpl LSYM(Lover11)
- neg dividend, dividend
+ negs dividend, dividend
LSYM(Lover11):
cmp dividend, divisor
blo LSYM(Lgot_result)
THUMB_DIV_MOD_BODY 0
- mov r0, result
+ movs r0, result
mov work, ip
cmp work, #0
bpl LSYM(Lover12)
- neg r0, r0
+ negs r0, r0
LSYM(Lover12):
pop { work }
RET
@@ -1348,8 +1349,8 @@ FUNC_START aeabi_idivmod
push {r0, r1, lr}
bl LSYM(divsi3_skip_div0_test)
POP {r1, r2, r3}
- mul r2, r0
- sub r1, r1, r2
+ muls r2, r0
+ subs r1, r1, r2
bx r3
# else
/* Both the quotient and remainder are calculated simultaneously