92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
/* { dg-do compile } */
|
|
/* { dg-options "-O1 -g" } */
|
|
|
|
enum reg_class
|
|
{
|
|
BASE_REGS,
|
|
GENERAL_REGS,
|
|
LIM_REG_CLASSES
|
|
};
|
|
|
|
static __inline__ unsigned char
|
|
hard_reg_set_subset_p (const unsigned long x[4], const unsigned long y[4])
|
|
{
|
|
return ((x[0] & ~y[0]) == 0
|
|
&& (x[1] & ~y[1]) == 0
|
|
&& (x[2] & ~y[2]) == 0
|
|
&& (x[3] & ~y[3]) == 0);
|
|
}
|
|
|
|
static __inline__ unsigned char
|
|
hard_reg_set_equal_p (const unsigned long x[4], const unsigned long y[4])
|
|
{
|
|
return x[0] == y[0]
|
|
&& x[1] == y[1]
|
|
&& x[2] == y[2]
|
|
&& x[3] == y[3];
|
|
}
|
|
|
|
extern unsigned long reg_class_contents[(int) LIM_REG_CLASSES][4];
|
|
extern int ira_important_classes_num;
|
|
extern enum reg_class ira_important_classes[(int) LIM_REG_CLASSES];
|
|
extern enum reg_class ira_reg_class_intersect[(int) LIM_REG_CLASSES][(int)
|
|
LIM_REG_CLASSES];
|
|
extern unsigned char ira_reg_classes_intersect_p[(int) LIM_REG_CLASSES][(int)
|
|
LIM_REG_CLASSES];
|
|
extern enum reg_class ira_reg_class_super_classes[(int) LIM_REG_CLASSES][(int)
|
|
LIM_REG_CLASSES];
|
|
static unsigned long temp_hard_regset[4];
|
|
|
|
static void
|
|
setup_reg_class_relations (void)
|
|
{
|
|
int i, cl1, cl2, cl3;
|
|
unsigned long temp_set2[4];
|
|
for (cl1 = 0; cl1 < (int) LIM_REG_CLASSES; cl1++)
|
|
{
|
|
ira_reg_class_super_classes[cl1][0] = LIM_REG_CLASSES;
|
|
for (cl2 = 0; cl2 < (int) LIM_REG_CLASSES; cl2++)
|
|
{
|
|
ira_reg_classes_intersect_p[cl1][cl2] = 0;
|
|
{
|
|
unsigned long *scan_tp_ = (temp_set2), *scan_fp_ =
|
|
(reg_class_contents[cl2]);
|
|
scan_tp_[1] = scan_fp_[1];
|
|
scan_tp_[2] = scan_fp_[2];
|
|
scan_tp_[3] = scan_fp_[3];
|
|
}
|
|
for (i = 0; i < ira_important_classes_num; i++)
|
|
{
|
|
cl3 = ira_important_classes[i];
|
|
{
|
|
unsigned long *scan_tp_ = (temp_hard_regset), *scan_fp_ =
|
|
(reg_class_contents[cl3]);
|
|
scan_tp_[0] = scan_fp_[0];
|
|
scan_tp_[1] = scan_fp_[1];
|
|
scan_tp_[3] = scan_fp_[3];
|
|
}
|
|
if (!hard_reg_set_subset_p (temp_hard_regset, temp_set2)
|
|
|| (hard_reg_set_equal_p (temp_hard_regset, temp_set2)
|
|
&& hard_reg_set_subset_p (reg_class_contents[cl3],
|
|
reg_class_contents[(int)
|
|
ira_reg_class_intersect
|
|
[cl1]
|
|
[cl2]])))
|
|
ira_reg_class_intersect[cl1][cl2] = (enum reg_class) cl3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
find_reg_class_closure (void)
|
|
{
|
|
setup_reg_class_relations ();
|
|
}
|
|
|
|
void
|
|
ira_init (void)
|
|
{
|
|
find_reg_class_closure ();
|
|
}
|