1 /* The problem on IA-64 is that if-conversion creates a sequence
3 (p17) cmp.geu p6, p7 = r48, r15
4 (p16) cmp.gtu p6, p7 = r48, r15
6 where p16 and p17 are complemenary, but the assembler DV validation
7 code doesn't recognize that p6 and p7 are complimentary, and so
8 we end up warning for a later use
13 that appears to be a WAW violation. */
15 /* { dg-prune-output "Assembler messages" } */
16 /* { dg-prune-output "violate\[^\n\]*dependency" } */
17 /* { dg-prune-output "first path encountering" } */
18 /* { dg-prune-output "location of the conflicting" } */
20 typedef unsigned long int unsigned_word
;
21 typedef signed long int signed_word
;
22 typedef unsigned_word word
;
24 typedef enum { ADD
, ADD_CI
, ADD_CO
, ADD_CIO
, SUB
, SUB_CI
, SUB_CO
,
25 SUB_CIO
, ADC_CI
, ADC_CO
, ADC_CIO
, AND
, IOR
, XOR
, ANDC
, IORC
, EQV
,
26 NAND
, NOR
, AND_RC
, IOR_RC
, XOR_RC
, ANDC_RC
, IORC_RC
, EQV_RC
, NAND_RC
,
27 NOR_RC
, AND_CC
, IOR_CC
, XOR_CC
, ANDC_CC
, IORC_CC
, EQV_CC
, NAND_CC
,
28 NOR_CC
, LSHIFTR
, ASHIFTR
, SHIFTL
, LSHIFTR_CO
, ASHIFTR_CO
, SHIFTL_CO
,
29 ROTATEL
, ROTATEL_CO
, ROTATEXL_CIO
, ASHIFTR_CON
, EXTS1
, EXTS2
, EXTU1
,
30 EXTU2
, CLZ
, CTZ
, FF1
, FF0
, ABSVAL
, NABSVAL
, CMP
, CPEQ
, CPGE
, CPGEU
,
31 CPGT
, CPGTU
, CPLE
, CPLEU
, CPLT
, CPLTU
, CPNEQ
, CMPPAR
, DOZ
, COPY
,
32 EXCHANGE
, COMCY
, } opcode_t
;
50 int flag_use_carry
= 1;
53 recurse(opcode_t opcode
,
63 const word goal_value
,
83 sequence
[n_insns
] = insn
;
85 synth(sequence
, n_insns
+ 1, values
, n_values
,
86 goal_value
, allowed_cost
, cy
, prune_flags
);
90 else if (goal_value
== v
)
96 sequence
[n_insns
] = insn
;
97 test_sequence(sequence
, n_insns
+ 1);
101 synth(insn_t
*sequence
,
116 last_dest
= sequence
[n_insns
- 1].d
;
119 if (ci
>= 0 && flag_use_carry
)
121 for (s1
= n_values
- 1; s1
>= 0; s1
--)
124 for (s2
= s1
- 1; s2
>= 0; s2
--)
128 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
130 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
133 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
134 recurse(ADD_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
135 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
136 recurse(ADD_CI
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
138 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r1
) : __d
> ( r1
); (v
) = __d
; } while (0);
139 recurse(SUB_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
140 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r2
) : __d
> ( r2
); (v
) = __d
; } while (0);
141 recurse(SUB_CIO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
143 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
144 recurse(SUB_CI
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
145 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
146 recurse(SUB_CI
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
151 for (s1
= n_values
- 1; s1
>= 0; s1
--)
154 for (s2
= s1
- 1; s2
>= 0; s2
--)
158 if (allowed_cost
<= 1)
160 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
164 do { word __d
= ( r1
) + ( r2
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
165 recurse(ADD_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
167 ((v
) = ( r1
) + ( r2
), ( co
) = ( ci
));
168 recurse(ADD
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
170 do { word __d
= ( r1
) - ( r2
); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
171 recurse(SUB_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
172 do { word __d
= ( r2
) - ( r1
); ( co
) = __d
> ( r2
); (v
) = __d
; } while (0);
173 recurse(SUB_CO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
174 ((v
) = ( r1
) - ( r2
), ( co
) = ( ci
));
175 recurse(SUB
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
176 ((v
) = ( r2
) - ( r1
), ( co
) = ( ci
));
177 recurse(SUB
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
179 ((v
) = ( r1
) & ( r2
), ( co
) = ( ci
));
180 recurse(AND
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
182 ((v
) = ( r1
) | ( r2
), ( co
) = ( ci
));
183 recurse(IOR
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
185 ((v
) = ( r1
) ^ ( r2
), ( co
) = ( ci
));
186 recurse(XOR
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
188 ((v
) = ( r1
) & ~( r2
), ( co
) = ( ci
));
189 recurse(ANDC
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
190 ((v
) = ( r2
) & ~( r1
), ( co
) = ( ci
));
191 recurse(ANDC
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
192 ((v
) = ( r1
) | ~( r2
), ( co
) = ( ci
));
193 recurse(IORC
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
194 ((v
) = ( r2
) | ~( r1
), ( co
) = ( ci
));
195 recurse(IORC
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
196 ((v
) = ( r1
) ^ ~( r2
), ( co
) = ( ci
));
197 recurse(EQV
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
201 if (ci
>= 0 && flag_use_carry
)
203 for (s1
= n_values
- 1; s1
>= 0; s1
--)
207 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
210 if (last_dest
>= 0 && s1
!= last_dest
)
214 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
215 recurse(ADD_CIO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
217 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
218 recurse(ADD_CI
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
220 do { word __d
= ( r1
) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
221 recurse(ADD_CIO
, n_values
, s1
, (0x20 + -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
223 do { word __d
= ( r1
) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
224 recurse(ADD_CIO
, n_values
, s1
, (0x20 + 0) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
225 do { word __d
= ( 0 ) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
226 recurse(SUB_CIO
, n_values
, (0x20 + 0) , s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
230 for (s1
= n_values
- 1; s1
>= 0; s1
--)
234 if (allowed_cost
<= 1)
236 if (last_dest
>= 0 && s1
!= last_dest
)
239 do { word __d
= ( r1
) + ( r1
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
240 recurse(ADD_CO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
242 ((v
) = ( r1
) & ( 1 ), ( co
) = ( ci
));
243 recurse(AND
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
245 ((v
) = ( r1
) ^ ( 1 ), ( co
) = ( ci
));
246 recurse(XOR
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
248 ((v
) = ( -1 ) - ( r1
), ( co
) = ( ci
));
249 recurse(SUB
, n_values
, (0x20 + -1) , s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
250 do { word __d
= ( r1
) + ( 1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
251 recurse(ADD_CO
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
252 ((v
) = ( r1
) + ( 1 ), ( co
) = ( ci
));
253 recurse(ADD
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
254 do { word __d
= ( r1
) + ( -1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
255 recurse(ADD_CO
, n_values
, s1
, (0x20 + -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
256 do { word __d
= ( r1
) - ( 1 ); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
257 recurse(SUB_CO
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
258 do { word __d
= ( 0 ) - ( r1
); ( co
) = __d
> ( 0 ); (v
) = __d
; } while (0);
259 recurse(SUB_CO
, n_values
, (0x20 + 0) , s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
260 ((v
) = ( 0 ) - ( r1
), ( co
) = ( ci
));
261 recurse(SUB
, n_values
, (0x20 + 0) , s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
262 ((v
) = ((unsigned_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
263 recurse(LSHIFTR
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
264 ((v
) = ((signed_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
265 recurse(ASHIFTR
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
266 ((v
) = ((signed_word
) ( r1
) << (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
267 recurse(SHIFTL
, n_values
, s1
, (0x20 + 1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
268 ((v
) = ((unsigned_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
269 recurse(LSHIFTR
, n_values
, s1
, (0x20 + 32 -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
270 ((v
) = ((signed_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
271 recurse(ASHIFTR
, n_values
, s1
, (0x20 + 32 -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
273 if (ci
>= 0 && flag_use_carry
274 && (allowed_cost
<= 1 ? ((prune_hint
& CY_JUST_SET
) != 0) : 1))
276 do { word __d
= ( 0 ) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
277 recurse(ADD_CIO
, n_values
, (0x20 + 0) , (0x20 + 0) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
| CY_0
);
278 do { word __d
= ( 0 ) - ( 0 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
279 recurse(SUB_CIO
, n_values
, (0x20 + 0) , (0x20 + 0) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
280 do { word __d
= ( 0 ) - ( -1 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
281 recurse(SUB_CIO
, n_values
, (0x20 + 0) , (0x20 + -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
| CY_1
);
282 do { word __d
= ( 0 ) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
283 recurse(ADD_CIO
, n_values
, (0x20 + 0) , (0x20 + -1) , v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
287 if (allowed_cost
> 1)
289 ((v
) = ( 0x80000000 ), ( co
) = ( ci
));
290 recurse(COPY
, n_values
, (0x20 - 2) , 0, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
292 ((v
) = ( -1 ), ( co
) = ( ci
));
293 recurse(COPY
, n_values
, (0x20 + -1) , 0, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);
295 ((v
) = ( 1 ), ( co
) = ( ci
));
296 recurse(COPY
, n_values
, (0x20 + 1) , 0, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, prune_hint
& ~CY_JUST_SET
);