diff mbox series

[1/2] VAX: Check the correct operand for constant 0 push operation

Message ID alpine.LFD.2.21.2012111630140.2104409@eddie.linux-mips.org
State Accepted
Headers show
Series VAX: Push operation fixes | expand

Commit Message

Maciej W. Rozycki Dec. 12, 2020, 12:05 p.m. UTC
Check the output operand for representing pushing a value onto the stack 
rather than the constant 0 input in determining whether to use the PUSHL 
or the CLRL instruction for a SImode move.  The latter actually works by 
means of using the predecrement addressing mode with the SP register and 
the machine code produced even takes the same number of bytes, however 
at least with some VAX implementations it incurs a performance penalty.  
Besides, we don't want to check the wrong operand anyway and have code 
that works by chance only.

Add a test case covering push operations; for operands different from 
constant zero there is actually a code size advantage for using PUSHL 
rather than the equivalent MOVL instruction.

	gcc/
	* config/vax/vax.c (vax_output_int_move): Check the correct 
	operand for constant 0 push operation.

	gcc/testsuite/
	* gcc.target/vax/push.c: New test.
---
 gcc/config/vax/vax.c                |    2 +-
 gcc/testsuite/gcc.target/vax/push.c |   27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

gcc-vax-push-zero.diff

Comments

Jeff Law Dec. 13, 2020, 4:34 p.m. UTC | #1
On 12/12/20 5:05 AM, Maciej W. Rozycki wrote:
> Check the output operand for representing pushing a value onto the stack 
> rather than the constant 0 input in determining whether to use the PUSHL 
> or the CLRL instruction for a SImode move.  The latter actually works by 
> means of using the predecrement addressing mode with the SP register and 
> the machine code produced even takes the same number of bytes, however 
> at least with some VAX implementations it incurs a performance penalty.  
> Besides, we don't want to check the wrong operand anyway and have code 
> that works by chance only.
>
> Add a test case covering push operations; for operands different from 
> constant zero there is actually a code size advantage for using PUSHL 
> rather than the equivalent MOVL instruction.
>
> 	gcc/
> 	* config/vax/vax.c (vax_output_int_move): Check the correct 
> 	operand for constant 0 push operation.
>
> 	gcc/testsuite/
> 	* gcc.target/vax/push.c: New test.

OK
jeff
diff mbox series

Patch

Index: gcc/gcc/config/vax/vax.c
===================================================================
--- gcc.orig/gcc/config/vax/vax.c
+++ gcc/gcc/config/vax/vax.c
@@ -1354,7 +1354,7 @@  vax_output_int_move (rtx insn ATTRIBUTE_
 
       if (operands[1] == const0_rtx)
 	{
-	  if (push_operand (operands[1], SImode))
+	  if (push_operand (operands[0], SImode))
 	    return "pushl %1";
 	  return "clrl %0";
 	}
Index: gcc/gcc/testsuite/gcc.target/vax/push.c
===================================================================
--- /dev/null
+++ gcc/gcc/testsuite/gcc.target/vax/push.c
@@ -0,0 +1,27 @@ 
+/* { dg-do compile } */
+
+void bar (void (*) (void), int, int);
+
+void
+foo (void)
+{
+  bar (foo, 1, 0);
+}
+
+/* Expect assembly like:
+
+	pushl $0
+	pushl $1
+	pushab foo
+	calls $3,bar
+
+rather than:
+
+	clrl -(%sp)
+	movl $1,-(%sp)
+	movab foo,-(%sp)
+	calls $3,bar
+
+ */
+
+/* { dg-final { scan-assembler "\[ \t\]+pushl\[ \t\]+\\\$0\n\[ \t\]+pushl\[ \t\]+\\\$1\n\[ \t\]+pushab\[ \t\]+foo\n" } } */