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