VAX: Check the correct operand for constant 0 push operation
authorMaciej W. Rozycki <macro@linux-mips.org>
Sun, 13 Dec 2020 20:46:17 +0000 (20:46 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Sun, 13 Dec 2020 20:46:17 +0000 (20:46 +0000)
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
gcc/testsuite/gcc.target/vax/push.c [new file with mode: 0644]

index 07c499c78af29125dc816c1d70b20335fa785c56..7c0adac6aaff97fd859699fd200e11e6e40c529d 100644 (file)
@@ -1354,7 +1354,7 @@ vax_output_int_move (rtx insn ATTRIBUTE_UNUSED, rtx *operands,
 
       if (operands[1] == const0_rtx)
        {
-         if (push_operand (operands[1], SImode))
+         if (push_operand (operands[0], SImode))
            return "pushl %1";
          return "clrl %0";
        }
diff --git a/gcc/testsuite/gcc.target/vax/push.c b/gcc/testsuite/gcc.target/vax/push.c
new file mode 100644 (file)
index 0000000..647ea60
--- /dev/null
@@ -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" } } */