diff mbox series

[committed] arm: unified syntax for libgcc when built with -Os [PR94220]

Message ID baf6389d-8618-f993-ede1-cdf4019d13b2@arm.com
State New
Headers show
Series [committed] arm: unified syntax for libgcc when built with -Os [PR94220] | expand

Commit Message

Richard Earnshaw (lists) March 26, 2020, 11:01 a.m. UTC
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.
---
 libgcc/config/arm/lib1funcs.S | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

  /*
------------------------------------------------------------------------ */
 /*		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
diff mbox series

Patch

diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S
index e8d2158f8d6..a094417e786 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