xref: /original-bsd/old/pcc/ccom.tahoe/table.c (revision d3640572)
1 #ifndef lint
2 static char sccsid[] = "@(#)table.c	1.14 (Berkeley) 12/10/87";
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|RESCC,
51 		"	ZU\n",
52 
53 SCONV,	FORCC,
54 	SAREG|AWD,	ANYFIXED,
55 	SANY,	ANYFIXED,
56 		NAREG|NASL,	RESC1|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 /* tahoe won't handle uns char/short equality/inequality with mem and const */
175 EQ,	FORCC,
176 	AWD,		TUCHAR|TUSHORT,
177 	SCON,	TANY,
178 		NAREG,	RESCC,
179 		"	movzZLl	AL,A1\n	cmpZL	A1,AR\nZP",
180 
181 NE,	FORCC,
182 	AWD,		TUCHAR|TUSHORT,
183 	SCON,	TANY,
184 		NAREG,	RESCC,
185 		"	movzZLl	AL,A1\n	cmpZL	A1,AR\nZP",
186 
187 /* optim2() handles degenerate comparisons with constants */
188 OPLOG,	FORCC,
189 	SAREG|AWD,	TCHAR|TUCHAR|TSHORT|TUSHORT,
190 	SCON,	TANY,
191 		0,	RESCC,
192 		"	cmpZL	AL,AR\nZP",
193 
194 OPLOG,	FORCC,
195 	SAREG|AWD,	TSHORT,
196 	SAREG|AWD,	TSHORT,
197 		0,	RESCC,
198 		"	cmpw	AL,AR\nZP",
199 
200 OPLOG,	FORCC,
201 	SAREG|AWD,	TUSHORT,
202 	SAREG|AWD,	TUSHORT,
203 		0,	RESCC,
204 		"	cmpw	AL,AR\nZP",
205 
206 OPLOG,	FORCC,
207 	SAREG|AWD,	TCHAR,
208 	SAREG|AWD,	TCHAR,
209 		0,	RESCC,
210 		"	cmpb	AL,AR\nZP",
211 
212 OPLOG,	FORCC,
213 	SAREG|AWD,	TUCHAR,
214 	SAREG|AWD,	TUCHAR,
215 		0,	RESCC,
216 		"	cmpb	AL,AR\nZP",
217 
218 OPLOG,	FORCC,
219 	SAREG|AWD,	TFLOAT,
220 	SAREG|AWD,	TFLOAT,
221 		0,	RESCC,
222 		"	cmpZL2	AL,AR\nZP",
223 
224 OPLOG,	FORCC,
225 	SZERO,		TDOUBLE,
226 	SAREG|AWD,	TDOUBLE,
227 		0,	RESCC,
228 		"	cmpf2	AL,AR\nZP",
229 
230 OPLOG,	FORCC,
231 	SAREG|AWD,	TDOUBLE,
232 	SAREG|AWD,	TDOUBLE,
233 		0,	RESCC,
234 		"	cmpZL2	AL,AR\nZP",
235 
236 #ifdef FORT
237 /* some implicit conversions made explicit to help f77 out (sigh) */
238 OPLOG,	FORCC,
239 	SAREG|AWD,	TFLOAT,
240 	SAREG|AWD,	TDOUBLE,
241 		0,	RESCC,
242 		"	ldfd	AL\n	cmpd	AR\nZP",
243 
244 /* ought to flip this comparison, save an instruction */
245 OPLOG,	FORCC,
246 	SAREG|AWD,	TDOUBLE,
247 	SAREG|AWD,	TFLOAT,
248 		NAREG|NEVEN|NASR,	RESCC,
249 		"	ldfd	AR\n	std	A1\n	cmpd2	AL,A1\nZP",
250 #endif
251 
252 CCODES,	INAREG|INTAREG,
253 	SANY,	TANY,
254 	SANY,	TANY,
255 		NAREG,	RESC1,
256 		"	movl	$1,A1\nZN",
257 
258 UNARY CALL,	INAREG|INTAREG,
259 	SCON,	TANY,
260 	SANY,	TANY,
261 		NAREG|NASL,	RESC1, /* should be register 0 */
262 		"	ZC,CL\n",
263 
264 UNARY CALL,	INAREG|INTAREG,
265 	SAREG,	TANY,
266 	SANY,	TANY,
267 		NAREG|NASL,	RESC1,	/* should be 0 */
268 		"	ZC,(AL)\n",
269 
270 UNARY CALL,	INAREG|INTAREG,
271 	SNAME,	TANY,
272 	SANY,	TANY,
273 		NAREG|NASL,	RESC1,	/* really reg 0 */
274 		"	ZC,*AL\n",
275 
276 UNARY CALL,	INAREG|INTAREG,
277 	SSOREG,	TANY,
278 	SANY,	TANY,
279 		NAREG|NASL,	RESC1,	/* really reg 0 */
280 		"	ZC,*AL\n",
281 
282 FORTCALL,	INAREG|INTAREG,
283 	SCON,	TANY,
284 	SAREG|AWD,	TFLOAT,
285 		NAREG|NASL|NASR,	RESC1,
286 		"	ldf	AR\n	CLf\n	stf	TA1\n",
287 
288 ASG OPSHFT,	INAREG|FOREFF|FORCC,
289 	SAREG|AWD,	TWORD,
290 	SAREG|SCON,	ANYFIXED,
291 		0,	RLEFT|RESCC,
292 		"	ZH	AR,AL,AL\n",
293 
294 ASG OPSHFT,	INAREG|FOREFF|FORCC,
295 	SAREG|AWD,	TWORD,
296 	AWD,	TCHAR|TUCHAR,
297 		0,	RLEFT|RESCC,
298 		"	ZH	AR,AL,AL\n",
299 
300 ASG OPSHFT,	INAREG|FOREFF|FORCC,
301 	SAREG|AWD,	TWORD,
302 	AWD,	ANYFIXED,
303 		NAREG,	RLEFT|RESCC,
304 		"	ZB	AR,A1\n	ZH	A1,AL,AL\n",
305 
306 OPSHFT,	INAREG|INTAREG|FORCC,
307 	SAREG|AWD,	TWORD,
308 	SAREG|SCON,	ANYFIXED,
309 		NAREG|NASL|NASR,	RESC1|RESCC,
310 		"	ZH	AR,AL,A1\n",
311 
312 OPSHFT,	INAREG|INTAREG|FORCC,
313 	SAREG|AWD,	TWORD,
314 	AWD,	TCHAR|TUCHAR,
315 		NAREG|NASL|NASR,	RESC1|RESCC,
316 		"	ZH	AR,AL,A1\n",
317 
318 OPSHFT,	INAREG|INTAREG|FORCC,
319 	SAREG|AWD,	TWORD,
320 	AWD,	ANYFIXED,
321 		NAREG|NASR,	RESC1|RESCC,
322 		"	ZB	AR,A1\n	ZH	A1,AL,A1\n",
323 
324 INCR,	FOREFF,
325 	SAREG|AWD,	TWORD,
326 	SCON|SNAME,	TANY,
327 		0,	RLEFT,
328 		"	ZE\n",
329 
330 DECR,	FOREFF,
331 	SAREG|AWD,	TWORD,
332 	SCON|SNAME,	TANY,
333 		0,	RLEFT,
334 		"	ZE\n",
335 
336 INCR,	INAREG|INTAREG,
337 	SAREG|AWD,	TANY,
338 	SCON|SNAME,	TANY,
339 		NAREG,	RESC1,
340 		"	ZD\n",
341 
342 DECR,	INAREG|INTAREG,
343 	SAREG|AWD,	TANY,
344 	SCON|SNAME,	TANY,
345 		NAREG,	RESC1,
346 		"	ZD\n",
347 
348 ASSIGN,	INAREG|FOREFF|FORCC,
349 	SAREG|AWD,	ANYFIXED,
350 	SAREG|AWD,	ANYFIXED,
351 		0,	RLEFT|RRIGHT|RESCC,
352 		"	ZU\n",
353 
354 ASSIGN,	INAREG|FOREFF|FORCC,
355 	SIREG,	TDOUBLE,
356 	SZERO,	TANY,
357 		0,	RLEFT|RESCC,
358 		"	cvld	$0\n	std	AL\n",
359 
360 ASSIGN,	INAREG|FOREFF|FORCC,
361 	SAREG|SNAME|SOREG,	TDOUBLE,
362 	SZERO,	TANY,
363 		0,	RLEFT|RESCC,
364 		"	clrl	UL\n	clrl	AL\n",
365 
366 ASSIGN,	INAREG|FOREFF|FORCC,
367 	SAREG|AWD,	TDOUBLE,
368 	SIREG,	TDOUBLE,
369 		0,	RLEFT|RRIGHT|RESCC,
370 		"	ldd	AR\n	std	AL\n",
371 
372 ASSIGN,	INAREG|FOREFF|FORCC,
373 	SIREG,	TDOUBLE,
374 	SAREG|AWD,	TDOUBLE,
375 		0,	RLEFT|RRIGHT|RESCC,
376 		"	ldd	AR\n	std	AL\n",
377 
378 ASSIGN,	INAREG|FOREFF|FORCC,
379 	SAREG|SNAME|SOREG,	TDOUBLE,
380 	SAREG|SNAME|SOREG,	TDOUBLE,
381 		0,	RLEFT|RRIGHT|RESCC,
382 		"	movl	UR,UL\n	movl	AR,AL\n",
383 
384 ASSIGN,	INAREG|FOREFF|FORCC,
385 	SAREG|AWD,	TFLOAT,
386 	SZERO,	TANY,
387 		0,	RLEFT|RESCC,
388 		"	clrl	TAL\n",
389 
390 ASSIGN,	INAREG|FOREFF|FORCC,
391 	SAREG|AWD,	TFLOAT,
392 	SAREG|AWD,	TFLOAT,
393 		0,	RLEFT|RRIGHT|RESCC,
394 		"	movl	AR,TAL\n",
395 
396 ASSIGN,	INAREG|FOREFF|FORCC,
397 	SAREG|AWD,	TFLOAT,
398 	SAREG|AWD,	TDOUBLE,
399 		0,	RLEFT|RESCC,
400 		"	ldd	AR\n	cvdf\n	stf	AL\n",
401 
402 ASSIGN,	INAREG|FOREFF|FORCC,
403 	SAREG|AWD,	TDOUBLE,
404 	SAREG|AWD,	TFLOAT,
405 		0,	RLEFT|RESCC,
406 		"	ldfd	AR\n	std	AL\n",
407 
408 ASSIGN,	INAREG|FOREFF|FORCC,
409 	SAREG|AWD,	TFLOAT|TDOUBLE,
410 	SAREG|AWD,	TINT,
411 		0,	RLEFT|RESCC,
412 		"	cvlZL	AR\n	stZL	AL\n",
413 
414 /* XXX need to trim significance here? */
415 ASSIGN,	INAREG|FOREFF|FORCC,
416 	SAREG|AWD,	TINT,
417 	SAREG|AWD,	TFLOAT|TDOUBLE,
418 		0,	RLEFT|RESCC,
419 		"	ldZR	AR\n	cvZRl	AL\n",
420 
421 /* unfortunately assignments are exempt from type balancing */
422 ASSIGN,	INAREG|FOREFF|FORCC,
423 	SAREG|AWD,	TCHAR|TUCHAR|TSHORT|TUSHORT,
424 	SAREG|AWD,	TFLOAT|TDOUBLE,
425 		NAREG|NASL,	RLEFT|RESCC,
426 		"	ldZR	AR\n	cvZRl	A1\n	cvtlZL	A1,AL\n",
427 
428 ASSIGN,	INAREG|FOREFF|FORCC,
429 	SAREG|AWD,	TFLOAT|TDOUBLE,
430 	SAREG|AWD,	TCHAR|TSHORT,
431 		NAREG|NASL,	RLEFT|RESCC,
432 		"	cvtZRl	AR,A1\n	cvlZL	A1\n	stZL	AL\n",
433 
434 ASSIGN,	INAREG|FOREFF|FORCC,
435 	SAREG|AWD,	TFLOAT|TDOUBLE,
436 	SAREG|AWD,	TUCHAR|TUSHORT,
437 		NAREG|NASL,	RLEFT|RESCC,
438 		"	movzZRl	AR,A1\n	cvlZL	A1\n	stZL	AL\n",
439 
440 ASSIGN, INAREG|FOREFF|FORCC,
441 	SAREG|AWD,	TUNSIGNED,
442 	SAREG|AWD,	TFLOAT|TDOUBLE,
443 		0,	RLEFT,
444 		"	ZW\n",
445 
446 ASSIGN, INAREG|FOREFF|FORCC,
447 	SAREG|AWD,	TFLOAT|TDOUBLE,
448 	SAREG|AWD,	TUNSIGNED,
449 		0,	RLEFT,
450 		"	ZY\n",
451 
452 ASSIGN,	INAREG|FOREFF,
453 	SFLD,	TANY,
454 	SZERO,	TANY,
455 		0,	RRIGHT,
456 		"	andl2	N,AL\n",
457 
458 ASSIGN,	FOREFF,
459 	SFLD,	TANY,
460 	SCON,	TANY,
461 		0,	RNOP,
462 		"	andl2	N,AL\n	orl2	ZF,AL\n",
463 
464 ASSIGN,	INAREG,
465 	SFLD,	TANY,
466 	SCON,	TANY,
467 		NAREG,	RESC1,
468 		"	andl2	N,AL\n	orl2	ZF,AL\n	ZI\n",
469 
470 ASSIGN,	FOREFF,
471 	SFLD,	TANY,
472 	SAREG|AWD,	TWORD,
473 		NAREG|NASR,	RNOP,
474 		"	shll	$H,AR,A1\n	andl2	M,A1\n	andl2	N,AL\n\
475 	orl2	A1,AL\n",
476 
477 ASSIGN,	INAREG,
478 	SFLD,	TANY,
479 	SAREG|AWD,	TWORD,
480 		NAREG,	RESC1,
481 		"	shll	$H,AR,A1\n	andl2	M,A1\n	andl2	N,AL\n\
482 	orl2	A1,AL\n	ZI\n",
483 
484 /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
485 UNARY MUL,	FOREFF,
486 	SCC,	TANY,
487 	SCC,	TANY,
488 		0,	RNULL,
489 		"	help help help\n",
490 
491 REG,	INTEMP,
492 	SANY,	TANY,
493 	SAREG,	TDOUBLE,
494 		2*NTEMP,	RESC1,
495 		"	movl	UR,U1\n	movl	AR,A1\n",
496 
497 REG,	INTEMP,
498 	SANY,	TANY,
499 	SAREG,	TANY,
500 		NTEMP,	RESC1,
501 		"	movl	AR,A1\n",
502 
503 REG,	FORARG,
504 	SANY,	TANY,
505 	SAREG,	TFLOAT,
506 		0,	RNULL,
507 		"	pushl	$0\n	pushl	AR\n",
508 
509 REG,	FORARG,
510 	SANY,	TANY,
511 	SAREG,	TDOUBLE,
512 		0,	RNULL,
513 		"	pushl	UR\n	pushl	AR\n",
514 
515 OPLEAF,	FOREFF,
516 	SANY,	TANY,
517 	SAREG|AWD,	TANY,
518 		0,	RLEFT,
519 		"",
520 
521 OPLTYPE,	INAREG|INTAREG,
522 	SANY,	TANY,
523 	SZERO,	TDOUBLE,
524 		NAREG|NASR,	RESC1,
525 		"	clrl	U1\n	clrl	A1\n",
526 
527 OPLTYPE,	INAREG|INTAREG,
528 	SANY,	TANY,
529 	SIREG,	TDOUBLE,
530 		NAREG|NASR,	RESC1,
531 		"	ldd	AR\n	std	A1\n",
532 
533 OPLTYPE,	INAREG|INTAREG,
534 	SANY,	TANY,
535 	SAREG|SNAME|SOREG|SCON,	TDOUBLE,
536 		NAREG,		RESC1,
537 		"	movl	AR,A1\n	movl	UR,U1\n",
538 
539 OPLTYPE,	INAREG|INTAREG,
540 	SANY,	TANY,
541 	SZERO,	TANY,
542 		NAREG|NASR,	RESC1,
543 		"	clrl	TA1\n",
544 
545 OPLTYPE,	INAREG|INTAREG,
546 	SANY,	TANY,
547 	SAREG|AWD,	TFLOAT,
548 		NAREG|NASR,	RESC1,
549 		"	movl	AR,TA1\n",
550 
551 OPLTYPE,	INAREG|INTAREG,
552 	SANY,	TANY,
553 	SANY,	ANYFIXED,
554 		NAREG|NASR,	RESC1,
555 		"	ZU\n",
556 
557 OPLTYPE,	FORCC,
558 	SANY,	TANY,
559 	SAREG|AWD,	TFLOAT,
560 		0,	RESCC,
561 		"	ldf	AR\n	tstf\n",
562 
563 OPLTYPE,	FORCC,
564 	SANY,	TANY,
565 	SAREG|AWD,	TDOUBLE,
566 		0,	RESCC,
567 		"	ldd	AR\n	tstd\n",
568 
569 OPLTYPE,	FORCC,
570 	SANY,	TANY,
571 	SANY,	ANYFIXED,
572 		0,	RESCC,
573 		"	tstZR	AR\n",
574 
575 OPLTYPE,	FORARG,
576 	SANY,	TANY,
577 	SANY,	TWORD,
578 		0,	RNULL,
579 		"	pushl	AR\n",
580 
581 OPLTYPE,	FORARG,
582 	SANY,	TANY,
583 	SANY,	TCHAR|TSHORT,
584 		0,	RNULL,
585 		"	pushZR	AR\n",
586 
587 OPLTYPE,	FORARG,
588 	SANY,	TANY,
589 	SANY,	TUCHAR|TUSHORT,
590 		0,	RNULL,
591 		"	movzZRl	AR,-(sp)\n",
592 
593 OPLTYPE,	FORARG,
594 	SANY,	TANY,
595 	SZERO,	TFLOAT|TDOUBLE,
596 		0,	RNULL,
597 		"	pushl	$0\n	pushl	$0\n",
598 
599 OPLTYPE,	FORARG,
600 	SANY,	TANY,
601 	SIREG,	TDOUBLE,
602 		0,	RNULL,
603 		"	ldd	AR\n	pushd\n",
604 
605 OPLTYPE,	FORARG,
606 	SANY,	TANY,
607 	SAREG|AWD,	TDOUBLE,
608 		0,	RNULL,
609 		"	pushl	UR\n	pushl	AR\n",
610 
611 OPLTYPE,	FORARG,
612 	SANY,	TANY,
613 	SAREG|AWD,	TFLOAT,
614 		0,	RNULL,
615 		"	pushl	$0\n	pushl	AR\n",
616 
617 UNARY MINUS,	INAREG|INTAREG|FORCC,
618 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
619 	SANY,	TANY,
620 		NAREG|NASL,	RESC1|RESCC,
621 		"	mnegZL	AL,A1\n",
622 
623 UNARY MINUS,	INAREG|INTAREG|FORCC,
624 	SAREG|AWD,	TFLOAT|TDOUBLE,
625 	SANY,	TANY,
626 		NAREG|NASL,	RESC1|RESCC,
627 		"	lnZL	AL\n	stZL	TA1\n",
628 
629 COMPL,	INAREG|INTAREG|FORCC,
630 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
631 	SANY,	TANY,
632 		NAREG|NASL,	RESC1|RESCC,
633 		"	mcomZL	AL,A1\n",
634 
635 COMPL,	INAREG|INTAREG|FORCC,
636 	SAREG|AWD,	ANYFIXED,
637 	SANY,	TANY,
638 		NAREG|NASL,	RESC1|RESCC,
639 		"	movzZLl	AL,A1\n	mcoml	A1,A1\n",
640 
641 AND,	FORCC,
642 	SAREG|AWD,	TWORD,
643 	SAREG|AWD,	TWORD,
644 		0,	RESCC,
645 		"	bitl	AR,AL\n",
646 
647 AND,	FORCC,
648 	SAREG|AWD,	TSHORT|TUSHORT,
649 	SSCON,	TWORD,
650 		0,	RESCC,
651 		"	bitw	AR,AL\n",
652 
653 AND,	FORCC,
654 	SAREG|AWD,	TSHORT|TUSHORT,
655 	SAREG|AWD,	TSHORT|TUSHORT,
656 		0,	RESCC,
657 		"	bitw	AR,AL\n",
658 
659 AND,	FORCC,
660 	SAREG|AWD,	TCHAR|TUCHAR,
661 	SCCON,	TWORD,
662 		0,	RESCC,
663 		"	bitb	AR,AL\n",
664 
665 AND,	FORCC,
666 	SAREG|AWD,	TCHAR|TUCHAR,
667 	SAREG|AWD,	TCHAR|TUCHAR,
668 		0,	RESCC,
669 		"	bitb	AR,AL\n",
670 
671 /* General cases for DIV and ASG DIV are handled below with OPMUL */
672 /* Some special cases are handled in optim2() */
673 
674 DIV,	INAREG|FOREFF|FORCC,
675 	SAREG|AWD,	TUNSIGNED|TULONG,
676 	SCON,	ANYUSIGNED,
677 		NAREG|NEVEN,	RESC1|RESCC,
678 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,A1,U1\n",
679 
680 ASG DIV,	INAREG|FOREFF|FORCC,
681 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
682 	SMCON,	ANYUSIGNED,
683 		0,	RLEFT|RESCC,
684 		"	ZJ\n",
685 
686 ASG DIV,	INAREG|FOREFF|FORCC,
687 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
688 	SCON,	ANYUSIGNED,
689 		NAREG|NEVEN,	RLEFT|RESCC,
690 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,AL,U1\n",
691 
692 MOD,	INAREG|INTAREG,
693 	SAREG|AWD,	TINT|TLONG,
694 	SAREG|AWD,	TINT|TLONG,
695 		NAREG|NEVEN,	RESC1,
696 		"	ZM	ediv	AR,A1,U1,A1\n",
697 
698 MOD,	INAREG|FOREFF,
699 	SAREG|AWD,	TUNSIGNED|TULONG,
700 	SMCON,	ANYUSIGNED,
701 		NAREG|NASL,	RLEFT|RESC1,
702 		"	ZJ\n",
703 
704 MOD,	INAREG|FOREFF,
705 	SAREG|AWD,	TUNSIGNED|TULONG,
706 	SCON,	ANYUSIGNED,
707 		NAREG|NEVEN,	RESC1,
708 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n",
709 
710 /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
711 ASG MOD,	INAREG|FOREFF,
712 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
713 	SAREG|AWD,	TINT|TLONG,
714 		NAREG|NEVEN,	RLEFT|RESCC,
715 		"	ZM	ediv	AR,A1,A1,AL\n",
716 
717 ASG MOD,	INAREG|FOREFF,
718 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
719 	SMCON,	ANYUSIGNED,
720 		0,	RLEFT,
721 		"	ZJ\n",
722 
723 ASG MOD,	INAREG|FOREFF,
724 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
725 	SCON,	ANYUSIGNED,
726 		NAREG|NEVEN,	RLEFT,
727 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,A1,AL\n",
728 
729 /* XXX is this supposed to help on overflow? */
730 ASG MUL,	INAREG|FOREFF|FORCC,
731 	SAREG|AWD,	TUNSIGNED,
732 	SAREG|AWD,	TUNSIGNED|TINT,
733 		NAREG|NEVEN,	RLEFT|RESCC,
734 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
735 
736 ASG MUL,	INAREG|FOREFF|FORCC,
737 	SAREG|AWD,	TUNSIGNED|TINT,
738 	SAREG|AWD,	TUNSIGNED,
739 		NAREG|NEVEN,	RLEFT|RESCC,
740 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
741 
742 ASG OPMUL,	INAREG|FOREFF|FORCC,
743 	SAREG|AWD,	TWORD,
744 	SAREG|AWD,	TWORD,
745 		0,	RLEFT|RESCC,
746 		"	OL2	AR,AL\n",
747 
748 MUL,	INAREG|INTAREG|FORCC,
749 	STAREG,		TUNSIGNED,
750 	SAREG|AWD,	TUNSIGNED,
751 		NAREG|NEVEN,	RLEFT|RESCC,
752 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
753 
754 OPMUL,	INAREG|INTAREG|FORCC,
755 	STAREG,		TWORD,
756 	SAREG|AWD,	TWORD,
757 		0,	RLEFT|RESCC,
758 		"	OL2	AR,AL\n",
759 
760 MUL,	INAREG|INTAREG|FORCC,
761 	SAREG|AWD,	TUNSIGNED,
762 	SAREG|AWD,	TUNSIGNED,
763 		NAREG|NEVEN,	RESC1|RESCC,
764 		"	emul	AR,AL,$0,A1\n	movl	U1,A1\n",
765 
766 OPMUL,	INAREG|INTAREG|FORCC,
767 	SAREG|AWD,	TWORD,
768 	SAREG|AWD,	TWORD,
769 		NAREG|NASL|NASR,	RESC1|RESCC,
770 		"	OL3	AR,AL,A1\n",
771 
772 #ifdef REG_CHAR
773 ASG PLUS,	INAREG|FOREFF|FORCC,
774 	SAREG,	TWORD,
775 	SONE,	TINT,
776 		0,	RLEFT|RESCC,
777 		"	incZL	AL\n",
778 
779 ASG PLUS,	INAREG|FOREFF|FORCC,
780 	AWD,	ANYFIXED,
781 	SONE,	TINT,
782 		0,	RLEFT|RESCC,
783 		"	incZL	AL\n",
784 
785 ASG MINUS,	INAREG|FOREFF|FORCC,
786 	SAREG,	TWORD,
787 	SONE,	TINT,
788 		0,	RLEFT|RESCC,
789 		"	decZL	AL\n",
790 
791 ASG MINUS,	INAREG|FOREFF|FORCC,
792 	AWD,	ANYFIXED,
793 	SONE,	TINT,
794 		0,	RLEFT|RESCC,
795 		"	decZL	AL\n",
796 #else
797 ASG PLUS,       INAREG|FOREFF|FORCC,
798 	SAREG|AWD,	ANYFIXED,
799 	SONE,	TANY,
800 		0,	RLEFT|RESCC,
801 		"	incZL	AL\n",
802 
803 ASG MINUS,       INAREG|FOREFF|FORCC,
804 	SAREG|AWD,	ANYFIXED,
805 	SONE,	TANY,
806 		0,	RLEFT|RESCC,
807 		"	decZL	AL\n",
808 #endif
809 
810 PLUS,	INAREG|INTAREG|FORCC,
811 	STAREG,	TWORD,
812 	SONE,	TWORD,
813 		0,	RLEFT|RESCC,
814 		"	incZL	AL\n",
815 
816 MINUS,	INAREG|INTAREG|FORCC,
817 	STAREG,	TWORD,
818 	SONE,	TWORD,
819 		0,	RLEFT|RESCC,
820 		"	decZL	AL\n",
821 
822 ASG OPSIMP,	INAREG|FOREFF|FORCC,
823 	SAREG|AWD,	TWORD,
824 	SAREG|AWD,	TWORD,
825 		0,	RLEFT|RESCC,
826 		"	OL2	AR,AL\n",
827 
828 ASG OPSIMP,	INAREG|FOREFF|FORCC,
829 	SAREG,	TWORD,
830 	SAREG,	TSHORT|TUSHORT|TCHAR|TUCHAR,
831 		0,	RLEFT|RESCC,
832 		"	OL2	AR,AL\n",
833 
834 ASG OPSIMP,	INAREG|FOREFF|FORCC,
835 	AWD,	TSHORT|TUSHORT,
836 	SAREG|AWD,	TSHORT|TUSHORT,
837 		0,	RLEFT|RESCC,
838 		"	OW2	AR,AL\n",
839 
840 ASG OPSIMP,	INAREG|FOREFF|FORCC,
841 	AWD,	TSHORT|TUSHORT,
842 	SSCON,	TWORD,
843 		0,	RLEFT|RESCC,
844 		"	OW2	AR,AL\n",
845 
846 ASG OPSIMP,	INAREG|FOREFF|FORCC,
847 	AWD,	TCHAR|TUCHAR,
848 	SAREG|AWD,	TCHAR|TUCHAR,
849 		0,	RLEFT|RESCC,
850 		"	OB2	AR,AL\n",
851 
852 ASG OPSIMP,	INAREG|FOREFF|FORCC,
853 	AWD,	TCHAR|TUCHAR,
854 	SCCON,	TWORD,
855 		0,	RLEFT|RESCC,
856 		"	OB2	AR,AL\n",
857 
858 OPSIMP,	INAREG|INTAREG|FORCC,
859 	STAREG,	ANYFIXED,
860 	SAREG|AWD,	TWORD,
861 		0,	RLEFT|RESCC,
862 		"	OL2	AR,AL\n",
863 
864 OPSIMP,	INAREG|INTAREG|FORCC,
865 	SAREG|AWD,	TWORD,
866 	SAREG|AWD,	TWORD,
867 		NAREG|NASL|NASR,	RESC1|RESCC,
868 		"	OL3	AR,AL,A1\n",
869 
870 ASG OPSIMP,	INAREG|FOREFF,
871 	SAREG|AWD,	TFLOAT|TDOUBLE,
872 	SZERO,	TANY,
873 		0,	RLEFT,
874 		"",
875 
876 ASG MUL,	INAREG|FOREFF|FORCC,
877 	SIREG,	TDOUBLE,
878 	SZERO,	TANY,
879 		0,	RLEFT|RESCC,
880 		"	cvld	$0\n	std	AL\n",
881 
882 ASG MUL,	INAREG|FOREFF|FORCC,
883 	SAREG|SNAME|SOREG,	TDOUBLE,
884 	SZERO,	TANY,
885 		0,	RLEFT|RESCC,
886 		"	clrl	UL\n	clrl	AL\n",
887 
888 ASG MUL,	INAREG|FOREFF|FORCC,
889 	SAREG|AWD,	TFLOAT,
890 	SZERO,	TANY,
891 		0,	RLEFT|RESCC,
892 		"	clrl	TAL\n",
893 
894 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
895 	SAREG|AWD,	TFLOAT,
896 	SAREG|AWD,	TFLOAT,
897 		0,	RLEFT|RESCC,
898 		"	ldf	AL\n	OF	AR\n	stf	TAL\n",
899 
900 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
901 	SAREG|AWD,	TDOUBLE,
902 	SAREG|AWD,	TDOUBLE,
903 		0,	RLEFT|RESCC,
904 		"	ldd	AL\n	OD	AR\n	std	AL\n",
905 
906 ASG PLUS,	INAREG|FOREFF|FORCC,
907 	SAREG|AWD,	TDOUBLE,
908 	SAREG|AWD,	TFLOAT,
909 		NAREG|NASL,	RLEFT|RESCC,
910 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
911 
912 ASG MUL,	INAREG|FOREFF|FORCC,
913 	SAREG|AWD,	TDOUBLE,
914 	SAREG|AWD,	TFLOAT,
915 		NAREG|NASL,	RLEFT|RESCC,
916 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
917 
918 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
919 	SAREG|AWD,	TDOUBLE,
920 	SAREG|AWD,	TFLOAT,
921 		NAREG|NASL,	RLEFT|RESCC,
922 		"	ldfd	AR\n	std	A1\n	ldd	AL\n	OD	A1\n	std	AL\n",
923 
924 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
925 	SAREG|AWD,	TFLOAT,
926 	SAREG|AWD,	TDOUBLE,
927 		0,	RLEFT|RESCC,
928 		"	ldfd	AL\n	OD	AR\n	cvdf\n	stf	TAL\n",
929 
930 ASG OPFLOAT,	INAREG|FOREFF,
931 	SAREG|AWD,	ANYFIXED,
932 	SAREG|AWD,	TFLOAT|TDOUBLE,
933 		NAREG,	RLEFT|RESCC,	/* usable() knows we may need a reg pair */
934 		"	ZG\n",
935 
936 OPSIMP,	INAREG|INTAREG,
937 	SAREG,	TFLOAT|TDOUBLE,
938 	SZERO,	TANY,
939 		0,	RLEFT,
940 #if defined(FORT) || defined(SPRECC)
941 		"T",
942 #else
943 		"",
944 #endif
945 
946 OPSIMP,	INAREG|INTAREG|FORCC,
947 	AWD,	TFLOAT,
948 	SZERO,	TANY,
949 		NAREG,	RESC1|RESCC,
950 		"	movl	AL,A1\n",
951 
952 OPSIMP,	INAREG|INTAREG|FORCC,
953 	AWD,	TDOUBLE,
954 	SZERO,	TANY,
955 		NAREG,	RESC1|RESCC,
956 		"	movl	UL,U1\n	movl	AL,A1\n",
957 
958 MUL,	INAREG|INTAREG|FORCC,
959 	SAREG|AWD,	TDOUBLE,
960 	SZERO,	TANY,
961 		NAREG|NASR,	RESC1|RESCC,
962 		"	clrl	U1\n	clrl	A1\n",
963 
964 MUL,	INAREG|INTAREG|FORCC,
965 	SAREG|AWD,	TFLOAT,
966 	SZERO,	TANY,
967 		NAREG|NASR,	RESC1|RESCC,
968 		"	clrl	TA1\n",
969 
970 OPFLOAT,	INAREG|INTAREG|FORCC,
971 	SAREG|AWD,	TFLOAT,
972 	SAREG|AWD,	TFLOAT,
973 		NAREG|NASL|NASR,	RESC1|RESCC,
974 		"	ldf	AL\n	OF	AR\n	stf	TA1\n",
975 
976 OPFLOAT,	INAREG|INTAREG|FORCC,
977 	SZERO,		TANY,
978 	SAREG|AWD,	TDOUBLE,
979 		NAREG,	RESC1|RESCC,
980 		"\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
981 
982 OPFLOAT,	INAREG|INTAREG|FORCC,
983 	SAREG|AWD,	TDOUBLE,
984 	SAREG|AWD,	TDOUBLE,
985 		NAREG|NASL|NASR,	RESC1|RESCC,
986 		"	ldd	AL\n	OD	AR\n	std	A1\n",
987 
988 	/* Default actions for hard trees ... */
989 
990 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
991 
992 UNARY MUL, DF( UNARY MUL ),
993 
994 INCR, DF(INCR),
995 
996 DECR, DF(INCR),
997 
998 ASSIGN, DF(ASSIGN),
999 
1000 STASG, DF(STASG),
1001 
1002 FLD, DF(FLD),
1003 
1004 OPLEAF, DF(NAME),
1005 
1006 OPLOG,	FORCC,
1007 	SANY,	TANY,
1008 	SANY,	TANY,
1009 		REWRITE,	BITYPE,
1010 		"",
1011 
1012 OPLOG,	DF(NOT),
1013 
1014 COMOP, DF(COMOP),
1015 
1016 INIT, DF(INIT),
1017 
1018 OPUNARY, DF(UNARY MINUS),
1019 
1020 
1021 ASG OPANY, DF(ASG PLUS),
1022 
1023 OPANY, DF(BITYPE),
1024 
1025 FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" };
1026