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:
parent
1bee034e01
commit
7f4c3943f7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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" } } */
|
Loading…
Reference in New Issue