1 /* $Id: table.c,v 1.97 2008/02/10 19:25:44 ragge Exp $ */
3 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 # define TLL TLONGLONG|TULONGLONG
33 # define ANYSIGNED TINT|TLONG|TSHORT|TCHAR
34 # define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR
35 # define ANYFIXED ANYSIGNED|ANYUSIGNED
36 # define TUWORD TUNSIGNED|TULONG
37 # define TSWORD TINT|TLONG
38 # define TWORD TUWORD|TSWORD
40 struct optab table
[] = {
41 { -1, FORREW
,SANY
,TANY
,SANY
,TANY
,REWRITE
,-1,"", },
43 * A bunch of pointer conversions.
44 * First pointer to integer.
46 /* Convert char pointer to int */
48 SAREG
|SAREG
, TPTRTO
|TCHAR
|TUCHAR
,
56 " tlz AL,0740000\n", },
58 /* Convert short pointer to int */
60 SAREG
|SAREG
, TPTRTO
|TSHORT
|TUSHORT
,
68 " tlz AL,0740000\n", },
70 /* Convert int/unsigned/long/ulong/struct/union/func ptr to int */
72 SAREG
|SAREG
, TPTRTO
|TWORD
|TSTRUCT
|TPOINT
,
78 * Convert int/long to pointers.
80 /* Convert int to char pointer */
83 SANY
, TPTRTO
|TCHAR
|TUCHAR
,
92 /* Convert int/long to short pointer */
95 SANY
, TPTRTO
|TSHORT
|TUSHORT
,
104 /* Convert int/long to int/struct/multiple ptr */
107 SANY
, TPOINT
|TWORD
|TSTRUCT
,
112 * Pointer to pointer conversions.
114 /* Convert char ptr to short ptr */
116 SAREG
, TPTRTO
|TCHAR
|TUCHAR
,
117 SANY
, TPTRTO
|TSHORT
|TUSHORT
,
121 " tlz AL,010000\n", },
123 /* Convert char/short pointer to int/struct/multiple ptr */
125 SAREG
, TPTRTO
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
126 SANY
, TPOINT
|TWORD
|TSTRUCT
,
128 " tlz AL,0770000\n", },
130 /* Convert short pointer to char ptr */
132 SAREG
, TPTRTO
|TSHORT
|TUSHORT
,
133 SANY
, TPTRTO
|TCHAR
|TUCHAR
,
135 " tlz AL,050000\n", },
137 /* Convert int/struct/foo pointer to char ptr */
139 SAREG
, TPOINT
|TWORD
|TSTRUCT
,
140 SANY
, TPTRTO
|TCHAR
|TUCHAR
,
142 " tlo AL,0700000\n", },
144 /* Convert int/struct/foo pointer to short ptr */
146 SAREG
, TPTRTO
|TWORD
|TSTRUCT
,
147 SANY
, TPTRTO
|TSHORT
|TUSHORT
,
149 " tlo AL,0750000\n", },
152 * A bunch conversions of integral<->integral types
155 /* convert short/char to int. This is done when register is loaded */
157 SAREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
|TWORD
,
162 /* convert int to short/char. This is done when register is loaded */
165 SANY
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
|TWORD
,
169 /* convert int/long to unsigned long long */
171 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
179 /* convert int/long to long long */
181 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
188 /* convert uchar/ushort to (unsigned) long long */
190 SAREG
|SAREG
|SNAME
|SOREG
, TUCHAR
|TUSHORT
,
196 /* convert long long to int/long */
198 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
203 /* convert long long to unsigned char - XXX - signed char */
205 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
209 " andi A1,0777\n", },
211 /* convert long long to short - XXX - signed short */
213 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
214 SANY
, TSHORT
|TUSHORT
,
219 /* floating point conversions */
221 SAREG
|SAREG
|SNAME
|SOREG
, TDOUBLE
|TFLOAT
,
227 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
233 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
236 " fltr A1,AL\n setz U1,\n", },
239 SAREG
|SAREG
|SNAME
|SOREG
, TDOUBLE
,
245 SAREG
|SAREG
|SNAME
|SOREG
, TFLOAT
,
248 " move A1,AL\n setz U1,\n", },
257 0, 0, /* should be 0 */
258 " pushj 017,AL\nZB", },
263 0, 0, /* should be 0 */
264 " pushj 017,AL\nZB", },
268 SANY
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TFLOAT
|TPOINT
,
269 NAREG
, RESC1
, /* should be 0 */
270 " pushj 017,AL\nZB", },
275 NAREG
|NASL
, RESC1
, /* should be 0 */
276 " pushj 017,AL\nZB", },
280 SANY
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TFLOAT
|TDOUBLE
|TLL
|TPOINT
,
281 NAREG
|NASL
, RESC1
, /* should be 0 */
282 " pushj 017,(AL)\nZB", },
286 SANY
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TFLOAT
|TDOUBLE
|TLL
|TPOINT
,
287 NAREG
, RESC1
, /* should be 0 */
288 " pushj 017,@AL\nZB", },
292 * INCR can be slightly optimized.
295 SAREG
|SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TPTRTO
,
301 /* Fix check of return value */
303 SAREG
|SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TPTRTO
,
312 /* Add a value to a char/short pointer */
313 { PLUS
, INAREG
|INAREG
|FOREFF
,
314 SAREG
|SAREG
|SNAME
|SOREG
, TPTRTO
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
319 /* No more search for char/short pointer addition */
320 { PLUS
, INAREG
|INAREG
|FOREFF
,
321 SANY
, TPTRTO
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
326 /* Add char/short/int to register */
327 { PLUS
, FOREFF
|INAREG
|INAREG
,
329 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
333 /* Add char/short/int to memory */
334 { PLUS
, FOREFF
|INAREG
|INAREG
,
335 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
340 /* Add a small constant to a register */
341 { PLUS
, FOREFF
|INAREG
|INAREG
,
342 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
|TPOINT
,
347 /* Add a larger constant to a register */
348 { PLUS
, FOREFF
|INAREG
|INAREG
,
349 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
|TPOINT
,
352 " add AL,[ .long AR ]\n", },
354 /* Add long long to register */
355 { PLUS
, INAREG
|INAREG
|FOREFF
,
357 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
361 /* Add int (or int pointer) to register */
362 { PLUS
, FOREFF
|INAREG
|INAREG
,
363 SAREG
|SAREG
, TWORD
|TPOINT
,
364 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
366 " add AL,AR # foo \n", },
368 /* char/short are allowed to be added if they are in registers */
369 { PLUS
, INAREG
|INAREG
|FOREFF
,
370 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
371 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
375 /* get address of an memory position into a register */
376 { PLUS
, INAREG
|INAREG
,
377 SAREG
|SAREG
, TWORD
|TPTRTO
,
380 " xmovei A1,AR(AL)\n", },
382 /* Safety belt for plus */
383 { PLUS
, FORREW
|FOREFF
|INAREG
|INAREG
,
392 /* Rewrite subtracts from char/short pointers (to negative adds) */
393 { MINUS
, FORREW
|FOREFF
|INAREG
|INAREG
,
394 SANY
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TPTRTO
,
399 /* Subtract char/short/int word in memory from reg */
400 { MINUS
, FOREFF
|INAREG
|INAREG
,
401 SAREG
|SAREG
, TWORD
|TPOINT
,
402 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
,
406 /* Subtract a small constant from reg */
407 { MINUS
, FOREFF
|INAREG
|INAREG
,
408 SAREG
|SAREG
, TWORD
|TPOINT
,
409 SUSHCON
, TWORD
|TPOINT
,
413 /* Subtract a large constant from reg */
414 { MINUS
, FOREFF
|INAREG
|INAREG
,
415 SAREG
|SAREG
, TWORD
|TPOINT
,
418 " sub AL,[ .long AR ]\n", },
420 /* Subtract char/short/int word in memory from reg, save in memory */
421 { MINUS
, FOREFF
|INAREG
|INAREG
,
423 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
427 /* Subtract long long from register */
428 { MINUS
, INAREG
|INAREG
|FOREFF
,
430 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
434 /* char/short are allowed to be subtracted if they are in registers */
435 { MINUS
, INAREG
|INAREG
|FOREFF
,
436 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
437 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
441 /* Safety belt for plus */
442 { MINUS
, FORREW
|FOREFF
|INAREG
|INAREG
,
449 * AND/OR/ER operators.
450 * Simpler that the ops above in that they only work on integral types.
452 /* And char/short/int with integer memory */
453 { AND
, FOREFF
|INAREG
|INAREG
,
454 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
455 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
459 /* And char/short/int with register */
460 { AND
, FOREFF
|INAREG
|INAREG
,
461 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
462 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
466 /* And char/short/int with small constant */
467 { AND
, FOREFF
|INAREG
|INAREG
,
468 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
469 SUSHCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
473 /* And char/short/int with large constant */
474 { AND
, FOREFF
|INAREG
|INAREG
,
475 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
476 SCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
478 " and AL,[ .long AR ]\n", },
481 { AND
, INAREG
|FOREFF
,
483 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
488 /* Safety belt for AND */
489 { AND
, FORREW
|FOREFF
|INAREG
|INAREG
,
496 /* OR char/short/int with integer memory */
497 { OR
, FOREFF
|INAREG
|INAREG
,
498 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
499 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
503 /* OR char/short/int with register */
504 { OR
, FOREFF
|INAREG
|INAREG
,
505 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
506 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
510 /* OR char/short/int with small constant */
511 { OR
, FOREFF
|INAREG
|INAREG
,
512 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
513 SUSHCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
517 /* OR char/short/int with large constant */
518 { OR
, FOREFF
|INAREG
|INAREG
,
519 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
520 SCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
522 " ior AL,[ .long AR ]\n", },
527 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
532 /* Safety belt for OR */
533 { OR
, FORREW
|FOREFF
|INAREG
|INAREG
,
540 /* ER char/short/int with integer memory */
541 { ER
, FOREFF
|INAREG
|INAREG
,
542 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
543 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
547 /* ER char/short/int with register */
548 { ER
, FOREFF
|INAREG
|INAREG
,
549 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
550 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
554 /* ER char/short/int with small constant */
555 { ER
, FOREFF
|INAREG
|INAREG
,
556 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
557 SUSHCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
561 /* ER char/short/int with large constant */
562 { ER
, FOREFF
|INAREG
|INAREG
,
563 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
564 SCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TWORD
,
566 " xor AL,[ .long AR ]\n", },
571 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
576 /* Safety belt for ER */
577 { ER
, FORREW
|FOREFF
|INAREG
|INAREG
,
584 * The next rules handle all shift operators.
586 { LS
, INAREG
|INAREG
|FOREFF
,
587 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
588 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
592 { LS
, INAREG
|INAREG
|FOREFF
,
593 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
598 { LS
, INAREG
|INAREG
|FOREFF
,
604 { LS
, INAREG
|INAREG
|FOREFF
,
606 SAREG
|SAREG
/* |SNAME|SOREG */, TANY
,
608 " ashc AL,(AR)\n", },
610 { RS
, INAREG
|INAREG
|FOREFF
,
616 { RS
, INAREG
|INAREG
|FOREFF
,
622 /* Safety belt for LS/RS */
623 { LS
, FORREW
|FOREFF
|INAREG
|INAREG
,
629 { RS
, FORREW
|FOREFF
|INAREG
|INAREG
,
636 * The next rules takes care of assignments. "=".
638 /* Match zeroed registers first */
639 { ASSIGN
, INAREG
|FOREFF
,
640 SAREG
, TUCHAR
|TUSHORT
|TCHAR
|TSHORT
|TWORD
|TPOINT
,
646 SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
,
651 { ASSIGN
, INAREG
|FOREFF
,
652 SAREG
|SAREG
, TUCHAR
|TUSHORT
|TCHAR
|TSHORT
|TWORD
|TPOINT
,
658 SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
,
663 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
664 SAREG
|SAREG
, TWORD
|TPOINT
,
669 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
670 SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
|TFLOAT
,
671 SAREG
|SAREG
, TUCHAR
|TUSHORT
|TWORD
|TPOINT
|TFLOAT
,
675 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
676 SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
|TFLOAT
,
681 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
682 SAREG
|SAREG
, TUCHAR
|TUSHORT
|TCHAR
|TSHORT
|TWORD
|TPOINT
,
683 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
,
687 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
688 SAREG
|SAREG
, TUCHAR
|TUSHORT
|TCHAR
|TSHORT
,
689 SAREG
|SAREG
, TUCHAR
|TUSHORT
|TCHAR
|TSHORT
,
693 { ASSIGN
, INBREG
|FOREFF
,
694 SBREG
|SNAME
|SOREG
, TLL
|TDOUBLE
,
697 " dmovem AR,AL\n", },
699 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
700 SOREG
|SNAME
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
705 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
706 SAREG
|SAREG
, TUSHORT
|TUCHAR
,
711 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
712 SAREG
|SAREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
717 { ASSIGN
, INAREG
|INAREG
|FOREFF
,
718 SAREG
|SAREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
721 " move AL,[ .long AR]\n", },
725 * These can be done way more efficient.
727 /* long long div. XXX - work only with unsigned */
729 SBREG
|SNAME
|SOREG
, TLL
,
730 SBREG
|SNAME
|SOREG
, TLL
,
731 (2*NBREG
)|NBSL
, RESC1
,
732 " dmove A2,AL ; dmove A1,[ .long 0,0 ]\n"
735 /* long long div. with constant. XXX - work only with unsigned */
737 SBREG
|SNAME
|SOREG
, TLL
,
739 (2*NBREG
)|NBSL
, RESC1
,
740 " dmove A2,AL ; dmove A1,[ .long 0,0 ]\n"
743 /* Simple divide. XXX - fix so next reg can be free */
744 { DIV
, INAREG
|INAREG
|FOREFF
,
745 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
746 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
750 /* Safety belt for DIV */
751 { DIV
, FORREW
|FOREFF
|INAREG
|INAREG
,
759 SBREG
|SNAME
|SOREG
, TLL
,
760 SBREG
|SNAME
|SOREG
, TLL
,
762 " dmove A2,AL ; dmove A1,[ .long 0,0 ]\n"
767 SAREG
|SNAME
|SOREG
, TWORD
,
768 SAREG
|SNAME
|SOREG
, TWORD
,
774 /* integer MOD for char/short */
776 SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
777 SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
783 /* Safety belt for MOD */
792 SBREG
|SNAME
|SOREG
, TLL
,
793 SBREG
|SNAME
|SOREG
, TLL
,
798 /* integer multiply to memory*/
799 { MUL
, INAREG
|INAREG
|FOREFF
,
800 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
805 /* integer multiply */
806 { MUL
, INAREG
|INAREG
|FOREFF
,
808 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
812 /* integer multiply for char/short */
813 { MUL
, INAREG
|INAREG
|FOREFF
,
814 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
815 SAREG
|SAREG
, TWORD
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
819 /* integer multiply with small constant */
820 { MUL
, INAREG
|INAREG
|FOREFF
,
826 /* integer multiply with large constant */
827 { MUL
, INAREG
|INAREG
|FOREFF
,
831 " imul AL,[ .long AR ]\n", },
833 /* Safety belt for MUL */
834 { MUL
, FORREW
|FOREFF
|INAREG
|INAREG
,
840 /* read an indirect long long value into register */
842 SAREG
|SAREG
, TPTRTO
|TLL
|TWORD
,
845 " dmove A1,(AL)\n", },
847 /* read an indirect integer value into register */
849 SAREG
|SAREG
, TWORD
|TPOINT
,
852 " move A1,(AL)\n", },
854 /* read an indirect value into register */
861 /* read an indirect value into register */
863 SAREG
|SAREG
|SOREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TPTRTO
,
864 SANY
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
869 /* Match tree shape for ildb */
872 SILDB
, TUCHAR
|TCHAR
|TPTRTO
,
877 /* Match char/short pointers first, requires special handling */
879 SAREG
|SAREG
, TPTRTO
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
880 SAREG
|SAREG
, TPTRTO
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
884 /* Can check anything by just comparing if EQ/NE */
886 SAREG
|SAREG
, TWORD
|TPOINT
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
889 " jumpZe AL,LC # bu\n", },
892 SAREG
|SAREG
, TWORD
|TPOINT
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
893 SAREG
|SAREG
|SOREG
|SNAME
|SCON
, TWORD
|TPOINT
,
898 SAREG
|SAREG
, TWORD
|TPOINT
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
899 SAREG
|SAREG
|SOREG
|SNAME
|SCON
, TWORD
|TPOINT
,
905 SAREG
|SAREG
|SOREG
|SNAME
|SCON
, TSWORD
,
910 SAREG
|SAREG
, TCHAR
|TUCHAR
,
916 SAREG
|SAREG
, TWORD
|TPOINT
|TFLOAT
,
917 SAREG
|SAREG
|SOREG
|SNAME
|SCON
, TWORD
|TPOINT
|TFLOAT
,
922 SAREG
|SAREG
, TWORD
|TPOINT
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
923 SAREG
|SAREG
, TWORD
|TPOINT
|TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
928 SAREG
|SAREG
, TLL
|TDOUBLE
, /* XXX - does double work here? */
929 SAREG
|SAREG
|SOREG
|SNAME
, TLL
|TDOUBLE
,
943 * Convert LTYPE to reg.
949 " seto A1,\n seto U1,\n", },
961 " setz A1,\n setz U1,\n", },
973 " setz A1,\n movei U1,AR\n", },
991 " ZD A1,ZE # suspekt\n", },
994 SANY
, TWORD
|TPOINT
|TFLOAT
,
995 SAREG
|SAREG
|SOREG
|SNAME
, TWORD
|TPOINT
|TFLOAT
,
1003 " dmove A1,ZO\n", },
1009 " dmove A1,AR\n", },
1012 SOREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
1013 SOREG
, TSHORT
|TUSHORT
|TCHAR
|TUCHAR
,
1021 " ldb A1,[ .long AL ]\n" },
1027 " ldb A1,[ .long AL ]\n"
1029 " ash A1,-033\n", },
1033 SNAME
, TSHORT
|TUSHORT
,
1044 SAREG
|SAREG
, TUSHORT
|TUCHAR
,
1045 SAREG
|SAREG
, TUSHORT
|TUCHAR
|TWORD
,
1053 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
1060 SANY
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
1065 SAREG
|SNAME
|SOREG
, TLL
,
1068 " dmovn A1,AL\n", },
1071 SAREG
|SAREG
|SNAME
|SOREG
, TLL
,
1075 " setcm U1,UL\n", },
1078 SAREG
|SAREG
|SNAME
|SOREG
, TWORD
,
1081 " setcm A1,AL\n", },
1084 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
1085 SANY
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
1087 " setcm A1,AL\n", },
1090 * Arguments to functions.
1093 SAREG
|SNAME
|SOREG
, TWORD
|TPOINT
|TFLOAT
,
1096 " push 017,AL\n", },
1099 SAREG
|SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
,
1102 " push 017,AL\n", },
1105 SCON
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|TPOINT
|TWORD
,
1108 " push 017,[ .long AL]\n", },
1114 " push 017,AL\n push 017,UL\n", },
1117 SAREG
|SOREG
|SNAME
|SCON
, TANY
,
1123 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1125 { UMUL
, DF( UMUL
), },
1127 { ASSIGN
, DF(ASSIGN
), },
1129 { OPLEAF
, DF(NAME
), },
1131 { OPUNARY
, DF(UMINUS
), },
1133 { FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, FREE
, "help; I'm in trouble\n" },
1136 int tablesize
= sizeof(table
)/sizeof(table
[0]);