1 | /* $Id: table.c,v 1.5 2008/10/19 15:25:25 ragge Exp $ */
|
---|
2 | /*
|
---|
3 | * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
|
---|
4 | * All rights reserved.
|
---|
5 | *
|
---|
6 | * Redistribution and use in source and binary forms, with or without
|
---|
7 | * modification, are permitted provided that the following conditions
|
---|
8 | * are met:
|
---|
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
|
---|
16 | *
|
---|
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.
|
---|
27 | */
|
---|
28 |
|
---|
29 |
|
---|
30 | # include "pass2.h"
|
---|
31 |
|
---|
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
|
---|
37 | # define TSWORD TINT
|
---|
38 | # define TWORD TUWORD|TSWORD
|
---|
39 | # define ANYSH SCON|SAREG|SOREG|SNAME
|
---|
40 | # define ARONS SAREG|SOREG|SNAME|STARNM
|
---|
41 |
|
---|
42 | struct optab table[] = {
|
---|
43 | /* First entry must be an empty entry */
|
---|
44 | { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
|
---|
45 |
|
---|
46 | /* PCONVs are usually not necessary */
|
---|
47 | { PCONV, INAREG,
|
---|
48 | SAREG, TWORD|TPOINT,
|
---|
49 | SAREG, TWORD|TPOINT,
|
---|
50 | 0, RLEFT,
|
---|
51 | "", },
|
---|
52 |
|
---|
53 | /* convert char to int or unsigned */
|
---|
54 | { SCONV, INAREG,
|
---|
55 | SAREG, TCHAR,
|
---|
56 | SAREG, TINT|TUNSIGNED,
|
---|
57 | NAREG|NASL, RESC1,
|
---|
58 | "", }, /* chars are stored as ints in registers */
|
---|
59 |
|
---|
60 | { SCONV, INAREG,
|
---|
61 | SOREG|SCON|SNAME, TCHAR,
|
---|
62 | SAREG, TINT,
|
---|
63 | NAREG|NASL, RESC1,
|
---|
64 | "movb AL,A1\n", },
|
---|
65 |
|
---|
66 | /* convert uchar to int or unsigned */
|
---|
67 | { SCONV, INAREG,
|
---|
68 | SAREG|SOREG|SCON|SNAME, TUCHAR,
|
---|
69 | SAREG, TINT|TUNSIGNED,
|
---|
70 | NAREG, RESC1,
|
---|
71 | "clr A1\nbisb AL,A1\n", },
|
---|
72 |
|
---|
73 | /* convert (u)int to (u)char. Nothing to do. */
|
---|
74 | { SCONV, INAREG,
|
---|
75 | SAREG, TWORD,
|
---|
76 | SANY, TCHAR|TUCHAR,
|
---|
77 | 0, RLEFT,
|
---|
78 | "", },
|
---|
79 |
|
---|
80 | /* convert (u)int to (u)int */
|
---|
81 | { SCONV, INAREG,
|
---|
82 | SAREG, TWORD,
|
---|
83 | SANY, TWORD,
|
---|
84 | 0, RLEFT,
|
---|
85 | "", },
|
---|
86 |
|
---|
87 | /* convert pointer to (u)int */
|
---|
88 | { SCONV, INAREG,
|
---|
89 | SAREG, TPOINT,
|
---|
90 | SANY, TWORD,
|
---|
91 | 0, RLEFT,
|
---|
92 | "", },
|
---|
93 |
|
---|
94 | /* convert int to long from memory */
|
---|
95 | { SCONV, INBREG,
|
---|
96 | SNAME|SOREG, TINT,
|
---|
97 | SANY, TLONG,
|
---|
98 | NBREG, RESC1,
|
---|
99 | "mov AL,U1\nsxt A1\n", },
|
---|
100 |
|
---|
101 | /* int -> (u)long. XXX - only in r0 and r1 */
|
---|
102 | { SCONV, INBREG,
|
---|
103 | SAREG, TINT,
|
---|
104 | SANY, TLONG|TULONG,
|
---|
105 | NSPECIAL|NBREG|NBSL, RESC1,
|
---|
106 | "tst AL\nsxt r0\n", },
|
---|
107 |
|
---|
108 | /* unsigned -> (u)long. XXX - only in r0 and r1 */
|
---|
109 | { SCONV, INBREG,
|
---|
110 | SAREG, TUNSIGNED,
|
---|
111 | SANY, TLONG|TULONG,
|
---|
112 | NSPECIAL|NBREG|NBSL, RESC1,
|
---|
113 | "clr r0\n", },
|
---|
114 |
|
---|
115 | /* uint -> double */
|
---|
116 | { SCONV, INCREG,
|
---|
117 | SAREG|SNAME|SOREG|SCON, TUNSIGNED,
|
---|
118 | SANY, TFLOAT|TDOUBLE,
|
---|
119 | NCREG|NCSL, RESC1,
|
---|
120 | "mov AL,-(sp)\nclr -(sp)\n"
|
---|
121 | "setl\nmovif (sp)+,A1\nseti\n", },
|
---|
122 |
|
---|
123 | /* long -> int */
|
---|
124 | { SCONV, INAREG,
|
---|
125 | SBREG|SOREG|SNAME, TLONG|TULONG,
|
---|
126 | SAREG, TWORD,
|
---|
127 | NAREG|NASL, RESC1,
|
---|
128 | "mov UL,A1\n", },
|
---|
129 |
|
---|
130 |
|
---|
131 | /* (u)long -> (u)long, nothing */
|
---|
132 | { SCONV, INBREG,
|
---|
133 | SBREG, TLONG|TULONG,
|
---|
134 | SANY, TLONG|TULONG,
|
---|
135 | NBREG|NBSL, RESC1,
|
---|
136 | "", },
|
---|
137 |
|
---|
138 | /* long -> double */
|
---|
139 | { SCONV, INCREG,
|
---|
140 | SBREG|SNAME|SOREG|SCON, TLONG,
|
---|
141 | SANY, TFLOAT|TDOUBLE,
|
---|
142 | NCREG|NCSL, RESC1,
|
---|
143 | "mov UL,-(sp)\nmov AL,-(sp)\n"
|
---|
144 | "setl\nmovif (sp)+,A1\nseti\n", },
|
---|
145 |
|
---|
146 | /*
|
---|
147 | * Subroutine calls.
|
---|
148 | */
|
---|
149 | { CALL, INBREG,
|
---|
150 | SCON, TANY,
|
---|
151 | SBREG, TLONG|TULONG,
|
---|
152 | NBREG|NBSL, RESC1,
|
---|
153 | "jsr pc,*CL\nZC", },
|
---|
154 |
|
---|
155 | { UCALL, INBREG,
|
---|
156 | SCON, TANY,
|
---|
157 | SBREG, TLONG|TULONG,
|
---|
158 | NBREG|NBSL, RESC1,
|
---|
159 | "jsr pc,*CL\n", },
|
---|
160 |
|
---|
161 | { CALL, FOREFF,
|
---|
162 | SCON|SNAME|SOREG, TANY,
|
---|
163 | SANY, TANY,
|
---|
164 | 0, 0,
|
---|
165 | "jsr pc,*AL\nZC", },
|
---|
166 |
|
---|
167 | { UCALL, FOREFF,
|
---|
168 | SCON|SNAME|SOREG, TANY,
|
---|
169 | SANY, TANY,
|
---|
170 | 0, 0,
|
---|
171 | "jsr pc,*AL\n", },
|
---|
172 |
|
---|
173 | { CALL, INAREG,
|
---|
174 | SCON|SOREG|SNAME, TANY,
|
---|
175 | SAREG, TWORD|TPOINT|TCHAR|TUCHAR,
|
---|
176 | NAREG|NASL, RESC1,
|
---|
177 | "jsr pc,*AL\nZC", },
|
---|
178 |
|
---|
179 | { UCALL, INAREG,
|
---|
180 | SCON|SOREG|SNAME, TANY,
|
---|
181 | SAREG, TWORD|TPOINT|TCHAR|TUCHAR,
|
---|
182 | NAREG|NASL, RESC1,
|
---|
183 | "jsr pc,*AL\n", },
|
---|
184 |
|
---|
185 | { CALL, FOREFF,
|
---|
186 | SAREG, TANY,
|
---|
187 | SANY, TANY,
|
---|
188 | 0, 0,
|
---|
189 | "jsr pc,(AL)\nZC", },
|
---|
190 |
|
---|
191 | { UCALL, FOREFF,
|
---|
192 | SAREG, TANY,
|
---|
193 | SANY, TANY,
|
---|
194 | 0, 0,
|
---|
195 | "jsr pc,(AL)\n", },
|
---|
196 |
|
---|
197 | { CALL, INAREG,
|
---|
198 | SAREG, TANY,
|
---|
199 | SANY, TANY,
|
---|
200 | NAREG|NASL, RESC1, /* should be 0 */
|
---|
201 | "jsr pc,(AL)\nZC", },
|
---|
202 |
|
---|
203 | { UCALL, INAREG,
|
---|
204 | SAREG, TANY,
|
---|
205 | SANY, TANY,
|
---|
206 | NAREG|NASL, RESC1, /* should be 0 */
|
---|
207 | "jsr pc,(AL)\n", },
|
---|
208 |
|
---|
209 | /*
|
---|
210 | * The next rules handle all binop-style operators.
|
---|
211 | */
|
---|
212 | /* Add one to anything left but use only for side effects */
|
---|
213 | { PLUS, FOREFF|INAREG|FORCC,
|
---|
214 | SAREG|SNAME|SOREG, TWORD|TPOINT,
|
---|
215 | SONE, TANY,
|
---|
216 | 0, RLEFT|RESCC,
|
---|
217 | "inc AL\n", },
|
---|
218 |
|
---|
219 | /* add one for char to reg, special handling */
|
---|
220 | { PLUS, FOREFF|INAREG|FORCC,
|
---|
221 | SAREG, TCHAR|TUCHAR,
|
---|
222 | SONE, TANY,
|
---|
223 | 0, RLEFT|RESCC,
|
---|
224 | "inc AL\n", },
|
---|
225 |
|
---|
226 | /* add one for char to memory */
|
---|
227 | { PLUS, FOREFF|FORCC,
|
---|
228 | SNAME|SOREG|STARNM, TCHAR|TUCHAR,
|
---|
229 | SONE, TANY,
|
---|
230 | 0, RLEFT|RESCC,
|
---|
231 | "incb AL\n", },
|
---|
232 |
|
---|
233 | { PLUS, INBREG|FOREFF,
|
---|
234 | SBREG, TLONG,
|
---|
235 | SBREG|SNAME|SOREG|SCON, TLONG,
|
---|
236 | 0, RLEFT,
|
---|
237 | "add AR,AL\nadd UR,UL\nadc AL\n", },
|
---|
238 |
|
---|
239 | /* Add to reg left and reclaim reg */
|
---|
240 | { PLUS, INAREG|FOREFF|FORCC,
|
---|
241 | SAREG|SNAME|SOREG, TWORD|TPOINT,
|
---|
242 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
243 | 0, RLEFT|RESCC,
|
---|
244 | "add AR,AL\n", },
|
---|
245 |
|
---|
246 | /* Add to anything left but use only for side effects */
|
---|
247 | { PLUS, FOREFF|FORCC,
|
---|
248 | SNAME|SOREG, TWORD|TPOINT,
|
---|
249 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
250 | 0, RLEFT|RESCC,
|
---|
251 | "add AR,AL\n", },
|
---|
252 |
|
---|
253 | { PLUS, INAREG|FOREFF|FORCC,
|
---|
254 | SAREG, TCHAR|TUCHAR,
|
---|
255 | SAREG|SNAME|SOREG|SCON, TCHAR|TUCHAR,
|
---|
256 | 0, RLEFT|RESCC,
|
---|
257 | "add AR,AL\n", },
|
---|
258 |
|
---|
259 | /* Post-increment read, byte */
|
---|
260 | { MINUS, INAREG,
|
---|
261 | SINCB, TCHAR|TUCHAR,
|
---|
262 | SONE, TANY,
|
---|
263 | NAREG, RESC1,
|
---|
264 | "movb ZG,A1\nincb ZG\n", },
|
---|
265 |
|
---|
266 | /* Post-increment read, int */
|
---|
267 | { MINUS, INAREG,
|
---|
268 | SINCB, TWORD|TPOINT,
|
---|
269 | SONE, TANY,
|
---|
270 | NAREG, RESC1,
|
---|
271 | "mov ZG,A1\ninc ZG\n", },
|
---|
272 |
|
---|
273 | { MINUS, INBREG|FOREFF,
|
---|
274 | SBREG, TLONG|TULONG,
|
---|
275 | SBREG|SNAME|SOREG|SCON, TLONG|TULONG,
|
---|
276 | 0, RLEFT,
|
---|
277 | "sub AR,AL\nsub UR,UL\nsbc AL\n", },
|
---|
278 |
|
---|
279 | /* Sub one from anything left */
|
---|
280 | { MINUS, FOREFF|INAREG|FORCC,
|
---|
281 | SAREG|SNAME|SOREG, TWORD|TPOINT,
|
---|
282 | SONE, TANY,
|
---|
283 | 0, RLEFT|RESCC,
|
---|
284 | "dec AL\n", },
|
---|
285 |
|
---|
286 | { MINUS, INAREG|FOREFF,
|
---|
287 | SAREG, TWORD|TPOINT,
|
---|
288 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
289 | 0, RLEFT,
|
---|
290 | "sub AR,AL\n", },
|
---|
291 |
|
---|
292 | /* Sub from anything left but use only for side effects */
|
---|
293 | { MINUS, FOREFF|INAREG|FORCC,
|
---|
294 | SAREG|SNAME|SOREG, TWORD|TPOINT,
|
---|
295 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
296 | 0, RLEFT|RESCC,
|
---|
297 | "sub AR,AL\n", },
|
---|
298 |
|
---|
299 | /* Sub one left but use only for side effects */
|
---|
300 | { MINUS, FOREFF|FORCC,
|
---|
301 | SAREG|SNAME|SOREG, TCHAR|TUCHAR,
|
---|
302 | SONE, TANY,
|
---|
303 | 0, RLEFT|RESCC,
|
---|
304 | "decb AL\n", },
|
---|
305 |
|
---|
306 | /* Sub from anything left but use only for side effects */
|
---|
307 | { MINUS, FOREFF|FORCC,
|
---|
308 | SAREG|SNAME|SOREG, TCHAR|TUCHAR,
|
---|
309 | SAREG|SNAME|SOREG|SCON, TCHAR|TUCHAR|TWORD|TPOINT,
|
---|
310 | 0, RLEFT|RESCC,
|
---|
311 | "subb AR,AL\n", },
|
---|
312 |
|
---|
313 | /*
|
---|
314 | * The next rules handle all shift operators.
|
---|
315 | */
|
---|
316 | { LS, INBREG|FOREFF,
|
---|
317 | SBREG, TLONG|TULONG,
|
---|
318 | SANY, TANY,
|
---|
319 | 0, RLEFT,
|
---|
320 | "ashc AR,AL\n", },
|
---|
321 |
|
---|
322 | { LS, INAREG|FOREFF,
|
---|
323 | SAREG, TWORD,
|
---|
324 | SONE, TANY,
|
---|
325 | 0, RLEFT,
|
---|
326 | "asl AL\n", },
|
---|
327 |
|
---|
328 | { LS, INAREG|FOREFF,
|
---|
329 | SAREG, TWORD,
|
---|
330 | ANYSH, TWORD,
|
---|
331 | 0, RLEFT,
|
---|
332 | "ash AR,AL\n", },
|
---|
333 |
|
---|
334 | /*
|
---|
335 | * The next rules takes care of assignments. "=".
|
---|
336 | */
|
---|
337 |
|
---|
338 | /* First optimizations, in lack of weight it uses first found */
|
---|
339 | /* Start with class A registers */
|
---|
340 |
|
---|
341 | /* Clear word at address */
|
---|
342 | { ASSIGN, FOREFF|FORCC,
|
---|
343 | ARONS, TWORD|TPOINT,
|
---|
344 | SZERO, TANY,
|
---|
345 | 0, RESCC,
|
---|
346 | "clr AL\n", },
|
---|
347 |
|
---|
348 | /* Clear word at reg */
|
---|
349 | { ASSIGN, FOREFF|INAREG,
|
---|
350 | SAREG, TWORD|TPOINT,
|
---|
351 | SZERO, TANY,
|
---|
352 | 0, RDEST,
|
---|
353 | "clr AL\n", },
|
---|
354 |
|
---|
355 | /* Clear byte at address. No reg here. */
|
---|
356 | { ASSIGN, FOREFF,
|
---|
357 | SNAME|SOREG|STARNM, TCHAR|TUCHAR,
|
---|
358 | SZERO, TANY,
|
---|
359 | 0, RDEST,
|
---|
360 | "clrb AL\n", },
|
---|
361 |
|
---|
362 | /* Clear byte in reg. must clear the whole register. */
|
---|
363 | { ASSIGN, FOREFF|INAREG,
|
---|
364 | SAREG, TCHAR|TUCHAR,
|
---|
365 | SZERO, TANY,
|
---|
366 | 0, RDEST,
|
---|
367 | "clr AL\n", },
|
---|
368 |
|
---|
369 | /* The next is class B regs */
|
---|
370 |
|
---|
371 | /* Clear long at address or in reg */
|
---|
372 | { ASSIGN, FOREFF|INBREG,
|
---|
373 | SNAME|SOREG|SBREG, TLONG|TULONG,
|
---|
374 | SZERO, TANY,
|
---|
375 | 0, RDEST,
|
---|
376 | "clr AL\nclr UL\n", },
|
---|
377 |
|
---|
378 | /* Save 2 bytes if high-order bits are zero */
|
---|
379 | { ASSIGN, FOREFF|INBREG,
|
---|
380 | SBREG, TLONG|TULONG,
|
---|
381 | SSCON, TLONG,
|
---|
382 | 0, RDEST,
|
---|
383 | "mov UR,UL\nsxt AL\n", },
|
---|
384 |
|
---|
385 | /* Must have multiple rules for long otherwise regs may be trashed */
|
---|
386 | { ASSIGN, FOREFF|INBREG,
|
---|
387 | SBREG, TLONG|TULONG,
|
---|
388 | SCON|SNAME|SOREG, TLONG|TULONG,
|
---|
389 | 0, RDEST,
|
---|
390 | "mov AR,AL\nmov UR,UL\n", },
|
---|
391 |
|
---|
392 | { ASSIGN, FOREFF|INBREG,
|
---|
393 | SNAME|SOREG, TLONG|TULONG,
|
---|
394 | SBREG, TLONG|TULONG,
|
---|
395 | 0, RDEST,
|
---|
396 | "mov AR,AL\nmov UR,UL\n", },
|
---|
397 |
|
---|
398 | { ASSIGN, FOREFF,
|
---|
399 | SNAME|SOREG, TLONG|TULONG,
|
---|
400 | SCON|SNAME|SOREG, TLONG|TULONG,
|
---|
401 | 0, 0,
|
---|
402 | "mov AR,AL\nmov UR,UL\n", },
|
---|
403 |
|
---|
404 | { ASSIGN, INBREG|FOREFF,
|
---|
405 | SBREG, TLONG|TULONG,
|
---|
406 | SBREG, TLONG|TULONG,
|
---|
407 | 0, RDEST,
|
---|
408 | "ZE\n", },
|
---|
409 |
|
---|
410 | { ASSIGN, FOREFF|INAREG|FORCC,
|
---|
411 | SAREG, TWORD|TPOINT,
|
---|
412 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
413 | 0, RDEST|RESCC,
|
---|
414 | "mov AR,AL\n", },
|
---|
415 |
|
---|
416 | { ASSIGN, FOREFF|INAREG|FORCC,
|
---|
417 | ARONS, TWORD|TPOINT,
|
---|
418 | SAREG, TWORD|TPOINT,
|
---|
419 | 0, RDEST|RESCC,
|
---|
420 | "mov AR,AL\n", },
|
---|
421 |
|
---|
422 | { ASSIGN, FOREFF|FORCC,
|
---|
423 | SNAME|SOREG, TWORD|TPOINT,
|
---|
424 | SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
425 | 0, RESCC,
|
---|
426 | "mov AR,AL\n", },
|
---|
427 |
|
---|
428 | { ASSIGN, FOREFF|INAREG|FORCC,
|
---|
429 | SAREG, TCHAR|TUCHAR,
|
---|
430 | ARONS|SCON, TCHAR|TUCHAR,
|
---|
431 | 0, RDEST|RESCC,
|
---|
432 | "movb AR,AL\n", },
|
---|
433 |
|
---|
434 | { ASSIGN, FOREFF|INAREG|FORCC,
|
---|
435 | ARONS, TCHAR|TUCHAR,
|
---|
436 | SAREG, TCHAR|TUCHAR,
|
---|
437 | 0, RDEST|RESCC,
|
---|
438 | "movb AR,AL\n", },
|
---|
439 |
|
---|
440 | { ASSIGN, FOREFF|FORCC,
|
---|
441 | SNAME|SOREG|STARNM, TCHAR|TUCHAR,
|
---|
442 | SNAME|SOREG|SCON|STARNM, TCHAR|TUCHAR,
|
---|
443 | 0, RDEST|RESCC,
|
---|
444 | "movb AR,AL\n", },
|
---|
445 |
|
---|
446 | { ASSIGN, FOREFF|INCREG,
|
---|
447 | SCREG, TDOUBLE,
|
---|
448 | SNAME|SOREG|SCON, TDOUBLE,
|
---|
449 | 0, RDEST,
|
---|
450 | "movf AR,AL\n", },
|
---|
451 |
|
---|
452 | { ASSIGN, FOREFF|INCREG,
|
---|
453 | SCREG, TFLOAT,
|
---|
454 | SNAME|SOREG|SCON, TFLOAT,
|
---|
455 | 0, RDEST,
|
---|
456 | "movof AR,AL\n", },
|
---|
457 |
|
---|
458 | { ASSIGN, FOREFF|INCREG,
|
---|
459 | SNAME|SOREG|SCREG, TDOUBLE,
|
---|
460 | SCREG, TDOUBLE,
|
---|
461 | 0, RDEST,
|
---|
462 | "movf AR,AL\n", },
|
---|
463 |
|
---|
464 | { ASSIGN, FOREFF|INCREG,
|
---|
465 | SNAME|SOREG|SCREG, TFLOAT,
|
---|
466 | SCREG, TFLOAT,
|
---|
467 | 0, RDEST,
|
---|
468 | "movfo AR,AL\n", },
|
---|
469 |
|
---|
470 | /*
|
---|
471 | * DIV/MOD/MUL
|
---|
472 | */
|
---|
473 | /* XXX - mul may use any odd register, only r1 for now */
|
---|
474 | { MUL, INAREG,
|
---|
475 | SAREG, TWORD|TPOINT,
|
---|
476 | SAREG|SNAME|SOREG|SCON, TWORD|TPOINT,
|
---|
477 | NSPECIAL, RLEFT,
|
---|
478 | "mul AR,AL\n", },
|
---|
479 |
|
---|
480 | { MUL, INBREG,
|
---|
481 | SBREG|SNAME|SCON|SOREG, TLONG|TULONG,
|
---|
482 | SBREG|SNAME|SCON|SOREG, TLONG|TULONG,
|
---|
483 | NSPECIAL|NBREG|NBSL|NBSR, RESC1,
|
---|
484 | "mov UR,-(sp)\nmov AR,-(sp)\n"
|
---|
485 | "mov UL,-(sp)\nmov AL,-(sp)\n"
|
---|
486 | "jsr pc,lmul\nadd $10,sp\n", },
|
---|
487 |
|
---|
488 | { MUL, INCREG,
|
---|
489 | SCREG, TFLOAT|TDOUBLE,
|
---|
490 | SCREG|SNAME|SOREG, TFLOAT|TDOUBLE,
|
---|
491 | 0, RLEFT,
|
---|
492 | "mulf AR,AL\n", },
|
---|
493 |
|
---|
494 | /* need extra move to be sure N flag is correct for sxt */
|
---|
495 | { DIV, INAREG,
|
---|
496 | ANYSH, TINT|TPOINT,
|
---|
497 | ANYSH, TINT|TPOINT,
|
---|
498 | NSPECIAL, RDEST,
|
---|
499 | "mov AL,r1\nsxt r0\ndiv AR,r0\n", },
|
---|
500 |
|
---|
501 | /* udiv uses args in registers */
|
---|
502 | { DIV, INAREG,
|
---|
503 | SAREG, TUNSIGNED,
|
---|
504 | SAREG, TUNSIGNED,
|
---|
505 | NSPECIAL|NAREG|NASL|NASR, RESC1,
|
---|
506 | "jsr pc,udiv\n", },
|
---|
507 |
|
---|
508 | { DIV, INBREG,
|
---|
509 | SBREG|SNAME|SCON|SOREG, TLONG|TULONG,
|
---|
510 | SBREG|SNAME|SCON|SOREG, TLONG|TULONG,
|
---|
511 | NSPECIAL|NBREG|NBSL|NBSR, RESC1,
|
---|
512 | "mov UR,-(sp)\nmov AR,-(sp)\n"
|
---|
513 | "mov UL,-(sp)\nmov AL,-(sp)\n"
|
---|
514 | "jsr pc,ldiv\nadd $10,sp\n", },
|
---|
515 |
|
---|
516 | { DIV, INCREG,
|
---|
517 | SCREG, TFLOAT|TDOUBLE,
|
---|
518 | SCREG|SNAME|SOREG, TFLOAT|TDOUBLE,
|
---|
519 | 0, RLEFT,
|
---|
520 | "divf AR,AL\n", },
|
---|
521 |
|
---|
522 | /* XXX merge the two below to one */
|
---|
523 | { MOD, INBREG,
|
---|
524 | SBREG|SNAME|SCON|SOREG, TLONG,
|
---|
525 | SBREG|SNAME|SCON|SOREG, TLONG,
|
---|
526 | NSPECIAL|NBREG|NBSL|NBSR, RESC1,
|
---|
527 | "mov UR,-(sp)\nmov AR,-(sp)\n"
|
---|
528 | "mov UL,-(sp)\nmov AL,-(sp)\n"
|
---|
529 | "jsr pc,lrem\nadd $10,sp\n", },
|
---|
530 |
|
---|
531 | { MOD, INBREG,
|
---|
532 | SBREG|SNAME|SCON|SOREG, TULONG,
|
---|
533 | SBREG|SNAME|SCON|SOREG, TULONG,
|
---|
534 | NSPECIAL|NBREG|NBSL|NBSR, RESC1,
|
---|
535 | "mov UR,-(sp)\nmov AR,-(sp)\n"
|
---|
536 | "mov UL,-(sp)\nmov AL,-(sp)\n"
|
---|
537 | "jsr pc,ulrem\nadd $10,sp\n", },
|
---|
538 |
|
---|
539 | /* urem uses args in registers */
|
---|
540 | { MOD, INAREG,
|
---|
541 | SAREG, TUNSIGNED,
|
---|
542 | SAREG, TUNSIGNED,
|
---|
543 | NSPECIAL|NAREG|NASL|NASR, RESC1,
|
---|
544 | "jsr pc,urem\n", },
|
---|
545 |
|
---|
546 | /*
|
---|
547 | * Indirection operators.
|
---|
548 | */
|
---|
549 | { UMUL, INBREG,
|
---|
550 | SANY, TPOINT|TWORD,
|
---|
551 | SOREG, TLONG|TULONG,
|
---|
552 | NBREG, RESC1, /* |NBSL - may overwrite index reg */
|
---|
553 | "mov AR,A1\nmov UR,U1\n", },
|
---|
554 |
|
---|
555 | { UMUL, INAREG,
|
---|
556 | SANY, TPOINT|TWORD,
|
---|
557 | SOREG, TPOINT|TWORD,
|
---|
558 | NAREG|NASL, RESC1,
|
---|
559 | "mov AR,A1\n", },
|
---|
560 |
|
---|
561 | { UMUL, INAREG,
|
---|
562 | SANY, TANY,
|
---|
563 | SOREG, TCHAR|TUCHAR,
|
---|
564 | NAREG|NASL, RESC1,
|
---|
565 | "movb AR,A1\n", },
|
---|
566 |
|
---|
567 | /*
|
---|
568 | * Logical/branching operators
|
---|
569 | */
|
---|
570 | { OPLOG, FORCC,
|
---|
571 | SAREG|SOREG|SNAME|SCON, TWORD|TPOINT,
|
---|
572 | SZERO, TANY,
|
---|
573 | 0, RESCC,
|
---|
574 | "tst AL\n", },
|
---|
575 |
|
---|
576 | { OPLOG, FORCC,
|
---|
577 | SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR,
|
---|
578 | SZERO, TANY,
|
---|
579 | 0, RESCC,
|
---|
580 | "tstb AL\n", },
|
---|
581 |
|
---|
582 | { OPLOG, FORCC,
|
---|
583 | SAREG|SOREG|SNAME|SCON, TWORD|TPOINT,
|
---|
584 | SAREG|SOREG|SNAME|SCON, TWORD|TPOINT,
|
---|
585 | 0, RESCC,
|
---|
586 | "cmp AL,AR\n", },
|
---|
587 |
|
---|
588 | { OPLOG, FORCC,
|
---|
589 | SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR,
|
---|
590 | SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR,
|
---|
591 | 0, RESCC,
|
---|
592 | "cmpb AL,AR\n", },
|
---|
593 |
|
---|
594 | { OPLOG, FORCC,
|
---|
595 | SBREG|SOREG|SNAME|SCON, TLONG|TULONG,
|
---|
596 | SZERO, TANY,
|
---|
597 | 0, RNULL,
|
---|
598 | "ZD", },
|
---|
599 |
|
---|
600 | { OPLOG, FORCC,
|
---|
601 | SBREG|SOREG|SNAME, TLONG|TULONG,
|
---|
602 | SBREG|SOREG|SNAME, TLONG|TULONG,
|
---|
603 | 0, RNULL,
|
---|
604 | "ZF", },
|
---|
605 |
|
---|
606 | /* AND/OR/ER/NOT */
|
---|
607 | /* Optimize if high order bits are zero */
|
---|
608 | { AND, FOREFF|INBREG|FORCC,
|
---|
609 | SOREG|SNAME|SBREG, TLONG|TULONG,
|
---|
610 | SANDSCON, TLONG|TULONG,
|
---|
611 | 0, RLEFT|RESCC,
|
---|
612 | "clr AL\nbic UR,UL\n", },
|
---|
613 |
|
---|
614 | { AND, INBREG|FORCC,
|
---|
615 | SBREG, TLONG|TULONG,
|
---|
616 | SCON|SBREG|SOREG|SNAME, TLONG|TULONG,
|
---|
617 | 0, RLEFT|RESCC,
|
---|
618 | "bic AR,AL\nbic UR,UL\n", },
|
---|
619 |
|
---|
620 | /* set status bits */
|
---|
621 | { AND, FORCC,
|
---|
622 | ARONS|SCON, TWORD|TPOINT,
|
---|
623 | ARONS|SCON, TWORD|TPOINT,
|
---|
624 | 0, RESCC,
|
---|
625 | "bit AR,AL\n", },
|
---|
626 |
|
---|
627 | /* AND with int */
|
---|
628 | { AND, INAREG|FORCC|FOREFF,
|
---|
629 | SAREG|SNAME|SOREG, TWORD,
|
---|
630 | SCON|SAREG|SOREG|SNAME, TWORD,
|
---|
631 | 0, RLEFT|RESCC,
|
---|
632 | "bic AR,AL\n", },
|
---|
633 |
|
---|
634 | /* AND with char */
|
---|
635 | { AND, INAREG|FORCC,
|
---|
636 | SAREG|SOREG|SNAME, TCHAR|TUCHAR,
|
---|
637 | ARONS|SCON, TCHAR|TUCHAR,
|
---|
638 | 0, RLEFT|RESCC,
|
---|
639 | "bicb AR,AL\n", },
|
---|
640 |
|
---|
641 | { OR, INBREG|FORCC,
|
---|
642 | SBREG, TLONG|TULONG,
|
---|
643 | SCON|SBREG|SOREG|SNAME, TLONG|TULONG,
|
---|
644 | 0, RLEFT|RESCC,
|
---|
645 | "bis AR,AL\nbis UR,UL\n", },
|
---|
646 |
|
---|
647 | /* OR with int */
|
---|
648 | { OR, FOREFF|INAREG|FORCC,
|
---|
649 | ARONS, TWORD,
|
---|
650 | ARONS|SCON, TWORD,
|
---|
651 | 0, RLEFT|RESCC,
|
---|
652 | "bis AR,AL\n", },
|
---|
653 |
|
---|
654 | /* OR with char */
|
---|
655 | { OR, INAREG|FORCC,
|
---|
656 | SAREG|SOREG|SNAME, TCHAR|TUCHAR,
|
---|
657 | ARONS|SCON, TCHAR|TUCHAR,
|
---|
658 | 0, RLEFT|RESCC,
|
---|
659 | "bisb AR,AL\n", },
|
---|
660 |
|
---|
661 | /* XOR with int (extended insn) */
|
---|
662 | { ER, INAREG|FORCC,
|
---|
663 | ARONS, TWORD,
|
---|
664 | SAREG, TWORD,
|
---|
665 | 0, RLEFT|RESCC,
|
---|
666 | "xor AR,AL\n", },
|
---|
667 |
|
---|
668 | /* XOR with char (extended insn) */
|
---|
669 | { ER, INAREG|FORCC,
|
---|
670 | SAREG, TCHAR|TUCHAR,
|
---|
671 | SAREG, TCHAR|TUCHAR,
|
---|
672 | 0, RLEFT|RESCC,
|
---|
673 | "xor AR,AL\n", },
|
---|
674 |
|
---|
675 | /*
|
---|
676 | * Jumps.
|
---|
677 | */
|
---|
678 | { GOTO, FOREFF,
|
---|
679 | SCON, TANY,
|
---|
680 | SANY, TANY,
|
---|
681 | 0, RNOP,
|
---|
682 | "jbr LL\n", },
|
---|
683 |
|
---|
684 | /*
|
---|
685 | * Convert LTYPE to reg.
|
---|
686 | */
|
---|
687 | /* Two bytes less if high half of constant is zero */
|
---|
688 | { OPLTYPE, INBREG,
|
---|
689 | SANY, TANY,
|
---|
690 | SSCON, TLONG|TULONG,
|
---|
691 | NBREG, RESC1,
|
---|
692 | "mov UL,U1\nsxt A1\n", },
|
---|
693 |
|
---|
694 | /* XXX - avoid OREG index register to be overwritten */
|
---|
695 | { OPLTYPE, INBREG,
|
---|
696 | SANY, TANY,
|
---|
697 | SCON|SBREG|SNAME|SOREG, TLONG|TULONG,
|
---|
698 | NBREG, RESC1,
|
---|
699 | "mov AL,A1\nmov UL,U1\n", },
|
---|
700 |
|
---|
701 | { OPLTYPE, INAREG,
|
---|
702 | SANY, TANY,
|
---|
703 | SAREG|SCON|SOREG|SNAME, TWORD|TPOINT,
|
---|
704 | NAREG|NASR, RESC1,
|
---|
705 | "mov AL,A1\n", },
|
---|
706 |
|
---|
707 | { OPLTYPE, INAREG,
|
---|
708 | SANY, TANY,
|
---|
709 | SAREG|SCON|SOREG|SNAME, TCHAR,
|
---|
710 | NAREG, RESC1,
|
---|
711 | "movb AR,A1\n", },
|
---|
712 |
|
---|
713 | { OPLTYPE, INAREG,
|
---|
714 | SANY, TANY,
|
---|
715 | SAREG|SCON|SOREG|SNAME, TUCHAR,
|
---|
716 | NAREG, RESC1,
|
---|
717 | "clr A1\nbisb AL,A1\n", },
|
---|
718 |
|
---|
719 | { OPLTYPE, INCREG,
|
---|
720 | SANY, TANY,
|
---|
721 | SCREG|SCON|SOREG|SNAME, TDOUBLE,
|
---|
722 | NCREG, RESC1,
|
---|
723 | "movf AL,A1\n", },
|
---|
724 |
|
---|
725 | { OPLTYPE, INCREG,
|
---|
726 | SANY, TANY,
|
---|
727 | SCREG|SCON|SOREG|SNAME, TFLOAT,
|
---|
728 | NCREG, RESC1,
|
---|
729 | "movof AL,A1\n", },
|
---|
730 |
|
---|
731 | /*
|
---|
732 | * Negate a word.
|
---|
733 | */
|
---|
734 | { UMINUS, INAREG|FOREFF,
|
---|
735 | SAREG, TWORD|TPOINT|TCHAR|TUCHAR,
|
---|
736 | SANY, TANY,
|
---|
737 | 0, RLEFT,
|
---|
738 | "neg AL\n", },
|
---|
739 |
|
---|
740 | { UMINUS, INBREG|FOREFF,
|
---|
741 | SBREG|SOREG|SNAME, TLONG,
|
---|
742 | SANY, TANY,
|
---|
743 | 0, RLEFT,
|
---|
744 | "neg AL\nneg UL\nsbc AL\n", },
|
---|
745 |
|
---|
746 |
|
---|
747 | { COMPL, INBREG,
|
---|
748 | SBREG, TLONG|TULONG,
|
---|
749 | SANY, TANY,
|
---|
750 | 0, RLEFT,
|
---|
751 | "com AL\ncom UL\n", },
|
---|
752 |
|
---|
753 | { COMPL, INAREG,
|
---|
754 | SAREG, TWORD,
|
---|
755 | SANY, TANY,
|
---|
756 | 0, RLEFT,
|
---|
757 | "com AL\n", },
|
---|
758 |
|
---|
759 | /*
|
---|
760 | * Arguments to functions.
|
---|
761 | */
|
---|
762 | { FUNARG, FOREFF,
|
---|
763 | SCON|SBREG|SNAME|SOREG, TLONG|TULONG,
|
---|
764 | SANY, TLONG|TULONG,
|
---|
765 | 0, RNULL,
|
---|
766 | "mov UL,ZA(sp)\nmov AL,-(sp)\n", },
|
---|
767 |
|
---|
768 | { FUNARG, FOREFF,
|
---|
769 | SZERO, TANY,
|
---|
770 | SANY, TANY,
|
---|
771 | 0, RNULL,
|
---|
772 | "clr ZA(sp)\n", },
|
---|
773 |
|
---|
774 | { FUNARG, FOREFF,
|
---|
775 | SARGSUB, TWORD|TPOINT,
|
---|
776 | SANY, TWORD|TPOINT,
|
---|
777 | 0, RNULL,
|
---|
778 | "ZB", },
|
---|
779 |
|
---|
780 | { FUNARG, FOREFF,
|
---|
781 | SARGINC, TWORD|TPOINT,
|
---|
782 | SANY, TWORD|TPOINT,
|
---|
783 | 0, RNULL,
|
---|
784 | "ZH", },
|
---|
785 |
|
---|
786 | { FUNARG, FOREFF,
|
---|
787 | SCON|SAREG|SNAME|SOREG, TWORD|TPOINT,
|
---|
788 | SANY, TWORD|TPOINT,
|
---|
789 | 0, RNULL,
|
---|
790 | "mov AL,ZA(sp)\n", },
|
---|
791 |
|
---|
792 | { FUNARG, FOREFF,
|
---|
793 | SCON, TCHAR|TUCHAR,
|
---|
794 | SANY, TANY,
|
---|
795 | 0, RNULL,
|
---|
796 | "mov AL,ZA(sp)\n", },
|
---|
797 |
|
---|
798 | { FUNARG, FOREFF,
|
---|
799 | SNAME|SOREG, TCHAR,
|
---|
800 | SANY, TCHAR,
|
---|
801 | NAREG, RNULL,
|
---|
802 | "movb AL,A1\nmov A1,ZA(sp)\n", },
|
---|
803 |
|
---|
804 | { FUNARG, FOREFF,
|
---|
805 | SNAME|SOREG, TUCHAR,
|
---|
806 | SANY, TUCHAR,
|
---|
807 | NAREG, RNULL,
|
---|
808 | "clr ZA(sp)\nbisb AL,(sp)\n", },
|
---|
809 |
|
---|
810 | { FUNARG, FOREFF,
|
---|
811 | SAREG, TUCHAR|TCHAR,
|
---|
812 | SANY, TUCHAR|TCHAR,
|
---|
813 | 0, RNULL,
|
---|
814 | "mov AL,ZA(sp)\n", },
|
---|
815 |
|
---|
816 | { FUNARG, FOREFF,
|
---|
817 | SCREG, TFLOAT|TDOUBLE,
|
---|
818 | SANY, TANY,
|
---|
819 | 0, RNULL,
|
---|
820 | "movf AL,ZA(sp)\n", },
|
---|
821 |
|
---|
822 | # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
|
---|
823 |
|
---|
824 | { UMUL, DF( UMUL ), },
|
---|
825 |
|
---|
826 | { ASSIGN, DF(ASSIGN), },
|
---|
827 |
|
---|
828 | { STASG, DF(STASG), },
|
---|
829 |
|
---|
830 | { FLD, DF(FLD), },
|
---|
831 |
|
---|
832 | { OPLEAF, DF(NAME), },
|
---|
833 |
|
---|
834 | /* { INIT, DF(INIT), }, */
|
---|
835 |
|
---|
836 | { OPUNARY, DF(UMINUS), },
|
---|
837 |
|
---|
838 | { OPANY, DF(BITYPE), },
|
---|
839 |
|
---|
840 | { FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
|
---|
841 | };
|
---|
842 |
|
---|
843 | int tablesize = sizeof(table)/sizeof(table[0]);
|
---|