Pristine Ack-5.5
[Ack-5.5.git] / mach / arm / top / table
1 /* ARM DESCRIPTOR TABLE FOR ACK TARGET OPTIMISER */
2
3 MAXOP           5;
4 MAXLINELEN      50;
5  
6 %%;
7  
8 ZERO                    {strcmp(VAL,"#0") ==0};
9 CONST,C1,C2,C3,C4       {VAL[0] == '#'};
10 REG,REG1,REG2           {is_register(VAL)};
11 LAB                     {VAL[0] == 'I'};
12 LL,X,Y,Z,W,LOG1,LOG2    {TRUE};
13 XX                      {no_side_effects(VAL)};
14 YY,ZZ,VV,WW             {TRUE};
15 RL11                    {is_reglist_11(VAL)};
16 RL1,RL2,RL3,RL4         {is_reglist1(VAL)};
17 RL13                    {is_local(VAL)};
18 X1,X2,Y1,Y2,Z1,Z2,V1,V2 {TRUE};
19
20 %%;
21  
22 /* save space */
23 ADD REG,REG,ZERO                           -> ;
24 MOV REG, REG                               -> ;
25 STMFD R12<,X:LDMFD R12<,X                  -> ;
26 CMP REG,REG:BNE X1                         -> ;
27 MOV REG,ZERO : ADD REG,REG,CONST           -> MOV REG,CONST;
28 STR REG,XX,Y : LDR REG,XX,Y                -> STR REG,XX,Y;
29 LDR REG,XX,Y: STMFD R12<,Z:LDR REG,XX,Y    -> LDR REG,XX,Y : STMFD R12<,Z;
30 LDR REG,XX,Y: STMFD R12<,Z,W:LDR REG,XX,Y  -> LDR REG,XX,Y : STMFD R12<,Z,W;
31 STR REG,XX : LDR REG,XX                    -> STR REG,XX;
32 LDR REG,XX : STMFD R12<,Z:LDR REG,XX       -> LDR REG,XX : STMFD R12<,Z;
33 LDR REG,XX : STMFD R12<,Z,W:LDR REG,XX     -> LDR REG,XX : STMFD R12<,Z,W;
34 MOV REG, #-2147483648:RSB REG,REG,ZERO     -> MOV REG,#-2147483648;
35 ADD R12,X,Y : MOV R12,R13                  -> MOV R12,R13;
36 MOV R11,REG:STMFD R12<,R11                 -> STMFD R12<,REG;
37 MOV REG,ZERO:MOV REG1,REG,LSR#8:
38 SUB REG,REG,REG1,LSL#8                     -> MOV REG,ZERO;
39
40 /* conditionals */
41 SUB.S REG,X,Y : CMP REG,ZERO               -> SUB.S REG,X,Y;
42 ADD.S REG,X,Y : CMP REG,ZERO               -> ADD.S REG,X,Y;
43 ORR.S REG,X,Y : CMP REG,ZERO               -> ORR.S REG,X,Y;
44 AND.S REG,X,Y : CMP REG,ZERO               -> AND.S REG,X,Y;
45 EOR.S REG,X,Y : CMP REG,ZERO               -> EOR.S REG,X,Y;
46  
47 SUB REG,X,Y : CMP REG,ZERO                 -> SUB.S REG,X,Y;
48 ADD REG,X,Y : CMP REG,ZERO                 -> ADD.S REG,X,Y;
49 ORR REG,X,Y : CMP REG,ZERO                 -> ORR.S REG,X,Y;
50 AND REG,X,Y : CMP REG,ZERO                 -> AND.S REG,X,Y;
51 EOR REG,X,Y : CMP REG,ZERO                 -> EOR.S REG,X,Y;
52  
53 /* speed increase */
54 STR REG,XX,Y : LDR REG1,XX,Y
55         {is_unequal(REG,REG1)}             -> STR REG,XX,Y : MOV REG1,REG;
56 LDR REG,XX,Y : LDR REG1,XX,Y
57         {is_unequal(REG,REG1)}             -> LDR REG,XX,Y : MOV REG1,REG;
58 STR REG,X    : LDR REG1,X
59         {is_unequal(REG,REG1)}             -> STR REG,X    : MOV REG1,REG;
60 LDR REG,X    : LDR REG1,X
61         {is_unequal(REG,REG1)}             -> LDR REG,X    : MOV REG1,REG;
62
63 LDR REG,XX,Y : STR REG,Z,W : LDR REG,XX,Y  -> LDR REG,XX,Y : STR REG,Z,W;
64 LDR REG,X    : STR REG,Z,W : LDR REG,X     -> LDR REG,X    : STR REG,Z,W;
65
66 MOV REG,C1   :STMFD R12<,X,Y : MOV REG,C1  -> MOV REG,C1   : STMFD R12<,X,Y;
67 MOV REG,C1   :STR REG,X,Y    : MOV REG,C1  -> MOV REG,C1   : STR REG,X,Y;
68 MOV REG,C1   :STR REG,X      : MOV REG,C1  -> MOV REG,C1   : STR REG,X;
69
70 MOV REG, ZERO: ADD REG1,REG1,REG           -> MOV REG,ZERO;
71 MOV REG, ZERO: ADD REG,REG,CONST           -> MOV REG,CONST;
72
73 /* for loops */
74 LDR REG,XX,Y:CMP REG,Z:
75 BEQ LAB:LDR REG,XX,Y                       -> LDR REG,XX,Y:CMP REG,Z:BEQ LAB;
76  
77 /* illegal constant optimisation */
78 MOV REG,CONST: RSB REG1,REG,#0 
79         {is_byte(CONST,LOG1)}              -> MVN REG1,#LOG1;
80
81 MOV REG,CONST:ADD REG,REG,#65280:
82 ADD REG,REG,#16711680:
83 ADD REG,REG,#-16777216
84         {is_byte2(CONST,LOG1,LOG2)}        -> MOV REG,#LOG1:
85                                               MOV REG,REG,ASR#LOG2;
86
87 MOV REG,CONST:ADD REG,REG,#65280:
88 ADD REG,REG,#16711680:
89 ADD REG,REG,#-16777216:
90 ADD REG1,REG1,REG
91         {is_byte2(CONST,LOG1,LOG2) && is_unequal(REG1,REG)}
92                                            -> MOV REG,#LOG1:
93                                               ADD REG1,REG1,REG,ASR#LOG2;
94
95 /* combine ldm's and stm's */
96 STMFD R12<, RL1: STMFD R12<, RL2
97         {is_greater(RL1,RL2,W)}            -> STMFD R12<,W;
98 LDMFD R12<, RL1: LDMFD R12<, RL2
99         {is_greater(RL2,RL1,W)}            -> LDMFD R12<,W;
100
101 /* unsigned comparisons */
102 /*MOV.HI REG, #-1:MOV.LS REG, #1:
103 MOV.EQ REG, #0:CMP REG, #0:BGT LAB         -> BLS LAB;
104 */
105 MOV.HI REG, #-1:MOV.LS REG, #1:
106 MOV.EQ REG, #0:CMP REG, #0:BGE LAB         -> BLS LAB /*: BEQ LAB */ ;
107 MOV.HI REG, #-1:MOV.LS REG, #1:
108 MOV.EQ REG, #0:CMP REG, #0:BLE LAB         -> BHI LAB: BEQ LAB;
109 MOV.HI REG, #-1:MOV.LS REG, #1:
110 MOV.EQ REG, #0:CMP REG, #0:BLT LAB         -> BHI LAB;
111
112 MOV.HI REG, #1:MOV.LS REG, #-1:
113 MOV.EQ REG, #0:CMP REG, #0:BGT LAB         -> BHI LAB;
114 MOV.HI REG, #1:MOV.LS REG, #-1:
115 MOV.EQ REG, #0:CMP REG, #0:BGE LAB         -> BHI LAB: BEQ LAB;
116 MOV.HI REG, #1:MOV.LS REG, #-1:
117 MOV.EQ REG, #0:CMP REG, #0:BLE LAB         -> BLS LAB /*: BEQ LAB */ ;
118 /*
119 MOV.HI REG, #1:MOV.LS REG, #-1:
120 MOV.EQ REG, #0:CMP REG, #0:BLT LAB         -> BLS LAB;
121 */
122
123 MOV REG,REG1:RSB REG,REG,ZERO
124         {is_unequal(REG,REG1)}             -> RSB REG,REG1,ZERO;
125
126 MOV REG,REG1:AND REG,REG,REG2
127         {is_unequal3(REG,REG1,REG2)}       -> AND REG,REG1,REG2;
128 MOV REG,REG1:ORR REG,REG,REG2
129         {is_unequal3(REG,REG1,REG2)}       -> ORR REG,REG1,REG2;
130 MOV REG,REG1:EOR REG,REG,REG2
131         {is_unequal3(REG,REG1,REG2)}       -> EOR REG,REG1,REG2;
132
133 /* combine successive pushes into one single multiple push */
134
135 ANY R11,X1,X2 : STMFD R12<,RL11 :
136 SUB R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
137         {is_lams(ANY) && list_f_10(WW)}  ->
138 ANY R11,X1,X2 : SUB R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
139
140 ANY R11,X1    : STMFD R12<,RL11 :
141 SUB R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
142         {is_lams(ANY) && list_f_10(WW)}  ->
143 ANY R11,X1    : SUB R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
144
145 ANY R11,X1,X2 : STMFD R12<,RL11 :
146 ADD R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
147         {is_lams(ANY) && list_f_10(WW)}  ->
148 ANY R11,X1,X2 : ADD R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
149
150 ANY R11,X1    : STMFD R12<,RL11 :
151 ADD R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
152         {is_lams(ANY) && list_f_10(WW)}  ->
153 ANY R11,X1    : ADD R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
154
155 ANY R11,X1,X2 : STMFD R12<,RL11 :
156 LDR R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
157         {is_lams(ANY) && list_f_10(WW)}  ->
158 ANY R11,X1,X2 : LDR R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
159
160 ANY R11,X1    : STMFD R12<,RL11 :
161 LDR R11,Y1,Y2 : STMFD R12<,RL11 : BAL.L LL
162         {is_lams(ANY) && list_f_10(WW)}  ->
163 ANY R11,X1    : LDR R10,Y1,Y2 : STMFD R12<,WW : BAL.L LL  ;
164
165 ANY R11,X1,X2 : STMFD R12<,RL11 :
166 LDR R11,Y1    : STMFD R12<,RL11 : BAL.L LL
167         {is_lams(ANY) && list_f_10(WW)}  ->
168 ANY R11,X1,X2 : LDR R10,Y1    : STMFD R12<,WW : BAL.L LL  ;
169
170 ANY R11,X1    : STMFD R12<,RL11 :
171 LDR R11,Y1    : STMFD R12<,RL11 : BAL.L LL
172         {is_lams(ANY) && list_f_10(WW)}  ->
173 ANY R11,X1    : LDR R10,Y1 : STMFD R12<,WW : BAL.L LL  ;
174
175 ANY R11,X1,X2 : STMFD R12<,RL11 :
176 MOV R11,Y1    : STMFD R12<,RL11 : BAL.L LL
177         {is_lams(ANY) && list_f_10(WW)}  ->
178 ANY R11,X1,X2 : MOV R10,Y1    : STMFD R12<,WW : BAL.L LL  ;
179
180 ANY R11,X1    : STMFD R12<,RL11 :
181 MOV R11,Y1    : STMFD R12<,RL11 : BAL.L LL
182         {is_lams(ANY) && list_f_10(WW)}  ->
183 ANY R11,X1    : MOV R10,Y1 : STMFD R12<,WW : BAL.L LL  ;
184
185 /* three push sequences */
186
187 ANY R11,X1    : STMFD R12<,RL11 :
188 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
189 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
190 {ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
191 ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
192
193 ANY R11,X1    : STMFD R12<,RL11 :
194 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
195 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
196 {ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
197 ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
198
199 ANY R11,X1    : STMFD R12<,RL11 :
200 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
201 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
202 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
203 ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
204
205 ANY R11,X1    : STMFD R12<,RL11 :
206 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
207 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
208 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
209 ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
210
211 ANY R11,X1    : STMFD R12<,RL11 :
212 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
213 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
214 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
215 ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
216
217 ANY R11,X1    : STMFD R12<,RL11 :
218 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
219 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
220 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
221 ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
222
223 ANY R11,X1    : STMFD R12<,RL11 :
224 MOV R11,Y1    : STMFD R12<,RL11 :
225 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
226 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
227 ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
228
229 ANY R11,X1    : STMFD R12<,RL11 :
230 MOV R11,Y1    : STMFD R12<,RL11 :
231 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
232 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
233 ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
234
235 ANY R11,X1    : STMFD R12<,RL11 :
236 MOV R11,Y1    : STMFD R12<,RL11 :
237 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
238 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
239 ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
240
241 ANY R11,X1,X2 : STMFD R12<,RL11 :
242 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
243 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
244 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
245 ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
246
247 ANY R11,X1,X2 : STMFD R12<,RL11 :
248 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
249 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
250 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
251 ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
252
253 ANY R11,X1,X2 : STMFD R12<,RL11 :
254 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
255 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
256 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
257 ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
258
259 ANY R11,X1,X2 : STMFD R12<,RL11 :
260 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
261 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
262 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
263 ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
264
265 ANY R11,X1,X2 : STMFD R12<,RL11 :
266 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
267 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
268 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
269 ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
270
271 ANY R11,X1,X2 : STMFD R12<,RL11 :
272 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
273 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
274 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
275 ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
276
277 ANY R11,X1,X2 : STMFD R12<,RL11 :
278 MOV R11,Y1    : STMFD R12<,RL11 :
279 SUB R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
280 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
281 ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
282
283 ANY R11,X1,X2 : STMFD R12<,RL11 :
284 MOV R11,Y1    : STMFD R12<,RL11 :
285 LDR R11,Z1,Z2 : STMFD R12<,RL11 : BAL.L LL
286 { ok_regcheck2(10,Z1,Z2) && list_f_9(WW)}  ->
287 ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : STMFD R12<,WW : BAL.L LL  ;
288
289 ANY R11,X1,X2 : STMFD R12<,RL11 :
290 MOV R11,Y1    : STMFD R12<,RL11 :
291 MOV R11,Z1    : STMFD R12<,RL11 : BAL.L LL
292 { ok_regcheck1(10,Z1) && list_f_9(WW)}  ->
293 ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : STMFD R12<,WW : BAL.L LL  ;
294
295 /* four push sequences */
296
297 ANY R11,X1    : STMFD R12<,RL11 :
298 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
299 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
300 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
301 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
302 ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
303
304 ANY R11,X1    : STMFD R12<,RL11 :
305 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
306 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
307 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
308 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
309 ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
310
311 ANY R11,X1    : STMFD R12<,RL11 :
312 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
313 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
314 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
315 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
316 ANY R11,X1    : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
317
318 ANY R11,X1    : STMFD R12<,RL11 :
319 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
320 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
321 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
322 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
323 ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
324
325 ANY R11,X1    : STMFD R12<,RL11 :
326 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
327 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
328 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
329 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
330 ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
331
332 ANY R11,X1    : STMFD R12<,RL11 :
333 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
334 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
335 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
336 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
337 ANY R11,X1    : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
338
339 ANY R11,X1    : STMFD R12<,RL11 :
340 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
341 MOV R11,Z1    : STMFD R12<,RL11 :
342 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
343 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
344 ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
345
346 ANY R11,X1    : STMFD R12<,RL11 :
347 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
348 MOV R11,Z1    : STMFD R12<,RL11 :
349 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
350 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
351 ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
352
353 ANY R11,X1    : STMFD R12<,RL11 :
354 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
355 MOV R11,Z1    : STMFD R12<,RL11 :
356 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
357 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
358 ANY R11,X1    : SUB R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
359
360 ANY R11,X1    : STMFD R12<,RL11 :
361 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
362 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
363 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
364 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
365 ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
366
367 ANY R11,X1    : STMFD R12<,RL11 :
368 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
369 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
370 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
371 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
372 ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
373
374 ANY R11,X1    : STMFD R12<,RL11 :
375 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
376 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
377 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
378 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
379 ANY R11,X1    : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
380
381 ANY R11,X1    : STMFD R12<,RL11 :
382 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
383 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
384 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
385 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
386 ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
387
388 ANY R11,X1    : STMFD R12<,RL11 :
389 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
390 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
391 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
392 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
393 ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
394
395 ANY R11,X1    : STMFD R12<,RL11 :
396 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
397 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
398 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
399 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
400 ANY R11,X1    : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
401
402 ANY R11,X1    : STMFD R12<,RL11 :
403 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
404 MOV R11,Z1    : STMFD R12<,RL11 :
405 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
406 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
407 ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
408
409 ANY R11,X1    : STMFD R12<,RL11 :
410 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
411 MOV R11,Z1    : STMFD R12<,RL11 :
412 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
413 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
414 ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
415
416 ANY R11,X1    : STMFD R12<,RL11 :
417 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
418 MOV R11,Z1    : STMFD R12<,RL11 :
419 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
420 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
421 ANY R11,X1    : LDR R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
422
423 ANY R11,X1    : STMFD R12<,RL11 :
424 MOV R11,Y1    : STMFD R12<,RL11 :
425 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
426 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
427 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
428 ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
429
430 ANY R11,X1    : STMFD R12<,RL11 :
431 MOV R11,Y1    : STMFD R12<,RL11 :
432 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
433 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
434 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
435 ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
436
437 ANY R11,X1    : STMFD R12<,RL11 :
438 MOV R11,Y1    : STMFD R12<,RL11 :
439 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
440 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
441 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
442 ANY R11,X1    : MOV R10,Y1    : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
443
444 ANY R11,X1    : STMFD R12<,RL11 :
445 MOV R11,Y1    : STMFD R12<,RL11 :
446 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
447 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
448 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
449 ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
450
451 ANY R11,X1    : STMFD R12<,RL11 :
452 MOV R11,Y1    : STMFD R12<,RL11 :
453 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
454 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
455 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
456 ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
457
458 ANY R11,X1    : STMFD R12<,RL11 :
459 MOV R11,Y1    : STMFD R12<,RL11 :
460 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
461 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
462 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
463 ANY R11,X1    : MOV R10,Y1    : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
464
465 ANY R11,X1    : STMFD R12<,RL11 :
466 MOV R11,Y1    : STMFD R12<,RL11 :
467 MOV R11,Z1    : STMFD R12<,RL11 :
468 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
469 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
470 ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
471
472 ANY R11,X1    : STMFD R12<,RL11 :
473 MOV R11,Y1    : STMFD R12<,RL11 :
474 MOV R11,Z1    : STMFD R12<,RL11 :
475 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
476 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
477 ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
478
479 ANY R11,X1    : STMFD R12<,RL11 :
480 MOV R11,Y1    : STMFD R12<,RL11 :
481 MOV R11,Z1    : STMFD R12<,RL11 :
482 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
483 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
484 ANY R11,X1    : MOV R10,Y1    : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
485
486 ANY R11,X1,X2 : STMFD R12<,RL11 :
487 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
488 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
489 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
490 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
491 ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
492
493 ANY R11,X1,X2 : STMFD R12<,RL11 :
494 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
495 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
496 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
497 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
498 ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
499
500 ANY R11,X1,X2 : STMFD R12<,RL11 :
501 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
502 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
503 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
504 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
505 ANY R11,X1,X2 : SUB R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
506
507 ANY R11,X1,X2 : STMFD R12<,RL11 :
508 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
509 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
510 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
511 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
512 ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
513
514 ANY R11,X1,X2 : STMFD R12<,RL11 :
515 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
516 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
517 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
518 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
519 ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
520
521 ANY R11,X1,X2 : STMFD R12<,RL11 :
522 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
523 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
524 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
525 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
526 ANY R11,X1,X2 : SUB R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
527
528 ANY R11,X1,X2 : STMFD R12<,RL11 :
529 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
530 MOV R11,Z1    : STMFD R12<,RL11 :
531 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
532 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
533 ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
534
535 ANY R11,X1,X2 : STMFD R12<,RL11 :
536 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
537 MOV R11,Z1    : STMFD R12<,RL11 :
538 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
539 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
540 ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
541
542 ANY R11,X1,X2 : STMFD R12<,RL11 :
543 SUB R11,Y1,Y2 : STMFD R12<,RL11 :
544 MOV R11,Z1    : STMFD R12<,RL11 :
545 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
546 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
547 ANY R11,X1,X2 : SUB R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
548
549 ANY R11,X1,X2 : STMFD R12<,RL11 :
550 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
551 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
552 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
553 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
554 ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
555
556 ANY R11,X1,X2 : STMFD R12<,RL11 :
557 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
558 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
559 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
560 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
561 ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
562
563 ANY R11,X1,X2 : STMFD R12<,RL11 :
564 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
565 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
566 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
567 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
568 ANY R11,X1,X2 : LDR R10,Y1,Y2 : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
569
570 ANY R11,X1,X2 : STMFD R12<,RL11 :
571 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
572 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
573 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
574 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
575 ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
576
577 ANY R11,X1,X2 : STMFD R12<,RL11 :
578 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
579 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
580 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
581 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
582 ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
583
584 ANY R11,X1,X2 : STMFD R12<,RL11 :
585 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
586 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
587 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
588 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
589 ANY R11,X1,X2 : LDR R10,Y1,Y2 : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
590
591 ANY R11,X1,X2 : STMFD R12<,RL11 :
592 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
593 MOV R11,Z1    : STMFD R12<,RL11 :
594 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
595 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
596 ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
597
598 ANY R11,X1,X2 : STMFD R12<,RL11 :
599 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
600 MOV R11,Z1    : STMFD R12<,RL11 :
601 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
602 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
603 ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
604
605 ANY R11,X1,X2 : STMFD R12<,RL11 :
606 LDR R11,Y1,Y2 : STMFD R12<,RL11 :
607 MOV R11,Z1    : STMFD R12<,RL11 :
608 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
609 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
610 ANY R11,X1,X2 : LDR R10,Y1,Y2 : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
611
612 ANY R11,X1,X2 : STMFD R12<,RL11 :
613 MOV R11,Y1    : STMFD R12<,RL11 :
614 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
615 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
616 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
617 ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
618
619 ANY R11,X1,X2 : STMFD R12<,RL11 :
620 MOV R11,Y1    : STMFD R12<,RL11 :
621 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
622 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
623 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
624 ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
625
626 ANY R11,X1,X2 : STMFD R12<,RL11 :
627 MOV R11,Y1    : STMFD R12<,RL11 :
628 SUB R11,Z1,Z2 : STMFD R12<,RL11 :
629 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
630 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
631 ANY R11,X1,X2 : MOV R10,Y1    : SUB R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
632
633 ANY R11,X1,X2 : STMFD R12<,RL11 :
634 MOV R11,Y1    : STMFD R12<,RL11 :
635 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
636 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
637 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
638 ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
639
640 ANY R11,X1,X2 : STMFD R12<,RL11 :
641 MOV R11,Y1    : STMFD R12<,RL11 :
642 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
643 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
644 {ok_regcheck2(9,V1,V2) && ok_regcheck4(10,Z1,Z2,V1,V2) && list_f_8(WW)}  ->
645 ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
646
647 ANY R11,X1,X2 : STMFD R12<,RL11 :
648 MOV R11,Y1    : STMFD R12<,RL11 :
649 LDR R11,Z1,Z2 : STMFD R12<,RL11 :
650 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
651 {ok_regcheck1(9,V1) && ok_regcheck3(10,Z1,Z2,V1) && list_f_8(WW)}  ->
652 ANY R11,X1,X2 : MOV R10,Y1    : LDR R9,Z1,Z2 : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
653
654 ANY R11,X1,X2 : STMFD R12<,RL11 :
655 MOV R11,Y1    : STMFD R12<,RL11 :
656 MOV R11,Z1    : STMFD R12<,RL11 :
657 SUB R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
658 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
659 ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : SUB R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
660
661 ANY R11,X1,X2 : STMFD R12<,RL11 :
662 MOV R11,Y1    : STMFD R12<,RL11 :
663 MOV R11,Z1    : STMFD R12<,RL11 :
664 LDR R11,V1,V2 : STMFD R12<,RL11 : BAL.L LL
665 {ok_regcheck2(9,V1,V2) && ok_regcheck3(10,Z1,V1,V2) && list_f_8(WW)}  ->
666 ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : LDR R8,V1,V2 : STMFD R12<,WW : BAL.L LL  ;
667
668 ANY R11,X1,X2 : STMFD R12<,RL11 :
669 MOV R11,Y1    : STMFD R12<,RL11 :
670 MOV R11,Z1    : STMFD R12<,RL11 :
671 MOV R11,V1    : STMFD R12<,RL11 : BAL.L LL
672 {ok_regcheck1(9,V1) && ok_regcheck2(10,Z1,V1) && list_f_8(WW)}  ->
673 ANY R11,X1,X2 : MOV R10,Y1    : MOV R9,Z1    : MOV R8,V1    : STMFD R12<,WW : BAL.L LL  ;
674
675
676
677 %%;
678  
679 int is_register(s)
680 register char *s;
681 { if (*s++ == 'R' && *s >= '0' && *s <= '9') {
682       if (*s++ == '1' && (*s >= '0' && *s <= '5')) s++;
683       return *s == '\0';
684       }
685       return FALSE;
686 }
687  
688 int is_byte(s,t)
689 char *s, *t;
690 {
691         long arg;
692
693         s++;   /* skip # */
694         arg = atol(s);
695         if (arg<1 || arg>256) return(FALSE);
696         sprintf(t,"%d",arg-1);
697         return(TRUE);
698 }
699
700 int is_byte2(s,t1,t2)
701 char *s,*t1,*t2;
702 {
703         long arg, shift;
704
705         s++;
706         arg = atol(s);
707         if (arg<1 || arg>255) return(FALSE);
708         if (arg & 0x80) {
709                 shift = arg << 24;
710                 sprintf(t1,"%ld",shift);
711                 sprintf(t2,"%d", 24);
712                 return(TRUE);
713         }
714         return(FALSE);
715 }
716   
717 int no_side_effects(s)
718 register char *s;
719 {
720         for (;;) {
721                 switch(*s++) {
722                   case '\0': return(TRUE);
723                   case ']' : return(FALSE);
724                   case '<' : return(FALSE);
725                 }
726         }
727 }
728
729 int is_greater(s1, s2, rl)
730 register char *s1, *s2, *rl;
731 {
732         long a1, a2;
733
734         s1++; s1++;   /* skip '{R' */
735         s2++; s2++;
736         a1 = atol(s1);
737         a2 = atol(s2);
738         if (a1 > a2) {
739                 sprintf(rl, "{R%d,R%d}", a2, a1);
740                 return(TRUE);
741         }
742         return(FALSE);
743 }
744
745 int is_local(s)
746 register char *s;
747 {
748         if (strcmp(s, "[R13") == 0) return(TRUE);
749         return(FALSE);
750 }
751
752 int is_reglist_11(s)
753 register char *s;
754 {
755         if (strcmp(s, "{R11}") == 0){
756                 return(TRUE);
757         }
758         return(FALSE);
759 }
760
761 int is_reglist(s)
762 register char *s;
763 {
764         if (*s == '{') return(TRUE);
765         return(FALSE);
766 }
767
768 int is_reglist1(s)
769 register char *s;
770 {
771         if (*s != '{') return(FALSE);
772         for (;;) {
773                 switch(*s++) {
774                         case '\0': return(TRUE);
775                         case ',' : return(FALSE);
776                 }
777         }
778 }
779
780 int is_lams(s)
781 register char *s;
782 {
783 /*      if (strcmp(s,"LDR") == 0) return(TRUE);
784         if (strcmp(s,"ADD") == 0) return(TRUE);
785         if (strcmp(s,"ADR") == 0) return(TRUE);
786         if (strcmp(s,"MOV") == 0) return(TRUE);
787         if (strcmp(s,"SUB") == 0) return(TRUE);
788         return(FALSE);
789 */
790 return(TRUE);
791 }
792
793 int is_unequal(s1, s2)
794 register char *s1, *s2;
795 {
796         long a1, a2;
797
798         s1++; s2++;
799         a1 = atol(s1);
800         a2 = atol(s2);
801         if (a1 == a2) return(FALSE);
802         return(TRUE);
803 }
804
805 int is_unequal3(s1, s2, s3)
806 register char *s1, *s2, *s3;
807 {
808         long a1, a2, a3;
809
810         s1++; s2++; s3++;
811         a1 = atol(s1);
812         a2 = atol(s2);
813         a3 = atol(s3);
814         if (a1 == a2) return(FALSE);
815         if (a3 == a2) return(FALSE);
816         if (a1 == a3) return(FALSE);
817         return(TRUE);
818 }
819
820 int list_f_10(s)
821 register char *s;
822 {
823         sprintf(s,"{R10,R11}");
824         return(TRUE);
825 }
826
827 int list_f_9(s)
828 register char *s;
829 {
830         sprintf(s,"{R9,R10,R11}");
831         return(TRUE);
832 }
833
834 int list_f_8(s)
835 register char *s;
836 {
837         sprintf(s,"{R8,R9,R10,R11}");
838         return(TRUE);
839 }
840
841 int ok_regcheck1(r, s1)
842 register char *s1;
843 int r;
844 {
845         int a1;
846
847         if (*s1 == '[') s1++;
848         if (*s1 != 'R') return(TRUE);
849         s1++;  /* skip R */
850         a1 = atoi(s1);
851         if (a1 >= r && a1 <= 11) return(FALSE);
852         return(TRUE);
853 }
854
855 int ok_regcheck2(r, s1, s2)
856 register char *s1, *s2;
857 int r;
858 {
859         if (ok_regcheck1(r,s1))
860                 if (ok_regcheck1(r,s2))
861                         return(TRUE);
862         return(FALSE);
863 }
864
865 int ok_regcheck3(r, s1, s2, s3)
866 register char *s1, *s2, *s3;
867 int r;
868 {
869         if (ok_regcheck1(r,s1))
870                 if (ok_regcheck2(r,s2,s3))
871                         return(TRUE);
872         return(FALSE);
873 }
874
875 int ok_regcheck4(r, s1, s2, s3, s4)
876 register char *s1, *s2, *s3, *s4;
877 int r;
878 {
879         if (ok_regcheck2(r,s1,s2))
880                 if (ok_regcheck2(r,s3,s4))
881                         return(TRUE);
882         return(FALSE);
883 }
884
885 int ok_regcheck5(r, s1, s2, s3, s4, s5)
886 register char *s1, *s2, *s3, *s4, *s5;
887 int r;
888 {
889         if (ok_regcheck2(r,s1,s2))
890                 if (ok_regcheck3(r,s3,s4,s5))
891                         return(TRUE);
892         return(FALSE);
893 }
894
895 int ok_regcheck6(r, s1, s2, s3, s4, s5, s6)
896 register char *s1, *s2, *s3, *s4, *s5, *s6;
897 int r;
898 {
899         if (ok_regcheck2(r,s1,s2))
900                 if (ok_regcheck4(r,s3,s4,s5,s6))
901                         return(TRUE);
902         return(FALSE);
903 }
904
905 int ok_regcheck7(r, s1, s2, s3, s4, s5, s6, s7)
906 register char *s1, *s2, *s3, *s4, *s5, *s6, *s7;
907 int r;
908 {
909         if (ok_regcheck4(r,s1,s2,s3,s4))
910                 if (ok_regcheck3(r,s5,s6,s7))
911                         return(TRUE);
912         return(FALSE);
913 }
914
915 int ok_regcheck8(r, s1, s2, s3, s4, s5, s6, s7, s8)
916 register char *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8;
917 int r;
918 {
919         if (ok_regcheck4(r,s1,s2,s3,s4))
920                 if (ok_regcheck4(r,s5,s6,s7,s8))
921                         return(TRUE);
922         return(FALSE);
923 }
924
925