comparison gcc/testsuite/c-c++-common/pr44832.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
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 }