blob: b091a145d0f6f7cde4bffef15ee39f0293ff48de [file] [log] [blame]
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "do not override -mcpu" { *-*-* } { "-mcpu=*" } { "-mcpu=power6" } } */
/* { dg-additional-options "-O3 -mcpu=power6 -mno-power9-vector -mno-power8-vector -mno-vsx" } */
enum reg_class
{
NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS, XGRF_REGS, ALL_REGS,
LIM_REG_CLASSES
};
enum machine_mode
{
VOIDmode, QImode, HImode, PSImode, SImode, PDImode, DImode, TImode, OImode,
QFmode, HFmode, TQFmode, SFmode, DFmode, XFmode, TFmode, SCmode, DCmode,
XCmode, TCmode, CQImode, CHImode, CSImode, CDImode, CTImode, COImode,
BLKmode, CCmode, CCEVENmode, MAX_MACHINE_MODE
};
typedef struct rtx_def
{
int mode:8;
}
*rtx;
extern rtx *regno_reg_rtx;
typedef unsigned int HARD_REG_ELT_TYPE;
typedef HARD_REG_ELT_TYPE HARD_REG_SET[((64 + 32 - 1) / 32)];
extern int reg_alloc_order[64];
extern int max_regno;
extern int *reg_n_calls_crossed;
extern short *reg_renumber;
static int *reg_where_dead;
static int *reg_where_born;
static int *reg_order;
static char *regs_change_size;
static HARD_REG_SET *after_insn_hard_regs;
static int stupid_find_reg (int, enum reg_class, enum machine_mode, int, int,
int);
enum reg_class reg_preferred_class (int);
void
stupid_life_analysis (f, nregs, file)
int nregs, file;
rtx f;
{
register int i;
for (i = (((64)) + 3) + 1; i < max_regno; i++)
{
register int r = reg_order[i];
if ((int) LIM_REG_CLASSES > 1)
reg_renumber[r] =
stupid_find_reg (reg_n_calls_crossed[r], reg_preferred_class (r),
((regno_reg_rtx[r])->mode), reg_where_born[r],
reg_where_dead[r], regs_change_size[r]);
}
}
static int
stupid_find_reg (call_preserved, class, mode, born_insn, dead_insn,
changes_size)
int call_preserved, born_insn, dead_insn, changes_size;
enum reg_class class;
enum machine_mode mode;
{
register int i, ins;
HARD_REG_SET used, this_reg;
for (ins = born_insn; ins < dead_insn; ins++)
do
{
register HARD_REG_ELT_TYPE *scan_tp_ = (used), *scan_fp_ =
(after_insn_hard_regs[ins]);
for (i = 0; i < ((64 + 32 - 1) / 32); i++)
*scan_tp_++ |= *scan_fp_++;
}
while (0);
for (i = 0; i < 64; i++)
{
int regno = reg_alloc_order[i];
if (((used)[(regno) / ((unsigned) 32)] &
(((HARD_REG_ELT_TYPE) (1)) << ((regno) % ((unsigned) 32)))))
{
register int j;
if (j == regno)
return regno;
}
}
}