|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)table.c 1.24 (Berkeley) 7/14/88";
3: #endif
4:
5: # include "pass2.h"
6: /* special shapes (SSOREG,SZERO etc.) shouldn't be or-ed */
7: # define AWD SNAME|SOREG|SCON|STARNM|STARREG
8: /* tbl */
9: # define ANYSIGNED TPOINT|TINT|TSHORT|TCHAR
10: # define ANYUSIGNED TUNSIGNED|TUSHORT|TUCHAR
11: # define ANYFIXED ANYSIGNED|ANYUSIGNED
12: # define TWORD TINT|TUNSIGNED|TPOINT
13: /* tbl */
14:
15: struct optab table[] = {
16:
17: #ifdef REG_CHAR
18: PCONV, INAREG|INTAREG,
19: SAREG|AWD, TCHAR|TSHORT,
20: SANY, TPOINT,
21: NAREG|NASL, RESC1,
22: " cvtZLl AL,A1\n",
23:
24: PCONV, INAREG|INTAREG,
25: SAREG|AWD, TUCHAR|TUSHORT,
26: SANY, TPOINT,
27: NAREG|NASL, RESC1,
28: " movzZLl AL,A1\n",
29: #endif
30:
31: /* the following entry is to fix a problem with
32: the manner that the first pass handles the
33: type of a shift expression */
34: PCONV, INAREG|INTAREG,
35: SAREG|AWD, TINT|TUNSIGNED,
36: SANY, TPOINT,
37: NAREG|NASL, RLEFT,
38: "",
39:
40: /* take care of redundant conversions introduced by reclaim() */
41: SCONV, INAREG|INTAREG,
42: STAREG, TWORD,
43: SANY, TWORD,
44: 0, RLEFT,
45: "",
46:
47: SCONV, INAREG|INTAREG,
48: SAREG|AWD, ANYFIXED,
49: SANY, ANYFIXED,
50: NAREG|NASL, RESC1,
51: " ZU\n",
52:
53: SCONV, FORCC,
54: SAREG|AWD, ANYFIXED,
55: SANY, ANYFIXED,
56: NAREG|NASL, RESCC,
57: " ZV\n",
58:
59: SCONV, INAREG|INTAREG|FORCC,
60: SAREG|AWD, TDOUBLE,
61: SANY, TFLOAT,
62: NAREG|NASL, RESC1|RESCC,
63: " ldd AL\n cvdf\n stf TA1\n",
64:
65: SCONV, INAREG|INTAREG|FORCC,
66: SAREG|AWD, TFLOAT,
67: SANY, TDOUBLE,
68: NAREG|NASL, RESC1|RESCC,
69: " ldfd AL\n std A1\n",
70:
71: SCONV, INAREG|INTAREG|FORCC,
72: SAREG|AWD, TINT,
73: SANY, TFLOAT|TDOUBLE,
74: NAREG|NASL, RESC1|RESCC,
75: " cvlZR AL\n stZR TA1\n",
76:
77: /* the hard stuff */
78: /* XXX how about TUCHAR|TUSHORT to TFLOAT|TDOUBLE? */
79: SCONV, INAREG|INTAREG|FORCC,
80: SAREG|AWD, TUNSIGNED,
81: SANY, TFLOAT|TDOUBLE,
82: NAREG|NASL, RESC1|RESCC,
83: " ZY\n",
84:
85: SCONV, INAREG|INTAREG|FORCC,
86: SAREG|AWD, TFLOAT|TDOUBLE,
87: SANY, ANYUSIGNED,
88: NAREG|NASL, RESC1|RESCC,
89: " ZW\n",
90:
91: /* XXX need to trim significance here? */
92: SCONV, INAREG|INTAREG|FORCC,
93: SAREG|AWD, TFLOAT|TDOUBLE,
94: SANY, ANYSIGNED,
95: NAREG|NASL, RESC1|RESCC,
96: " ldZL AL\n cvZLl A1\n",
97:
98: INIT, FOREFF,
99: SCON, TANY,
100: SANY, TWORD,
101: 0, RNOP,
102: " .long CL\n",
103:
104: INIT, FOREFF,
105: SCON, TANY,
106: SANY, TSHORT|TUSHORT,
107: 0, RNOP,
108: " .word CL\n",
109:
110: INIT, FOREFF,
111: SCON, TANY,
112: SANY, TCHAR|TUCHAR,
113: 0, RNOP,
114: " .byte CL\n",
115:
116: #ifdef FORT
117: /* for the use of fortran only */
118:
119: GOTO, FOREFF,
120: SCON, TANY,
121: SANY, TANY,
122: 0, RNOP,
123: " jbr CL\n",
124: #endif
125:
126: GOTO, FOREFF,
127: AWD, TANY,
128: SANY, TANY,
129: 0, RNOP,
130: " jmp *AL\n",
131:
132: GOTO, FOREFF,
133: SAREG, TANY,
134: SANY, TANY,
135: 0, RNOP,
136: " jmp (AL)\n",
137:
138: STARG, FORARG,
139: SCON|SOREG, TANY,
140: SANY, TANY,
141: NTEMP+2*NAREG, RESC3,
142: "ZS",
143:
144: STASG, FORARG,
145: SNAME|SOREG, TANY,
146: SCON|SAREG, TANY,
147: 0, RNULL,
148: " ZT\nZS",
149:
150: STASG, FOREFF,
151: SNAME|SOREG, TANY,
152: SCON|SAREG, TANY,
153: 0, RNOP,
154: "ZS",
155:
156: STASG, INAREG,
157: SNAME|SOREG, TANY,
158: SCON, TANY,
159: NAREG, RESC1,
160: "ZS movl AR,A1\n",
161:
162: STASG, INAREG,
163: SNAME|SOREG, TANY,
164: SAREG, TANY,
165: 0, RRIGHT,
166: " pushl AR\nZS movl (sp)+,AR\n",
167:
168: OPLOG, FORCC,
169: SAREG|AWD, TWORD,
170: SAREG|AWD, TWORD,
171: 0, RESCC,
172: " cmpl AL,AR\nZP",
173:
174: /* more grot: constants in unsigned char/short comparisons sign-extend */
175: /* optim2() ensures that SCCON/SSCON iff high bit is not set */
176: OPLOG, FORCC,
177: SAREG|AWD, TUCHAR,
178: SCCON, TANY,
179: 0, RESCC,
180: " cmpZL AL,AR\nZP",
181:
182: OPLOG, FORCC,
183: AWD, TUCHAR,
184: SCON, TANY,
185: NAREG, RESCC,
186: " movzZLl AL,A1\n cmpl A1,AR\nZP",
187:
188: OPLOG, FORCC,
189: SAREG|AWD, TUSHORT,
190: SSCON, TANY,
191: 0, RESCC,
192: " cmpZL AL,AR\nZP",
193:
194: OPLOG, FORCC,
195: AWD, TUSHORT,
196: SCON, TANY,
197: NAREG, RESCC,
198: " movzZLl AL,A1\n cmpl A1,AR\nZP",
199:
200: /* optim2() handles degenerate comparisons with constants */
201: OPLOG, FORCC,
202: SAREG|AWD, TCHAR|TSHORT,
203: SCON, TANY,
204: 0, RESCC,
205: " cmpZL AL,AR\nZP",
206:
207: OPLOG, FORCC,
208: SAREG|AWD, TSHORT,
209: SAREG|AWD, TSHORT,
210: 0, RESCC,
211: " cmpw AL,AR\nZP",
212:
213: OPLOG, FORCC,
214: SAREG|AWD, TUSHORT,
215: SAREG|AWD, TUSHORT,
216: 0, RESCC,
217: " cmpw AL,AR\nZP",
218:
219: OPLOG, FORCC,
220: SAREG|AWD, TCHAR,
221: SAREG|AWD, TCHAR,
222: 0, RESCC,
223: " cmpb AL,AR\nZP",
224:
225: OPLOG, FORCC,
226: SAREG|AWD, TUCHAR,
227: SAREG|AWD, TUCHAR,
228: 0, RESCC,
229: " cmpb AL,AR\nZP",
230:
231: OPLOG, FORCC,
232: SAREG|AWD, TFLOAT,
233: SAREG|AWD, TFLOAT,
234: 0, RESCC,
235: " cmpZL2 AL,AR\nZP",
236:
237: OPLOG, FORCC,
238: SZERO, TDOUBLE,
239: SAREG|AWD, TDOUBLE,
240: 0, RESCC,
241: " cmpf2 AL,AR\nZP",
242:
243: OPLOG, FORCC,
244: SAREG|AWD, TDOUBLE,
245: SAREG|AWD, TDOUBLE,
246: 0, RESCC,
247: " cmpZL2 AL,AR\nZP",
248:
249: #ifdef FORT
250: /* some implicit conversions made explicit to help f77 out (sigh) */
251: OPLOG, FORCC,
252: SAREG|AWD, TFLOAT,
253: SAREG|AWD, TDOUBLE,
254: 0, RESCC,
255: " ldfd AL\n cmpd AR\nZP",
256:
257: /* ought to flip this comparison, save an instruction */
258: OPLOG, FORCC,
259: SAREG|AWD, TDOUBLE,
260: SAREG|AWD, TFLOAT,
261: NAREG|NEVEN|NASR, RESCC,
262: " ldfd AR\n std A1\n cmpd2 AL,A1\nZP",
263: #endif
264:
265: CCODES, INAREG|INTAREG,
266: SANY, TANY,
267: SANY, TANY,
268: NAREG, RESC1,
269: " movl $1,A1\nZN",
270:
271: UNARY CALL, INAREG|INTAREG,
272: SCON, TANY,
273: SANY, TANY,
274: NAREG|NASL, RESC1, /* should be register 0 */
275: " ZC,CL\n",
276:
277: UNARY CALL, INAREG|INTAREG,
278: SAREG, TANY,
279: SANY, TANY,
280: NAREG|NASL, RESC1, /* should be 0 */
281: " ZC,(AL)\n",
282:
283: UNARY CALL, INAREG|INTAREG,
284: SNAME, TANY,
285: SANY, TANY,
286: NAREG|NASL, RESC1, /* really reg 0 */
287: " ZC,*AL\n",
288:
289: UNARY CALL, INAREG|INTAREG,
290: SSOREG, TANY,
291: SANY, TANY,
292: NAREG|NASL, RESC1, /* really reg 0 */
293: " ZC,*AL\n",
294:
295: FORTCALL, INAREG|INTAREG,
296: SCON, TANY,
297: SAREG|AWD, TFLOAT,
298: NAREG|NASL|NASR, RESC1,
299: " ldf AR\n CLf\n stf TA1\n",
300:
301: ASG OPSHFT, INAREG|FOREFF|FORCC,
302: SAREG|AWD, TWORD,
303: SAREG|SCON, ANYFIXED,
304: 0, RLEFT|RESCC,
305: " ZH AR,AL,AL\n",
306:
307: ASG OPSHFT, INAREG|FOREFF|FORCC,
308: SAREG|AWD, TWORD,
309: AWD, TCHAR|TUCHAR,
310: 0, RLEFT|RESCC,
311: " ZH AR,AL,AL\n",
312:
313: ASG OPSHFT, INAREG|FOREFF|FORCC,
314: SAREG|AWD, TWORD,
315: AWD, ANYFIXED,
316: NAREG, RLEFT|RESCC,
317: " ZB AR,A1\n ZH A1,AL,AL\n",
318:
319: OPSHFT, INAREG|INTAREG|FORCC,
320: SAREG|AWD, TWORD,
321: SAREG|SCON, ANYFIXED,
322: NAREG|NASL|NASR, RESC1|RESCC,
323: " ZH AR,AL,A1\n",
324:
325: OPSHFT, INAREG|INTAREG|FORCC,
326: SAREG|AWD, TWORD,
327: AWD, TCHAR|TUCHAR,
328: NAREG|NASL|NASR, RESC1|RESCC,
329: " ZH AR,AL,A1\n",
330:
331: OPSHFT, INAREG|INTAREG|FORCC,
332: SAREG|AWD, TWORD,
333: AWD, ANYFIXED,
334: NAREG|NASR, RESC1|RESCC,
335: " ZB AR,A1\n ZH A1,AL,A1\n",
336:
337: INCR, FOREFF,
338: SAREG|AWD, TANY,
339: SCON|SNAME, TANY,
340: 0, RLEFT,
341: " ZE\n",
342:
343: DECR, FOREFF,
344: SAREG|AWD, TANY,
345: SCON|SNAME, TANY,
346: 0, RLEFT,
347: " ZE\n",
348:
349: INCR, INAREG|INTAREG,
350: SAREG|AWD, TANY,
351: SCON|SNAME, TANY,
352: NAREG, RESC1,
353: " ZD\n",
354:
355: DECR, INAREG|INTAREG,
356: SAREG|AWD, TANY,
357: SCON|SNAME, TANY,
358: NAREG, RESC1,
359: " ZD\n",
360:
361: ASSIGN, INAREG|FOREFF,
362: SAREG|AWD, ANYFIXED,
363: SAREG|AWD, ANYFIXED,
364: 0, RLEFT,
365: " ZU\n",
366:
367: ASSIGN, FORCC,
368: SAREG|AWD, ANYFIXED,
369: SAREG|AWD, ANYFIXED,
370: 0, RESCC,
371: " ZV\n",
372:
373: ASSIGN, INAREG|FOREFF|FORCC,
374: SIREG, TDOUBLE,
375: SZERO, TANY,
376: 0, RLEFT|RESCC,
377: " cvld $0\n std AL\n",
378:
379: ASSIGN, INAREG|FOREFF|FORCC,
380: SAREG|SNAME|SOREG, TDOUBLE,
381: SZERO, TANY,
382: 0, RLEFT|RESCC,
383: " clrl UL\n clrl AL\n",
384:
385: ASSIGN, INAREG|FOREFF|FORCC,
386: SAREG|AWD, TDOUBLE,
387: SIREG, TDOUBLE,
388: 0, RLEFT|RRIGHT|RESCC,
389: " ldd AR\n std AL\n",
390:
391: ASSIGN, INAREG|FOREFF|FORCC,
392: SIREG, TDOUBLE,
393: SAREG|AWD, TDOUBLE,
394: 0, RLEFT|RRIGHT|RESCC,
395: " ldd AR\n std AL\n",
396:
397: ASSIGN, INAREG|FOREFF|FORCC,
398: SAREG|SNAME|SOREG, TDOUBLE,
399: SAREG|SNAME|SOREG, TDOUBLE,
400: 0, RLEFT|RRIGHT|RESCC,
401: " movl UR,UL\n movl AR,AL\n",
402:
403: ASSIGN, INAREG|FOREFF|FORCC,
404: SAREG|AWD, TDOUBLE,
405: STARNM, TDOUBLE,
406: 0, RLEFT|RRIGHT|RESCC,
407: " ldd AR\n std AL\n",
408:
409: ASSIGN, INAREG|FOREFF|FORCC,
410: STARNM, TDOUBLE,
411: SAREG|AWD, TDOUBLE,
412: 0, RLEFT|RRIGHT|RESCC,
413: " ldd AR\n std AL\n",
414:
415: ASSIGN, INAREG|FOREFF|FORCC,
416: SAREG|AWD, TFLOAT,
417: SZERO, TANY,
418: 0, RLEFT|RESCC,
419: " clrl TAL\n",
420:
421: ASSIGN, INAREG|FOREFF|FORCC,
422: SAREG|AWD, TFLOAT,
423: SAREG|AWD, TFLOAT,
424: 0, RLEFT|RRIGHT|RESCC,
425: " movl AR,TAL\n",
426:
427: ASSIGN, INAREG|FOREFF|FORCC,
428: SAREG|AWD, TFLOAT,
429: SAREG|AWD, TDOUBLE,
430: 0, RLEFT|RESCC,
431: " ldd AR\n cvdf\n stf AL\n",
432:
433: ASSIGN, INAREG|FOREFF|FORCC,
434: SAREG|AWD, TDOUBLE,
435: SAREG|AWD, TFLOAT,
436: 0, RLEFT|RESCC,
437: " ldfd AR\n std AL\n",
438:
439: ASSIGN, INAREG|FOREFF|FORCC,
440: SAREG|AWD, TFLOAT|TDOUBLE,
441: SAREG|AWD, TINT,
442: 0, RLEFT|RESCC,
443: " cvlZL AR\n stZL AL\n",
444:
445: /* XXX need to trim significance here? */
446: ASSIGN, INAREG|FOREFF|FORCC,
447: SAREG|AWD, TINT,
448: SAREG|AWD, TFLOAT|TDOUBLE,
449: 0, RLEFT|RESCC,
450: " ldZR AR\n cvZRl AL\n",
451:
452: /* unfortunately assignments are exempt from type balancing */
453: ASSIGN, INAREG|FOREFF|FORCC,
454: SAREG|AWD, TCHAR|TUCHAR|TSHORT|TUSHORT,
455: SAREG|AWD, TFLOAT|TDOUBLE,
456: NAREG|NASR, RLEFT|RESCC,
457: " ldZR AR\n cvZRl A1\n cvtlZL A1,AL\n",
458:
459: ASSIGN, INAREG|FOREFF|FORCC,
460: SAREG|AWD, TFLOAT|TDOUBLE,
461: SAREG|AWD, TCHAR|TSHORT,
462: NAREG|NASR, RLEFT|RESCC,
463: " cvtZRl AR,A1\n cvlZL A1\n stZL AL\n",
464:
465: ASSIGN, INAREG|FOREFF|FORCC,
466: SAREG|AWD, TFLOAT|TDOUBLE,
467: SAREG|AWD, TUCHAR|TUSHORT,
468: NAREG|NASR, RLEFT|RESCC,
469: " movzZRl AR,A1\n cvlZL A1\n stZL AL\n",
470:
471: ASSIGN, INAREG|FOREFF|FORCC,
472: SAREG|AWD, TUNSIGNED,
473: SAREG|AWD, TFLOAT|TDOUBLE,
474: 0, RLEFT|RESCC,
475: " ZW\n",
476:
477: ASSIGN, INAREG|FOREFF|FORCC,
478: SAREG|AWD, TFLOAT|TDOUBLE,
479: SAREG|AWD, TUNSIGNED,
480: 0, RLEFT|RESCC,
481: " ZY\n",
482:
483: ASSIGN, INAREG|FOREFF,
484: SFLD, TANY,
485: SZERO, TANY,
486: 0, RRIGHT,
487: " andl2 N,AL\n",
488:
489: ASSIGN, FOREFF,
490: SFLD, TANY,
491: SCON, TANY,
492: 0, RNOP,
493: " andl2 N,AL\n orl2 ZF,AL\n",
494:
495: ASSIGN, INAREG,
496: SFLD, TANY,
497: SCON, TANY,
498: NAREG, RESC1,
499: " andl2 N,AL\n orl2 ZF,AL\n ZI\n",
500:
501: ASSIGN, FOREFF,
502: SFLD, TANY,
503: SAREG|AWD, TWORD,
504: NAREG|NASR, RNOP,
505: " shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\
506: orl2 A1,AL\n",
507:
508: ASSIGN, INAREG,
509: SFLD, TANY,
510: SAREG|AWD, TWORD,
511: NAREG, RESC1,
512: " shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\
513: orl2 A1,AL\n ZI\n",
514:
515: /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
516: UNARY MUL, FOREFF,
517: SCC, TANY,
518: SCC, TANY,
519: 0, RNULL,
520: " help help help\n",
521:
522: REG, INTEMP,
523: SANY, TANY,
524: SAREG, TDOUBLE,
525: 2*NTEMP, RESC1,
526: " movl UR,U1\n movl AR,A1\n",
527:
528: REG, INTEMP,
529: SANY, TANY,
530: SAREG, TANY,
531: NTEMP, RESC1,
532: " movl AR,A1\n",
533:
534: REG, FORARG,
535: SANY, TANY,
536: SAREG, TFLOAT,
537: 0, RNULL,
538: " pushl $0\n pushl AR\n",
539:
540: REG, FORARG,
541: SANY, TANY,
542: SAREG, TDOUBLE,
543: 0, RNULL,
544: " pushl UR\n pushl AR\n",
545:
546: OREG, INTEMP,
547: SANY, TANY,
548: SOREG, TWORD|TFLOAT,
549: NTEMP, RESC1,
550: " movl AR,A1\n",
551:
552: OREG, INTEMP,
553: SANY, TANY,
554: SIREG, TDOUBLE,
555: 2*NTEMP, RESC1,
556: " ldd UR\n std A1\n",
557:
558: OREG, INTEMP,
559: SANY, TANY,
560: SOREG, TDOUBLE,
561: 2*NTEMP, RESC1,
562: " movl UR,U1\n movl AR,A1\n",
563:
564: OREG, INTEMP,
565: SANY, TANY,
566: SOREG, TANY,
567: NTEMP, RESC1,
568: " movZR AR,A1\n",
569:
570: OPLEAF, FOREFF,
571: SANY, TANY,
572: SAREG|AWD, TANY,
573: 0, RLEFT,
574: "",
575:
576: OPLTYPE, INAREG|INTAREG,
577: SANY, TANY,
578: SZERO, TDOUBLE,
579: NAREG|NASR, RESC1,
580: " clrl U1\n clrl A1\n",
581:
582: OPLTYPE, INAREG|INTAREG,
583: SANY, TANY,
584: SIREG, TDOUBLE,
585: NAREG|NASR, RESC1,
586: " ldd AR\n std A1\n",
587:
588: OPLTYPE, INAREG|INTAREG,
589: SANY, TANY,
590: SAREG|SNAME|SOREG|SCON, TDOUBLE,
591: NAREG, RESC1,
592: " movl AR,A1\n movl UR,U1\n",
593:
594: OPLTYPE, INAREG|INTAREG,
595: SANY, TANY,
596: STARNM, TDOUBLE,
597: NAREG|NASR, RESC1,
598: " ldd AR\n std A1\n",
599:
600: OPLTYPE, INAREG|INTAREG,
601: SANY, TANY,
602: SZERO, TANY,
603: NAREG|NASR, RESC1,
604: " clrl TA1\n",
605:
606: OPLTYPE, INAREG|INTAREG,
607: SANY, TANY,
608: SAREG|AWD, TFLOAT,
609: NAREG|NASR, RESC1,
610: " movl AR,TA1\n",
611:
612: OPLTYPE, INAREG|INTAREG,
613: SANY, TANY,
614: SANY, ANYFIXED,
615: NAREG|NASR, RESC1,
616: " ZU\n",
617:
618: OPLTYPE, FORCC,
619: SANY, TANY,
620: SAREG|AWD, TFLOAT,
621: 0, RESCC,
622: " ldf AR\n tstf\n",
623:
624: OPLTYPE, FORCC,
625: SANY, TANY,
626: SAREG|AWD, TDOUBLE,
627: 0, RESCC,
628: " ldd AR\n tstd\n",
629:
630: OPLTYPE, FORCC,
631: SANY, TANY,
632: SANY, ANYFIXED,
633: 0, RESCC,
634: " tstZR AR\n",
635:
636: OPLTYPE, FORARG,
637: SANY, TANY,
638: SANY, TWORD,
639: 0, RNULL,
640: " pushl AR\n",
641:
642: OPLTYPE, FORARG,
643: SANY, TANY,
644: SANY, TCHAR|TSHORT,
645: 0, RNULL,
646: " pushZR AR\n",
647:
648: OPLTYPE, FORARG,
649: SANY, TANY,
650: SANY, TUCHAR|TUSHORT,
651: 0, RNULL,
652: " movzZRl AR,-(sp)\n",
653:
654: OPLTYPE, FORARG,
655: SANY, TANY,
656: SZERO, TFLOAT|TDOUBLE,
657: 0, RNULL,
658: " pushl $0\n pushl $0\n",
659:
660: OPLTYPE, FORARG,
661: SANY, TANY,
662: SIREG, TDOUBLE,
663: 0, RNULL,
664: " ldd AR\n pushd\n",
665:
666: OPLTYPE, FORARG,
667: SANY, TANY,
668: SAREG|SNAME|SOREG, TDOUBLE,
669: 0, RNULL,
670: " pushl UR\n pushl AR\n",
671:
672: OPLTYPE, FORARG,
673: SANY, TANY,
674: STARNM, TDOUBLE,
675: 0, RNULL,
676: " ldd AR\n pushd\n",
677:
678: OPLTYPE, FORARG,
679: SANY, TANY,
680: SAREG|AWD, TFLOAT,
681: 0, RNULL,
682: " pushl $0\n pushl AR\n",
683:
684: UNARY MINUS, INAREG|INTAREG|FORCC,
685: SAREG|AWD, ANYSIGNED|TUNSIGNED,
686: SANY, TANY,
687: NAREG|NASL, RESC1|RESCC,
688: " mnegZL AL,A1\n",
689:
690: UNARY MINUS, INAREG|INTAREG|FORCC,
691: SAREG|AWD, TFLOAT|TDOUBLE,
692: SANY, TANY,
693: NAREG|NASL, RESC1|RESCC,
694: " lnZL AL\n stZL TA1\n",
695:
696: COMPL, INAREG|INTAREG|FORCC,
697: SAREG|AWD, ANYSIGNED|TUNSIGNED,
698: SANY, TANY,
699: NAREG|NASL, RESC1|RESCC,
700: " mcomZL AL,A1\n",
701:
702: COMPL, INAREG|INTAREG|FORCC,
703: SAREG|AWD, ANYFIXED,
704: SANY, TANY,
705: NAREG|NASL, RESC1|RESCC,
706: " movzZLl AL,A1\n mcoml A1,A1\n",
707:
708: AND, FORCC,
709: SAREG|AWD, TWORD,
710: SAREG|AWD, TWORD,
711: 0, RESCC,
712: " bitl AR,AL\n",
713:
714: AND, FORCC,
715: SAREG|AWD, TSHORT|TUSHORT,
716: SSCON, TWORD,
717: 0, RESCC,
718: " bitw AR,AL\n",
719:
720: AND, FORCC,
721: SAREG|AWD, TSHORT|TUSHORT,
722: SAREG|AWD, TSHORT|TUSHORT,
723: 0, RESCC,
724: " bitw AR,AL\n",
725:
726: AND, FORCC,
727: SAREG|AWD, TCHAR|TUCHAR,
728: SCCON, TWORD,
729: 0, RESCC,
730: " bitb AR,AL\n",
731:
732: AND, FORCC,
733: SAREG|AWD, TCHAR|TUCHAR,
734: SAREG|AWD, TCHAR|TUCHAR,
735: 0, RESCC,
736: " bitb AR,AL\n",
737:
738: /* General cases for DIV and ASG DIV are handled below with OPMUL */
739: /* Some special cases are handled in optim2() */
740:
741: DIV, INAREG|FOREFF|FORCC,
742: SAREG|AWD, TUNSIGNED|TULONG,
743: SCON, ANYUSIGNED,
744: NAREG|NEVEN, RESC1|RESCC,
745: " movl AL,U1\n clrl A1\n ediv AR,A1,A1,U1\n",
746:
747: ASG DIV, INAREG|FOREFF|FORCC,
748: SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG,
749: SMCON, ANYUSIGNED,
750: 0, RLEFT|RESCC,
751: " ZJ\n",
752:
753: ASG DIV, INAREG|FOREFF|FORCC,
754: SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG,
755: SCON, ANYUSIGNED,
756: NAREG|NEVEN, RLEFT|RESCC,
757: " movl AL,U1\n clrl A1\n ediv AR,A1,AL,U1\n",
758:
759: MOD, INAREG|INTAREG,
760: SAREG|AWD, TINT|TLONG,
761: SAREG|AWD, TINT|TLONG,
762: NAREG|NEVEN, RESC1,
763: " ZM ediv AR,A1,U1,A1\n",
764:
765: MOD, INAREG|FOREFF,
766: SAREG|AWD, TUNSIGNED|TULONG,
767: SMCON, ANYUSIGNED,
768: NAREG|NASL, RLEFT|RESC1,
769: " ZJ\n",
770:
771: MOD, INAREG|FOREFF,
772: SAREG|AWD, TUNSIGNED|TULONG,
773: SCON, ANYUSIGNED,
774: NAREG|NEVEN, RESC1,
775: " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n",
776:
777: /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
778: /* beware -- the ediv remainder operand must be a register */
779: ASG MOD, INAREG|FOREFF|FORCC,
780: SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG,
781: SAREG|AWD, TINT|TLONG,
782: NAREG|NEVEN, RLEFT|RESCC,
783: " ZM ediv AR,A1,U1,A1\n movl A1,AL\n",
784:
785: ASG MOD, INAREG|FOREFF,
786: SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG,
787: SMCON, ANYUSIGNED,
788: 0, RLEFT,
789: " ZJ\n",
790:
791: ASG MOD, INAREG|FOREFF,
792: SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG,
793: SCON, ANYUSIGNED,
794: NAREG|NEVEN, RLEFT,
795: " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n movl A1,AL\n",
796:
797: /* XXX is this supposed to help on overflow? */
798: ASG MUL, INAREG|FOREFF|FORCC,
799: SAREG|AWD, TUNSIGNED,
800: SAREG|AWD, TUNSIGNED|TINT,
801: NAREG|NEVEN, RLEFT|RESCC,
802: " emul AR,AL,$0,A1\n movl U1,AL\n",
803:
804: ASG MUL, INAREG|FOREFF|FORCC,
805: SAREG|AWD, TUNSIGNED|TINT,
806: SAREG|AWD, TUNSIGNED,
807: NAREG|NEVEN, RLEFT|RESCC,
808: " emul AR,AL,$0,A1\n movl U1,AL\n",
809:
810: ASG OPMUL, INAREG|FOREFF|FORCC,
811: SAREG|AWD, TWORD,
812: SAREG|AWD, TWORD,
813: 0, RLEFT|RESCC,
814: " OL2 AR,AL\n",
815:
816: MUL, INAREG|INTAREG|FORCC,
817: STAREG, TUNSIGNED,
818: SAREG|AWD, TUNSIGNED,
819: NAREG|NEVEN, RLEFT|RESCC,
820: " emul AR,AL,$0,A1\n movl U1,AL\n",
821:
822: OPMUL, INAREG|INTAREG|FORCC,
823: STAREG, TWORD,
824: SAREG|AWD, TWORD,
825: 0, RLEFT|RESCC,
826: " OL2 AR,AL\n",
827:
828: MUL, INAREG|INTAREG|FORCC,
829: SAREG|AWD, TUNSIGNED,
830: SAREG|AWD, TUNSIGNED,
831: NAREG|NEVEN, RESC1|RESCC,
832: " emul AR,AL,$0,A1\n movl U1,A1\n",
833:
834: OPMUL, INAREG|INTAREG|FORCC,
835: SAREG|AWD, TWORD,
836: SAREG|AWD, TWORD,
837: NAREG|NASL|NASR, RESC1|RESCC,
838: " OL3 AR,AL,A1\n",
839:
840: #ifdef REG_CHAR
841: ASG PLUS, INAREG|FOREFF|FORCC,
842: SAREG, TWORD,
843: SONE, TINT,
844: 0, RLEFT|RESCC,
845: " incZL AL\n",
846:
847: ASG PLUS, INAREG|FOREFF|FORCC,
848: AWD, ANYFIXED,
849: SONE, TINT,
850: 0, RLEFT|RESCC,
851: " incZL AL\n",
852:
853: ASG MINUS, INAREG|FOREFF|FORCC,
854: SAREG, TWORD,
855: SONE, TINT,
856: 0, RLEFT|RESCC,
857: " decZL AL\n",
858:
859: ASG MINUS, INAREG|FOREFF|FORCC,
860: AWD, ANYFIXED,
861: SONE, TINT,
862: 0, RLEFT|RESCC,
863: " decZL AL\n",
864: #else
865: ASG PLUS, INAREG|FOREFF|FORCC,
866: SAREG|AWD, ANYFIXED,
867: SONE, TANY,
868: 0, RLEFT|RESCC,
869: " incZL AL\n",
870:
871: ASG MINUS, INAREG|FOREFF|FORCC,
872: SAREG|AWD, ANYFIXED,
873: SONE, TANY,
874: 0, RLEFT|RESCC,
875: " decZL AL\n",
876: #endif
877:
878: PLUS, INAREG|INTAREG|FORCC,
879: STAREG, TWORD,
880: SONE, TWORD,
881: 0, RLEFT|RESCC,
882: " incZL AL\n",
883:
884: MINUS, INAREG|INTAREG|FORCC,
885: STAREG, TWORD,
886: SONE, TWORD,
887: 0, RLEFT|RESCC,
888: " decZL AL\n",
889:
890: ASG OPSIMP, INAREG|FOREFF|FORCC,
891: SAREG|AWD, TWORD,
892: SAREG|AWD, TWORD,
893: 0, RLEFT|RESCC,
894: " OL2 AR,AL\n",
895:
896: ASG OPSIMP, INAREG|FOREFF|FORCC,
897: SAREG, TWORD,
898: SAREG, TSHORT|TUSHORT|TCHAR|TUCHAR,
899: 0, RLEFT|RESCC,
900: " OL2 AR,AL\n",
901:
902: ASG OPSIMP, INAREG|FOREFF|FORCC,
903: AWD, TSHORT|TUSHORT,
904: SAREG|AWD, TSHORT|TUSHORT,
905: 0, RLEFT|RESCC,
906: " OW2 AR,AL\n",
907:
908: ASG OPSIMP, INAREG|FOREFF|FORCC,
909: AWD, TSHORT|TUSHORT,
910: SSCON, TWORD,
911: 0, RLEFT|RESCC,
912: " OW2 AR,AL\n",
913:
914: ASG OPSIMP, INAREG|FOREFF|FORCC,
915: AWD, TCHAR|TUCHAR,
916: SAREG|AWD, TCHAR|TUCHAR,
917: 0, RLEFT|RESCC,
918: " OB2 AR,AL\n",
919:
920: ASG OPSIMP, INAREG|FOREFF|FORCC,
921: AWD, TCHAR|TUCHAR,
922: SCCON, TWORD,
923: 0, RLEFT|RESCC,
924: " OB2 AR,AL\n",
925:
926: OPSIMP, INAREG|INTAREG|FORCC,
927: STAREG, ANYFIXED,
928: SAREG|AWD, TWORD,
929: 0, RLEFT|RESCC,
930: " OL2 AR,AL\n",
931:
932: OPSIMP, INAREG|INTAREG|FORCC,
933: SAREG|AWD, TWORD,
934: SAREG|AWD, TWORD,
935: NAREG|NASL|NASR, RESC1|RESCC,
936: " OL3 AR,AL,A1\n",
937:
938: ASG OPSIMP, INAREG|FOREFF,
939: SAREG|AWD, TFLOAT|TDOUBLE,
940: SZERO, TANY,
941: 0, RLEFT,
942: "",
943:
944: ASG MUL, INAREG|FOREFF|FORCC,
945: SIREG, TDOUBLE,
946: SZERO, TANY,
947: 0, RLEFT|RESCC,
948: " cvld $0\n std AL\n",
949:
950: ASG MUL, INAREG|FOREFF|FORCC,
951: SAREG|SNAME|SOREG, TDOUBLE,
952: SZERO, TANY,
953: 0, RLEFT|RESCC,
954: " clrl UL\n clrl AL\n",
955:
956: ASG MUL, INAREG|FOREFF|FORCC,
957: SAREG|AWD, TFLOAT,
958: SZERO, TANY,
959: 0, RLEFT|RESCC,
960: " clrl TAL\n",
961:
962: ASG OPFLOAT, INAREG|FOREFF|FORCC,
963: SAREG|AWD, TFLOAT,
964: SAREG|AWD, TFLOAT,
965: 0, RLEFT|RESCC,
966: " ldf AL\n OF AR\n stf TAL\n",
967:
968: ASG OPFLOAT, INAREG|FOREFF|FORCC,
969: SAREG|AWD, TDOUBLE,
970: SAREG|AWD, TDOUBLE,
971: 0, RLEFT|RESCC,
972: " ldd AL\n OD AR\n std AL\n",
973:
974: ASG PLUS, INAREG|FOREFF|FORCC,
975: SAREG|AWD, TDOUBLE,
976: SAREG|AWD, TFLOAT,
977: NAREG|NASL, RLEFT|RESCC,
978: " ldfd AR\n OD AL\n std AL\n",
979:
980: ASG MUL, INAREG|FOREFF|FORCC,
981: SAREG|AWD, TDOUBLE,
982: SAREG|AWD, TFLOAT,
983: NAREG|NASL, RLEFT|RESCC,
984: " ldfd AR\n OD AL\n std AL\n",
985:
986: ASG OPFLOAT, INAREG|FOREFF|FORCC,
987: SAREG|AWD, TDOUBLE,
988: SAREG|AWD, TFLOAT,
989: NAREG|NASL, RLEFT|RESCC,
990: " ldfd AR\n std A1\n ldd AL\n OD A1\n std AL\n",
991:
992: ASG OPFLOAT, INAREG|FOREFF|FORCC,
993: SAREG|AWD, TFLOAT,
994: SAREG|AWD, TDOUBLE,
995: 0, RLEFT|RESCC,
996: " ldfd AL\n OD AR\n cvdf\n stf TAL\n",
997:
998: ASG OPFLOAT, INAREG|FOREFF|FORCC,
999: SAREG|AWD, ANYFIXED,
1000: SAREG|AWD, TFLOAT|TDOUBLE,
1001: NAREG, RLEFT|RESCC, /* usable() knows we may need a reg pair */
1002: " ZG\n",
1003:
1004: OPSIMP, INAREG|INTAREG,
1005: SAREG, TFLOAT|TDOUBLE,
1006: SZERO, TANY,
1007: 0, RLEFT,
1008: #if defined(FORT) || defined(SPRECC)
1009: "T",
1010: #else
1011: "",
1012: #endif
1013:
1014: OPSIMP, INAREG|INTAREG|FORCC,
1015: AWD, TFLOAT,
1016: SZERO, TANY,
1017: NAREG, RESC1|RESCC,
1018: " movl AL,A1\n",
1019:
1020: OPSIMP, INAREG|INTAREG|FORCC,
1021: SIREG, TDOUBLE,
1022: SZERO, TANY,
1023: NAREG, RESC1|RESCC,
1024: " ldd AL\n std A1\n",
1025:
1026: OPSIMP, INAREG|INTAREG|FORCC,
1027: SAREG|SNAME|SOREG, TDOUBLE,
1028: SZERO, TANY,
1029: NAREG, RESC1|RESCC,
1030: " movl UL,U1\n movl AL,A1\n",
1031:
1032: MUL, INAREG|INTAREG|FORCC,
1033: SIREG, TDOUBLE,
1034: SZERO, TANY,
1035: NAREG|NASR, RESC1|RESCC,
1036: " cvld $0\n std A1\n",
1037:
1038: MUL, INAREG|INTAREG|FORCC,
1039: SAREG|SNAME|SOREG, TDOUBLE,
1040: SZERO, TANY,
1041: NAREG|NASR, RESC1|RESCC,
1042: " clrl U1\n clrl A1\n",
1043:
1044: MUL, INAREG|INTAREG|FORCC,
1045: SAREG|AWD, TFLOAT,
1046: SZERO, TANY,
1047: NAREG|NASR, RESC1|RESCC,
1048: " clrl TA1\n",
1049:
1050: OPFLOAT, INAREG|INTAREG|FORCC,
1051: SAREG|AWD, TFLOAT,
1052: SAREG|AWD, TFLOAT,
1053: NAREG|NASL|NASR, RESC1|RESCC,
1054: " ldf AL\n OF AR\n stf TA1\n",
1055:
1056: OPFLOAT, INAREG|INTAREG|FORCC,
1057: SZERO, TANY,
1058: SAREG|AWD, TDOUBLE,
1059: NAREG, RESC1|RESCC,
1060: "\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
1061:
1062: OPFLOAT, INAREG|INTAREG|FORCC,
1063: SAREG|AWD, TDOUBLE,
1064: SAREG|AWD, TDOUBLE,
1065: NAREG|NASL|NASR, RESC1|RESCC,
1066: " ldd AL\n OD AR\n std A1\n",
1067:
1068: /* Default actions for hard trees ... */
1069:
1070: # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1071:
1072: UNARY MUL, DF( UNARY MUL ),
1073:
1074: INCR, DF(INCR),
1075:
1076: DECR, DF(INCR),
1077:
1078: ASSIGN, DF(ASSIGN),
1079:
1080: STASG, DF(STASG),
1081:
1082: FLD, DF(FLD),
1083:
1084: OPLEAF, DF(NAME),
1085:
1086: OPLOG, FORCC,
1087: SANY, TANY,
1088: SANY, TANY,
1089: REWRITE, BITYPE,
1090: "",
1091:
1092: OPLOG, DF(NOT),
1093:
1094: COMOP, DF(COMOP),
1095:
1096: INIT, DF(INIT),
1097:
1098: OPUNARY, DF(UNARY MINUS),
1099:
1100:
1101: ASG OPANY, DF(ASG PLUS),
1102:
1103: OPANY, DF(BITYPE),
1104:
1105: 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.