From ced2b59691fce2370c568e2a0e94499a751d3860 Mon Sep 17 00:00:00 2001 From: rth Date: Thu, 20 Jan 2005 18:20:46 +0000 Subject: [PATCH] * config/i386/i386.c (ix86_expand_push): New. * config/i386/mmx.md (push1): New. * config/i386/sse.md (push1): New. * config/i386/i386-protos.h: Update. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@93970 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386-protos.h | 1 + gcc/config/i386/i386.c | 18 ++++++++++++++++++ gcc/config/i386/mmx.md | 8 ++++++++ gcc/config/i386/sse.md | 8 ++++++++ gcc/testsuite/gcc.c-torture/execute/va-arg-25.x | 12 ++++++++++++ 6 files changed, 54 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/va-arg-25.x diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9e3637d85cd..7f2af19f9ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-01-20 Richard Henderson + + * config/i386/i386.c (ix86_expand_push): New. + * config/i386/mmx.md (push1): New. + * config/i386/sse.md (push1): New. + * config/i386/i386-protos.h: Update. + 2005-01-20 Kazu Hirata * params.def, params.h, predict.c, tree-ssa-loop-im.c: Update diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 1b951b120e6..8be5408dd0e 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -126,6 +126,7 @@ extern void ix86_expand_clear (rtx); extern void ix86_expand_move (enum machine_mode, rtx[]); extern void ix86_expand_vector_move (enum machine_mode, rtx[]); extern void ix86_expand_vector_move_misalign (enum machine_mode, rtx[]); +extern void ix86_expand_push (enum machine_mode, rtx); extern rtx ix86_fixup_binary_operands (enum rtx_code, enum machine_mode, rtx[]); extern void ix86_fixup_binary_operands_no_copy (enum rtx_code, diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 256d38fa0ec..2c1e9fd4c3d 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -7754,6 +7754,24 @@ ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[]) gcc_unreachable (); } +/* Expand a push in MODE. This is some mode for which we do not support + proper push instructions, at least from the registers that we expect + the value to live in. */ + +void +ix86_expand_push (enum machine_mode mode, rtx x) +{ + rtx tmp; + + tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx, + GEN_INT (-GET_MODE_SIZE (mode)), + stack_pointer_rtx, 1, OPTAB_DIRECT); + if (tmp != stack_pointer_rtx) + emit_move_insn (stack_pointer_rtx, tmp); + + tmp = gen_rtx_MEM (mode, stack_pointer_rtx); + emit_move_insn (tmp, x); +} /* Fix up OPERANDS to satisfy ix86_binary_operator_ok. Return the destination to use for the operation. If different from the true diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index ccee83d57dd..d46fb36fd29 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -175,6 +175,14 @@ [(const_int 0)] "ix86_split_long_move (operands); DONE;") +(define_expand "push1" + [(match_operand:MMXMODE 0 "register_operand" "")] + "TARGET_SSE" +{ + ix86_expand_push (mode, operands[0]); + DONE; +}) + (define_expand "movmisalign" [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "") (match_operand:MMXMODE 1 "nonimmediate_operand" ""))] diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 68c48eab777..d15664b4394 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -194,6 +194,14 @@ operands[2] = CONST0_RTX (DFmode); }) +(define_expand "push1" + [(match_operand:SSEMODE 0 "register_operand" "")] + "TARGET_SSE" +{ + ix86_expand_push (mode, operands[0]); + DONE; +}) + (define_expand "movmisalign" [(set (match_operand:SSEMODE 0 "nonimmediate_operand" "") (match_operand:SSEMODE 1 "nonimmediate_operand" ""))] diff --git a/gcc/testsuite/gcc.c-torture/execute/va-arg-25.x b/gcc/testsuite/gcc.c-torture/execute/va-arg-25.x new file mode 100644 index 00000000000..fe8d7f918f2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/va-arg-25.x @@ -0,0 +1,12 @@ +# With -Os we default to -mpreferred-stack-boundary=2, which is not +# enough for proper operation with V4SImode when the architecture +# default enables SSE. Arguably setting -mpreferred-stack-boundary=2 +# under this condition is incorrect. Finding the correct set of +# options such that we don't exchange a FAIL for an XPASS is hard; +# simply force the stack boundary we need and forget about it for now. + +if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } { + set additional_flags "-mpreferred-stack-boundary=4" +} + +return 0 -- 2.11.0