[AArch64] Extend frame state to track WB candidates.

From-SVN: r212996
This commit is contained in:
Jiong Wang 2014-07-24 14:32:54 +00:00 committed by Marcus Shawcroft
parent 51705ec128
commit 363ffa50f1
3 changed files with 23 additions and 0 deletions

View File

@ -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:

View File

@ -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;
}

View File

@ -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;