[AArch64] Extend frame state to track WB candidates.
From-SVN: r212996
This commit is contained in:
parent
51705ec128
commit
363ffa50f1
@ -1,3 +1,9 @@
|
||||
2014-07-24 Jiong Wang <jiong.wang@arm.com>
|
||||
|
||||
* config/aarch64/aarch64.h (frame): New fields "wb_candidate1" and
|
||||
"wb_candidate2".
|
||||
* config/aarch64/aarch64.c (aarch64_layout_frame): Initialize above.
|
||||
|
||||
2014-07-24 Roman Gareev <gareevroman@gmail.com>
|
||||
|
||||
* graphite-isl-ast-to-gimple.c:
|
||||
|
@ -1818,6 +1818,9 @@ aarch64_layout_frame (void)
|
||||
#define SLOT_NOT_REQUIRED (-2)
|
||||
#define SLOT_REQUIRED (-1)
|
||||
|
||||
cfun->machine->frame.wb_candidate1 = FIRST_PSEUDO_REGISTER;
|
||||
cfun->machine->frame.wb_candidate2 = FIRST_PSEUDO_REGISTER;
|
||||
|
||||
/* First mark all the registers that really need to be saved... */
|
||||
for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
|
||||
cfun->machine->frame.reg_offset[regno] = SLOT_NOT_REQUIRED;
|
||||
@ -1846,7 +1849,9 @@ aarch64_layout_frame (void)
|
||||
{
|
||||
/* FP and LR are placed in the linkage record. */
|
||||
cfun->machine->frame.reg_offset[R29_REGNUM] = 0;
|
||||
cfun->machine->frame.wb_candidate1 = R29_REGNUM;
|
||||
cfun->machine->frame.reg_offset[R30_REGNUM] = UNITS_PER_WORD;
|
||||
cfun->machine->frame.wb_candidate2 = R30_REGNUM;
|
||||
cfun->machine->frame.hardfp_offset = 2 * UNITS_PER_WORD;
|
||||
offset += 2 * UNITS_PER_WORD;
|
||||
}
|
||||
@ -1856,6 +1861,10 @@ aarch64_layout_frame (void)
|
||||
if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
|
||||
{
|
||||
cfun->machine->frame.reg_offset[regno] = offset;
|
||||
if (cfun->machine->frame.wb_candidate1 == FIRST_PSEUDO_REGISTER)
|
||||
cfun->machine->frame.wb_candidate1 = regno;
|
||||
else if (cfun->machine->frame.wb_candidate2 == FIRST_PSEUDO_REGISTER)
|
||||
cfun->machine->frame.wb_candidate2 = regno;
|
||||
offset += UNITS_PER_WORD;
|
||||
}
|
||||
|
||||
@ -1863,6 +1872,11 @@ aarch64_layout_frame (void)
|
||||
if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
|
||||
{
|
||||
cfun->machine->frame.reg_offset[regno] = offset;
|
||||
if (cfun->machine->frame.wb_candidate1 == FIRST_PSEUDO_REGISTER)
|
||||
cfun->machine->frame.wb_candidate1 = regno;
|
||||
else if (cfun->machine->frame.wb_candidate2 == FIRST_PSEUDO_REGISTER
|
||||
&& cfun->machine->frame.wb_candidate1 >= V0_REGNUM)
|
||||
cfun->machine->frame.wb_candidate2 = regno;
|
||||
offset += UNITS_PER_WORD;
|
||||
}
|
||||
|
||||
|
@ -542,6 +542,9 @@ struct GTY (()) aarch64_frame
|
||||
* frame (incomming SP) to the stack_pointer. This value is always
|
||||
* a multiple of STACK_BOUNDARY. */
|
||||
|
||||
unsigned wb_candidate1;
|
||||
unsigned wb_candidate2;
|
||||
|
||||
HOST_WIDE_INT frame_size;
|
||||
|
||||
bool laid_out;
|
||||
|
Loading…
Reference in New Issue
Block a user