1 /* { dg-skip-if "too many arguments in function call" { bpf-*-* } } */
2 /* { dg-additional-options "-std=gnu89" } */
4 typedef unsigned long int unsigned_word
;
5 typedef signed long int signed_word
;
6 typedef unsigned_word word
;
8 typedef enum { ADD
, ADD_CI
, ADD_CO
, ADD_CIO
, SUB
, SUB_CI
, SUB_CO
,
9 SUB_CIO
, ADC_CI
, ADC_CO
, ADC_CIO
, AND
, IOR
, XOR
, ANDC
, IORC
, EQV
,
10 NAND
, NOR
, AND_RC
, IOR_RC
, XOR_RC
, ANDC_RC
, IORC_RC
, EQV_RC
, NAND_RC
,
11 NOR_RC
, AND_CC
, IOR_CC
, XOR_CC
, ANDC_CC
, IORC_CC
, EQV_CC
, NAND_CC
,
12 NOR_CC
, LSHIFTR
, ASHIFTR
, SHIFTL
, LSHIFTR_CO
, ASHIFTR_CO
, SHIFTL_CO
,
13 ROTATEL
, ROTATEL_CO
, ROTATEXL_CIO
, ASHIFTR_CON
, EXTS1
, EXTS2
, EXTU1
,
14 EXTU2
, CLZ
, CTZ
, FF1
, FF0
, ABSVAL
, NABSVAL
, CMP
, CPEQ
, CPGE
, CPGEU
,
15 CPGT
, CPGTU
, CPLE
, CPLEU
, CPLT
, CPLTU
, CPNEQ
, CMPPAR
, DOZ
, COPY
,
16 EXCHANGE
, COMCY
, } opcode_t
;
34 int flag_use_carry
= 1;
37 recurse(opcode_t opcode
,
47 const word goal_value
,
67 sequence
[n_insns
] = insn
;
69 synth(sequence
, n_insns
+ 1, values
, n_values
,
70 goal_value
, allowed_cost
, cy
, prune_flags
);
74 else if (goal_value
== v
)
80 sequence
[n_insns
] = insn
;
81 test_sequence(sequence
, n_insns
+ 1);
85 synth(insn_t
*sequence
,
100 last_dest
= sequence
[n_insns
- 1].d
;
103 if (ci
>= 0 && flag_use_carry
)
105 for (s1
= n_values
- 1; s1
>= 0; s1
--)
108 for (s2
= s1
- 1; s2
>= 0; s2
--)
112 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
114 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
117 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
118 recurse(ADD_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
119 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
120 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
);
122 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r1
) : __d
> ( r1
); (v
) = __d
; } while (0);
123 recurse(SUB_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
124 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r2
) : __d
> ( r2
); (v
) = __d
; } while (0);
125 recurse(SUB_CIO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
127 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
128 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
);
129 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
130 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
);
135 for (s1
= n_values
- 1; s1
>= 0; s1
--)
138 for (s2
= s1
- 1; s2
>= 0; s2
--)
142 if (allowed_cost
<= 1)
144 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
148 do { word __d
= ( r1
) + ( r2
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
149 recurse(ADD_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
151 ((v
) = ( r1
) + ( r2
), ( co
) = ( ci
));
152 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
);
154 do { word __d
= ( r1
) - ( r2
); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
155 recurse(SUB_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
156 do { word __d
= ( r2
) - ( r1
); ( co
) = __d
> ( r2
); (v
) = __d
; } while (0);
157 recurse(SUB_CO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
158 ((v
) = ( r1
) - ( r2
), ( co
) = ( ci
));
159 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
);
160 ((v
) = ( r2
) - ( r1
), ( co
) = ( ci
));
161 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
);
163 ((v
) = ( r1
) & ( r2
), ( co
) = ( ci
));
164 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
);
166 ((v
) = ( r1
) | ( r2
), ( co
) = ( ci
));
167 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
);
169 ((v
) = ( r1
) ^ ( r2
), ( co
) = ( ci
));
170 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
);
172 ((v
) = ( r1
) & ~( r2
), ( co
) = ( ci
));
173 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
);
174 ((v
) = ( r2
) & ~( r1
), ( co
) = ( ci
));
175 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
);
176 ((v
) = ( r1
) | ~( r2
), ( co
) = ( ci
));
177 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
);
178 ((v
) = ( r2
) | ~( r1
), ( co
) = ( ci
));
179 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
);
180 ((v
) = ( r1
) ^ ~( r2
), ( co
) = ( ci
));
181 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
);
185 if (ci
>= 0 && flag_use_carry
)
187 for (s1
= n_values
- 1; s1
>= 0; s1
--)
191 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
194 if (last_dest
>= 0 && s1
!= last_dest
)
198 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
199 recurse(ADD_CIO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
201 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
202 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
);
204 do { word __d
= ( r1
) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
205 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
);
207 do { word __d
= ( r1
) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
208 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
);
209 do { word __d
= ( 0 ) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
210 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
);
214 for (s1
= n_values
- 1; s1
>= 0; s1
--)
218 if (allowed_cost
<= 1)
220 if (last_dest
>= 0 && s1
!= last_dest
)
223 do { word __d
= ( r1
) + ( r1
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
224 recurse(ADD_CO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
226 ((v
) = ( r1
) & ( 1 ), ( co
) = ( ci
));
227 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
);
229 ((v
) = ( r1
) ^ ( 1 ), ( co
) = ( ci
));
230 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
);
232 ((v
) = ( -1 ) - ( r1
), ( co
) = ( ci
));
233 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
);
234 do { word __d
= ( r1
) + ( 1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
235 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
);
236 ((v
) = ( r1
) + ( 1 ), ( co
) = ( ci
));
237 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
);
238 do { word __d
= ( r1
) + ( -1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
239 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
);
240 do { word __d
= ( r1
) - ( 1 ); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
241 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
);
242 do { word __d
= ( 0 ) - ( r1
); ( co
) = __d
> ( 0 ); (v
) = __d
; } while (0);
243 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
);
244 ((v
) = ( 0 ) - ( r1
), ( co
) = ( ci
));
245 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
);
246 ((v
) = ((unsigned_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
247 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
);
248 ((v
) = ((signed_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
249 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
);
250 ((v
) = ((signed_word
) ( r1
) << (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
251 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
);
252 ((v
) = ((unsigned_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
253 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
);
254 ((v
) = ((signed_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
255 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
);
257 if (ci
>= 0 && flag_use_carry
258 && (allowed_cost
<= 1 ? ((prune_hint
& CY_JUST_SET
) != 0) : 1))
260 do { word __d
= ( 0 ) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
261 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
);
262 do { word __d
= ( 0 ) - ( 0 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
263 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
);
264 do { word __d
= ( 0 ) - ( -1 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
265 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
);
266 do { word __d
= ( 0 ) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
267 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
);
271 if (allowed_cost
> 1)
273 ((v
) = ( 0x80000000 ), ( co
) = ( ci
));
274 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
);
276 ((v
) = ( -1 ), ( co
) = ( ci
));
277 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
);
279 ((v
) = ( 1 ), ( co
) = ( ci
));
280 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
);