arm: unified syntax for libgcc when built with -Os [PR94220]
authorRichard Earnshaw <rearnsha@arm.com>
Tue, 24 Mar 2020 14:45:50 +0000 (14:45 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Thu, 26 Mar 2020 10:59:34 +0000 (10:59 +0000)
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.

gcc/ChangeLog
libgcc/config/arm/lib1funcs.S

index cc7f4d4ab377786a18d190d8c656c2bd053568b0..e81e876bc007375a77cf37744f74d593125792a3 100644 (file)
@@ -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
index e8d2158f8d6d25dabee90bee6acd56f8320d0e59..a094417e786029639db04e2da5fa4bc7fdbd7efb 100644 (file)
@@ -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