|
|
1.1 root 1: # include "cpass2.h"
2: #ifndef lint
3: static char sccsid[] = "@(#)table.c 1.1 86/02/03 Copyr 1985 Sun Micro";
4: #endif
5:
6: /*
7: * Copyright (c) 1985 by Sun Microsystems, Inc.
8: */
9:
10: # define ANYSIGNED TPOINT|TINT|TLONG|TSHORT|TCHAR
11: # define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR
12: # define ANYFIXED ANYSIGNED|ANYUSIGNED
13: # define TWORD TINT|TUNSIGNED|TPOINT|TLONG|TULONG
14: # define TSCALAR TCHAR|TUCHAR|TSHORT|TUSHORT|TINT|TUNSIGNED|TPOINT
15:
16: # define EA SNAME|SOREG|SCON|STARREG|STARNM|SAREG|SBREG
17: # define EAA SNAME|SOREG|SCON|STARREG|STARNM|SAREG
18: # define EB SBREG
19: # define ED SNAME|SOREG|SCON|SAREG /* for addressability of DOUBLEs */
20: # define ES SNAME|SOREG|STARREG|STARNM|SAREG|SBREG
21: # define EM SNAME|SOREG|STARREG|STARNM|SCON
22:
23: struct optab table[] = {
24:
25: /*
26: * special-case constant assignments
27: */
28:
29: ASSIGN, INAREG|FOREFF|FORCC,
30: (EAA)&~SAREG, TSCALAR|TFLOAT,
31: SZERO, TANY,
32: 0, RLEFT|RRIGHT|RESCC,
33: " clrZB AL\n",
34:
35: ASSIGN, INAREG|FOREFF|FORCC,
36: SAREG|STAREG, TSCALAR,
37: SCCON, TSCALAR,
38: 0, RLEFT|RRIGHT|RESCC,
39: " moveq AR,AL\n",
40:
41: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
42:
43: /*
44: * two's complement assignments, to anything but the address registers
45: */
46: ASSIGN, INAREG|FOREFF|FORCC,
47: EAA, TSCALAR,
48: EA, TSCALAR,
49: 0, RLEFT|RRIGHT|RESCC,
50: " movZB AR,AL\n",
51:
52: /*
53: * two's complement assignments, to the address registers
54: */
55: ASSIGN, INBREG|FOREFF,
56: SBREG|STBREG, TWORD|TSHORT,
57: EA, TWORD|TSHORT,
58: 0, RLEFT|RRIGHT,
59: " movZB AR,AL\n",
60:
61: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
62:
63: /*
64: * Floating assignments to anything but the address registers
65: * Note that the condition codes are not left in a valid state.
66: */
67: ASSIGN, INAREG|FOREFF,
68: EAA, TFLOAT,
69: EA, TFLOAT,
70: 0, RLEFT|RRIGHT,
71: " movZB AR,AL\n",
72:
73: /*
74: * Floating assignments to the address registers.
75: * Note that the condition codes are not left in a valid state.
76: */
77: ASSIGN, INBREG|FOREFF,
78: SBREG|STBREG, TFLOAT,
79: EA, TFLOAT,
80: 0, RLEFT|RRIGHT,
81: " movZB AR,AL\n",
82:
83: ASSIGN|OP68881, INBREG|FOREFF,
84: SBREG|STBREG, TFLOAT,
85: SCREG|STCREG, TFLOAT,
86: NAREG, RLEFT|RRIGHT|RESC1,
87: " fmoves AR,A1\n movl A1,AL\n",
88:
89: /*
90: * assignments from temp aregs to anything but the a-registers
91: */
92: ASSIGN, INTAREG|FOREFF,
93: EAA, TSCALAR|TFLOAT,
94: STAREG, TSCALAR|TFLOAT,
95: 0, RRIGHT,
96: " movZB AR,AL\n",
97:
98: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
99:
100: /*
101: * Floating assignments to the fp-registers, if we have them.
102: */
103:
104: ASSIGN|OP68881, INCREG|FOREFF|FORCC,
105: SCREG|STCREG, TFLOAT|TDOUBLE,
106: SFLOAT_SRCE, TFLOAT|TDOUBLE,
107: 0, RLEFT|RRIGHT|RESFCC,
108: " fmoveZF ZK,AL\n",
109:
110: ASSIGN|OP68881, INCREG|FOREFF|FORCC,
111: SCREG|STCREG, TFLOAT|TDOUBLE,
112: SCREG|STCREG, TFLOAT|TDOUBLE,
113: 0, RLEFT|RRIGHT|RESFCC,
114: " fmovex AR,AL\n",
115:
116: ASSIGN|OP68881, INCREG|FOREFF|FORCC,
117: SCREG|STCREG, TFLOAT|TDOUBLE,
118: SAREG|STAREG, TDOUBLE,
119: 0, RLEFT|RRIGHT|RESFCC,
120: " movl UR,sp@-\n\
121: movl AR,sp@-\n\
122: fmoved sp@+,AL\n",
123:
124: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
125:
126: /*
127: * Floating stores from the fp-registers, if we have them.
128: * Note: these do not affect the condition codes on either processor.
129: */
130:
131: ASSIGN|OP68881, INCREG|FOREFF,
132: EM, TFLOAT|TDOUBLE,
133: SCREG|STCREG, TFLOAT|TDOUBLE,
134: 0, RLEFT|RRIGHT,
135: " fmoveZG AR,AL\n",
136:
137: ASSIGN|OP68881, INCREG|FOREFF,
138: SAREG|STAREG, TFLOAT,
139: SCREG|STCREG, TFLOAT|TDOUBLE,
140: 0, RLEFT|RRIGHT,
141: " fmoveZG AR,AL\n",
142:
143: ASSIGN|OP68881, INCREG|FOREFF,
144: SAREG|STAREG, TDOUBLE,
145: SCREG|STCREG, TFLOAT|TDOUBLE,
146: 0, RLEFT|RRIGHT,
147: " fmoved AR,sp@-\n\
148: movl sp@+,AL\n\
149: movl sp@+,UL\n",
150:
151: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
152:
153: /*
154: * Other floating-point assignments
155: */
156:
157: ASSIGN, INAREG|FOREFF,
158: ED, TDOUBLE,
159: ED, TDOUBLE,
160: 0, RLEFT|RRIGHT,
161: " movl AR,AL\n movl UR,UL\n",
162:
163: ASSIGN|NO68881, INAREG|FOREFF,
164: EAA, TFLOAT,
165: ED, TDOUBLE,
166: 0, RLEFT|RRIGHT,
167: "Zg",
168:
169: ASSIGN, INAREG|FOREFF,
170: EAA, TDOUBLE,
171: SAREG, TDOUBLE,
172: 0, RLEFT|RRIGHT,
173: "ZD",
174:
175: ASSIGN, INAREG|FOREFF,
176: SAREG, TDOUBLE,
177: EAA, TDOUBLE,
178: 0, RLEFT|RRIGHT,
179: "ZD",
180:
181: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
182:
183: /* new, fun field ops */
184: ASSIGN, INAREG|FOREFF,
185: SPEC_FLD, TANY,
186: SAREG|STAREG, TANY,
187: NAREG, RRIGHT,
188: "Za\n", /* ie: do the whole show by hand */
189:
190: ASSIGN, INAREG|FOREFF,
191: SPEC_FLD, TANY,
192: SCON, TANY,
193: NAREG, RRIGHT,
194: "Za\n", /* ie: do the whole show by hand */
195:
196: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
197:
198: /* put this here so UNARY MUL nodes match OPLTYPE when appropriate */
199: UNARY MUL, INTAREG|INAREG|FORCC,
200: SBREG, TSCALAR,
201: SANY, TANY,
202: NAREG|NASR, RESC1|RESCC,
203: " movZB AL@,A1\n",
204:
205: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
206:
207: #ifdef FORT
208: GOTO, FOREFF,
209: SCON, TANY,
210: SANY, TANY,
211: 0, RNOP,
212: " jra CL\n",
213:
214: GOTO, FOREFF,
215: SBREG|STBREG, TANY,
216: SANY, TANY,
217: 0, RNOP,
218: " jmp AL@\n",
219: #endif
220:
221: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
222:
223: /* leaf node for effect -- evaluate and discard */
224:
225: OPLTYPE, FOREFF,
226: SANY, TANY,
227: EA, TANY,
228: 0, RRIGHT,
229: "Z ", /* note that the "leaf" may have side effects!!*/
230:
231: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
232:
233: /*
234: * tests to set condition codes, integral operands
235: */
236:
237: OPLTYPE|OP68020, FORCC,
238: SANY, TANY,
239: (EA)&~SCON, TWORD|TSHORT|TUSHORT,
240: 0, RESCC,
241: " tstZB AR\n",
242:
243: OPLTYPE, FORCC,
244: SANY, TANY,
245: (EAA)&~SCON, TSCALAR,
246: 0, RESCC,
247: " tstZB AR\n",
248:
249: OPLTYPE, FORCC,
250: SANY, TANY,
251: EB, TWORD|TSHORT|TUSHORT,
252: 0, RESCC,
253: " cmpw #0,AR\n",
254:
255: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
256:
257: /*
258: * (68881) tests to set coprocessor condition codes, floating point operands
259: */
260:
261: OPLTYPE|OP68881, FORCC,
262: SANY, TANY,
263: SFLOAT_SRCE, TFLOAT|TDOUBLE,
264: 0, RESFCC,
265: " ftestZF ZK\n",
266:
267: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
268:
269: /*
270: * (no 68881) tests to set condtion codes, floating point operands
271: */
272: OPLTYPE|NO68881, FORCC,
273: SANY, TANY,
274: EA, TFLOAT,
275: 0, RESCC,
276: "Zf",
277:
278: OPLTYPE|NO68881, FORCC,
279: SANY, TANY,
280: ED, TDOUBLE,
281: 0, RESCC,
282: "Zf",
283:
284: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
285:
286: /*
287: * special-case loads, constant integral operands
288: */
289: OPLTYPE, INTAREG|INAREG|FORCC,
290: SANY, TANY,
291: SZERO, TSCALAR,
292: NAREG|NASR, RESC1|RESCC,
293: " moveq #0,A1\n",
294:
295: OPLTYPE, INTAREG|INAREG|FORCC,
296: SANY, TANY,
297: SCCON, TSCALAR,
298: NAREG|NASR, RESC1|RESCC,
299: " moveq AR,A1\n",
300:
301: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
302:
303: /*
304: * load scalar into temp d-register
305: */
306: OPLTYPE, INTAREG|INAREG|FORCC,
307: SANY, TANY&~TSTRUCT,
308: EA, TSCALAR,
309: NAREG|NASR, RESC1|RESCC,
310: " movZB AR,A1\n",
311:
312: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
313:
314: /*
315: * special-case loads, float and double operands
316: */
317: OPLTYPE, INTAREG|INAREG,
318: SANY, TANY,
319: EAA, TDOUBLE,
320: NAREG, RESC1,
321: "ZD",
322:
323: OPLTYPE, INTAREG|INAREG,
324: SANY, TANY,
325: SOREG, TDOUBLE,
326: NAREG|NASL|NBREG|NBSL, RESC1,
327: "ZE",
328:
329: OPLTYPE, INTAREG|INAREG,
330: SANY, TANY,
331: EA, TFLOAT,
332: NAREG|NASR, RESC1,
333: " movl AR,A1\n",
334:
335: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
336:
337: /*
338: * (68881) loads from various places into coprocessor registers
339: */
340:
341: OPLTYPE|OP68881, INTCREG|INCREG,
342: SANY, TANY,
343: SFLOAT_SRCE, TFLOAT|TDOUBLE,
344: NCREG, RESC1,
345: " fmoveZF ZK,A1\n",
346:
347: OPLTYPE|OP68881, INTCREG|INCREG,
348: SANY, TANY,
349: SAREG|STAREG, TDOUBLE,
350: NCREG, RESC1,
351: " movl UR,sp@-\n\
352: movl AR,sp@-\n\
353: fmoved sp@+,A1\n",
354:
355: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
356:
357: /*
358: * (68881) loads from coprocessor registers into data registers
359: */
360:
361: OPLTYPE|OP68881, INTAREG|INAREG,
362: SANY, TANY,
363: SCREG|STCREG, TFLOAT,
364: NAREG, RESC1,
365: " fmoves AR,A1\n",
366:
367: OPLTYPE|OP68881, INTAREG|INAREG,
368: SANY, TANY,
369: SCREG|STCREG, TDOUBLE,
370: NAREG, RESC1,
371: " fmoved AR,sp@-\n\
372: movl sp@+,A1\n\
373: movl sp@+,U1\n",
374:
375: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
376:
377: /*
378: * loads into address-registers
379: */
380: OPLTYPE, INTBREG|INBREG,
381: SANY, TANY,
382: SCON, TSCALAR,
383: NBREG|NBSR, RESC1,
384: " lea CR,A1\n",
385:
386: OPLTYPE, INTBREG|INBREG,
387: SANY, TANY,
388: EA, TWORD|TSHORT,
389: NBREG|NBSR, RESC1,
390: " movZB AR,A1\n",
391:
392: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
393:
394: /*
395: * stores into temp stack locations
396: */
397: OPLTYPE, INTEMP|FORCC,
398: SANY, TANY,
399: EA, TSCALAR,
400: NTEMP, RESC1|RESCC,
401: " movZB AR,A1\n",
402:
403: OPLTYPE, INTEMP,
404: SANY, TANY,
405: EA, TFLOAT,
406: NTEMP, RESC1,
407: " movZB AR,A1\n",
408:
409: OPLTYPE, INTEMP,
410: SANY, TANY,
411: ED, TDOUBLE,
412: 2*NTEMP, RESC1,
413: " movl AR,A1\n movl UR,U1\n",
414:
415: OPLTYPE|OP68881, INTEMP,
416: SANY, TANY,
417: SCREG|STCREG, TFLOAT,
418: NTEMP, RESC1,
419: " fmoves AR,A1\n",
420:
421: OPLTYPE|OP68881, INTEMP,
422: SANY, TANY,
423: SCREG|STCREG, TDOUBLE,
424: 2*NTEMP, RESC1,
425: " fmoved AR,A1\n",
426:
427: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
428:
429: /*
430: * argument passing, integral types
431: */
432:
433: OPLTYPE, FORARG,
434: SANY, TANY,
435: SBREG, TINT|TUNSIGNED|TPOINT,
436: 0, RNULL,
437: " pea AR@\nZP",
438:
439: OPLTYPE, FORARG,
440: SANY, TANY,
441: SCON, TSCALAR,
442: 0, RNULL,
443: " pea CR\nZP",
444:
445: OPLTYPE, FORARG,
446: SANY, TANY,
447: EA, TINT|TUNSIGNED|TPOINT,
448: 0, RNULL,
449: " movl AR,Z-\n",
450:
451: OPLTYPE, FORARG,
452: SANY, TANY,
453: EA, TSHORT,
454: NBREG|NBSR, RNULL,
455: " movw AR,A1\n movl A1,Z-\n",
456:
457: OPLTYPE, FORARG,
458: SANY, TANY,
459: EA, TUSHORT,
460: NAREG, RNULL,
461: " clrl A1\n movw AR,A1\n movl A1,Z-\n",
462:
463: OPLTYPE|NO68020, FORARG,
464: SANY, TANY,
465: EA, TCHAR,
466: NAREG|NASR, RNULL,
467: " movb AR,A1\n extw A1\n extl A1\n movl A1,Z-\n",
468:
469: OPLTYPE|OP68020, FORARG,
470: SANY, TANY,
471: EA, TCHAR,
472: NAREG|NASR, RNULL,
473: " movb AR,A1\n extbl A1\n movl A1,Z-\n",
474:
475: OPLTYPE, FORARG,
476: SANY, TANY,
477: EA, TUCHAR,
478: NAREG, RNULL,
479: " clrl A1\n movb AR,A1\n movl A1,Z-\n",
480:
481: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
482:
483: /*
484: * argument passing, floating types
485: */
486:
487: OPLTYPE|OP68881, FORARG,
488: SANY, TANY,
489: SCREG|STCREG, TFLOAT,
490: 0, RNULL,
491: "Zf", /* can't tell from here whether to convert */
492:
493: OPLTYPE|OP68881, FORARG,
494: SANY, TANY,
495: SCREG|STCREG, TDOUBLE,
496: 0, RNULL,
497: " fmoved AR,Z-\n",
498:
499: OPLTYPE, FORARG,
500: SANY, TANY,
501: EA, TFLOAT,
502: 0, RNULL,
503: "Zf", /* can't tell from here whether to convert */
504:
505: OPLTYPE, FORARG,
506: SANY, TANY,
507: ED, TDOUBLE,
508: 0, RNULL,
509: " movl UR,Z-\n movl AR,Z-\n",
510:
511: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
512:
513: /*
514: * field extraction, for value or condition codes
515: */
516: FLD, INAREG|INTAREG|FORCC,
517: SANY, TANY,
518: SPEC_FLD, TSCALAR,
519: NAREG, RESC1|RESCC,
520: "Zb\n",
521:
522: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
523:
524: /*
525: * compare integral operands, for flow control
526: */
527:
528: OPLOG, FORCC,
529: SAREG|STAREG|SBREG|STBREG, TSCALAR,
530: EA, TSCALAR,
531: 0, RESCC,
532: " cmpZL AR,AL\nZI",
533:
534: OPLOG, FORCC,
535: (EA)&~SCON, TSCALAR,
536: SCON, TSCALAR,
537: 0, RESCC,
538: " cmpZL AR,AL\nZI",
539:
540: OPLOG, FORCC,
541: SAUTOINC, TSCALAR,
542: SAUTOINC, TSCALAR,
543: 0, RESCC,
544: " cmpmZL AR,AL\nZI",
545:
546: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
547:
548: /*
549: * (68881) compare floating operands, for flow control.
550: * Note that the 68881 has a separate condition code register and
551: * requires a different set of branch instructions.
552: */
553:
554: OPLOG|OP68881, FORCC,
555: SFLOAT_SRCE, TFLOAT|TDOUBLE,
556: SFZERO, TFLOAT|TDOUBLE,
557: 0, RESFCC,
558: " ftestZG AL\nZH",
559:
560: OPLOG|OP68881, FORCC,
561: SCREG|STCREG, TFLOAT|TDOUBLE,
562: SFLOAT_SRCE, TFLOAT|TDOUBLE,
563: 0, RESFCC,
564: " fcmpZF ZK,AL\nZH",
565:
566: OPLOG|OP68881, FORCC,
567: SCREG|STCREG, TFLOAT|TDOUBLE,
568: SCREG|STCREG, TFLOAT|TDOUBLE,
569: 0, RESFCC,
570: " fcmpx AR,AL\nZH",
571:
572: OPLOG|OP68881, FORCC,
573: SCREG|STCREG, TFLOAT|TDOUBLE,
574: SAREG|STAREG, TDOUBLE,
575: 0, RESFCC,
576: " movl UR,Z-\n\
577: movl AR,Z-\n\
578: fcmpd sp@+,AL\nZH",
579:
580: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
581:
582: /*
583: * (no 68881) compare floating operands, for flow control.
584: */
585: OPLOG|NO68881, FORCC,
586: SPEC_FLT, TFLOAT,
587: SPEC_FLT, TFLOAT,
588: 0, RESCC,
589: "ZfZI",
590:
591: OPLOG|NO68881, FORCC,
592: SPEC_FLT, TDOUBLE,
593: SPEC_DFLT, TDOUBLE,
594: NBREG, RESCC,
595: "ZfZI",
596:
597: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
598:
599: /*
600: * compare constant to field, for flow control
601: */
602: OPLOG, FORCC,
603: SPEC_FLD, TSCALAR,
604: SCON, TSCALAR,
605: NAREG, RESCC,
606: "Zc\nZI", /* let ME do it */
607:
608: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
609:
610: /*
611: * compare integral operands for boolean result
612: */
613:
614: OPLOG, INTAREG,
615: SAREG|STAREG|SBREG|STBREG, TSCALAR,
616: EA, TSCALAR,
617: NAREG, RESC1,
618: " moveq #0,A1\n cmpZL AR,AL\n sI. A1\n negb A1\n",
619:
620: OPLOG, INTAREG,
621: (EA)&~SCON, TSCALAR,
622: SCON, TSCALAR,
623: NAREG, RESC1,
624: " moveq #0,A1\n cmpZL AR,AL\n sI. A1\n negb A1\n",
625:
626: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
627:
628: /*
629: * (68881) compare floating operands for boolean result
630: */
631:
632: OPLOG|OP68881, INTAREG,
633: SFLOAT_SRCE, TFLOAT|TDOUBLE,
634: SFZERO, TFLOAT|TDOUBLE,
635: NAREG, RESC1,
636: " moveq #0,A1\n\
637: ftestZG AL\n\
638: fsI. A1\n\
639: negb A1\n",
640:
641: OPLOG|OP68881, INTAREG,
642: SCREG|STCREG, TFLOAT|TDOUBLE,
643: SFLOAT_SRCE, TFLOAT|TDOUBLE,
644: NAREG, RESC1,
645: " moveq #0,A1\n\
646: fcmpZF ZK,AL\n\
647: fsI. A1\n\
648: negb A1\n",
649:
650: OPLOG|OP68881, INTAREG,
651: SCREG|STCREG, TFLOAT|TDOUBLE,
652: SCREG|STCREG, TFLOAT|TDOUBLE,
653: NAREG, RESC1,
654: " moveq #0,A1\n\
655: fcmpx AR,AL\n\
656: fsI. A1\n\
657: negb A1\n",
658:
659: OPLOG|OP68881, INTAREG,
660: SCREG|STCREG, TFLOAT|TDOUBLE,
661: SAREG|STAREG, TDOUBLE,
662: NAREG, RESC1,
663: " moveq #0,A1\n\
664: movl UR,sp@-\n\
665: movl AR,sp@-\n\
666: fcmpd sp@+,AL\n\
667: fsI. A1\n\
668: negb A1\n",
669:
670: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
671:
672: /*
673: * (no 68881) compare floating operands for boolean result
674: */
675: OPLOG|NO68881, INTAREG,
676: SPEC_FLT, TFLOAT,
677: SPEC_FLT, TFLOAT,
678: NAREG, RESC1,
679: " moveq #0,A1\nZf sfI. A1\n negb A1\n",
680:
681: OPLOG|NO68881, INTAREG,
682: SPEC_FLT, TDOUBLE,
683: SPEC_DFLT, TDOUBLE,
684: NBREG+NAREG, RESC1,
685: " moveq #0,A1\nZf sfI. A1\n negb A1\n",
686:
687: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
688:
689: /*
690: * compare constant to field, for boolean result
691: */
692: OPLOG, INTAREG,
693: SPEC_FLD, TSCALAR,
694: SCON, TSCALAR,
695: 2*NAREG, RESC2,
696: " moveq #0,A2\nZc\n sI. A2\n negb A2\n",
697:
698: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
699:
700: /*
701: * convert floating point condition codes into boolean result
702: */
703: FCCODES|OP68881, INTAREG|INAREG,
704: SANY, TANY,
705: SANY, TANY,
706: NAREG, RESC1,
707: " moveq #1,A1\nZN",
708:
709: /*
710: * convert integer condition codes into boolean result
711: */
712: CCODES, INTAREG|INAREG,
713: SANY, TANY,
714: SANY, TANY,
715: NAREG, RESC1,
716: " moveq #1,A1\nZN",
717:
718: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
719:
720: /*
721: * negate scalar in temp register
722: */
723: UNARY MINUS, INAREG|INTAREG,
724: STAREG, TSCALAR,
725: SANY, TANY,
726: 0, RLEFT,
727: " negZB AL\n",
728:
729: /*
730: * negate floating operand in temp data register.
731: */
732: UNARY MINUS, INAREG|INTAREG,
733: STAREG, TFLOAT|TDOUBLE,
734: SANY, TANY,
735: 0, RLEFT,
736: "Zf",
737:
738: UNARY MINUS, INAREG|INTAREG,
739: EA&~STAREG, TFLOAT,
740: SANY, TANY,
741: NAREG|NASL, RESC1,
742: " movl AL,A1\n bchg #31,A1\n",
743:
744: UNARY MINUS, INAREG|INTAREG,
745: EA&~STAREG, TDOUBLE,
746: SANY, TANY,
747: NAREG|NASL, RESC1,
748: " movl AL,A1\n movl UL,U1\n bchg #31,A1\n",
749:
750: /*
751: * negate floating operand in floating point register
752: */
753: (UNARY MINUS)|OP68881, INCREG|INTCREG,
754: SFLOAT_SRCE, TFLOAT|TDOUBLE,
755: SANY, TANY,
756: NCREG|NCSL, RESC1,
757: " fnegZF ZK,A1\n",
758:
759: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
760:
761: /*
762: * absolute value in temp data register
763: */
764: FABS, INAREG|INTAREG,
765: STAREG, TFLOAT|TDOUBLE,
766: SANY, TANY,
767: 0, RLEFT,
768: " bclr #31,AL\n",
769:
770: FABS, INAREG|INTAREG,
771: EA&~STAREG, TFLOAT,
772: SANY, TANY,
773: NAREG|NASL, RESC1,
774: " movl AL,A1\n bclr #31,A1\n",
775:
776: FABS, INAREG|INTAREG,
777: EA&~STAREG, TDOUBLE,
778: SANY, TANY,
779: NAREG|NASL, RESC1,
780: " movl AL,A1\n movl UL,U1\n bclr #31,A1\n",
781:
782: /*
783: * floating=>integer conversion -- at present, these are
784: * only generated by FORTRAN and Pascal -- but see also
785: * SCONV below.
786: */
787: FNINT|OP68881, INAREG|INTAREG,
788: STCREG, TFLOAT|TDOUBLE,
789: SANY, TSCALAR,
790: NAREG, RESC1,
791: "Zf",
792:
793: FNINT|NO68881, INAREG|INTAREG,
794: STAREG, TFLOAT|TDOUBLE,
795: SANY, TSCALAR,
796: 0, RLEFT,
797: "Zf",
798:
799: /*
800: * floating point intrinsics (sin, cos, exp, log, ...)
801: */
802: OPINTR|OP68881, INCREG|INTCREG,
803: SFLOAT_SRCE, TFLOAT|TDOUBLE,
804: SANY, TANY,
805: NCREG|NCSL, RESC1,
806: "Zf",
807:
808: OPINTR|OP68881, INCREG|INTCREG,
809: SAREG|STAREG, TDOUBLE,
810: SANY, TANY,
811: NCREG|NCSL, RESC1,
812: "Zf",
813:
814: OPINTR|NO68881, INAREG|INTAREG,
815: STAREG, TFLOAT|TDOUBLE,
816: SANY, TANY,
817: 0, RLEFT,
818: "Zf",
819:
820: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
821:
822: /*
823: * one's complement of temp d-register
824: */
825: COMPL, INTAREG|FORCC,
826: STAREG, TSCALAR,
827: SANY, TANY,
828: 0, RLEFT|RESCC,
829: " notZB AL\n",
830:
831: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
832:
833: /*
834: * increment/decrement operators
835: */
836:
837: INCR, INTAREG|INAREG|FOREFF,
838: EAA, TSCALAR,
839: S8CON, TSCALAR,
840: NAREG, RESC1,
841: "F movZB AL,A1\n addqZB AR,AL\nZv",
842:
843: DECR, INTAREG|INAREG|FOREFF,
844: EAA, TSCALAR,
845: S8CON, TSCALAR,
846: NAREG, RESC1,
847: "F movZB AL,A1\n subqZB AR,AL\nZv",
848:
849: INCR, INTAREG|INAREG|FOREFF,
850: EAA, TSCALAR,
851: SCON, TSCALAR,
852: NAREG, RESC1,
853: "F movZB AL,A1\n addZB AR,AL\nZv",
854:
855: DECR, INTAREG|INAREG|FOREFF,
856: EAA, TSCALAR,
857: SCON, TSCALAR,
858: NAREG, RESC1,
859: "F movZB AL,A1\n subZB AR,AL\nZv",
860:
861: INCR, INTBREG|INBREG|FOREFF,
862: EB, TSCALAR,
863: S8CON, TSCALAR,
864: NBREG, RESC1,
865: "F movZB AL,A1\n addqZB AR,AL\n",
866:
867: DECR, INTBREG|INBREG|FOREFF,
868: EB, TSCALAR,
869: S8CON, TSCALAR,
870: NBREG, RESC1,
871: "F movZB AL,A1\n subqZB AR,AL\n",
872:
873: INCR, INTBREG|INBREG|FOREFF,
874: EB, TSCALAR,
875: SCON, TSCALAR,
876: NBREG, RESC1,
877: "F movZB AL,A1\n addZB AR,AL\n",
878:
879: DECR, INTBREG|INBREG|FOREFF,
880: EB, TSCALAR,
881: SCON, TSCALAR,
882: NBREG, RESC1,
883: "F movZB AL,A1\n subZB AR,AL\n",
884:
885: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
886:
887: /*
888: * address expressions ( base + offset [+ index] )
889: */
890: PLUS, INBREG|INTBREG,
891: SBREG, TPOINT,
892: SSCON, TANY,
893: NBREG|NBSL, RESC1,
894: " lea AL@(ZO),A1\n",
895:
896: PLUS, INBREG|INTBREG,
897: SBREG, TPOINT,
898: SAREG|SBREG, TWORD|TSHORT,
899: NBREG|NBSL, RESC1,
900: "Zl",
901:
902: PLUS, INBREG|INTBREG,
903: SBASE, TPOINT,
904: SXREG, TWORD|TSHORT,
905: NBREG|NBSL, RESC1,
906: " lea ZX,A1\n",
907:
908: PLUS, FORARG,
909: SBREG, TPOINT,
910: SSCON, TANY,
911: 0, RNULL,
912: " pea AL@(ZO)\nZP",
913:
914: PLUS, FORARG,
915: SBREG, TPOINT,
916: SAREG, TWORD|TSHORT,
917: 0, RNULL,
918: " pea AL@(0,AR:ZR)\nZP",
919:
920: PLUS, FORARG,
921: SBASE, TPOINT,
922: SXREG, TWORD|TSHORT,
923: 0, RNULL,
924: " pea ZX\nZP",
925:
926: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
927:
928: MINUS, INBREG|INTBREG,
929: SBREG, TPOINT,
930: SSCON, TANY,
931: NBREG|NBSL, RESC1,
932: " lea AL@(ZM),A1\n",
933:
934: MINUS, FORARG,
935: SBREG, TPOINT,
936: SSCON, TANY,
937: 0, RNULL,
938: " pea AL@(ZM)\nZP",
939:
940: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
941:
942: ASG PLUS, INAREG|FORCC,
943: EAA, TSCALAR,
944: S8CON, TSCALAR,
945: 0, RLEFT|RESCC,
946: " addqZB AR,AL\nZv",
947:
948: ASG PLUS, INBREG,
949: EB, TSCALAR,
950: S8CON, TSCALAR,
951: 0, RLEFT|RESCC,
952: " addqw AR,AL\n",
953:
954: ASG PLUS, INAREG|FORCC,
955: SAREG|STAREG, TSCALAR,
956: EAA, TSCALAR,
957: 0, RLEFT|RESCC,
958: " addZB AR,AL\nZv",
959:
960: ASG PLUS, INAREG|FORCC,
961: SAREG|STAREG, TWORD|TSHORT,
962: EB, TWORD|TSHORT,
963: 0, RLEFT|RESCC,
964: " addZB AR,AL\nZv",
965:
966: ASG PLUS, INBREG,
967: SBREG|STBREG, TSCALAR,
968: SICON, TANY,
969: 0, RLEFT,
970: " lea AL@(CR),AL\n",
971:
972: ASG PLUS, INBREG,
973: SBREG|STBREG, TSCALAR,
974: EA, TWORD|TSHORT,
975: 0, RLEFT,
976: " addZR AR,AL\n",
977:
978: ASG PLUS, INAREG|FORCC,
979: EAA, TSCALAR,
980: SAREG|STAREG, TSCALAR,
981: 0, RLEFT|RESCC,
982: " addZB AR,AL\nZv",
983:
984: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
985:
986: ASG MINUS, INAREG|FORCC,
987: EAA, TSCALAR,
988: S8CON, TSCALAR,
989: 0, RLEFT|RESCC,
990: " subqZB AR,AL\nZv",
991:
992: ASG MINUS, INBREG,
993: EB, TSCALAR,
994: S8CON, TSCALAR,
995: 0, RLEFT|RESCC,
996: " subqw AR,AL\n",
997:
998: ASG MINUS, INBREG,
999: SBREG|STBREG, TSCALAR,
1000: SICON, TANY,
1001: 0, RLEFT,
1002: " lea AL@(ZM),AL\n",
1003:
1004: ASG MINUS, INAREG|FORCC,
1005: SAREG|STAREG, TSCALAR,
1006: EAA, TSCALAR,
1007: 0, RLEFT|RESCC,
1008: " subZB AR,AL\nZv",
1009:
1010: ASG MINUS, INAREG|FORCC,
1011: SAREG|STAREG, TWORD|TSHORT,
1012: EB, TWORD|TSHORT,
1013: 0, RLEFT|RESCC,
1014: " subZB AR,AL\nZv",
1015:
1016: ASG MINUS, INBREG,
1017: SBREG|STBREG, TSCALAR,
1018: EA, TWORD|TSHORT,
1019: 0, RLEFT,
1020: " subZR AR,AL\n",
1021:
1022: ASG MINUS, INAREG|FORCC,
1023: EAA, TSCALAR,
1024: SAREG|STAREG, TSCALAR,
1025: 0, RLEFT|RESCC,
1026: " subZB AR,AL\nZv",
1027:
1028: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1029:
1030: ASG ER, INAREG|FORCC,
1031: EAA, TSCALAR,
1032: SCON, TSCALAR,
1033: 0, RLEFT|RESCC,
1034: " eorZB AR,AL\n",
1035:
1036: ASG ER, INAREG|FORCC,
1037: EAA, TSCALAR,
1038: SAREG|STAREG, TSCALAR,
1039: 0, RLEFT|RESCC,
1040: " eorZB AR,AL\nZv",
1041:
1042: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1043:
1044: ASG OPSIMP, INAREG|FORCC,
1045: SAREG|STAREG, TSCALAR,
1046: EAA, TSCALAR,
1047: 0, RLEFT|RESCC,
1048: " OIZB AR,AL\nZv",
1049:
1050: ASG OPSIMP, INAREG|FORCC,
1051: EAA, TSCALAR,
1052: SCON, TSCALAR,
1053: 0, RLEFT|RESCC,
1054: " OIZB AR,AL\nZv",
1055:
1056: ASG OPSIMP, INAREG|FORCC,
1057: EAA, TSCALAR,
1058: SAREG|STAREG, TSCALAR,
1059: 0, RLEFT|RESCC,
1060: " OIZB AR,AL\nZv",
1061:
1062: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1063:
1064: /*
1065: * floating ASG binary operators
1066: */
1067:
1068: (ASG OPFLOAT)|OP68881, INCREG|INTCREG|FOREFF,
1069: SCREG|STCREG, TFLOAT|TDOUBLE,
1070: SFLOAT_SRCE, TFLOAT|TDOUBLE,
1071: 0, RLEFT,
1072: " OFZF ZK,AL\n",
1073:
1074: (ASG OPFLOAT)|OP68881, INCREG|INTCREG|FOREFF,
1075: SCREG|STCREG, TFLOAT|TDOUBLE,
1076: SCREG|STCREG, TFLOAT|TDOUBLE,
1077: 0, RLEFT,
1078: " OFx AR,AL\n",
1079:
1080: (ASG OPFLOAT)|NO68881, INAREG|INTAREG|FOREFF,
1081: SPEC_FLT, TFLOAT,
1082: SPEC_FLT, TFLOAT,
1083: 0, RLEFT,
1084: "Zf",
1085:
1086: (ASG OPFLOAT)|NO68881, INAREG|INTAREG|FOREFF,
1087: SPEC_FLT, TDOUBLE,
1088: SPEC_DFLT, TDOUBLE,
1089: NBREG, RLEFT,
1090: "Zf",
1091:
1092: (ASG PLUS)|NO68881, INAREG|INTAREG|FOREFF,
1093: SPEC_FLT, TFLOAT,
1094: SPEC_PVT, TFLOAT,
1095: 0, RLEFT,
1096: "Zf",
1097:
1098: (ASG PLUS)|NO68881, INAREG|INTAREG|FOREFF,
1099: SPEC_FLT, TDOUBLE,
1100: SPEC_PVT, TDOUBLE,
1101: NBREG, RLEFT,
1102: "Zf",
1103:
1104: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1105:
1106: /*
1107: * floating binary operators
1108: */
1109:
1110: OPFLOAT|NO68881, INAREG|INTAREG,
1111: SPEC_FLT, TFLOAT,
1112: SPEC_FLT, TFLOAT,
1113: NAREG|NASL|NASR, RESC1,
1114: "Zf",
1115:
1116: OPFLOAT|NO68881, INAREG|INTAREG,
1117: SPEC_FLT, TDOUBLE,
1118: SPEC_DFLT, TDOUBLE,
1119: NAREG|NBREG|NASL|NASR, RESC1,
1120: "Zf",
1121:
1122: PLUS|NO68881, INAREG|INTAREG,
1123: SPEC_FLT, TFLOAT,
1124: SPEC_PVT, TFLOAT,
1125: NAREG|NASL|NASR, RESC1,
1126: "Zf",
1127:
1128: PLUS|NO68881, INAREG|INTAREG,
1129: SPEC_FLT, TDOUBLE,
1130: SPEC_PVT, TDOUBLE,
1131: NAREG|NBREG|NASL|NASR, RESC1,
1132: "Zf",
1133:
1134: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1135:
1136: ASG MUL, INAREG|INTAREG|FOREFF,
1137: SAREG|STAREG, TCHAR,
1138: SCON, TANY,
1139: NAREG, RLEFT,
1140: " extw AL\nZm",
1141:
1142: ASG MUL, INAREG|INTAREG|FOREFF,
1143: SAREG|STAREG, TUCHAR,
1144: SCON, TANY,
1145: NAREG, RLEFT,
1146: " andw #255,AL\nZm",
1147:
1148: ASG MUL, INAREG|INTAREG|FOREFF,
1149: SAREG|STAREG, TWORD|TSHORT|TUSHORT,
1150: SCON, TANY,
1151: NAREG, RLEFT,
1152: "Zm",
1153:
1154: ASG MUL, INAREG|FORCC|FOREFF,
1155: SAREG|STAREG, TSHORT,
1156: EAA, TSHORT,
1157: 0, RLEFT|RESCC,
1158: " muls AR,AL\n",
1159:
1160: ASG MUL, INAREG|FORCC|FOREFF,
1161: SAREG|STAREG, TUSHORT,
1162: EAA, TUSHORT|TSHORT,
1163: 0, RLEFT|RESCC,
1164: " mulu AR,AL\n",
1165:
1166: ASG MUL, INAREG|FORCC|FOREFF,
1167: SAREG|STAREG, TSHORT,
1168: EAA, TUSHORT,
1169: 0, RLEFT|RESCC,
1170: " mulu AR,AL\n",
1171:
1172: ASG MUL, INAREG|INTAREG|FOREFF,
1173: SAREG|STAREG, TCHAR,
1174: EAA, TCHAR,
1175: NAREG, RLEFT,
1176: "\textw AL\n\tmovb AR,A1\n\textw A1\n\tmuls A1,AL\n",
1177:
1178: ASG MUL, INAREG|INTAREG|FOREFF,
1179: SAREG|STAREG, TUCHAR,
1180: EAA, TUCHAR|TCHAR,
1181: NAREG, RLEFT,
1182: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tmuls A1,AL\n",
1183:
1184: (ASG MUL)|NO68020, INTAREG|FOREFF,
1185: STAREG, TPOINT|TLONG|TINT,
1186: STAREG, TPOINT|TLONG|TINT,
1187: 0, RLEFT,
1188: " jsr lmult\nZv",
1189:
1190: (ASG MUL)|NO68020, INTAREG|FOREFF,
1191: STAREG, TWORD,
1192: STAREG, TWORD,
1193: 0, RLEFT,
1194: " jsr ulmult\nZv",
1195:
1196: (ASG MUL)|OP68020, INAREG|INTAREG|FOREFF,
1197: SAREG|STAREG, TPOINT|TLONG|TINT,
1198: EAA, TPOINT|TLONG|TINT,
1199: 0, RLEFT,
1200: " mulsl AR,AL\nZv",
1201:
1202: (ASG MUL)|OP68020, INAREG|INTAREG|FOREFF,
1203: SAREG|STAREG, TWORD,
1204: EAA, TWORD,
1205: 0, RLEFT,
1206: " mulul AR,AL\nZv",
1207:
1208: (ASG MUL)|NO68881, INAREG|FOREFF,
1209: STAREG, TFLOAT,
1210: STAREG, TFLOAT,
1211: 0, RLEFT,
1212: "Zf",
1213:
1214: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1215:
1216: ASG DIV, INAREG|INTAREG|FOREFF,
1217: SAREG|STAREG, ANYSIGNED,
1218: SCON, TANY,
1219: 0, RLEFT|RNULL,
1220: "Zd",
1221:
1222: ASG DIV, INAREG|INTAREG|FORCC|FOREFF,
1223: SAREG|STAREG, TSHORT,
1224: EAA, TSHORT,
1225: 0, RLEFT|RESCC,
1226: " extl AL\n divs AR,AL\n",
1227:
1228: ASG DIV, INAREG|INTAREG|FORCC|FOREFF,
1229: SAREG|STAREG, TUSHORT,
1230: EAA, TUSHORT|TSHORT,
1231: 0, RLEFT|RESCC,
1232: " andl #0xffff,AL\n divu AR,AL\n",
1233:
1234: ASG DIV, INAREG|INTAREG|FORCC|FOREFF,
1235: SAREG|STAREG, TSHORT,
1236: EAA, TUSHORT,
1237: 0, RLEFT|RESCC,
1238: " andl #0xffff,AL\n divu AR,AL\n",
1239:
1240: (ASG DIV)|NO68020, INTAREG|INAREG|FOREFF,
1241: SAREG|STAREG, TCHAR,
1242: EAA, TCHAR,
1243: NAREG, RLEFT,
1244: " extw AL\n\
1245: extl AL\n\
1246: movb AR,A1\n\
1247: extw A1\n\
1248: divs A1,AL\n",
1249:
1250: (ASG DIV)|OP68020, INTAREG|INAREG|FOREFF,
1251: SAREG|STAREG, TCHAR,
1252: EAA, TCHAR,
1253: NAREG, RLEFT,
1254: " extbl AL\n\
1255: movb AR,A1\n\
1256: extw A1\n\
1257: divs A1,AL\n",
1258:
1259: ASG DIV, INTAREG|INAREG|FOREFF,
1260: SAREG|STAREG, TUCHAR,
1261: EAA, TUCHAR|TCHAR,
1262: NAREG, RLEFT,
1263: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tdivs A1,AL\n",
1264:
1265: (ASG DIV)|NO68020, INTAREG|FOREFF,
1266: STAREG, ANYSIGNED,
1267: STAREG, ANYSIGNED,
1268: 0, RLEFT,
1269: " jsr ldivt\n",
1270:
1271: (ASG DIV)|NO68020, INTAREG|FOREFF,
1272: STAREG, TWORD,
1273: STAREG, TWORD,
1274: 0, RLEFT,
1275: " jsr uldivt\n",
1276:
1277: (ASG DIV)|OP68020, INAREG|INTAREG|FOREFF,
1278: SAREG|STAREG, ANYSIGNED,
1279: EAA, ANYSIGNED,
1280: 0, RLEFT,
1281: " divsl AR,AL\n",
1282:
1283: (ASG DIV)|OP68020, INAREG|INTAREG|FOREFF,
1284: SAREG|STAREG, TWORD,
1285: EAA, TWORD,
1286: 0, RLEFT,
1287: " divul AR,AL\n",
1288:
1289: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1290:
1291: /*
1292: * <areg> %= <constant, not a power of 2>.
1293: * This case has two templates before the "Zr" case, so that we can
1294: * generate a div.ll instruction with the remainder returned in RESC1
1295: * instead of RLEFT, thus saving a register-register move. whoop-te-doo
1296: */
1297:
1298: (ASG MOD)|OP68020, INAREG|INTAREG,
1299: STAREG, TINT|TLONG,
1300: SNONPOW2, TANY,
1301: NAREG, RESC1,
1302: " divsll AR,A1:AL\n",
1303:
1304: (ASG MOD)|OP68020, INAREG|INTAREG,
1305: STAREG, TUNSIGNED|TULONG,
1306: SNONPOW2, TANY,
1307: NAREG, RESC1,
1308: " divull AR,A1:AL\n",
1309:
1310: ASG MOD, INAREG|INTAREG|FOREFF,
1311: SAREG|STAREG, ANYFIXED,
1312: SCON, TANY,
1313: NAREG, RLEFT|RNULL,
1314: "Zr",
1315:
1316: ASG MOD, INTAREG|INAREG|FOREFF,
1317: SAREG|STAREG, TSHORT,
1318: EAA, TSHORT,
1319: 0, RLEFT,
1320: " extl AL\n divs AR,AL\n swap AL\n",
1321:
1322: ASG MOD, INTAREG|INAREG|FOREFF,
1323: SAREG|STAREG, TUSHORT,
1324: EAA, TUSHORT|TSHORT,
1325: 0, RLEFT,
1326: " andl #65535,AL\n divu AR,AL\n swap AL\n",
1327:
1328: ASG MOD, INTAREG|INAREG|FOREFF,
1329: SAREG|STAREG, TSHORT,
1330: EAA, TUSHORT,
1331: 0, RLEFT,
1332: " andl #65535,AL\n divu AR,AL\n swap AL\n",
1333:
1334: ASG MOD, INTAREG|INAREG|FOREFF,
1335: SAREG|STAREG, TCHAR,
1336: EAA, TCHAR,
1337: NAREG, RLEFT,
1338: " extw AL\n\
1339: movb AR,A1\n\
1340: extw A1\n\
1341: divs A1,AL\n\
1342: swap AL\n",
1343:
1344: ASG MOD, INTAREG|INAREG|FOREFF,
1345: SAREG|STAREG, TUCHAR,
1346: EAA, TUCHAR|TCHAR,
1347: NAREG, RLEFT,
1348: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tdivs A1,AL\n swap AL\n",
1349:
1350: (ASG MOD)|NO68020, INTAREG|FOREFF,
1351: STAREG, ANYSIGNED,
1352: STAREG, ANYSIGNED,
1353: 0, RLEFT,
1354: " jsr lmodt\n",
1355:
1356: (ASG MOD)|NO68020, INTAREG|FOREFF,
1357: STAREG, TWORD,
1358: STAREG, TWORD,
1359: 0, RLEFT,
1360: " jsr ulmodt\n",
1361:
1362: (ASG MOD)|OP68020, INAREG|INTAREG,
1363: STAREG, ANYSIGNED,
1364: EAA, ANYSIGNED,
1365: NAREG|NASR, RESC1,
1366: " divsll AR,A1:AL\n",
1367:
1368: (ASG MOD)|OP68020, INAREG|INTAREG|FOREFF,
1369: SAREG|STAREG, ANYSIGNED,
1370: EAA, ANYSIGNED,
1371: NAREG|NASR, RLEFT,
1372: " divsll AR,A1:AL\n movl A1,AL\n",
1373:
1374: (ASG MOD)|OP68020, INAREG|INTAREG,
1375: STAREG, TWORD,
1376: EAA, TWORD,
1377: NAREG|NASR, RESC1,
1378: " divull AR,A1:AL\n",
1379:
1380: (ASG MOD)|OP68020, INAREG|INTAREG|FOREFF,
1381: SAREG|STAREG, TWORD,
1382: EAA, TWORD,
1383: NAREG|NASR, RLEFT,
1384: " divull AR,A1:AL\n movl A1,AL\n",
1385:
1386: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1387:
1388: ASG OPSHFT, FOREFF,
1389: SNAME|SOREG|STARREG, TSHORT,
1390: SONE, TSCALAR,
1391: 0, RLEFT,
1392: " aOIw AL\n",
1393:
1394: ASG OPSHFT, INAREG|FOREFF,
1395: SAREG, TINT|TSHORT|TCHAR,
1396: S8CON, TSCALAR,
1397: 0, RLEFT,
1398: " aOIZB AR,AL\n",
1399:
1400: ASG OPSHFT, INAREG|FOREFF,
1401: SAREG, TINT|TSHORT|TCHAR,
1402: SAREG, TSCALAR,
1403: 0, RLEFT,
1404: " aOIZB AR,AL\n",
1405:
1406: /* ASG OPSHFT, INAREG|FOREFF, */
1407: ASG OPSHFT, FOREFF,
1408: SNAME|SOREG|STARREG, TUSHORT,
1409: SONE, TSCALAR,
1410: 0, RLEFT,
1411: " lOIw AL\n",
1412:
1413: ASG OPSHFT, INAREG|FOREFF,
1414: SAREG, TUNSIGNED|TUSHORT|TUCHAR,
1415: S8CON, TSCALAR,
1416: 0, RLEFT,
1417: " lOIZB AR,AL\n",
1418:
1419: ASG OPSHFT, INAREG|FOREFF,
1420: SAREG, TUNSIGNED|TUSHORT|TUCHAR,
1421: SAREG, TSCALAR,
1422: 0, RLEFT,
1423: " lOIZB AR,AL\n",
1424:
1425: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1426:
1427: UNARY CALL, INTAREG,
1428: SBREG|SNAME|SOREG|SCON|SAREG, TANY,
1429: SANY, TANY,
1430: NAREG|NASL, RESC1, /* should be register 0 */
1431: "ZC\n",
1432:
1433: CHK, INAREG,
1434: SAREG, TSHORT|TWORD,
1435: SZEROLB, TANY,
1436: 0, RLEFT,
1437: "ZV",
1438:
1439: CHK, INTAREG,
1440: STAREG, TSCALAR,
1441: SANY, TANY,
1442: 0, RLEFT,
1443: "ZV",
1444:
1445: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1446:
1447: /*
1448: * conversions, from and to integer types
1449: */
1450: SCONV, INTAREG,
1451: STAREG, TINT|TUNSIGNED|TPOINT,
1452: SANY, TINT|TUNSIGNED|TPOINT,
1453: 0, RLEFT,
1454: "",
1455:
1456: SCONV, INAREG|INTAREG,
1457: STAREG, TINT|TUNSIGNED|TPOINT,
1458: SANY, TSHORT|TCHAR|TUSHORT|TUCHAR,
1459: 0, RLEFT,
1460: "",
1461:
1462: SCONV, INAREG|INTAREG,
1463: SAREG, TINT|TUNSIGNED|TPOINT,
1464: SANY, TSHORT|TCHAR|TUSHORT|TUCHAR,
1465: NAREG|NASL, RESC1,
1466: " movZB AL,A1\n",
1467:
1468: SCONV, INAREG|INTAREG,
1469: STAREG, TCHAR,
1470: SANY, TSHORT|TUSHORT,
1471: 0, RLEFT,
1472: " extw AL\n",
1473:
1474: (SCONV)|NO68020, INAREG|INTAREG,
1475: STAREG, TCHAR,
1476: SANY, TINT|TUNSIGNED|TPOINT,
1477: 0, RLEFT,
1478: " extw AL\n extl AL\n",
1479:
1480: (SCONV)|OP68020, INAREG|INTAREG,
1481: STAREG, TCHAR,
1482: SANY, TINT|TUNSIGNED|TPOINT,
1483: 0, RLEFT,
1484: " extbl AL\n",
1485:
1486: SCONV, INAREG|INTAREG,
1487: STAREG, TSHORT,
1488: SANY, TINT|TUNSIGNED|TPOINT,
1489: 0, RLEFT,
1490: " extl AL\n",
1491:
1492: SCONV, INAREG|INTAREG,
1493: ES, TUCHAR,
1494: SANY, TSCALAR,
1495: NAREG|NASL, RESC1,
1496: "Zt",
1497:
1498: SCONV, INAREG|INTAREG,
1499: ES, TUSHORT,
1500: SANY, TWORD,
1501: NAREG|NASL, RESC1,
1502: "Zt",
1503:
1504: /* icky conversions into B registers -- for immediate use as a pointer */
1505: SCONV, INBREG|INTBREG,
1506: STAREG, TSHORT,
1507: SANY, TWORD,
1508: NBREG, RESC1,
1509: " movw AL,A1\n",
1510:
1511: SCONV, INBREG|INTBREG,
1512: STAREG, TUSHORT,
1513: SANY, TWORD,
1514: NBREG, RESC1,
1515: " andl #0xffff,AL\n movl AL,A1\n",
1516:
1517: SCONV, INBREG|INTBREG,
1518: STAREG, TCHAR,
1519: SANY, TWORD,
1520: NBREG, RESC1,
1521: " extw AL\n movw AL,A1\n",
1522:
1523: SCONV, INBREG|INTBREG,
1524: STAREG, TUCHAR,
1525: SANY, TWORD,
1526: NBREG, RESC1,
1527: " andl #0xff,AL\n movl AL,A1\n",
1528: /* end icky */
1529:
1530: SCONV, INAREG|INTAREG,
1531: SNAME|SOREG|SAREG, TINT|TUNSIGNED|TPOINT|TSHORT|TUSHORT,
1532: SANY, TSHORT|TUSHORT|TCHAR|TUCHAR,
1533: 0, RLEFT,
1534: "ZT",
1535:
1536: SCONV, INAREG|INTAREG,
1537: SBREG, TINT|TUNSIGNED|TPOINT|TSHORT|TUSHORT,
1538: SANY, TSHORT|TUSHORT,
1539: 0, RLEFT,
1540: "ZT",
1541:
1542: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1543:
1544: /*
1545: * floating point conversions
1546: */
1547:
1548: SCONV|OP68881, INCREG|INTCREG,
1549: EAA, ANYSIGNED|TFLOAT,
1550: SANY, TFLOAT|TDOUBLE,
1551: NCREG, RESC1,
1552: " fmoveZG AL,A1\n",
1553:
1554: SCONV|OP68881, INCREG|INTCREG,
1555: SCREG|STCREG, TFLOAT|TDOUBLE,
1556: SANY, TDOUBLE,
1557: 0, RLEFT,
1558: "",
1559:
1560: /* conversions into the d-registers, for function results etc */
1561:
1562: SCONV|OP68881, INTAREG|INTAREG,
1563: SCREG|STCREG, TFLOAT|TDOUBLE,
1564: SANY, TFLOAT,
1565: NAREG, RESC1,
1566: " fmoveZ. AL,A1\n",
1567:
1568: SCONV|OP68881, INTAREG|INTAREG,
1569: SCREG|STCREG, TFLOAT,
1570: SANY, TDOUBLE,
1571: NAREG, RESC1,
1572: " fmoveZ. AL,sp@-\n\
1573: movl sp@+,A1\n\
1574: movl sp@+,U1\n",
1575:
1576: /*
1577: * conversion from float|double to integer
1578: */
1579: SCONV|OP68881, INTAREG,
1580: STCREG, TDOUBLE|TFLOAT,
1581: SANY, TSCALAR,
1582: NAREG, RESC1,
1583: " fintrzx AL,AL\n\
1584: fmovel AL,A1\n",
1585:
1586: SCONV|NO68881, INAREG|INTAREG,
1587: STAREG, TDOUBLE,
1588: SANY, TFLOAT,
1589: NAREG|NASL, RESC1,
1590: "Zg",
1591:
1592: SCONV|NO68881, INTAREG|INTAREG,
1593: STAREG,TFLOAT,
1594: SANY, TDOUBLE,
1595: NAREG|NASL, RESC1,
1596: "Zg",
1597:
1598: SCONV|NO68881, INTAREG,
1599: STAREG, TDOUBLE|TFLOAT,
1600: SANY, TSCALAR,
1601: NAREG|NASL, RESC1,
1602: "Zg",
1603:
1604: SCONV|NO68881, INTAREG,
1605: STAREG, TSCALAR,
1606: SANY, TDOUBLE|TFLOAT,
1607: NAREG|NASL, RESC1,
1608: "Zg",
1609:
1610: SCONV, INAREG,
1611: STAREG|SAREG, TDOUBLE,
1612: SANY, TDOUBLE,
1613: 0, RLEFT,
1614: "",
1615:
1616: SCONV, INAREG,
1617: STAREG|SAREG, TFLOAT,
1618: SANY, TFLOAT,
1619: 0, RLEFT,
1620: "",
1621:
1622: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1623:
1624: /*
1625: * structure assignments
1626: */
1627:
1628: STASG, FOREFF,
1629: STBREG, TANY,
1630: STBREG, TANY,
1631: NAREG, RNULL,
1632: "ZS",
1633:
1634: STASG, INBREG|INTBREG|FOREFF,
1635: SNAME|SOREG|SBREG|STBREG, TANY,
1636: STBREG, TANY,
1637: NAREG|NBREG|NBSL, RRIGHT,
1638: "ZS",
1639:
1640: /* never needs a temp register on the left */
1641: STASG, INBREG|INTBREG|FOREFF,
1642: STBREG, TANY,
1643: SBREG|STBREG, TANY,
1644: NAREG|NBREG|NBSR, RRIGHT,
1645: "ZS",
1646:
1647: /* last resort -- uses more registers */
1648: STASG, INBREG|INTBREG|FOREFF,
1649: SNAME|SOREG|SBREG|STBREG, TANY,
1650: SBREG|STBREG, TANY,
1651: NAREG|2*NBREG|NBSR, RRIGHT,
1652: "ZS",
1653:
1654: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1655:
1656: /*
1657: * structure arguments
1658: */
1659:
1660: STARG, FORARG,
1661: STBREG, TPOINT,
1662: SANY, TANY,
1663: NAREG|NBREG, RNULL,
1664: "ZS",
1665:
1666: STARG, FORARG,
1667: SNAME|SOREG, TSTRUCT,
1668: SANY, TANY,
1669: NAREG|2*NBREG, RNULL,
1670: "ZS",
1671:
1672: STARG, FORARG,
1673: SBREG|STBREG, TPOINT,
1674: SANY, TANY,
1675: NAREG|2*NBREG, RNULL,
1676: "ZS",
1677:
1678: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1679:
1680: /*
1681: * initializations - constants only
1682: */
1683: INIT, FOREFF,
1684: SCON, TANY,
1685: SANY, TINT|TLONG|TUNSIGNED|TULONG|TPOINT,
1686: 0, RNOP,
1687: " .long CL\n",
1688:
1689: INIT, FOREFF,
1690: SCON, TANY,
1691: SANY, TSHORT|TUSHORT,
1692: 0, RNOP,
1693: " .word CL\n",
1694:
1695: INIT, FOREFF,
1696: SCON, TANY,
1697: SANY, TCHAR|TUCHAR,
1698: 0, RNOP,
1699: " .byte CL\n",
1700:
1701: INIT, FOREFF,
1702: SCON, TANY,
1703: SANY, TFLOAT|TDOUBLE,
1704: 0, RNOP,
1705: " .long CL\n",
1706:
1707: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1708:
1709: /* Default actions for hard trees ... */
1710:
1711: # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1712:
1713: UNARY MUL, DF( UNARY MUL ),
1714:
1715: INCR, DF(INCR),
1716:
1717: DECR, DF(INCR),
1718:
1719: ASSIGN, DF(ASSIGN),
1720:
1721: STASG, DF(STASG),
1722:
1723: OPLEAF, DF(NAME),
1724:
1725: OPLOG, FORCC,
1726: SANY, TANY,
1727: SANY, TANY,
1728: REWRITE, BITYPE,
1729: "",
1730:
1731: /*OPLOG, DF(NOT),*/
1732: OPLOG, DF(BITYPE),
1733: COMOP, DF(COMOP),
1734: INIT, DF(INIT),
1735: FLD, DF(FLD),
1736: GOTO,DF(GOTO),
1737: SCONV, DF(SCONV),
1738: OPUNARY, DF(UNARY MINUS),
1739: ASG OPANY, DF(ASG PLUS),
1740: OPANY, DF(BITYPE),
1741: FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.