| /* { 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 (); |
| } |