111
|
1 /* { dg-do compile } */
|
|
2 /* { dg-options "-O1 -g" } */
|
|
3
|
|
4 enum reg_class
|
|
5 {
|
|
6 BASE_REGS,
|
|
7 GENERAL_REGS,
|
|
8 LIM_REG_CLASSES
|
|
9 };
|
|
10
|
|
11 static __inline__ unsigned char
|
|
12 hard_reg_set_subset_p (const unsigned long x[4], const unsigned long y[4])
|
|
13 {
|
|
14 return ((x[0] & ~y[0]) == 0
|
|
15 && (x[1] & ~y[1]) == 0
|
|
16 && (x[2] & ~y[2]) == 0
|
|
17 && (x[3] & ~y[3]) == 0);
|
|
18 }
|
|
19
|
|
20 static __inline__ unsigned char
|
|
21 hard_reg_set_equal_p (const unsigned long x[4], const unsigned long y[4])
|
|
22 {
|
|
23 return x[0] == y[0]
|
|
24 && x[1] == y[1]
|
|
25 && x[2] == y[2]
|
|
26 && x[3] == y[3];
|
|
27 }
|
|
28
|
|
29 extern unsigned long reg_class_contents[(int) LIM_REG_CLASSES][4];
|
|
30 extern int ira_important_classes_num;
|
|
31 extern enum reg_class ira_important_classes[(int) LIM_REG_CLASSES];
|
|
32 extern enum reg_class ira_reg_class_intersect[(int) LIM_REG_CLASSES][(int)
|
|
33 LIM_REG_CLASSES];
|
|
34 extern unsigned char ira_reg_classes_intersect_p[(int) LIM_REG_CLASSES][(int)
|
|
35 LIM_REG_CLASSES];
|
|
36 extern enum reg_class ira_reg_class_super_classes[(int) LIM_REG_CLASSES][(int)
|
|
37 LIM_REG_CLASSES];
|
|
38 static unsigned long temp_hard_regset[4];
|
|
39
|
|
40 static void
|
|
41 setup_reg_class_relations (void)
|
|
42 {
|
|
43 int i, cl1, cl2, cl3;
|
|
44 unsigned long temp_set2[4];
|
|
45 for (cl1 = 0; cl1 < (int) LIM_REG_CLASSES; cl1++)
|
|
46 {
|
|
47 ira_reg_class_super_classes[cl1][0] = LIM_REG_CLASSES;
|
|
48 for (cl2 = 0; cl2 < (int) LIM_REG_CLASSES; cl2++)
|
|
49 {
|
|
50 ira_reg_classes_intersect_p[cl1][cl2] = 0;
|
|
51 {
|
|
52 unsigned long *scan_tp_ = (temp_set2), *scan_fp_ =
|
|
53 (reg_class_contents[cl2]);
|
|
54 scan_tp_[1] = scan_fp_[1];
|
|
55 scan_tp_[2] = scan_fp_[2];
|
|
56 scan_tp_[3] = scan_fp_[3];
|
|
57 }
|
|
58 for (i = 0; i < ira_important_classes_num; i++)
|
|
59 {
|
|
60 cl3 = ira_important_classes[i];
|
|
61 {
|
|
62 unsigned long *scan_tp_ = (temp_hard_regset), *scan_fp_ =
|
|
63 (reg_class_contents[cl3]);
|
|
64 scan_tp_[0] = scan_fp_[0];
|
|
65 scan_tp_[1] = scan_fp_[1];
|
|
66 scan_tp_[3] = scan_fp_[3];
|
|
67 }
|
|
68 if (!hard_reg_set_subset_p (temp_hard_regset, temp_set2)
|
|
69 || (hard_reg_set_equal_p (temp_hard_regset, temp_set2)
|
|
70 && hard_reg_set_subset_p (reg_class_contents[cl3],
|
|
71 reg_class_contents[(int)
|
|
72 ira_reg_class_intersect
|
|
73 [cl1]
|
|
74 [cl2]])))
|
|
75 ira_reg_class_intersect[cl1][cl2] = (enum reg_class) cl3;
|
|
76 }
|
|
77 }
|
|
78 }
|
|
79 }
|
|
80
|
|
81 static void
|
|
82 find_reg_class_closure (void)
|
|
83 {
|
|
84 setup_reg_class_relations ();
|
|
85 }
|
|
86
|
|
87 void
|
|
88 ira_init (void)
|
|
89 {
|
|
90 find_reg_class_closure ();
|
|
91 }
|