x86: Avoid stack realignment when copying data

To avoid stack realignment, use SCRATCH_SSE_REG to copy data from one
memory location to another.

gcc/

	* config/i386/i386-expand.c (ix86_expand_vector_move): Call
	ix86_gen_scratch_sse_rtx to get a scratch SSE register to copy
	data from one memory location to another.

gcc/testsuite/

	* gcc.target/i386/eh_return-1.c: New test.
This commit is contained in:
H.J. Lu 2021-08-02 10:01:46 -07:00
parent 1bee034e01
commit 7f4c3943f7
2 changed files with 29 additions and 1 deletions

View File

@ -625,7 +625,9 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[])
&& !register_operand (op0, mode)
&& !register_operand (op1, mode))
{
emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
rtx tmp = ix86_gen_scratch_sse_rtx (GET_MODE (op0));
emit_move_insn (tmp, op1);
emit_move_insn (op0, tmp);
return;
}

View File

@ -0,0 +1,26 @@
/* { dg-do compile } */
/* { dg-options "-O2 -march=haswell -mno-avx512f" } */
struct _Unwind_Context
{
void *ra;
char array[48];
};
extern long uw_install_context_1 (struct _Unwind_Context *);
void
_Unwind_RaiseException (void)
{
struct _Unwind_Context this_context, cur_context;
long offset = uw_install_context_1 (&this_context);
__builtin_memcpy (&this_context, &cur_context,
sizeof (struct _Unwind_Context));
void *handler = __builtin_frob_return_addr ((&cur_context)->ra);
uw_install_context_1 (&cur_context);
__builtin_eh_return (offset, handler);
}
/* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\n\]*%ymm" 4 } } */
/* No need to dynamically realign the stack here. */
/* { dg-final { scan-assembler-not "and\[^\n\r]*%\[re\]sp" } } */