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