Message ID | 20210804131953.2868697-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | x86: Avoid stack realignment when copying data with SSE register | expand |
On Wed, Aug 4, 2021 at 3:20 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > To avoid stack realignment, call ix86_gen_scratch_sse_rtx to get a > scratch SSE register to copy data with with SSE register from one > memory location to another. > > gcc/ > > PR target/101772 > * config/i386/i386-expand.c (ix86_expand_vector_move): Call > ix86_gen_scratch_sse_rtx to get a scratch SSE register to copy > data with SSE register from one memory location to another. > > gcc/testsuite/ > > PR target/101772 > * gcc.target/i386/eh_return-2.c: New test. LGTM. Thanks, Uros. > --- > gcc/config/i386/i386-expand.c | 6 +++++- > gcc/testsuite/gcc.target/i386/eh_return-2.c | 16 ++++++++++++++++ > 2 files changed, 21 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.target/i386/eh_return-2.c > > diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c > index 1d469bf7221..bd21efa9530 100644 > --- a/gcc/config/i386/i386-expand.c > +++ b/gcc/config/i386/i386-expand.c > @@ -613,7 +613,11 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[]) > arguments in memory. */ > if (!register_operand (op0, mode) > && !register_operand (op1, mode)) > - op1 = force_reg (mode, op1); > + { > + rtx scratch = ix86_gen_scratch_sse_rtx (mode); > + emit_move_insn (scratch, op1); > + op1 = scratch; > + } > > tmp[0] = op0; tmp[1] = op1; > ix86_expand_vector_move_misalign (mode, tmp); > diff --git a/gcc/testsuite/gcc.target/i386/eh_return-2.c b/gcc/testsuite/gcc.target/i386/eh_return-2.c > new file mode 100644 > index 00000000000..f23f4492dac > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/eh_return-2.c > @@ -0,0 +1,16 @@ > +/* PR target/101772 */ > +/* { dg-do compile } */ > +/* { dg-additional-options "-O0 -march=x86-64 -mstackrealign" } */ > + > +struct _Unwind_Context _Unwind_Resume_or_Rethrow_this_context; > + > +void offset (int); > + > +struct _Unwind_Context { > + void *reg[7]; > +} _Unwind_Resume_or_Rethrow() { > + struct _Unwind_Context cur_contextcur_context = > + _Unwind_Resume_or_Rethrow_this_context; > + offset(0); > + __builtin_eh_return ((long) offset, 0); > +} > -- > 2.31.1 >
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index 1d469bf7221..bd21efa9530 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -613,7 +613,11 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[]) arguments in memory. */ if (!register_operand (op0, mode) && !register_operand (op1, mode)) - op1 = force_reg (mode, op1); + { + rtx scratch = ix86_gen_scratch_sse_rtx (mode); + emit_move_insn (scratch, op1); + op1 = scratch; + } tmp[0] = op0; tmp[1] = op1; ix86_expand_vector_move_misalign (mode, tmp); diff --git a/gcc/testsuite/gcc.target/i386/eh_return-2.c b/gcc/testsuite/gcc.target/i386/eh_return-2.c new file mode 100644 index 00000000000..f23f4492dac --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/eh_return-2.c @@ -0,0 +1,16 @@ +/* PR target/101772 */ +/* { dg-do compile } */ +/* { dg-additional-options "-O0 -march=x86-64 -mstackrealign" } */ + +struct _Unwind_Context _Unwind_Resume_or_Rethrow_this_context; + +void offset (int); + +struct _Unwind_Context { + void *reg[7]; +} _Unwind_Resume_or_Rethrow() { + struct _Unwind_Context cur_contextcur_context = + _Unwind_Resume_or_Rethrow_this_context; + offset(0); + __builtin_eh_return ((long) offset, 0); +}