xref: /csrg-svn/old/pcc/ccom.tahoe/table.c (revision 33621)
1 #ifndef lint
2 static char sccsid[] = "@(#)table.c	1.21 (Berkeley) 02/29/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|NASL,	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|NASL,	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|NASL,	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,
475 		"	ZW\n",
476 
477 ASSIGN, INAREG|FOREFF|FORCC,
478 	SAREG|AWD,	TFLOAT|TDOUBLE,
479 	SAREG|AWD,	TUNSIGNED,
480 		0,	RLEFT,
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,	TDOUBLE,
549 		2*NTEMP,	RESC1,
550 		"	movl	UR,U1\n	movl	AR,A1\n",
551 
552 OREG,	INTEMP,
553 	SANY,	TANY,
554 	SOREG,	TANY,
555 		NTEMP,	RESC1,
556 		"	movl	AR,A1\n",
557 
558 OPLEAF,	FOREFF,
559 	SANY,	TANY,
560 	SAREG|AWD,	TANY,
561 		0,	RLEFT,
562 		"",
563 
564 OPLTYPE,	INAREG|INTAREG,
565 	SANY,	TANY,
566 	SZERO,	TDOUBLE,
567 		NAREG|NASR,	RESC1,
568 		"	clrl	U1\n	clrl	A1\n",
569 
570 OPLTYPE,	INAREG|INTAREG,
571 	SANY,	TANY,
572 	SIREG,	TDOUBLE,
573 		NAREG|NASR,	RESC1,
574 		"	ldd	AR\n	std	A1\n",
575 
576 OPLTYPE,	INAREG|INTAREG,
577 	SANY,	TANY,
578 	SAREG|SNAME|SOREG|SCON,	TDOUBLE,
579 		NAREG,		RESC1,
580 		"	movl	AR,A1\n	movl	UR,U1\n",
581 
582 OPLTYPE,	INAREG|INTAREG,
583 	SANY,	TANY,
584 	STARNM,	TDOUBLE,
585 		NAREG|NASR,	RESC1,
586 		"	ldd	AR\n	std	A1\n",
587 
588 OPLTYPE,	INAREG|INTAREG,
589 	SANY,	TANY,
590 	SZERO,	TANY,
591 		NAREG|NASR,	RESC1,
592 		"	clrl	TA1\n",
593 
594 OPLTYPE,	INAREG|INTAREG,
595 	SANY,	TANY,
596 	SAREG|AWD,	TFLOAT,
597 		NAREG|NASR,	RESC1,
598 		"	movl	AR,TA1\n",
599 
600 OPLTYPE,	INAREG|INTAREG,
601 	SANY,	TANY,
602 	SANY,	ANYFIXED,
603 		NAREG|NASR,	RESC1,
604 		"	ZU\n",
605 
606 OPLTYPE,	FORCC,
607 	SANY,	TANY,
608 	SAREG|AWD,	TFLOAT,
609 		0,	RESCC,
610 		"	ldf	AR\n	tstf\n",
611 
612 OPLTYPE,	FORCC,
613 	SANY,	TANY,
614 	SAREG|AWD,	TDOUBLE,
615 		0,	RESCC,
616 		"	ldd	AR\n	tstd\n",
617 
618 OPLTYPE,	FORCC,
619 	SANY,	TANY,
620 	SANY,	ANYFIXED,
621 		0,	RESCC,
622 		"	tstZR	AR\n",
623 
624 OPLTYPE,	FORARG,
625 	SANY,	TANY,
626 	SANY,	TWORD,
627 		0,	RNULL,
628 		"	pushl	AR\n",
629 
630 OPLTYPE,	FORARG,
631 	SANY,	TANY,
632 	SANY,	TCHAR|TSHORT,
633 		0,	RNULL,
634 		"	pushZR	AR\n",
635 
636 OPLTYPE,	FORARG,
637 	SANY,	TANY,
638 	SANY,	TUCHAR|TUSHORT,
639 		0,	RNULL,
640 		"	movzZRl	AR,-(sp)\n",
641 
642 OPLTYPE,	FORARG,
643 	SANY,	TANY,
644 	SZERO,	TFLOAT|TDOUBLE,
645 		0,	RNULL,
646 		"	pushl	$0\n	pushl	$0\n",
647 
648 OPLTYPE,	FORARG,
649 	SANY,	TANY,
650 	SIREG,	TDOUBLE,
651 		0,	RNULL,
652 		"	ldd	AR\n	pushd\n",
653 
654 OPLTYPE,	FORARG,
655 	SANY,	TANY,
656 	SAREG|SNAME|SOREG,	TDOUBLE,
657 		0,	RNULL,
658 		"	pushl	UR\n	pushl	AR\n",
659 
660 OPLTYPE,	FORARG,
661 	SANY,	TANY,
662 	STARNM,	TDOUBLE,
663 		0,	RNULL,
664 		"	ldd	AR\n	pushd\n",
665 
666 OPLTYPE,	FORARG,
667 	SANY,	TANY,
668 	SAREG|AWD,	TFLOAT,
669 		0,	RNULL,
670 		"	pushl	$0\n	pushl	AR\n",
671 
672 UNARY MINUS,	INAREG|INTAREG|FORCC,
673 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
674 	SANY,	TANY,
675 		NAREG|NASL,	RESC1|RESCC,
676 		"	mnegZL	AL,A1\n",
677 
678 UNARY MINUS,	INAREG|INTAREG|FORCC,
679 	SAREG|AWD,	TFLOAT|TDOUBLE,
680 	SANY,	TANY,
681 		NAREG|NASL,	RESC1|RESCC,
682 		"	lnZL	AL\n	stZL	TA1\n",
683 
684 COMPL,	INAREG|INTAREG|FORCC,
685 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
686 	SANY,	TANY,
687 		NAREG|NASL,	RESC1|RESCC,
688 		"	mcomZL	AL,A1\n",
689 
690 COMPL,	INAREG|INTAREG|FORCC,
691 	SAREG|AWD,	ANYFIXED,
692 	SANY,	TANY,
693 		NAREG|NASL,	RESC1|RESCC,
694 		"	movzZLl	AL,A1\n	mcoml	A1,A1\n",
695 
696 AND,	FORCC,
697 	SAREG|AWD,	TWORD,
698 	SAREG|AWD,	TWORD,
699 		0,	RESCC,
700 		"	bitl	AR,AL\n",
701 
702 AND,	FORCC,
703 	SAREG|AWD,	TSHORT|TUSHORT,
704 	SSCON,	TWORD,
705 		0,	RESCC,
706 		"	bitw	AR,AL\n",
707 
708 AND,	FORCC,
709 	SAREG|AWD,	TSHORT|TUSHORT,
710 	SAREG|AWD,	TSHORT|TUSHORT,
711 		0,	RESCC,
712 		"	bitw	AR,AL\n",
713 
714 AND,	FORCC,
715 	SAREG|AWD,	TCHAR|TUCHAR,
716 	SCCON,	TWORD,
717 		0,	RESCC,
718 		"	bitb	AR,AL\n",
719 
720 AND,	FORCC,
721 	SAREG|AWD,	TCHAR|TUCHAR,
722 	SAREG|AWD,	TCHAR|TUCHAR,
723 		0,	RESCC,
724 		"	bitb	AR,AL\n",
725 
726 /* General cases for DIV and ASG DIV are handled below with OPMUL */
727 /* Some special cases are handled in optim2() */
728 
729 DIV,	INAREG|FOREFF|FORCC,
730 	SAREG|AWD,	TUNSIGNED|TULONG,
731 	SCON,	ANYUSIGNED,
732 		NAREG|NEVEN,	RESC1|RESCC,
733 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,A1,U1\n",
734 
735 ASG DIV,	INAREG|FOREFF|FORCC,
736 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
737 	SMCON,	ANYUSIGNED,
738 		0,	RLEFT|RESCC,
739 		"	ZJ\n",
740 
741 ASG DIV,	INAREG|FOREFF|FORCC,
742 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
743 	SCON,	ANYUSIGNED,
744 		NAREG|NEVEN,	RLEFT|RESCC,
745 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,AL,U1\n",
746 
747 MOD,	INAREG|INTAREG,
748 	SAREG|AWD,	TINT|TLONG,
749 	SAREG|AWD,	TINT|TLONG,
750 		NAREG|NEVEN,	RESC1,
751 		"	ZM	ediv	AR,A1,U1,A1\n",
752 
753 MOD,	INAREG|FOREFF,
754 	SAREG|AWD,	TUNSIGNED|TULONG,
755 	SMCON,	ANYUSIGNED,
756 		NAREG|NASL,	RLEFT|RESC1,
757 		"	ZJ\n",
758 
759 MOD,	INAREG|FOREFF,
760 	SAREG|AWD,	TUNSIGNED|TULONG,
761 	SCON,	ANYUSIGNED,
762 		NAREG|NEVEN,	RESC1,
763 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n",
764 
765 /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
766 /* beware -- the ediv remainder operand must be a register */
767 ASG MOD,	INAREG|FOREFF,
768 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
769 	SAREG|AWD,	TINT|TLONG,
770 		NAREG|NEVEN,	RLEFT|RESCC,
771 		"	ZM	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
772 
773 ASG MOD,	INAREG|FOREFF,
774 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
775 	SMCON,	ANYUSIGNED,
776 		0,	RLEFT,
777 		"	ZJ\n",
778 
779 ASG MOD,	INAREG|FOREFF,
780 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
781 	SCON,	ANYUSIGNED,
782 		NAREG|NEVEN,	RLEFT,
783 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
784 
785 /* XXX is this supposed to help on overflow? */
786 ASG MUL,	INAREG|FOREFF|FORCC,
787 	SAREG|AWD,	TUNSIGNED,
788 	SAREG|AWD,	TUNSIGNED|TINT,
789 		NAREG|NEVEN,	RLEFT|RESCC,
790 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
791 
792 ASG MUL,	INAREG|FOREFF|FORCC,
793 	SAREG|AWD,	TUNSIGNED|TINT,
794 	SAREG|AWD,	TUNSIGNED,
795 		NAREG|NEVEN,	RLEFT|RESCC,
796 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
797 
798 ASG OPMUL,	INAREG|FOREFF|FORCC,
799 	SAREG|AWD,	TWORD,
800 	SAREG|AWD,	TWORD,
801 		0,	RLEFT|RESCC,
802 		"	OL2	AR,AL\n",
803 
804 MUL,	INAREG|INTAREG|FORCC,
805 	STAREG,		TUNSIGNED,
806 	SAREG|AWD,	TUNSIGNED,
807 		NAREG|NEVEN,	RLEFT|RESCC,
808 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
809 
810 OPMUL,	INAREG|INTAREG|FORCC,
811 	STAREG,		TWORD,
812 	SAREG|AWD,	TWORD,
813 		0,	RLEFT|RESCC,
814 		"	OL2	AR,AL\n",
815 
816 MUL,	INAREG|INTAREG|FORCC,
817 	SAREG|AWD,	TUNSIGNED,
818 	SAREG|AWD,	TUNSIGNED,
819 		NAREG|NEVEN,	RESC1|RESCC,
820 		"	emul	AR,AL,$0,A1\n	movl	U1,A1\n",
821 
822 OPMUL,	INAREG|INTAREG|FORCC,
823 	SAREG|AWD,	TWORD,
824 	SAREG|AWD,	TWORD,
825 		NAREG|NASL|NASR,	RESC1|RESCC,
826 		"	OL3	AR,AL,A1\n",
827 
828 #ifdef REG_CHAR
829 ASG PLUS,	INAREG|FOREFF|FORCC,
830 	SAREG,	TWORD,
831 	SONE,	TINT,
832 		0,	RLEFT|RESCC,
833 		"	incZL	AL\n",
834 
835 ASG PLUS,	INAREG|FOREFF|FORCC,
836 	AWD,	ANYFIXED,
837 	SONE,	TINT,
838 		0,	RLEFT|RESCC,
839 		"	incZL	AL\n",
840 
841 ASG MINUS,	INAREG|FOREFF|FORCC,
842 	SAREG,	TWORD,
843 	SONE,	TINT,
844 		0,	RLEFT|RESCC,
845 		"	decZL	AL\n",
846 
847 ASG MINUS,	INAREG|FOREFF|FORCC,
848 	AWD,	ANYFIXED,
849 	SONE,	TINT,
850 		0,	RLEFT|RESCC,
851 		"	decZL	AL\n",
852 #else
853 ASG PLUS,       INAREG|FOREFF|FORCC,
854 	SAREG|AWD,	ANYFIXED,
855 	SONE,	TANY,
856 		0,	RLEFT|RESCC,
857 		"	incZL	AL\n",
858 
859 ASG MINUS,       INAREG|FOREFF|FORCC,
860 	SAREG|AWD,	ANYFIXED,
861 	SONE,	TANY,
862 		0,	RLEFT|RESCC,
863 		"	decZL	AL\n",
864 #endif
865 
866 PLUS,	INAREG|INTAREG|FORCC,
867 	STAREG,	TWORD,
868 	SONE,	TWORD,
869 		0,	RLEFT|RESCC,
870 		"	incZL	AL\n",
871 
872 MINUS,	INAREG|INTAREG|FORCC,
873 	STAREG,	TWORD,
874 	SONE,	TWORD,
875 		0,	RLEFT|RESCC,
876 		"	decZL	AL\n",
877 
878 ASG OPSIMP,	INAREG|FOREFF|FORCC,
879 	SAREG|AWD,	TWORD,
880 	SAREG|AWD,	TWORD,
881 		0,	RLEFT|RESCC,
882 		"	OL2	AR,AL\n",
883 
884 ASG OPSIMP,	INAREG|FOREFF|FORCC,
885 	SAREG,	TWORD,
886 	SAREG,	TSHORT|TUSHORT|TCHAR|TUCHAR,
887 		0,	RLEFT|RESCC,
888 		"	OL2	AR,AL\n",
889 
890 ASG OPSIMP,	INAREG|FOREFF|FORCC,
891 	AWD,	TSHORT|TUSHORT,
892 	SAREG|AWD,	TSHORT|TUSHORT,
893 		0,	RLEFT|RESCC,
894 		"	OW2	AR,AL\n",
895 
896 ASG OPSIMP,	INAREG|FOREFF|FORCC,
897 	AWD,	TSHORT|TUSHORT,
898 	SSCON,	TWORD,
899 		0,	RLEFT|RESCC,
900 		"	OW2	AR,AL\n",
901 
902 ASG OPSIMP,	INAREG|FOREFF|FORCC,
903 	AWD,	TCHAR|TUCHAR,
904 	SAREG|AWD,	TCHAR|TUCHAR,
905 		0,	RLEFT|RESCC,
906 		"	OB2	AR,AL\n",
907 
908 ASG OPSIMP,	INAREG|FOREFF|FORCC,
909 	AWD,	TCHAR|TUCHAR,
910 	SCCON,	TWORD,
911 		0,	RLEFT|RESCC,
912 		"	OB2	AR,AL\n",
913 
914 OPSIMP,	INAREG|INTAREG|FORCC,
915 	STAREG,	ANYFIXED,
916 	SAREG|AWD,	TWORD,
917 		0,	RLEFT|RESCC,
918 		"	OL2	AR,AL\n",
919 
920 OPSIMP,	INAREG|INTAREG|FORCC,
921 	SAREG|AWD,	TWORD,
922 	SAREG|AWD,	TWORD,
923 		NAREG|NASL|NASR,	RESC1|RESCC,
924 		"	OL3	AR,AL,A1\n",
925 
926 ASG OPSIMP,	INAREG|FOREFF,
927 	SAREG|AWD,	TFLOAT|TDOUBLE,
928 	SZERO,	TANY,
929 		0,	RLEFT,
930 		"",
931 
932 ASG MUL,	INAREG|FOREFF|FORCC,
933 	SIREG,	TDOUBLE,
934 	SZERO,	TANY,
935 		0,	RLEFT|RESCC,
936 		"	cvld	$0\n	std	AL\n",
937 
938 ASG MUL,	INAREG|FOREFF|FORCC,
939 	SAREG|SNAME|SOREG,	TDOUBLE,
940 	SZERO,	TANY,
941 		0,	RLEFT|RESCC,
942 		"	clrl	UL\n	clrl	AL\n",
943 
944 ASG MUL,	INAREG|FOREFF|FORCC,
945 	SAREG|AWD,	TFLOAT,
946 	SZERO,	TANY,
947 		0,	RLEFT|RESCC,
948 		"	clrl	TAL\n",
949 
950 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
951 	SAREG|AWD,	TFLOAT,
952 	SAREG|AWD,	TFLOAT,
953 		0,	RLEFT|RESCC,
954 		"	ldf	AL\n	OF	AR\n	stf	TAL\n",
955 
956 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
957 	SAREG|AWD,	TDOUBLE,
958 	SAREG|AWD,	TDOUBLE,
959 		0,	RLEFT|RESCC,
960 		"	ldd	AL\n	OD	AR\n	std	AL\n",
961 
962 ASG PLUS,	INAREG|FOREFF|FORCC,
963 	SAREG|AWD,	TDOUBLE,
964 	SAREG|AWD,	TFLOAT,
965 		NAREG|NASL,	RLEFT|RESCC,
966 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
967 
968 ASG MUL,	INAREG|FOREFF|FORCC,
969 	SAREG|AWD,	TDOUBLE,
970 	SAREG|AWD,	TFLOAT,
971 		NAREG|NASL,	RLEFT|RESCC,
972 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
973 
974 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
975 	SAREG|AWD,	TDOUBLE,
976 	SAREG|AWD,	TFLOAT,
977 		NAREG|NASL,	RLEFT|RESCC,
978 		"	ldfd	AR\n	std	A1\n	ldd	AL\n	OD	A1\n	std	AL\n",
979 
980 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
981 	SAREG|AWD,	TFLOAT,
982 	SAREG|AWD,	TDOUBLE,
983 		0,	RLEFT|RESCC,
984 		"	ldfd	AL\n	OD	AR\n	cvdf\n	stf	TAL\n",
985 
986 ASG OPFLOAT,	INAREG|FOREFF,
987 	SAREG|AWD,	ANYFIXED,
988 	SAREG|AWD,	TFLOAT|TDOUBLE,
989 		NAREG,	RLEFT|RESCC,	/* usable() knows we may need a reg pair */
990 		"	ZG\n",
991 
992 OPSIMP,	INAREG|INTAREG,
993 	SAREG,	TFLOAT|TDOUBLE,
994 	SZERO,	TANY,
995 		0,	RLEFT,
996 #if defined(FORT) || defined(SPRECC)
997 		"T",
998 #else
999 		"",
1000 #endif
1001 
1002 OPSIMP,	INAREG|INTAREG|FORCC,
1003 	AWD,	TFLOAT,
1004 	SZERO,	TANY,
1005 		NAREG,	RESC1|RESCC,
1006 		"	movl	AL,A1\n",
1007 
1008 OPSIMP,	INAREG|INTAREG|FORCC,
1009 	SIREG,	TDOUBLE,
1010 	SZERO,	TANY,
1011 		NAREG,	RESC1|RESCC,
1012 		"	ldd	AL\n	std	A1\n",
1013 
1014 OPSIMP,	INAREG|INTAREG|FORCC,
1015 	SAREG|SNAME|SOREG,	TDOUBLE,
1016 	SZERO,	TANY,
1017 		NAREG,	RESC1|RESCC,
1018 		"	movl	UL,U1\n	movl	AL,A1\n",
1019 
1020 MUL,	INAREG|INTAREG|FORCC,
1021 	SIREG,	TDOUBLE,
1022 	SZERO,	TANY,
1023 		NAREG|NASR,	RESC1|RESCC,
1024 		"	cvld	$0\n	std	A1\n",
1025 
1026 MUL,	INAREG|INTAREG|FORCC,
1027 	SAREG|SNAME|SOREG,	TDOUBLE,
1028 	SZERO,	TANY,
1029 		NAREG|NASR,	RESC1|RESCC,
1030 		"	clrl	U1\n	clrl	A1\n",
1031 
1032 MUL,	INAREG|INTAREG|FORCC,
1033 	SAREG|AWD,	TFLOAT,
1034 	SZERO,	TANY,
1035 		NAREG|NASR,	RESC1|RESCC,
1036 		"	clrl	TA1\n",
1037 
1038 OPFLOAT,	INAREG|INTAREG|FORCC,
1039 	SAREG|AWD,	TFLOAT,
1040 	SAREG|AWD,	TFLOAT,
1041 		NAREG|NASL|NASR,	RESC1|RESCC,
1042 		"	ldf	AL\n	OF	AR\n	stf	TA1\n",
1043 
1044 OPFLOAT,	INAREG|INTAREG|FORCC,
1045 	SZERO,		TANY,
1046 	SAREG|AWD,	TDOUBLE,
1047 		NAREG,	RESC1|RESCC,
1048 		"\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
1049 
1050 OPFLOAT,	INAREG|INTAREG|FORCC,
1051 	SAREG|AWD,	TDOUBLE,
1052 	SAREG|AWD,	TDOUBLE,
1053 		NAREG|NASL|NASR,	RESC1|RESCC,
1054 		"	ldd	AL\n	OD	AR\n	std	A1\n",
1055 
1056 	/* Default actions for hard trees ... */
1057 
1058 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1059 
1060 UNARY MUL, DF( UNARY MUL ),
1061 
1062 INCR, DF(INCR),
1063 
1064 DECR, DF(INCR),
1065 
1066 ASSIGN, DF(ASSIGN),
1067 
1068 STASG, DF(STASG),
1069 
1070 FLD, DF(FLD),
1071 
1072 OPLEAF, DF(NAME),
1073 
1074 OPLOG,	FORCC,
1075 	SANY,	TANY,
1076 	SANY,	TANY,
1077 		REWRITE,	BITYPE,
1078 		"",
1079 
1080 OPLOG,	DF(NOT),
1081 
1082 COMOP, DF(COMOP),
1083 
1084 INIT, DF(INIT),
1085 
1086 OPUNARY, DF(UNARY MINUS),
1087 
1088 
1089 ASG OPANY, DF(ASG PLUS),
1090 
1091 OPANY, DF(BITYPE),
1092 
1093 FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" };
1094