3
# define ANYSIGNED TINT|TLONG|TCHAR
4
# define ANYUSIGNED TUNSIGNED|TULONG|TUCHAR
5
# define ANYFIXED ANYSIGNED|ANYUSIGNED
6
# define TL TLONG|TULONG
7
# define TWORD TUNSIGNED|TINT
8
# define TCH TCHAR|TUCHAR
10
struct optab table[] = {
11
/* First entry must be an empty entry */
12
{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
14
/* (signed) char -> int/pointer */
19
" mov.b AL, A1\n\texts.b A1\n", },
21
/* (unsigned) char -> int/pointer */
28
/* unsigned char -> long */
33
" mov.b AL, A1\n mov.w #0,U1\n", },
35
/* int or pointer -> (unsigned) long */
37
SAREG|SNAME, TWORD|TPOINT,
40
" mov.w AL,A1\n mov.w #0,U1\n", },
42
/* char -> (signed) long */
47
" exts.b AL\n exts.w AL\n", },
56
/* long -> int or pointer */
58
SAREG|SOREG|SNAME, TL,
90
{ PLUS, INAREG|FOREFF,
94
" add.w AR,AL\n adc.w UR,UL\n", },
96
{ MINUS, INAREG|FOREFF,
100
" sub.w AR,AL\n sbb.w UR,UL\n", },
102
{ AND, INAREG|FOREFF,
104
SAREG|SNAME|SOREG, TL,
106
" and.w AR,AL\n and.w UR,UL\n", },
110
SAREG|SNAME|SOREG, TL,
112
" xor.w AR,AL\n xor.w UR,UL\n", },
116
SAREG|SNAME|SOREG, TL,
118
" xor.w AR,AL\n xor.w UR,UL\n", },
120
{ COMPL, INAREG|FOREFF,
122
SAREG|SNAME|SOREG, TL,
124
" not.w AR,AL\n not.w UR,UL\n", },
126
{ OPSIMP, INAREG|FOREFF,
128
SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
132
/* XXX - Is this rule really correct? Having a SAREG shape seems kind of
133
strange. Doesn't work. Gives a areg as A1. */
137
SAREG|SBREG|SNAME|SOREG|SCON, TWORD|TPOINT,
144
SAREG|SBREG|SNAME|SOREG|SCON, TWORD|TPOINT,
148
{ OPSIMP, INCREG|FOREFF,
150
SCREG|SNAME|SOREG|SCON, TCH,
154
/* XXX - Do these work? check nspecial in order.c */
155
/* signed integer division */
158
SAREG|SNAME|SOREG, TWORD,
159
/*2*NAREG|NASL|*/NSPECIAL, RLEFT,
160
" div.w AR\n mov.w r0,AL\n", },
161
// " xor.w r2\n div.w AR\n", },
164
/* signed integer/char division - separate entry for FOREFF */
167
SAREG|SNAME|SOREG, TWORD,
172
/* signed char division */
175
SCREG|SNAME|SOREG, TCH,
176
2*NCREG|NCSL|NSPECIAL, RLEFT,
177
" div.b AR\n\tmov.b r0l,AL\n", },
178
// " xor.w r2\n div.w AR\n", },
181
/* signed integer modulus, equal to above */
184
SAREG|SNAME|SOREG, TWORD,
185
/*2*NAREG|NASL|*/NSPECIAL, RLEFT,
186
" div.w AR\n\tmov r2,AL\n", },
188
/* signed integer modulus - separate entry for FOREFF */
191
SAREG|SNAME|SOREG, TWORD,
195
/* signed integer multiplication */
198
SAREG|SNAME|SOREG, TWORD,
199
2*NAREG|NASL|NSPECIAL, RESC1,
204
SAREG|SNAME|SOREG, TWORD,
269
SAREG|SBREG|SOREG|SNAME, TL,
270
SAREG|SBREG|SOREG|SNAME, TL,
275
SBREG|SOREG, TWORD|TPOINT,
281
SAREG|SBREG|SOREG|SNAME, TWORD|TPOINT,
282
SAREG|SBREG|SOREG|SNAME, TWORD|TPOINT,
287
SCREG|SOREG|SNAME, TCH,
288
SCREG|SOREG|SNAME, TCH,
293
SCREG|SOREG|SNAME, TCH,
294
SCREG|SOREG|SNAME, TCH,
306
SCON|SNAME|SOREG|SAREG, TL|TFTN,
308
" mov.w AR,A1\n mov.w UR,U1\n", },
312
SCON|SNAME|SOREG|SAREG|SBREG, TWORD|TPOINT,
318
SBREG|SCON|SNAME|SOREG|SAREG, TWORD|TPOINT,
324
SCON|SNAME|SOREG, TCH,
326
" mov.b AR, A1\n", },
330
SCON|SNAME|SOREG, TCHAR|TUCHAR,
337
SCON|SNAME|SOREG, TCHAR|TUCHAR,
353
/* Push function address */
367
SNAME|SAREG, TL|TFTN,
370
" push.w UL\n push.w AL\n", },
373
SCON|SAREG|SNAME|SOREG, TWORD|TPOINT,
379
SAREG|SNAME|SOREG, TCHAR|TUCHAR,
384
/* Match function pointers first */
407
SBREG|SAREG|SOREG|SNAME, TFTN,
409
" mov.w AR,AL\n mov.w UR,UL\n", },
413
SBREG|SAREG|SOREG|SNAME, TFTN,
415
" mov.w AR,AL\n mov.w UR,UL\n", },
418
SBREG|SAREG|SOREG|SNAME, TFTN,
421
" mov.w AR,AL\n mov.w UR,UL\n", },
424
SBREG|SAREG|SOREG|SNAME, TFTN,
427
" mov.w AR,AL\n mov.w UR,UL\n", },
430
{ ASSIGN, FOREFF|INAREG,
437
SBREG|SAREG|SOREG|SNAME, TL,
440
" mov.w AR,AL\n mov.w UR,UL\n", },
443
SBREG|SAREG|SOREG|SNAME, TL,
446
" mov.w AR,AL\n mov.w UR,UL\n", },
449
SBREG|SAREG|SOREG|SNAME, TL,
450
SCON|SBREG|SAREG|SOREG|SNAME, TL,
452
" mov.w AR,AL\n mov.w UR,UL\n", },
454
{ ASSIGN, INAREG|FOREFF,
460
{ ASSIGN, INBREG|FOREFF,
467
SNAME|SOREG, TWORD|TPOINT,
472
/* char, oreg/name -> c reg */
473
{ ASSIGN, FOREFF|INCREG,
475
SOREG|SNAME|SCON, TCHAR|TUCHAR,
479
/* int, oreg/name -> a reg */
480
{ ASSIGN, FOREFF|INAREG,
482
SOREG|SNAME, TWORD|TPOINT,
486
{ ASSIGN, FOREFF|INBREG,
488
SOREG|SNAME, TWORD|TPOINT,
492
{ ASSIGN, FOREFF|INAREG,
493
SOREG|SNAME, TWORD|TPOINT,
498
{ ASSIGN, FOREFF|INBREG,
499
SOREG|SNAME, TWORD|TPOINT,
504
{ ASSIGN, FOREFF|INCREG,
505
SOREG|SNAME, TCHAR|TUCHAR,
510
{ ASSIGN, FOREFF|INCREG,
516
{ ASSIGN, FOREFF|INBREG,
526
" mov.w [AL],A1\n mov.w 2[AL],U1\n", },
532
" mov.w [AL],A1\n", },
538
" mov.w [AL],A1\n", },
541
SBREG, TCHAR|TUCHAR|TPTRTO,
544
" mov.b [AL], A1\n", },
561
NAREG|NASL, RESC1, /* should be 0 */
573
NAREG|NASL, RESC1, /* should be 0 */
574
" jsri.a [AL]\nZB", },
580
" jsri.a [AL]\nZB", },
583
{ FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
586
int tablesize = sizeof(table)/sizeof(table[0]);