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