* add p cc
[mascara-docs.git] / compilers / pcc / pcc-1.0.0 / arch / arm / table.c
blob70e57189c0b9fc99186d199bd3aa0f7d47d03b2a
1 /* $Id: table.c,v 1.19 2008/05/16 02:20:36 gmcgarry Exp $ */
2 /*-
3 * Copyright (c) 2007 Gregory McGarry <g.mcgarry@ieee.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 * A template has five logical sections:
21 * 1) subtree (operator); goal to achieve (cookie)
22 * 2) left node descendent of operator (node class; type)
23 * 3) right node descendent of operator (node class; type)
24 * 4) resource requirements (number of scratch registers);
25 * subtree rewriting rule
26 * 5) emitted instructions
29 #include "pass2.h"
31 #define TUWORD TUNSIGNED|TULONG
32 #define TSWORD TINT|TLONG
33 #define TWORD TUWORD|TSWORD
35 struct optab table[] = {
36 /* First entry must be an empty entry */
37 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
39 /* PCONVs are not necessary */
40 { PCONV, INAREG,
41 SAREG, TWORD|TPOINT,
42 SAREG, TWORD|TPOINT,
43 0, RLEFT,
44 COM "pointer conversion\n", },
48 * Conversions of integral types
50 * For each deunsigned type, they look something like this:
52 * signed -> bigger signed - nothing to do
53 * signed -> bigger unsigned - clear the top bits (of source type)
55 * signed -> smaller signed - sign-extend the bits (to dest type)
56 * signed -> smaller unsigned - clear the top bits (of dest type)
57 * unsigned -> smaller signed - sign-extend top bits (to dest type)
58 * unsigned -> smaller unsigned - clear the top bits (of dest type)
60 * unsigned -> bigger - nothing to do
63 { SCONV, INAREG,
64 SAREG, TCHAR,
65 SAREG, TSWORD|TSHORT,
66 0, RLEFT,
67 COM "convert char to short/int\n", },
69 { SCONV, INAREG,
70 SAREG, TCHAR,
71 SAREG, TUWORD|TUSHORT|TUCHAR,
72 NAREG|NASL, RESC1,
73 " and A1,AL,#255" COM "convert char to uchar/ushort/uint\n", },
75 { SCONV, INAREG | FEATURE_EXTEND,
76 SAREG, TUCHAR,
77 SAREG, TCHAR,
78 NAREG|NASL, RESC1,
79 " sxtb A1,AL" COM "convert uchar to char\n", },
81 { SCONV, INAREG,
82 SAREG, TUCHAR,
83 SAREG, TCHAR,
84 NAREG|NASL, RESC1,
85 " mov A1,AL,asl #24" COM "convert uchar to char\n"
86 " mov A1,A1,asr #24\n", },
88 { SCONV, INAREG,
89 SAREG, TUCHAR,
90 SAREG, TWORD|TSHORT|TUSHORT,
91 0, RLEFT,
92 COM "convert uchar to (u)short/(u)int\n", },
94 { SCONV, INAREG,
95 SAREG, TSHORT,
96 SAREG, TSWORD,
97 0, RLEFT,
98 COM "convert short to int\n", },
100 { SCONV, INAREG | FEATURE_EXTEND,
101 SAREG, TSHORT,
102 SAREG, TUWORD|TUSHORT,
103 NAREG|NASL, RESC1,
104 " uxth A1,AL" COM "convert short to uint\n", },
106 { SCONV, INAREG,
107 SAREG, TSHORT,
108 SAREG, TUWORD|TUSHORT,
109 NAREG|NASL, RESC1,
110 " mov A1,AL,asl #16" COM "convert short to uint\n"
111 " mov A1,AL,lsr #16\n", },
113 { SCONV, INAREG | FEATURE_EXTEND,
114 SAREG, TUSHORT,
115 SAREG, TSHORT,
116 NAREG|NASL, RESC1,
117 " sxth A1,AL" COM "convert ushort to short\n", },
119 { SCONV, INAREG,
120 SAREG, TUSHORT,
121 SAREG, TSHORT,
122 NAREG|NASL, RESC1,
123 " mov A1,AL,asl #16" COM "convert ushort to short\n"
124 " mov A1,A1,asr #16\n", },
126 { SCONV, INAREG | FEATURE_EXTEND,
127 SAREG, TSHORT|TUSHORT,
128 SAREG, TCHAR,
129 NAREG|NASL, RESC1,
130 " sxtb A1,AL" COM "convert (u)short to char\n", },
132 { SCONV, INAREG,
133 SAREG, TSHORT|TUSHORT,
134 SAREG, TCHAR,
135 NAREG|NASL, RESC1,
136 " mov A1,AL,asl #24" COM "convert (u)short to char\n"
137 " mov A1,A1,asr #24\n", },
139 { SCONV, INAREG,
140 SAREG, TSHORT|TUSHORT,
141 SAREG, TCHAR,
142 NAREG|NASL, RESC1,
143 " sxtb A1,AL" COM "convert (u)short to char\n", },
145 { SCONV, INAREG,
146 SAREG, TSHORT|TUSHORT,
147 SAREG, TUCHAR,
148 NAREG|NASL, RESC1,
149 " and A1,AL,#255" COM "convert (u)short to uchar\n", },
151 { SCONV, INAREG,
152 SAREG, TUSHORT,
153 SAREG, TWORD,
154 0, RLEFT,
155 COM "convert ushort to (u)int\n", },
157 { SCONV, INAREG | FEATURE_EXTEND,
158 SAREG, TWORD,
159 SAREG, TCHAR,
160 NAREG|NASL, RESC1,
161 " sxtb A1,AL" COM "convert (u)int to char\n", },
163 { SCONV, INAREG,
164 SAREG, TWORD,
165 SAREG, TCHAR,
166 NAREG|NASL, RESC1,
167 " mov A1,AL,asl #24" COM "convert (u)int to char\n"
168 " mov A1,A1,asr #24\n", },
170 { SCONV, INAREG | FEATURE_EXTEND,
171 SAREG, TWORD,
172 SAREG, TSHORT,
173 NAREG|NASL, RESC1,
174 " sxth A1,AL" COM "convert (u)int to short\n", },
176 { SCONV, INAREG,
177 SAREG, TWORD,
178 SAREG, TSHORT,
179 NAREG|NASL, RESC1,
180 " mov A1,AL,asl #16" COM "convert (u)int to short\n"
181 " mov A1,A1,asr #16\n", },
183 { SCONV, INAREG,
184 SAREG, TWORD,
185 SAREG, TUCHAR,
186 NAREG|NASL, RESC1,
187 " and A1,AL,#255" COM "convert uchar to char\n", },
189 { SCONV, INAREG | FEATURE_EXTEND,
190 SAREG, TWORD,
191 SAREG, TUSHORT,
192 NAREG|NASL, RESC1,
193 " uxth A1,AL" COM "convert int to ushort\n", },
195 { SCONV, INAREG,
196 SAREG, TWORD,
197 SAREG, TUSHORT,
198 NAREG|NASL, RESC1,
199 " mov A1,AL,asl #16" COM "convert int to ushort\n"
200 " mov A1,AL,lsr #16\n", },
202 { SCONV, INAREG,
203 SAREG, TPOINT|TWORD,
204 SAREG, TWORD|TPOINT,
205 0, RLEFT,
206 COM "convert between pointers and words\n", },
208 { SCONV, INBREG,
209 SBREG, TLONGLONG|TULONGLONG,
210 SBREG, TLONGLONG|TULONGLONG,
211 0, RLEFT,
212 COM "convert (u)longlong to (u)longlong\n", },
214 /* convert (u)char/(u)short/(u)int to longlong */
215 { SCONV, INBREG,
216 SAREG, TCHAR|TUCHAR|TSHORT|TUSHORT|TWORD,
217 SBREG, TLONGLONG|TULONGLONG,
218 NBREG|NBSL, RESC1,
219 " mov A1,AL" COM "convert (u)char/(u)short/(u)int to (u)longlong\n"
220 " mov U1,AL,asr #31\n", },
222 { SCONV, INAREG | FEATURE_EXTEND,
223 SBREG, TLONGLONG|TULONGLONG,
224 SAREG, TCHAR,
225 NAREG, RESC1,
226 " sxtb A1,AL" COM "convert (u)longlong to char\n", },
228 { SCONV, INAREG,
229 SBREG, TLONGLONG|TULONGLONG,
230 SAREG, TCHAR,
231 NAREG, RESC1,
232 " mov A1,AL,asl #24" COM "convert (u)longlong to char\n"
233 " mov A1,A1,asr #24\n", },
235 { SCONV, INAREG | FEATURE_EXTEND,
236 SBREG, TLONGLONG|TULONGLONG,
237 SAREG, TSHORT,
238 NAREG, RESC1,
239 " sxth A1,AL" COM "convert (u)longlong to short\n", },
241 { SCONV, INAREG,
242 SBREG, TLONGLONG|TULONGLONG,
243 SAREG, TSHORT,
244 NAREG, RESC1,
245 " mov A1,AL,asl #16" COM "convert (u)longlong to short\n"
246 " mov A1,A1,asr #16\n", },
248 { SCONV, INAREG,
249 SBREG, TLONGLONG|TULONGLONG,
250 SAREG, TWORD,
251 NAREG, RESC1,
252 " mov A1,AL" COM "convert (u)longlong to (u)int\n", },
254 { SCONV, INAREG,
255 SBREG, TLONGLONG|TULONGLONG,
256 SAREG, TUCHAR,
257 NAREG, RESC1,
258 " and A1,AL,#255" COM "convert (u)longlong to uchar\n", },
260 { SCONV, INAREG | FEATURE_EXTEND,
261 SBREG, TLONGLONG|TULONGLONG,
262 SAREG, TUSHORT,
263 NAREG, RESC1,
264 " uxth A1,AL" COM "convert (u)longlong to ushort\n", },
266 { SCONV, INAREG,
267 SBREG, TLONGLONG|TULONGLONG,
268 SAREG, TUSHORT,
269 NAREG, RESC1,
270 " mov A1,AL,asl #16" COM "convert (u)longlong to ushort\n"
271 " mov A1,A1,lsr #16\n", },
273 /* conversions on load from memory */
275 /* char */
276 { SCONV, INAREG,
277 SOREG, TCHAR,
278 SAREG, TWORD,
279 NASL|NAREG, RESC1,
280 " ldrsb A1,AL" COM "convert char to int/long\n", },
282 /* uchar */
283 { SCONV, INAREG,
284 SOREG, TUCHAR,
285 SAREG, TWORD,
286 NASL|NAREG, RESC1,
287 " ldrb A1,AL" COM "convert uchar to int/long\n", },
289 /* short */
290 { SCONV, INAREG | FEATURE_HALFWORDS,
291 SOREG, TSHORT,
292 SAREG, TWORD,
293 NASL|NAREG, RESC1,
294 " ldrsh A1,AL" COM "convert short to int/long\n", },
296 /* ushort */
297 { SCONV, INAREG | FEATURE_HALFWORDS,
298 SOREG, TSHORT,
299 SAREG, TWORD,
300 NASL|NAREG, RESC1,
301 " ldrh A1,AL" COM "convert ushort to int/long\n", },
303 /* short */
304 { SCONV, INAREG,
305 SOREG, TSHORT|TUSHORT,
306 SAREG, TWORD,
307 2*NAREG|NASL, RESC1,
308 "ZH", },
310 { SCONV, INAREG | FEATURE_FPA,
311 SCREG, TFLOAT,
312 SAREG, TWORD,
313 NAREG, RESC1,
314 " fix AL,AR" COM "convert float to int\n", },
316 { SCONV, INAREG | FEATURE_VFP,
317 SCREG, TFLOAT,
318 SAREG, TSWORD,
319 NAREG, RESC1,
320 " ftosis AL,AR" COM "convert float to int\n", },
322 { SCONV, INAREG | FEATURE_VFP,
323 SCREG, TFLOAT,
324 SAREG, TSWORD,
325 NAREG, RESC1,
326 " ftouis AL,AR" COM "convert float to int\n", },
328 { SCONV, INAREG,
329 SAREG, TFLOAT,
330 SAREG, TWORD,
331 NSPECIAL|NAREG, RESC1,
332 "ZF", },
334 { SCONV, INBREG | FEATURE_FPA,
335 SCREG, TFLOAT,
336 SBREG, TULONGLONG|TLONGLONG,
337 NBREG, RESC1,
338 COM "unimplemented\n", },
340 { SCONV, INBREG | FEATURE_VFP,
341 SCREG, TFLOAT,
342 SBREG, TULONGLONG|TLONGLONG,
343 NBREG, RESC1,
344 COM "unimplemented\n", },
346 { SCONV, INBREG,
347 SAREG, TFLOAT,
348 SBREG, TULONGLONG|TLONGLONG,
349 NSPECIAL|NBREG, RESC1,
350 "ZF", },
352 { SCONV, INAREG | FEATURE_FPA,
353 SCREG, TDOUBLE|TLDOUBLE,
354 SAREG, TWORD,
355 NAREG, RESC1,
356 " fix AL,AR" COM "convert double/ldouble to int\n", },
358 { SCONV, INAREG | FEATURE_VFP,
359 SCREG, TDOUBLE|TLDOUBLE,
360 SAREG, TSWORD,
361 NAREG, RESC1,
362 " ftosid AL,AR" COM "convert double/ldouble to int\n", },
364 { SCONV, INAREG | FEATURE_VFP,
365 SCREG, TDOUBLE|TLDOUBLE,
366 SAREG, TUWORD,
367 NAREG, RESC1,
368 " ftouid AL,AR" COM "convert double/ldouble to int\n", },
370 { SCONV, INAREG,
371 SBREG, TDOUBLE|TLDOUBLE,
372 SAREG, TWORD,
373 NSPECIAL|NAREG, RESC1,
374 "ZF", },
376 { SCONV, INBREG | FEATURE_FPA,
377 SCREG, TDOUBLE|TLDOUBLE,
378 SBREG, TLONGLONG|TULONGLONG,
379 NBREG, RESC1,
380 COM "unimplemented\n", },
382 { SCONV, INBREG | FEATURE_VFP,
383 SCREG, TDOUBLE|TLDOUBLE,
384 SBREG, TULONGLONG|TLONGLONG,
385 NBREG, RESC1,
386 COM "unimplemented\n", },
388 { SCONV, INBREG,
389 SBREG, TDOUBLE|TLDOUBLE,
390 SBREG, TULONGLONG|TLONGLONG,
391 NSPECIAL|NBREG, RESC1,
392 "ZF", },
394 { SCONV, INCREG | FEATURE_FPA,
395 SAREG, TWORD,
396 SCREG, TFLOAT,
397 NCREG, RESC1,
398 " flts AL,AR" COM "convert int to float\n" },
400 { SCONV, INCREG | FEATURE_VFP,
401 SAREG, TSWORD,
402 SCREG, TFLOAT,
403 NCREG, RESC1,
404 " fsitos AL,AR" COM "convert int to float\n" },
406 { SCONV, INCREG | FEATURE_VFP,
407 SAREG, TUWORD,
408 SCREG, TFLOAT,
409 NCREG, RESC1,
410 " fuitos AL,AR" COM "convert int to float\n" },
412 { SCONV, INAREG,
413 SAREG, TWORD,
414 SAREG, TFLOAT,
415 NSPECIAL|NAREG, RESC1,
416 "ZF", },
418 { SCONV, INCREG | FEATURE_FPA,
419 SBREG, TULONGLONG|TLONGLONG,
420 SCREG, TFLOAT,
421 NCREG, RESC1,
422 COM "unimplemented\n", },
424 { SCONV, INCREG | FEATURE_VFP,
425 SBREG, TULONGLONG|TLONGLONG,
426 SCREG, TFLOAT,
427 NCREG, RESC1,
428 COM "unimplemented\n", },
430 { SCONV, INAREG,
431 SBREG, TULONGLONG|TLONGLONG,
432 SAREG, TFLOAT,
433 NAREG, RESC1,
434 COM "unimplemented\n", },
436 { SCONV, INCREG | FEATURE_FPA,
437 SAREG, TWORD,
438 SCREG, TDOUBLE,
439 NCREG, RESC1,
440 " fltd AL,AR" COM "convert int to double\n" },
442 { SCONV, INCREG | FEATURE_VFP,
443 SAREG, TSWORD,
444 SCREG, TDOUBLE,
445 NCREG, RESC1,
446 " fsitod AL,AR" COM "convert int to double\n" },
448 { SCONV, INCREG | FEATURE_VFP,
449 SAREG, TUWORD,
450 SCREG, TDOUBLE,
451 NCREG, RESC1,
452 " fuitod AL,AR" COM "convert int to double\n" },
454 { SCONV, INBREG,
455 SAREG, TWORD,
456 SBREG, TDOUBLE,
457 NSPECIAL|NBREG, RESC1,
458 "ZF", },
460 { SCONV, INCREG | FEATURE_FPA,
461 SBREG, TLONGLONG|TULONGLONG,
462 SCREG, TDOUBLE,
463 NCREG, RESC1,
464 COM "unimplemented\n", },
466 { SCONV, INCREG | FEATURE_VFP,
467 SBREG, TLONGLONG|TULONGLONG,
468 SCREG, TDOUBLE,
469 NCREG, RESC1,
470 COM "unimplemented\n", },
472 { SCONV, INBREG,
473 SBREG, TLONGLONG|TULONGLONG,
474 SBREG, TDOUBLE,
475 NSPECIAL|NBREG, RESC1,
476 "ZF", },
478 { SCONV, INCREG | FEATURE_FPA,
479 SAREG, TWORD,
480 SCREG, TLDOUBLE,
481 NCREG, RESC1,
482 " flte AL,AR" COM "convert int to ldouble\n" },
484 { SCONV, INCREG | FEATURE_VFP,
485 SAREG, TSWORD,
486 SCREG, TLDOUBLE,
487 NCREG, RESC1,
488 " fsitod AL,AR" COM "convert int to ldouble\n" },
490 { SCONV, INCREG | FEATURE_VFP,
491 SAREG, TUWORD,
492 SCREG, TLDOUBLE,
493 NCREG, RESC1,
494 " fuitod AL,AR" COM "convert uint to ldouble\n" },
496 { SCONV, INBREG,
497 SAREG, TWORD,
498 SBREG, TLDOUBLE,
499 NSPECIAL|NBREG, RESC1,
500 "ZF", },
502 { SCONV, INCREG | FEATURE_FPA,
503 SBREG, TLONGLONG|TULONGLONG,
504 SCREG, TLDOUBLE,
505 NCREG, RESC1,
506 COM "unimplemented\n", },
508 { SCONV, INCREG | FEATURE_VFP,
509 SBREG, TLONGLONG|TULONGLONG,
510 SCREG, TLDOUBLE,
511 NCREG, RESC1,
512 COM "unimplemented\n", },
514 { SCONV, INBREG,
515 SBREG, TLONGLONG|TULONGLONG,
516 SBREG, TLDOUBLE,
517 NSPECIAL|NBREG, RESC1,
518 "ZF", },
520 { SCONV, INCREG | FEATURE_FPA,
521 SCREG, TDOUBLE|TLDOUBLE,
522 SCREG, TFLOAT,
523 NCREG, RESC1,
524 COM "unimplemented\n", },
526 { SCONV, INCREG | FEATURE_VFP,
527 SCREG, TDOUBLE|TLDOUBLE,
528 SCREG, TFLOAT,
529 NCREG, RESC1,
530 " fcvtds AL,AR" COM "convert float to double\n" },
532 { SCONV, INAREG,
533 SBREG, TDOUBLE|TLDOUBLE,
534 SAREG, TFLOAT,
535 NSPECIAL|NAREG, RESC1,
536 "ZF", },
538 { SCONV, INCREG | FEATURE_FPA,
539 SCREG, TFLOAT,
540 SCREG, TDOUBLE|TLDOUBLE,
541 NCREG, RESC1,
542 COM "unimplemented\n", },
544 { SCONV, INCREG | FEATURE_VFP,
545 SCREG, TFLOAT,
546 SCREG, TDOUBLE|TLDOUBLE,
547 NCREG, RESC1,
548 " fcvtsd AL,AR" COM "convert float to double\n" },
550 { SCONV, INBREG,
551 SAREG, TFLOAT,
552 SBREG, TDOUBLE|TLDOUBLE,
553 NSPECIAL|NBREG, RESC1,
554 "ZF", },
556 { SCONV, INCREG | FEATURE_FPA,
557 SCREG, TDOUBLE|TLDOUBLE,
558 SCREG, TDOUBLE|TLDOUBLE,
559 0, RLEFT,
560 COM "convert (l)double to (l)double", },
562 { SCONV, INCREG | FEATURE_VFP,
563 SCREG, TDOUBLE|TLDOUBLE,
564 SCREG, TDOUBLE|TLDOUBLE,
565 0, RLEFT,
566 COM "convert (l)double to (l)double", },
568 { SCONV, INBREG,
569 SBREG, TDOUBLE|TLDOUBLE,
570 SBREG, TDOUBLE|TLDOUBLE,
571 0, RLEFT,
572 COM "convert (l)double to (l)double", },
575 * Subroutine calls.
578 { CALL, FOREFF,
579 SCON|SNAME, TANY,
580 SANY, TANY,
581 0, 0,
582 " bl CL" COM "call (args, no result) to scon/sname (CL)\n"
583 "ZC", },
585 { UCALL, FOREFF,
586 SCON|SNAME, TANY,
587 SANY, TANY,
588 0, 0,
589 " bl CL" COM "call (no args, no result) to scon/sname (CL)\n", },
591 { CALL, INAREG,
592 SCON|SNAME, TANY,
593 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
594 NAREG|NASL, RESC1, /* should be 0 */
595 " bl CL" COM "call (args, result in r0) to scon/sname (CL)\n"
596 "ZC", },
598 { CALL, INBREG,
599 SCON|SNAME, TANY,
600 SBREG, TLONGLONG|TULONGLONG,
601 NBREG|NBSL, RESC1, /* should be 0 */
602 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
603 "ZC", },
605 { CALL, INCREG | FEATURE_FPA,
606 SCON|SNAME, TANY,
607 SCREG, TFLOAT,
608 NCREG|NCSL, RESC1, /* should be 0 */
609 " bl CL" COM "call (args, result r0) to scon/sname (CL)\n"
610 "ZC", },
612 { CALL, INCREG | FEATURE_FPA,
613 SCON|SNAME, TANY,
614 SCREG, TDOUBLE|TLDOUBLE,
615 NCREG|NCSL, RESC1, /* should be 0 */
616 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
617 "ZC", },
619 { CALL, INAREG,
620 SCON|SNAME, TANY,
621 SAREG, TFLOAT,
622 NAREG|NASL, RESC1, /* should be 0 */
623 " bl CL" COM "call (args, result r0) to scon/sname (CL)\n"
624 "ZC", },
626 { CALL, INBREG,
627 SCON|SNAME, TANY,
628 SBREG, TDOUBLE|TLDOUBLE,
629 NBREG|NBSL, RESC1, /* should be 0 */
630 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
631 "ZC", },
633 { UCALL, INAREG,
634 SCON|SNAME, TANY,
635 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
636 NAREG|NASL, RESC1, /* should be 0 */
637 " bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", },
639 { UCALL, INBREG,
640 SCON|SNAME, TANY,
641 SBREG, TLONGLONG|TULONGLONG,
642 NBREG|NBSL, RESC1, /* should be 0 */
643 " bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", },
645 { UCALL, INCREG | FEATURE_FPA,
646 SCON|SNAME, TANY,
647 SCREG, TFLOAT,
648 NCREG|NCSL, RESC1, /* should be 0 */
649 " bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", },
651 { UCALL, INCREG | FEATURE_FPA,
652 SCON|SNAME, TANY,
653 SCREG, TDOUBLE|TLDOUBLE,
654 NCREG|NCSL, RESC1, /* should be 0 */
655 " bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", },
657 { CALL, FOREFF,
658 SAREG, TANY,
659 SANY, TANY,
660 0, 0,
661 " mov lr,pc\n"
662 " mov pc,AL\n"
663 "ZC", },
665 { UCALL, FOREFF,
666 SAREG, TANY,
667 SANY, TANY,
668 0, 0,
669 " mov lr,pc\n"
670 " mov pc,AL\n", },
672 { CALL, INAREG,
673 SAREG, TANY,
674 SANY, TANY,
675 NAREG, RESC1,
676 " mov lr,pc\n"
677 " mov pc,AL\n"
678 "ZC", },
680 { UCALL, INAREG,
681 SAREG, TANY,
682 SANY, TANY,
683 NAREG, RESC1,
684 " mov lr,pc\n"
685 " mov pc,AL\n", },
687 { CALL, INBREG,
688 SAREG, TANY,
689 SANY, TANY,
690 NBREG, RESC1,
691 " mov lr,pc\n"
692 " mov pc,AL\n"
693 "ZC", },
695 { UCALL, INBREG,
696 SAREG, TANY,
697 SANY, TANY,
698 NBREG, RESC1,
699 " mov lr,pc\n"
700 " mov pc,AL\n", },
702 /* struct return */
703 { USTCALL, FOREFF,
704 SCON, TANY,
705 SANY, TANY,
706 0, 0,
707 " bl CL\n", },
709 { USTCALL, INAREG,
710 SCON, TANY,
711 SANY, TANY,
712 NAREG|NASL, RESC1, /* should be 0 */
713 " bl CL\n", },
715 { USTCALL, INAREG,
716 SNAME|SAREG, TANY,
717 SANY, TANY,
718 NAREG|NASL, RESC1, /* should be 0 */
719 " mov lr,pc\n"
720 " mov pc,AL\n", },
722 { STCALL, FOREFF,
723 SCON, TANY,
724 SANY, TANY,
725 0, 0,
726 " bl CL\n"
727 "ZC", },
729 { STCALL, INAREG,
730 SCON, TANY,
731 SANY, TANY,
732 NAREG|NASL, RESC1, /* should be 0 */
733 " bl CL\n"
734 "ZC", },
736 { STCALL, INAREG,
737 SNAME|SAREG, TANY,
738 SANY, TANY,
739 NAREG|NASL, RESC1, /* should be 0 */
740 " mov lr,pc\n"
741 " mov pc,AL\n"
742 "ZC", },
745 * The next rules handle all binop-style operators.
748 { PLUS, INAREG,
749 SAREG, TWORD|TPOINT,
750 SCCON, TANY,
751 NAREG, RESC1,
752 " add A1,AL,AR" COM "addition of constant\n", },
754 { PLUS, INBREG,
755 SBREG, TLONGLONG|TULONGLONG,
756 SSCON, TANY,
757 NBREG|NBSL, RESC1,
758 " adds A1,AL,AR" COM "64-bit addition of constant\n"
759 " adc U1,UL,UR\n", },
761 { PLUS, INAREG,
762 SAREG, TWORD|TPOINT,
763 SAREG, TWORD|TPOINT,
764 NAREG|NASL, RESC1,
765 " add A1,AL,AR" COM "addition\n", },
767 { PLUS, INBREG,
768 SBREG, TLONGLONG|TULONGLONG,
769 SBREG, TLONGLONG|TULONGLONG,
770 NBREG|NBSL, RESC1,
771 " adds A1,AL,AR" COM "64-bit addition\n"
772 " adc U1,UL,UR\n", },
774 { PLUS, INCREG | FEATURE_FPA,
775 SCREG, TFLOAT,
776 SCREG, TFLOAT,
777 NCREG, RESC1,
778 " adfs A1,AL,AR" COM "float add\n", },
780 { PLUS, INCREG | FEATURE_VFP,
781 SCREG, TFLOAT,
782 SCREG, TFLOAT,
783 NCREG, RESC1,
784 " fadds A1,AL,AR" COM "float add\n", },
786 { PLUS, INAREG,
787 SAREG, TFLOAT,
788 SAREG, TFLOAT,
789 NSPECIAL|NAREG, RESC1,
790 "ZF", },
792 { PLUS, INCREG | FEATURE_FPA,
793 SCREG, TDOUBLE,
794 SCREG, TDOUBLE,
795 NCREG, RESC1,
796 " adfd A1,AL,AR" COM "double add\n", },
798 { PLUS, INCREG | FEATURE_VFP,
799 SCREG, TDOUBLE,
800 SCREG, TDOUBLE,
801 NCREG, RESC1,
802 " faddd A1,AL,AR" COM "double add\n", },
804 { PLUS, INBREG,
805 SBREG, TDOUBLE,
806 SBREG, TDOUBLE,
807 NSPECIAL|NBREG, RESC1,
808 "ZF", },
810 { PLUS, INCREG | FEATURE_FPA,
811 SCREG, TLDOUBLE,
812 SCREG, TLDOUBLE,
813 NCREG, RESC1,
814 " adfe A1,AL,AR" COM "ldouble add\n", },
816 { PLUS, INCREG | FEATURE_VFP,
817 SCREG, TLDOUBLE,
818 SCREG, TLDOUBLE,
819 NCREG, RESC1,
820 " faddd A1,AL,AR" COM "ldouble add\n", },
822 { PLUS, INBREG,
823 SBREG, TLDOUBLE,
824 SBREG, TLDOUBLE,
825 NSPECIAL|NBREG, RESC1,
826 "ZF", },
828 { MINUS, INAREG,
829 SAREG, TWORD|TPOINT,
830 SCCON, TANY,
831 NAREG|NASL, RESC1,
832 " sub A1,AL,AR" COM "subtraction of constant\n", },
834 { MINUS, INAREG,
835 SAREG, TWORD|TPOINT,
836 SAREG, TWORD|TPOINT,
837 NAREG|NASL, RESC1,
838 " sub A1,AL,AR" COM "subtraction\n", },
840 { MINUS, INBREG,
841 SBREG, TLONGLONG|TULONGLONG,
842 SCCON, TANY,
843 NBREG|NBSL, RESC1,
844 " subs A1,AL,AR" COM "64-bit subtraction of constant\n"
845 " rsc U1,UL,AR\n", },
847 { MINUS, INBREG,
848 SBREG, TLONGLONG|TULONGLONG,
849 SBREG, TLONGLONG|TULONGLONG,
850 NBREG|NBSL, RESC1,
851 " subs A1,AL,AR" COM "64-bit subtraction\n"
852 " sbc U1,UL,AR\n", },
854 { MINUS, INCREG | FEATURE_FPA,
855 SCREG, TFLOAT,
856 SCREG, TFLOAT,
857 NCREG, RESC1,
858 " sufs A1,AL,AR" COM "float subtraction\n", },
860 { MINUS, INCREG | FEATURE_VFP,
861 SCREG, TFLOAT,
862 SCREG, TFLOAT,
863 NCREG, RESC1,
864 " fsubs A1,AL,AR" COM "float subtraction\n", },
866 { MINUS, INAREG,
867 SAREG, TFLOAT,
868 SAREG, TFLOAT,
869 NSPECIAL|NAREG, RESC1,
870 "ZF", },
872 { MINUS, INCREG | FEATURE_FPA,
873 SCREG, TDOUBLE,
874 SCREG, TDOUBLE,
875 NCREG, RESC1,
876 " sufd A1,AL,AR" COM "double subtraction\n", },
878 { MINUS, INCREG | FEATURE_VFP,
879 SCREG, TDOUBLE,
880 SCREG, TDOUBLE,
881 NCREG, RESC1,
882 " fsubd A1,AL,AR" COM "double subtraction\n", },
884 { MINUS, INBREG,
885 SBREG, TDOUBLE,
886 SBREG, TDOUBLE,
887 NSPECIAL|NBREG, RESC1,
888 "ZF", },
890 { MINUS, INCREG | FEATURE_FPA,
891 SCREG, TLDOUBLE,
892 SCREG, TLDOUBLE,
893 NCREG, RESC1,
894 " sufe A1,AL,AR" COM "ldouble subtraction\n", },
896 { MINUS, INCREG | FEATURE_VFP,
897 SCREG, TLDOUBLE,
898 SCREG, TLDOUBLE,
899 NCREG, RESC1,
900 " fsubd A1,AL,AR" COM "double subtraction\n", },
902 { MINUS, INBREG,
903 SBREG, TLDOUBLE,
904 SBREG, TLDOUBLE,
905 NSPECIAL|NBREG, RESC1,
906 "ZF", },
909 * The next rules handle all shift operators.
912 { LS, INAREG,
913 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
914 SAREG, TANY,
915 NAREG|NASL, RESC1,
916 " mov A1,AL,asl AR" COM "left shift\n", },
918 { LS, INAREG,
919 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
920 SCCON, TANY,
921 NAREG|NASL, RESC1,
922 " mov A1,AL,asl AR" COM "left shift by constant\n", },
924 { LS, INBREG,
925 SBREG, TLONGLONG|TULONGLONG,
926 SCON, TANY,
927 NBREG, RESC1,
928 "ZO" },
930 { LS, INBREG,
931 SBREG, TLONGLONG|TULONGLONG,
932 SAREG, TANY,
933 NSPECIAL|NBREG, RESC1,
934 "ZE" },
936 { RS, INAREG,
937 SAREG, TSWORD|TSHORT|TCHAR,
938 SAREG, TANY,
939 NAREG|NASL, RESC1,
940 " mov A1,AL,asr AR" COM "right shift\n", },
942 { RS, INAREG,
943 SAREG, TUWORD|TUSHORT|TUCHAR,
944 SAREG, TANY,
945 NAREG|NASL, RESC1,
946 " mov A1,AL,lsr AR" COM "right shift\n", },
948 { RS, INAREG,
949 SAREG, TSWORD|TSHORT|TCHAR,
950 SCCON, TANY,
951 NAREG|NASL, RESC1,
952 " mov A1,AL,asr AR" COM "right shift by constant\n", },
954 { RS, INAREG,
955 SAREG, TUWORD|TUSHORT|TUCHAR,
956 SCCON, TANY,
957 NAREG|NASL, RESC1,
958 " mov A1,AL,lsr AR" COM "right shift by constant\n", },
960 { RS, INBREG,
961 SBREG, TLONGLONG|TULONGLONG,
962 SCON, TANY,
963 NBREG, RESC1,
964 "ZO" },
966 { RS, INBREG,
967 SBREG, TLONGLONG|TULONGLONG,
968 SAREG, TANY,
969 NSPECIAL|NBREG, RESC1,
970 "ZE" },
974 * The next rules takes care of assignments. "=".
977 { ASSIGN, FOREFF|INAREG,
978 SOREG|SNAME, TWORD|TPOINT,
979 SAREG, TWORD|TPOINT,
980 0, RDEST,
981 " str AR,AL" COM "assign word\n", },
983 { ASSIGN, FOREFF|INBREG,
984 SOREG|SNAME, TLONGLONG|TULONGLONG,
985 SBREG, TLONGLONG|TULONGLONG,
986 0, RDEST,
987 " str AR,AL" COM "assign 64-bit value\n"
988 " str UR,UL\n", },
990 /* XXX don't know if this works */
991 { ASSIGN, FOREFF|INBREG,
992 SAREG, TPTRTO|TLONGLONG|TULONGLONG,
993 SBREG, TLONGLONG|TULONGLONG,
994 0, RDEST,
995 " stmdb AL,{AR-UR}" COM "assign 64-bit value\n", },
997 { ASSIGN, FOREFF|INAREG,
998 SOREG|SNAME, TCHAR|TUCHAR,
999 SAREG, TCHAR|TUCHAR,
1000 0, RDEST,
1001 " strb AR,AL" COM "assign (u)char\n", },
1003 { ASSIGN, FOREFF|INAREG | FEATURE_HALFWORDS,
1004 SOREG|SNAME, TSHORT|TUSHORT,
1005 SAREG, TSHORT|TUSHORT,
1006 0, RDEST,
1007 " strh AR,AL" COM "assign (u)short\n", },
1009 { ASSIGN, FOREFF|INAREG,
1010 SOREG|SNAME, TSHORT|TUSHORT,
1011 SAREG, TSHORT|TUSHORT,
1012 NAREG|NASL, RDEST,
1013 "ZH", },
1015 { ASSIGN, FOREFF|INCREG | FEATURE_FPA,
1016 SOREG|SNAME, TFLOAT,
1017 SCREG, TFLOAT,
1018 0, RDEST,
1019 " stfs AR,AL" COM "assign float\n", },
1021 { ASSIGN, FOREFF|INCREG | FEATURE_VFP,
1022 SOREG|SNAME, TFLOAT,
1023 SCREG, TFLOAT,
1024 0, RDEST,
1025 COM "unimplemented\n", },
1027 { ASSIGN, FOREFF|INAREG,
1028 SOREG|SNAME, TFLOAT,
1029 SAREG, TFLOAT,
1030 0, RDEST,
1031 " str AR,AL" COM "assign float (soft-float)\n", },
1033 { ASSIGN, FOREFF|INCREG | FEATURE_FPA,
1034 SOREG|SNAME, TDOUBLE,
1035 SCREG, TDOUBLE,
1036 0, RDEST,
1037 " stfd AR,AL" COM "assign double\n", },
1039 { ASSIGN, FOREFF|INCREG | FEATURE_VFP,
1040 SOREG|SNAME, TDOUBLE,
1041 SCREG, TDOUBLE,
1042 0, RDEST,
1043 COM "unimplemented\n", },
1045 { ASSIGN, FOREFF|INBREG,
1046 SOREG|SNAME, TDOUBLE,
1047 SBREG, TDOUBLE,
1048 0, RDEST,
1049 " str AR,AL" COM "assign double (soft-float)\n"
1050 " str UR,UL\n", },
1052 { ASSIGN, FOREFF|INCREG | FEATURE_FPA,
1053 SOREG|SNAME, TLDOUBLE,
1054 SCREG, TLDOUBLE,
1055 0, RDEST,
1056 " stfe AR,AL" COM "assign ldouble\n", },
1058 { ASSIGN, FOREFF|INCREG | FEATURE_VFP,
1059 SOREG|SNAME, TLDOUBLE,
1060 SCREG, TLDOUBLE,
1061 0, RDEST,
1062 COM "not implemented", },
1064 { ASSIGN, FOREFF|INBREG,
1065 SOREG|SNAME, TLDOUBLE,
1066 SBREG, TLDOUBLE,
1067 0, RDEST,
1068 " str AR,AL" COM "assign ldouble (soft-float)\n"
1069 " str UR,UL\n", },
1071 /* assign register to register */
1072 { ASSIGN, FOREFF|INAREG,
1073 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1074 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1075 0, RDEST,
1076 " mov AL,AR" COM "assign AR to AL\n", },
1078 { ASSIGN, FOREFF|INBREG,
1079 SBREG, TLONGLONG|TULONGLONG,
1080 SBREG, TLONGLONG|TULONGLONG,
1081 0, RDEST,
1082 " mov AL,AR" COM "assign UR:AR to UL:AL\n"
1083 " mov UL,UR\n", },
1085 { ASSIGN, FOREFF|INCREG | FEATURE_FPA,
1086 SCREG, TFLOAT,
1087 SCREG, TFLOAT,
1088 0, RDEST,
1089 " mvf AL,AR" COM "assign float reg to float reg\n", },
1091 { ASSIGN, FOREFF|INCREG | FEATURE_VFP,
1092 SCREG, TFLOAT,
1093 SCREG, TFLOAT,
1094 0, RDEST,
1095 " fcpys AL,AR" COM "assign float reg to float reg\n", },
1097 { ASSIGN, FOREFF|INAREG,
1098 SAREG, TFLOAT,
1099 SAREG, TFLOAT,
1100 0, RDEST,
1101 " mov AL,AR" COM "assign float reg to float reg\n", },
1103 { ASSIGN, FOREFF|INCREG | FEATURE_FPA,
1104 SCREG, TDOUBLE|TLDOUBLE,
1105 SCREG, TDOUBLE|TLDOUBLE,
1106 0, RDEST,
1107 " mvf AL,AR" COM "assign float reg to float reg\n", },
1109 { ASSIGN, FOREFF|INCREG | FEATURE_VFP,
1110 SCREG, TDOUBLE|TLDOUBLE,
1111 SCREG, TDOUBLE|TLDOUBLE,
1112 0, RDEST,
1113 " fcpyd AL,AR" COM "assign float reg to float reg\n", },
1115 { ASSIGN, FOREFF|INBREG,
1116 SBREG, TDOUBLE|TLDOUBLE,
1117 SBREG, TDOUBLE|TLDOUBLE,
1118 0, RDEST,
1119 " mov AL,AR" COM "assign (l)double reg to (l)double reg\n"
1120 " mov UL,UR\n", },
1122 { ASSIGN, FOREFF|INAREG,
1123 SFLD, TANY,
1124 SOREG|SNAME, TANY,
1125 3*NAREG, RDEST,
1126 " ldr A1,AR" COM "bit-field assignment\n"
1127 " ldr A2,AL\n"
1128 " ldr A3,=M\n"
1129 " mov A1,A1,asl H\n"
1130 " and A1,A1,A3\n"
1131 " bic A2,A2,A3\n"
1132 " orr A3,A2,A1\n"
1133 " str A3,AL\n"
1134 "F ldr AD,AR\n"
1135 "FZB", },
1137 { ASSIGN, FOREFF|INAREG,
1138 SFLD, TANY,
1139 SAREG, TANY,
1140 3*NAREG, RDEST,
1141 " ldr A2,AL" COM "bit-field assignment\n"
1142 " ldr A3,=M\n"
1143 " mov A1,AR,asl H\n"
1144 " and A1,A1,A3\n"
1145 " bic A2,A2,A3\n"
1146 " orr A3,A2,A1\n"
1147 " str A3,AL\n"
1148 "F mov AD,AR\n"
1149 "FZB", },
1151 { STASG, INAREG|FOREFF,
1152 SOREG|SNAME, TANY,
1153 SAREG, TPTRTO|TANY,
1154 NSPECIAL, RRIGHT,
1155 "ZQ", },
1158 * DIV/MOD/MUL
1161 { DIV, INAREG,
1162 SAREG, TWORD,
1163 SAREG, TWORD,
1164 NSPECIAL|NAREG|NASL, RESC1,
1165 "ZE", },
1167 { DIV, INBREG,
1168 SBREG, TLONGLONG|TULONGLONG,
1169 SBREG, TLONGLONG|TULONGLONG,
1170 NSPECIAL|NBREG|NBSL, RESC1,
1171 "ZE", },
1173 { DIV, INCREG | FEATURE_FPA,
1174 SCREG, TFLOAT,
1175 SCREG, TFLOAT,
1176 NCREG, RESC1,
1177 " dvfs A1,AL,AL" COM "fast (float) divide\n", },
1179 { DIV, INCREG | FEATURE_VFP,
1180 SCREG, TFLOAT,
1181 SCREG, TFLOAT,
1182 NCREG, RESC1,
1183 " fdivs A1,AL,AL" COM "fast (float) divide\n", },
1185 { DIV, INAREG,
1186 SAREG, TFLOAT,
1187 SAREG, TFLOAT,
1188 NSPECIAL|NAREG, RESC1,
1189 "ZF", },
1191 { DIV, INCREG | FEATURE_FPA,
1192 SCREG, TDOUBLE,
1193 SCREG, TDOUBLE,
1194 NCREG, RESC1,
1195 " dvfd A1,AL,AL" COM "double divide\n", },
1197 { DIV, INCREG | FEATURE_VFP,
1198 SCREG, TDOUBLE,
1199 SCREG, TDOUBLE,
1200 NCREG, RESC1,
1201 " fdivd A1,AL,AL" COM "double divide\n", },
1203 { DIV, INBREG,
1204 SBREG, TDOUBLE,
1205 SBREG, TDOUBLE,
1206 NSPECIAL|NBREG, RESC1,
1207 "ZF", },
1209 { DIV, INCREG | FEATURE_FPA,
1210 SCREG, TLDOUBLE,
1211 SCREG, TLDOUBLE,
1212 NCREG, RESC1,
1213 " dvfe A1,AL,AR" COM "long double load\n", },
1215 { DIV, INCREG | FEATURE_VFP,
1216 SCREG, TLDOUBLE,
1217 SCREG, TLDOUBLE,
1218 NCREG, RESC1,
1219 " fdivd A1,AL,AL" COM "double divide\n", },
1221 { DIV, INBREG,
1222 SBREG, TLDOUBLE,
1223 SBREG, TLDOUBLE,
1224 NSPECIAL|NBREG, RESC1,
1225 "ZF", },
1227 { MOD, INAREG,
1228 SAREG, TWORD,
1229 SAREG, TWORD,
1230 NSPECIAL|NAREG, RESC1,
1231 "ZE", },
1233 { MOD, INBREG,
1234 SBREG, TLONGLONG|TULONGLONG,
1235 SBREG, TLONGLONG|TULONGLONG,
1236 NSPECIAL|NBREG, RESC1,
1237 "ZE", },
1239 { MUL, INAREG | FEATURE_MUL,
1240 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1241 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1242 NAREG, RESC1,
1243 " mul A1,AL,AR\n", },
1245 { MUL, INAREG,
1246 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1247 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1248 NSPECIAL|NAREG, RESC1,
1249 "ZE", },
1251 { MUL, INBREG | FEATURE_MULL,
1252 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1253 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1254 NBREG, RESC1,
1255 " smull U1,A1,AL,AR\n", },
1257 { MUL, INBREG | FEATURE_MUL,
1258 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1259 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1260 NBREG, RESC1,
1261 " mul A1,AL,AR\n"
1262 " mov U1,A1,asr #31\n", },
1264 { MUL, INBREG,
1265 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1266 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1267 NSPECIAL|NBREG, RESC1,
1268 "ZE", },
1270 { MUL, INBREG | FEATURE_MULL,
1271 SAREG, TSWORD|TSHORT|TCHAR,
1272 SAREG, TSWORD|TSHORT|TCHAR,
1273 NBREG, RESC1,
1274 " umull U1,A1,AL,AR\n", },
1276 { MUL, INBREG | FEATURE_MUL,
1277 SAREG, TSWORD|TSHORT|TCHAR,
1278 SAREG, TSWORD|TSHORT|TCHAR,
1279 NBREG, RESC1,
1280 " mul A1,AL,AR\n"
1281 " mov U1,#0\n", },
1283 { MUL, INBREG,
1284 SAREG, TSWORD|TSHORT|TCHAR,
1285 SAREG, TSWORD|TSHORT|TCHAR,
1286 NSPECIAL|NBREG, RESC1,
1287 "ZE", },
1289 { MUL, INBREG | FEATURE_MULL,
1290 SBREG, TLONGLONG|TULONGLONG,
1291 SBREG, TLONGLONG|TULONGLONG,
1292 NBREG, RESC1,
1293 " umull U1,A1,AL,AR\n", },
1295 { MUL, INBREG | FEATURE_MUL,
1296 SBREG, TLONGLONG|TULONGLONG,
1297 SBREG, TLONGLONG|TULONGLONG,
1298 NBREG, RESC1,
1299 " mul A1,AL,AR\n"
1300 " mov U1,A1,asr #31\n", },
1302 { MUL, INBREG,
1303 SBREG, TLONGLONG|TULONGLONG,
1304 SBREG, TLONGLONG|TULONGLONG,
1305 NSPECIAL|NBREG, RESC1,
1306 "ZE", },
1308 { MUL, INCREG | FEATURE_FPA,
1309 SCREG, TFLOAT,
1310 SCREG, TFLOAT,
1311 NCREG, RESC1,
1312 " fmls A1,AL,AL" COM "fast (float) multiply\n", },
1314 { MUL, INCREG | FEATURE_VFP,
1315 SCREG, TFLOAT,
1316 SCREG, TFLOAT,
1317 NCREG, RESC1,
1318 " fmuls A1,AL,AL" COM "float multiply\n", },
1320 { MUL, INAREG,
1321 SAREG, TFLOAT,
1322 SAREG, TFLOAT,
1323 NSPECIAL|NAREG, RESC1,
1324 "ZF", },
1326 { MUL, INCREG | FEATURE_FPA,
1327 SCREG, TDOUBLE|TLDOUBLE,
1328 SCREG, TDOUBLE|TLDOUBLE,
1329 NCREG, RESC1,
1330 " mufd A1,AL,AL" COM "fast (l)double multiply\n", },
1332 { MUL, INCREG | FEATURE_VFP,
1333 SCREG, TDOUBLE|TLDOUBLE,
1334 SCREG, TDOUBLE|TLDOUBLE,
1335 NCREG, RESC1,
1336 " muld A1,AL,AL" COM "(l)double multiply\n", },
1338 { MUL, INBREG,
1339 SBREG, TDOUBLE|TLDOUBLE,
1340 SBREG, TDOUBLE|TLDOUBLE,
1341 NSPECIAL|NBREG, RESC1,
1342 "ZF", },
1345 * Indirection operators.
1348 { UMUL, INAREG,
1349 SANY, TANY,
1350 SOREG|SNAME, TWORD|TPOINT,
1351 NAREG, RESC1,
1352 " ldr A1,AL" COM "word load\n", },
1354 { UMUL, INAREG,
1355 SANY, TANY,
1356 SOREG|SNAME, TCHAR,
1357 NAREG, RESC1,
1358 " ldrsb A1,AL" COM "char load\n", },
1360 { UMUL, INAREG,
1361 SANY, TANY,
1362 SOREG|SNAME, TUCHAR,
1363 NAREG, RESC1,
1364 " ldrb A1,AL" COM "uchar load\n", },
1366 { UMUL, INAREG | FEATURE_HALFWORDS,
1367 SANY, TANY,
1368 SOREG|SNAME, TUSHORT,
1369 NAREG, RESC1,
1370 " ldrh A1,AL" COM "short load\n", },
1372 { UMUL, INAREG | FEATURE_HALFWORDS,
1373 SANY, TANY,
1374 SOREG|SNAME, TSHORT,
1375 NAREG, RESC1,
1376 " ldrsh A1,AL" COM "short load\n", },
1378 { UMUL, INAREG,
1379 SANY, TANY,
1380 SOREG|SNAME, TSHORT|TUSHORT,
1381 2*NAREG|NASL, RESC1,
1382 "ZH", },
1384 { UMUL, INBREG,
1385 SANY, TANY,
1386 SOREG|SNAME, TLONGLONG|TULONGLONG,
1387 NBREG, RESC1,
1388 " ldr A1,AL" COM "64-bit load\n"
1389 " ldr U1,UL\n", },
1391 { UMUL, INCREG | FEATURE_FPA,
1392 SANY, TANY,
1393 SOREG|SNAME, TFLOAT,
1394 NCREG, RESC1,
1395 " ldfs A1,AL" COM "float load\n", },
1397 { UMUL, INCREG | FEATURE_VFP,
1398 SANY, TANY,
1399 SOREG|SNAME, TFLOAT,
1400 NCREG, RESC1,
1401 COM "not implemented\n", },
1403 { UMUL, INAREG,
1404 SANY, TANY,
1405 SOREG|SNAME, TFLOAT,
1406 NAREG, RESC1,
1407 " ldr A1,AL" COM "float load\n", },
1409 { UMUL, INCREG | FEATURE_FPA,
1410 SANY, TANY,
1411 SOREG|SNAME, TDOUBLE,
1412 NCREG, RESC1,
1413 " ldfd A1,AL" COM "double load\n", },
1415 { UMUL, INCREG | FEATURE_VFP,
1416 SANY, TANY,
1417 SOREG|SNAME, TDOUBLE,
1418 NCREG, RESC1,
1419 COM "not implemented\n", },
1421 { UMUL, INBREG,
1422 SANY, TANY,
1423 SOREG|SNAME, TDOUBLE,
1424 NBREG, RESC1,
1425 " ldr A1,AL" COM "double load\n"
1426 " ldr U1,UL\n", },
1428 { UMUL, INCREG | FEATURE_FPA,
1429 SANY, TANY,
1430 SOREG|SNAME, TLDOUBLE,
1431 NCREG, RESC1,
1432 " ldfe A1,AL" COM "long double load\n", },
1434 { UMUL, INCREG | FEATURE_VFP,
1435 SANY, TANY,
1436 SOREG|SNAME, TLDOUBLE,
1437 NCREG, RESC1,
1438 COM "not implemented\n", },
1440 { UMUL, INBREG,
1441 SANY, TANY,
1442 SOREG|SNAME, TLDOUBLE,
1443 NBREG, RESC1,
1444 " ldr A1,AL" COM "long double load (soft-float)\n"
1445 " ldr U1,UL\n", },
1448 * Logical/branching operators
1451 /* compare with register */
1452 { OPLOG, FORCC,
1453 SAREG, TSWORD|TSHORT|TCHAR,
1454 SAREG, TSWORD|TSHORT|TCHAR,
1455 0, RESCC,
1456 " cmp AL,AR" COM "AR-AL (sets flags)\n", },
1458 /* compare with register */
1459 { OPLOG, FORCC,
1460 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1461 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
1462 0, RESCC,
1463 " cmp AL,AR" COM "AR-AL (sets flags)\n", },
1465 /* compare with register */
1466 { OPLOG, FORCC,
1467 SBREG, TLONGLONG|TULONGLONG,
1468 SBREG, TLONGLONG|TULONGLONG,
1469 0, RESCC,
1470 "ZD", },
1472 { OPLOG, FORCC | FEATURE_FPA,
1473 SCREG, TFLOAT,
1474 SCREG, TFLOAT,
1475 NSPECIAL, RESCC,
1476 " cmfs AL,AR" COM "float compare\n", },
1478 { OPLOG, FORCC | FEATURE_VFP,
1479 SCREG, TFLOAT,
1480 SCREG, TFLOAT,
1481 0, RESCC,
1482 " fcmps AL,AR" COM "float compare\n", },
1484 { OPLOG, FORCC,
1485 SAREG, TFLOAT,
1486 SAREG, TFLOAT,
1487 NSPECIAL, RESCC,
1488 "ZF", },
1490 { OPLOG, FORCC | FEATURE_FPA,
1491 SCREG, TDOUBLE,
1492 SCREG, TDOUBLE,
1493 NSPECIAL, RESCC,
1494 " cmfd AL,AR" COM "double compare\n", },
1496 { OPLOG, FORCC | FEATURE_VFP,
1497 SCREG, TDOUBLE,
1498 SCREG, TDOUBLE,
1499 0, RESCC,
1500 " fcmpd AL,AR" COM "double compare\n", },
1502 { OPLOG, FORCC,
1503 SBREG, TDOUBLE,
1504 SBREG, TDOUBLE,
1505 NSPECIAL, RESCC,
1506 "ZF", },
1508 { OPLOG, FORCC | FEATURE_FPA,
1509 SCREG, TLDOUBLE,
1510 SCREG, TLDOUBLE,
1511 NSPECIAL, RESCC,
1512 " cmfe AL,AR" COM "ldouble compare\n", },
1514 { OPLOG, FORCC | FEATURE_VFP,
1515 SCREG, TLDOUBLE,
1516 SCREG, TLDOUBLE,
1517 0, RESCC,
1518 " fcmpd AL,AR" COM "double compare\n", },
1520 { OPLOG, FORCC,
1521 SBREG, TLDOUBLE,
1522 SBREG, TLDOUBLE,
1523 NSPECIAL, RESCC,
1524 "ZF", },
1526 /* AND/OR/ER */
1527 { AND, INBREG,
1528 SBREG, TLONGLONG|TULONGLONG,
1529 SBREG, TLONGLONG|TULONGLONG,
1530 NBREG|NBSL, RESC1|RESCC,
1531 " and A1,AL,AR" COM "64-bit and\n"
1532 " and U1,UL,UR\n", },
1534 { OR, INBREG,
1535 SBREG, TLONGLONG|TULONGLONG,
1536 SBREG, TLONGLONG|TULONGLONG,
1537 NBREG|NBSL, RESC1,
1538 " orr A1,AL,AR" COM "64-bit or\n"
1539 " orr U1,UL,UR\n" },
1541 { ER, INBREG,
1542 SBREG, TLONGLONG|TULONGLONG,
1543 SBREG, TLONGLONG|TULONGLONG,
1544 NBREG|NBSL, RESC1,
1545 " eor A1,AL,AR" COM "64-bit xor\n"
1546 " eor U1,UL,UR\n" },
1548 { OPSIMP, INAREG,
1549 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1550 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1551 NAREG|NASL, RESC1|RESCC,
1552 " O A1,AL,AR\n", },
1554 { OPSIMP, INAREG|FORCC,
1555 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1556 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1557 NAREG|NASL, RESC1,
1558 " Os A1,AL,AR\n", },
1562 * Jumps.
1564 { GOTO, FOREFF,
1565 SCON, TANY,
1566 SANY, TANY,
1567 0, RNOP,
1568 " b LL\n", },
1570 #if 0
1571 { GOTO, FOREFF,
1572 SAREG, TANY,
1573 SANY, TANY,
1574 0, RNOP,
1575 " mov pc,AL\n", },
1576 #endif
1579 * Convert LTYPE to reg.
1582 { OPLTYPE, INAREG,
1583 SANY, TANY,
1584 SOREG|SNAME, TWORD|TPOINT,
1585 NAREG, RESC1,
1586 " ldr A1,AL" COM "load word from memory\n", },
1588 { OPLTYPE, INBREG,
1589 SANY, TANY,
1590 SOREG|SNAME, TLONGLONG|TULONGLONG,
1591 NBREG, RESC1,
1592 " ldr A1,AL" COM "load long long from memory\n"
1593 " ldr U1,UL\n", },
1595 { OPLTYPE, INAREG,
1596 SANY, TANY,
1597 SOREG|SNAME, TCHAR,
1598 NAREG, RESC1,
1599 " ldrsb A1,AL" COM "load char from memory\n" },
1601 { OPLTYPE, INAREG,
1602 SANY, TANY,
1603 SOREG|SNAME, TUCHAR,
1604 NAREG, RESC1,
1605 " ldrb A1,AL" COM "load uchar from memory\n", },
1607 { OPLTYPE, INAREG | FEATURE_HALFWORDS,
1608 SANY, TANY,
1609 SOREG|SNAME, TSHORT,
1610 NAREG, RESC1,
1611 " ldrsh A1,AL" COM "load short from memory\n", },
1613 { OPLTYPE, INAREG | FEATURE_HALFWORDS,
1614 SANY, TANY,
1615 SOREG|SNAME, TUSHORT,
1616 NAREG, RESC1,
1617 " ldrh A1,AL" COM "load ushort from memory\n", },
1619 { OPLTYPE, INAREG,
1620 SANY, TANY,
1621 SOREG|SNAME, TSHORT|TUSHORT,
1622 2*NAREG, RESC1,
1623 "ZH", },
1625 #if 0
1626 { OPLTYPE, INAREG,
1627 SANY, TANY,
1628 SCON, TPOINT,
1629 NAREG, RESC1,
1630 " ldr A1,AL" COM "load integer constant\n", },
1631 #endif
1633 { OPLTYPE, INAREG,
1634 SANY, TANY,
1635 SCON, TANY,
1636 NAREG, RESC1,
1637 "ZI", },
1639 { OPLTYPE, INBREG,
1640 SANY, TANY,
1641 SCON, TANY,
1642 NBREG, RESC1,
1643 "ZJ", },
1645 { OPLTYPE, INAREG,
1646 SANY, TANY,
1647 SAREG, TANY,
1648 NAREG, RESC1,
1649 " mov A1,AL" COM "load AL into A1\n" },
1651 { OPLTYPE, INBREG,
1652 SANY, TANY,
1653 SBREG, TLONGLONG|TULONGLONG,
1654 NBREG, RESC1,
1655 " mov A1,AL" COM "load UL:AL into U1:A1\n"
1656 " mov U1,UL\n", },
1658 { OPLTYPE, INCREG | FEATURE_FPA,
1659 SANY, TANY,
1660 SOREG|SNAME, TFLOAT,
1661 NCREG, RESC1,
1662 " ldfs A1,AL" COM "load float\n", },
1664 { OPLTYPE, INCREG | FEATURE_VFP,
1665 SANY, TANY,
1666 SOREG|SNAME, TFLOAT,
1667 NCREG, RESC1,
1668 COM "not implemented\n", },
1670 { OPLTYPE, INAREG,
1671 SANY, TANY,
1672 SOREG|SNAME, TFLOAT,
1673 NAREG, RESC1,
1674 " ldr A1,AL" COM "load float (soft-float)\n", },
1676 { OPLTYPE, INCREG | FEATURE_FPA,
1677 SANY, TANY,
1678 SOREG|SNAME, TDOUBLE,
1679 NCREG, RESC1,
1680 " ldfd A1,AL" COM "load double\n", },
1682 { OPLTYPE, INCREG | FEATURE_VFP,
1683 SANY, TANY,
1684 SOREG|SNAME, TDOUBLE,
1685 NCREG, RESC1,
1686 COM "not implemented\n" },
1688 { OPLTYPE, INBREG,
1689 SANY, TANY,
1690 SOREG|SNAME, TDOUBLE,
1691 NBREG, RESC1,
1692 " ldr A1,AL" COM "load double (soft-float)\n"
1693 " ldr U1,UL\n", },
1695 { OPLTYPE, INCREG | FEATURE_FPA,
1696 SANY, TANY,
1697 SOREG|SNAME, TLDOUBLE,
1698 NCREG, RESC1,
1699 " ldfe A1,AL" COM "load ldouble\n", },
1701 { OPLTYPE, INCREG | FEATURE_VFP,
1702 SANY, TANY,
1703 SOREG|SNAME, TLDOUBLE,
1704 NCREG, RESC1,
1705 COM "not implemented\n", },
1707 { OPLTYPE, INBREG,
1708 SANY, TANY,
1709 SOREG|SNAME, TLDOUBLE,
1710 NBREG, RESC1,
1711 " ldr A1,AL" COM "load ldouble (soft-float)\n"
1712 " ldr U1,UL\n", },
1715 * Negate a word.
1718 { UMINUS, INAREG,
1719 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1720 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1721 NAREG|NASL, RESC1,
1722 " rsb A1,AL,#0" COM "negation\n", },
1724 { UMINUS, INBREG,
1725 SBREG, TLONGLONG|TULONGLONG,
1726 SBREG, TLONGLONG|TULONGLONG,
1727 NBREG|NBSL, RESC1,
1728 " rsbs A1,AL,#0" COM "64-bit negation\n"
1729 " rsc U1,UL,#0\n", },
1731 { UMINUS, INCREG | FEATURE_FPA,
1732 SCREG, TFLOAT,
1733 SCREG, TFLOAT,
1734 NCREG, RESC1,
1735 " mvfs A1,AL" COM "float negation\n", },
1737 { UMINUS, INCREG | FEATURE_VFP,
1738 SCREG, TFLOAT,
1739 SCREG, TFLOAT,
1740 NCREG, RESC1,
1741 " negs A1,AL" COM "float negation\n", },
1743 { UMINUS, INAREG,
1744 SAREG, TFLOAT,
1745 SAREG, TFLOAT,
1746 NSPECIAL|NAREG, RESC1,
1747 "ZF", },
1749 { UMINUS, INCREG | FEATURE_FPA,
1750 SCREG, TDOUBLE,
1751 SCREG, TDOUBLE,
1752 NCREG, RESC1,
1753 " mvfd A1,AL" COM "double negation\n", },
1755 { UMINUS, INCREG | FEATURE_VFP,
1756 SCREG, TDOUBLE,
1757 SCREG, TDOUBLE,
1758 NCREG, RESC1,
1759 " negd A1,AL" COM "double negation\n", },
1761 { UMINUS, INBREG,
1762 SBREG, TDOUBLE,
1763 SBREG, TDOUBLE,
1764 NSPECIAL|NBREG, RESC1,
1765 "ZF", },
1767 { UMINUS, INCREG | FEATURE_FPA,
1768 SCREG, TLDOUBLE,
1769 SCREG, TLDOUBLE,
1770 NCREG, RESC1,
1771 " mvfe A1,AL" COM "ldouble negation\n", },
1773 { UMINUS, INCREG | FEATURE_VFP,
1774 SCREG, TLDOUBLE,
1775 SCREG, TLDOUBLE,
1776 NCREG, RESC1,
1777 " negd A1,AL" COM "ldouble negation\n", },
1779 { UMINUS, INBREG,
1780 SBREG, TLDOUBLE,
1781 SBREG, TLDOUBLE,
1782 NSPECIAL|NBREG, RESC1,
1783 "ZF", },
1785 { COMPL, INAREG,
1786 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1787 SANY, TANY,
1788 NAREG|NASL, RESC1,
1789 " mvn A1,AL" COM "complement\n", },
1791 { COMPL, INBREG,
1792 SBREG, TLONGLONG|TULONGLONG,
1793 SANY, TANY,
1794 NBREG|NBSL, RESC1,
1795 " mvn A1,AL" COM "64-bit complement\n"
1796 " mvn U1,UL\n", },
1799 * Arguments to functions.
1802 { FUNARG, FOREFF,
1803 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1804 SANY, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1805 0, 0,
1806 " stmfd sp!,{AL}" COM "save function arg to stack\n", },
1808 { FUNARG, FOREFF,
1809 SBREG, TLONGLONG|TULONGLONG,
1810 SANY, TLONGLONG|TULONGLONG,
1811 0, 0,
1812 " stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
1814 { FUNARG, FOREFF,
1815 SCREG, TFLOAT,
1816 SANY, TFLOAT,
1817 0, 0,
1818 " stmfd sp!,{AL}" COM "save function arg to stack\n", },
1820 { FUNARG, FOREFF,
1821 SCREG, TDOUBLE|TLDOUBLE,
1822 SANY, TDOUBLE|TLDOUBLE,
1823 0, 0,
1824 " stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
1826 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1828 { UMUL, DF( UMUL ), },
1830 { ASSIGN, DF(ASSIGN), },
1832 { STASG, DF(STASG), },
1834 { FLD, DF(FLD), },
1836 { OPLEAF, DF(NAME), },
1838 /* { INIT, DF(INIT), }, */
1840 { OPUNARY, DF(UMINUS), },
1842 { OPANY, DF(BITYPE), },
1844 { FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
1847 int tablesize = sizeof(table)/sizeof(table[0]);