1 typedef unsigned long int unsigned_word
;
2 typedef signed long int signed_word
;
3 typedef unsigned_word word
;
5 typedef enum { ADD
, ADD_CI
, ADD_CO
, ADD_CIO
, SUB
, SUB_CI
, SUB_CO
,
6 SUB_CIO
, ADC_CI
, ADC_CO
, ADC_CIO
, AND
, IOR
, XOR
, ANDC
, IORC
, EQV
,
7 NAND
, NOR
, AND_RC
, IOR_RC
, XOR_RC
, ANDC_RC
, IORC_RC
, EQV_RC
, NAND_RC
,
8 NOR_RC
, AND_CC
, IOR_CC
, XOR_CC
, ANDC_CC
, IORC_CC
, EQV_CC
, NAND_CC
,
9 NOR_CC
, LSHIFTR
, ASHIFTR
, SHIFTL
, LSHIFTR_CO
, ASHIFTR_CO
, SHIFTL_CO
,
10 ROTATEL
, ROTATEL_CO
, ROTATEXL_CIO
, ASHIFTR_CON
, EXTS1
, EXTS2
, EXTU1
,
11 EXTU2
, CLZ
, CTZ
, FF1
, FF0
, ABSVAL
, NABSVAL
, CMP
, CPEQ
, CPGE
, CPGEU
,
12 CPGT
, CPGTU
, CPLE
, CPLEU
, CPLT
, CPLTU
, CPNEQ
, CMPPAR
, DOZ
, COPY
,
13 EXCHANGE
, COMCY
, } opcode_t
;
31 int flag_use_carry
= 1;
34 recurse(opcode_t opcode
,
44 const word goal_value
,
64 sequence
[n_insns
] = insn
;
66 synth(sequence
, n_insns
+ 1, values
, n_values
,
67 goal_value
, allowed_cost
, cy
, prune_flags
);
71 else if (goal_value
== v
)
77 sequence
[n_insns
] = insn
;
78 test_sequence(sequence
, n_insns
+ 1);
82 synth(insn_t
*sequence
,
97 last_dest
= sequence
[n_insns
- 1].d
;
100 if (ci
>= 0 && flag_use_carry
)
102 for (s1
= n_values
- 1; s1
>= 0; s1
--)
105 for (s2
= s1
- 1; s2
>= 0; s2
--)
109 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
111 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
114 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
115 recurse(ADD_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
116 do { word __d
= ( r1
) + ( r2
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
117 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
);
119 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r1
) : __d
> ( r1
); (v
) = __d
; } while (0);
120 recurse(SUB_CIO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
121 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( r2
) : __d
> ( r2
); (v
) = __d
; } while (0);
122 recurse(SUB_CIO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
124 do { word __d
= ( r1
) - ( r2
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
125 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
);
126 do { word __d
= ( r2
) - ( r1
) - (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
127 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
);
132 for (s1
= n_values
- 1; s1
>= 0; s1
--)
135 for (s2
= s1
- 1; s2
>= 0; s2
--)
139 if (allowed_cost
<= 1)
141 if (last_dest
>= 0 && s1
!= last_dest
&& s2
!= last_dest
)
145 do { word __d
= ( r1
) + ( r2
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
146 recurse(ADD_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
148 ((v
) = ( r1
) + ( r2
), ( co
) = ( ci
));
149 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
);
151 do { word __d
= ( r1
) - ( r2
); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
152 recurse(SUB_CO
, n_values
, s1
, s2
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
153 do { word __d
= ( r2
) - ( r1
); ( co
) = __d
> ( r2
); (v
) = __d
; } while (0);
154 recurse(SUB_CO
, n_values
, s2
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
155 ((v
) = ( r1
) - ( r2
), ( co
) = ( ci
));
156 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
);
157 ((v
) = ( r2
) - ( r1
), ( co
) = ( ci
));
158 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
);
160 ((v
) = ( r1
) & ( r2
), ( co
) = ( ci
));
161 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
);
163 ((v
) = ( r1
) | ( r2
), ( co
) = ( ci
));
164 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
);
166 ((v
) = ( r1
) ^ ( r2
), ( co
) = ( ci
));
167 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
);
169 ((v
) = ( r1
) & ~( r2
), ( co
) = ( ci
));
170 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
);
171 ((v
) = ( r2
) & ~( r1
), ( co
) = ( ci
));
172 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
);
173 ((v
) = ( r1
) | ~( r2
), ( co
) = ( ci
));
174 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
);
175 ((v
) = ( r2
) | ~( r1
), ( co
) = ( ci
));
176 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
);
177 ((v
) = ( r1
) ^ ~( r2
), ( co
) = ( ci
));
178 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
);
182 if (ci
>= 0 && flag_use_carry
)
184 for (s1
= n_values
- 1; s1
>= 0; s1
--)
188 if (allowed_cost
<= 1 && (prune_hint
& CY_JUST_SET
) == 0)
191 if (last_dest
>= 0 && s1
!= last_dest
)
195 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
196 recurse(ADD_CIO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
198 do { word __d
= ( r1
) + ( r1
) + (( ci
)); ( co
) = ( ci
); (v
) = __d
; } while (0);
199 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
);
201 do { word __d
= ( r1
) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
202 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
);
204 do { word __d
= ( r1
) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( r1
) : __d
< ( r1
); (v
) = __d
; } while (0);
205 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
);
206 do { word __d
= ( 0 ) - ( r1
) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
207 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
);
211 for (s1
= n_values
- 1; s1
>= 0; s1
--)
215 if (allowed_cost
<= 1)
217 if (last_dest
>= 0 && s1
!= last_dest
)
220 do { word __d
= ( r1
) + ( r1
); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
221 recurse(ADD_CO
, n_values
, s1
, s1
, v
, 1, sequence
, n_insns
, values
, n_values
+ 1, goal_value
, allowed_cost
, co
, CY_JUST_SET
);
223 ((v
) = ( r1
) & ( 1 ), ( co
) = ( ci
));
224 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
);
226 ((v
) = ( r1
) ^ ( 1 ), ( co
) = ( ci
));
227 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
);
229 ((v
) = ( -1 ) - ( r1
), ( co
) = ( ci
));
230 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
);
231 do { word __d
= ( r1
) + ( 1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
232 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
);
233 ((v
) = ( r1
) + ( 1 ), ( co
) = ( ci
));
234 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
);
235 do { word __d
= ( r1
) + ( -1 ); ( co
) = __d
< ( r1
); (v
) = __d
; } while (0);
236 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
);
237 do { word __d
= ( r1
) - ( 1 ); ( co
) = __d
> ( r1
); (v
) = __d
; } while (0);
238 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
);
239 do { word __d
= ( 0 ) - ( r1
); ( co
) = __d
> ( 0 ); (v
) = __d
; } while (0);
240 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
);
241 ((v
) = ( 0 ) - ( r1
), ( co
) = ( ci
));
242 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
);
243 ((v
) = ((unsigned_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
244 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
);
245 ((v
) = ((signed_word
) ( r1
) >> (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
246 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
);
247 ((v
) = ((signed_word
) ( r1
) << (( 1 ) & (32 - 1)) ), ( co
) = ( ci
));
248 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
);
249 ((v
) = ((unsigned_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
250 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
);
251 ((v
) = ((signed_word
) ( r1
) >> (( 32 -1 ) & (32 - 1)) ), ( co
) = ( ci
));
252 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
);
254 if (ci
>= 0 && flag_use_carry
255 && (allowed_cost
<= 1 ? ((prune_hint
& CY_JUST_SET
) != 0) : 1))
257 do { word __d
= ( 0 ) + ( 0 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
258 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
);
259 do { word __d
= ( 0 ) - ( 0 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
260 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
);
261 do { word __d
= ( 0 ) - ( -1 ) - (( ci
)); ( co
) = ( ci
) ? __d
>= ( 0 ) : __d
> ( 0 ); (v
) = __d
; } while (0);
262 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
);
263 do { word __d
= ( 0 ) + ( -1 ) + (( ci
)); ( co
) = ( ci
) ? __d
<= ( 0 ) : __d
< ( 0 ); (v
) = __d
; } while (0);
264 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
);
268 if (allowed_cost
> 1)
270 ((v
) = ( 0x80000000 ), ( co
) = ( ci
));
271 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
);
273 ((v
) = ( -1 ), ( co
) = ( ci
));
274 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
);
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
);