Message ID | alpine.LFD.2.21.2012111630140.2104409@eddie.linux-mips.org |
---|---|
State | Accepted |
Headers | show |
Series | VAX: Push operation fixes | expand |
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
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" } } */