111
|
1 /* PR debug/44832 */
|
|
2 /* { dg-do compile } */
|
|
3 /* { dg-options "-O2 -fcompare-debug" } */
|
|
4 /* { dg-options "-O2 -fcompare-debug -fno-short-enums" {target short_enums} } */
|
|
5 /* { dg-require-effective-target int32plus } */
|
|
6
|
|
7 struct rtx_def;
|
|
8 typedef struct rtx_def *rtx;
|
|
9 typedef const struct rtx_def *const_rtx;
|
|
10 struct rtvec_def;
|
|
11 typedef struct rtvec_def *rtvec;
|
|
12 extern int ix86_isa_flags;
|
|
13
|
|
14 enum machine_mode
|
|
15 {
|
|
16 VOIDmode,
|
|
17 V8HImode,
|
|
18 V16QImode,
|
|
19 V4SImode,
|
|
20 V2DImode,
|
|
21 V32QImode,
|
|
22 MAX_MACHINE_MODE,
|
|
23
|
|
24 NUM_MACHINE_MODES = MAX_MACHINE_MODE
|
|
25 };
|
|
26 extern unsigned char mode_size[NUM_MACHINE_MODES];
|
|
27 extern const unsigned char mode_inner[NUM_MACHINE_MODES];
|
|
28 extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
|
|
29 enum rtx_code {
|
|
30
|
|
31 CONST_INT ,
|
|
32
|
|
33 CONST_FIXED ,
|
|
34
|
|
35 CONST_DOUBLE
|
|
36
|
|
37 };
|
|
38 union rtunion_def
|
|
39 {
|
|
40 rtvec rt_rtvec;
|
|
41 };
|
|
42 typedef union rtunion_def rtunion;
|
|
43 struct rtx_def {
|
|
44
|
|
45 __extension__ enum rtx_code code: 16;
|
|
46
|
|
47 __extension__ enum machine_mode mode : 8;
|
|
48
|
|
49 union u {
|
|
50 rtunion fld[1];
|
|
51 } u;
|
|
52 };
|
|
53 struct rtvec_def {
|
|
54 rtx elem[1];
|
|
55 };
|
|
56 extern int rtx_equal_p (const_rtx, const_rtx);
|
|
57 extern rtx gen_reg_rtx (enum machine_mode);
|
|
58
|
|
59 extern void
|
|
60 ix86_expand_vector_init_concat (enum machine_mode mode,
|
|
61 rtx target, rtx *ops, int n);
|
|
62
|
|
63 static void
|
|
64 ix86_expand_vector_init_general (unsigned char mmx_ok, enum machine_mode mode,
|
|
65 rtx target, rtx vals)
|
|
66 {
|
|
67 rtx ops[32], op0, op1;
|
|
68 enum machine_mode half_mode = VOIDmode;
|
|
69 int n, i;
|
|
70
|
|
71 switch (mode)
|
|
72 {
|
|
73 case V4SImode:
|
|
74 case V2DImode:
|
|
75 n = mode_nunits[mode];
|
|
76 ix86_expand_vector_init_concat (mode, target, ops, n);
|
|
77 return;
|
|
78
|
|
79 case V32QImode:
|
|
80 goto half;
|
|
81 half:
|
|
82 {
|
|
83 typedef int eger;
|
|
84 if (mode != V4SImode)
|
|
85 ops[0] = 0;
|
|
86 }
|
|
87 n = mode_nunits[mode];
|
|
88 for (i = 0; i < n; i++)
|
|
89 ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
|
|
90 op0 = gen_reg_rtx (VOIDmode);
|
|
91 return;
|
|
92
|
|
93 case V16QImode:
|
|
94 if (!((ix86_isa_flags & (1 << 19)) != 0))
|
|
95 break;
|
|
96
|
|
97 case V8HImode:
|
|
98 if (!((ix86_isa_flags & (1 << 17)) != 0))
|
|
99 break;
|
|
100
|
|
101 n = mode_nunits[mode];
|
|
102 for (i = 0; i < n; i++)
|
|
103 ops[i] = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
|
|
104 return;
|
|
105
|
|
106 default:
|
|
107 ;
|
|
108 }
|
|
109
|
|
110 {
|
|
111 int n_words;
|
|
112
|
|
113 n_words = ((unsigned short) mode_size[mode]) / 4;
|
|
114
|
|
115 if (n_words == 4)
|
|
116 ix86_expand_vector_init_general (0, V4SImode, 0, 0);
|
|
117 }
|
|
118 }
|
|
119
|
|
120
|
|
121 void
|
|
122 ix86_expand_vector_init (unsigned char mmx_ok, rtx target, rtx vals)
|
|
123 {
|
|
124 enum machine_mode mode = ((enum machine_mode) (target)->mode);
|
|
125 enum machine_mode inner_mode = ((enum machine_mode) mode_inner[mode]);
|
|
126 int n_elts = mode_nunits[mode];
|
|
127 int n_var = 0, one_var = -1;
|
|
128 unsigned char all_same = 1, all_const_zero = 1;
|
|
129 int i;
|
|
130 rtx x;
|
|
131
|
|
132 for (i = 0; i < n_elts; ++i)
|
|
133 {
|
|
134 x = (((((vals)->u.fld[0]).rt_rtvec))->elem[i]);
|
|
135 if (!((((enum rtx_code) (x)->code) == CONST_INT)
|
|
136 || ((enum rtx_code) (x)->code) == CONST_DOUBLE
|
|
137 || ((enum rtx_code) (x)->code) == CONST_FIXED))
|
|
138 n_var++, one_var = i;
|
|
139 else
|
|
140 all_const_zero = 0;
|
|
141 if (i > 0 && !rtx_equal_p (x, (((((vals)->u.fld[0]).rt_rtvec))->elem[0])))
|
|
142 all_same = 0;
|
|
143 }
|
|
144
|
|
145
|
|
146 if (n_var == 0)
|
|
147 {
|
|
148 return;
|
|
149 }
|
|
150
|
|
151 if (all_same)
|
|
152 return;
|
|
153
|
|
154 if (n_var == 1)
|
|
155 {
|
|
156 if (all_const_zero)
|
|
157 return;
|
|
158
|
|
159 }
|
|
160
|
|
161 ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
|
|
162 }
|