xref: /csrg-svn/old/pcc/ccom.tahoe/table.c (revision 33392)
1 #ifndef lint
2 static char sccsid[] = "@(#)table.c	1.19 (Berkeley) 01/25/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 /* beware -- the ediv remainder operand must be a register */
742 ASG MOD,	INAREG|FOREFF,
743 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
744 	SAREG|AWD,	TINT|TLONG,
745 		NAREG|NEVEN,	RLEFT|RESCC,
746 		"	ZM	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
747 
748 ASG MOD,	INAREG|FOREFF,
749 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
750 	SMCON,	ANYUSIGNED,
751 		0,	RLEFT,
752 		"	ZJ\n",
753 
754 ASG MOD,	INAREG|FOREFF,
755 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
756 	SCON,	ANYUSIGNED,
757 		NAREG|NEVEN,	RLEFT,
758 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
759 
760 /* XXX is this supposed to help on overflow? */
761 ASG MUL,	INAREG|FOREFF|FORCC,
762 	SAREG|AWD,	TUNSIGNED,
763 	SAREG|AWD,	TUNSIGNED|TINT,
764 		NAREG|NEVEN,	RLEFT|RESCC,
765 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
766 
767 ASG MUL,	INAREG|FOREFF|FORCC,
768 	SAREG|AWD,	TUNSIGNED|TINT,
769 	SAREG|AWD,	TUNSIGNED,
770 		NAREG|NEVEN,	RLEFT|RESCC,
771 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
772 
773 ASG OPMUL,	INAREG|FOREFF|FORCC,
774 	SAREG|AWD,	TWORD,
775 	SAREG|AWD,	TWORD,
776 		0,	RLEFT|RESCC,
777 		"	OL2	AR,AL\n",
778 
779 MUL,	INAREG|INTAREG|FORCC,
780 	STAREG,		TUNSIGNED,
781 	SAREG|AWD,	TUNSIGNED,
782 		NAREG|NEVEN,	RLEFT|RESCC,
783 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
784 
785 OPMUL,	INAREG|INTAREG|FORCC,
786 	STAREG,		TWORD,
787 	SAREG|AWD,	TWORD,
788 		0,	RLEFT|RESCC,
789 		"	OL2	AR,AL\n",
790 
791 MUL,	INAREG|INTAREG|FORCC,
792 	SAREG|AWD,	TUNSIGNED,
793 	SAREG|AWD,	TUNSIGNED,
794 		NAREG|NEVEN,	RESC1|RESCC,
795 		"	emul	AR,AL,$0,A1\n	movl	U1,A1\n",
796 
797 OPMUL,	INAREG|INTAREG|FORCC,
798 	SAREG|AWD,	TWORD,
799 	SAREG|AWD,	TWORD,
800 		NAREG|NASL|NASR,	RESC1|RESCC,
801 		"	OL3	AR,AL,A1\n",
802 
803 #ifdef REG_CHAR
804 ASG PLUS,	INAREG|FOREFF|FORCC,
805 	SAREG,	TWORD,
806 	SONE,	TINT,
807 		0,	RLEFT|RESCC,
808 		"	incZL	AL\n",
809 
810 ASG PLUS,	INAREG|FOREFF|FORCC,
811 	AWD,	ANYFIXED,
812 	SONE,	TINT,
813 		0,	RLEFT|RESCC,
814 		"	incZL	AL\n",
815 
816 ASG MINUS,	INAREG|FOREFF|FORCC,
817 	SAREG,	TWORD,
818 	SONE,	TINT,
819 		0,	RLEFT|RESCC,
820 		"	decZL	AL\n",
821 
822 ASG MINUS,	INAREG|FOREFF|FORCC,
823 	AWD,	ANYFIXED,
824 	SONE,	TINT,
825 		0,	RLEFT|RESCC,
826 		"	decZL	AL\n",
827 #else
828 ASG PLUS,       INAREG|FOREFF|FORCC,
829 	SAREG|AWD,	ANYFIXED,
830 	SONE,	TANY,
831 		0,	RLEFT|RESCC,
832 		"	incZL	AL\n",
833 
834 ASG MINUS,       INAREG|FOREFF|FORCC,
835 	SAREG|AWD,	ANYFIXED,
836 	SONE,	TANY,
837 		0,	RLEFT|RESCC,
838 		"	decZL	AL\n",
839 #endif
840 
841 PLUS,	INAREG|INTAREG|FORCC,
842 	STAREG,	TWORD,
843 	SONE,	TWORD,
844 		0,	RLEFT|RESCC,
845 		"	incZL	AL\n",
846 
847 MINUS,	INAREG|INTAREG|FORCC,
848 	STAREG,	TWORD,
849 	SONE,	TWORD,
850 		0,	RLEFT|RESCC,
851 		"	decZL	AL\n",
852 
853 ASG OPSIMP,	INAREG|FOREFF|FORCC,
854 	SAREG|AWD,	TWORD,
855 	SAREG|AWD,	TWORD,
856 		0,	RLEFT|RESCC,
857 		"	OL2	AR,AL\n",
858 
859 ASG OPSIMP,	INAREG|FOREFF|FORCC,
860 	SAREG,	TWORD,
861 	SAREG,	TSHORT|TUSHORT|TCHAR|TUCHAR,
862 		0,	RLEFT|RESCC,
863 		"	OL2	AR,AL\n",
864 
865 ASG OPSIMP,	INAREG|FOREFF|FORCC,
866 	AWD,	TSHORT|TUSHORT,
867 	SAREG|AWD,	TSHORT|TUSHORT,
868 		0,	RLEFT|RESCC,
869 		"	OW2	AR,AL\n",
870 
871 ASG OPSIMP,	INAREG|FOREFF|FORCC,
872 	AWD,	TSHORT|TUSHORT,
873 	SSCON,	TWORD,
874 		0,	RLEFT|RESCC,
875 		"	OW2	AR,AL\n",
876 
877 ASG OPSIMP,	INAREG|FOREFF|FORCC,
878 	AWD,	TCHAR|TUCHAR,
879 	SAREG|AWD,	TCHAR|TUCHAR,
880 		0,	RLEFT|RESCC,
881 		"	OB2	AR,AL\n",
882 
883 ASG OPSIMP,	INAREG|FOREFF|FORCC,
884 	AWD,	TCHAR|TUCHAR,
885 	SCCON,	TWORD,
886 		0,	RLEFT|RESCC,
887 		"	OB2	AR,AL\n",
888 
889 OPSIMP,	INAREG|INTAREG|FORCC,
890 	STAREG,	ANYFIXED,
891 	SAREG|AWD,	TWORD,
892 		0,	RLEFT|RESCC,
893 		"	OL2	AR,AL\n",
894 
895 OPSIMP,	INAREG|INTAREG|FORCC,
896 	SAREG|AWD,	TWORD,
897 	SAREG|AWD,	TWORD,
898 		NAREG|NASL|NASR,	RESC1|RESCC,
899 		"	OL3	AR,AL,A1\n",
900 
901 ASG OPSIMP,	INAREG|FOREFF,
902 	SAREG|AWD,	TFLOAT|TDOUBLE,
903 	SZERO,	TANY,
904 		0,	RLEFT,
905 		"",
906 
907 ASG MUL,	INAREG|FOREFF|FORCC,
908 	SIREG,	TDOUBLE,
909 	SZERO,	TANY,
910 		0,	RLEFT|RESCC,
911 		"	cvld	$0\n	std	AL\n",
912 
913 ASG MUL,	INAREG|FOREFF|FORCC,
914 	SAREG|SNAME|SOREG,	TDOUBLE,
915 	SZERO,	TANY,
916 		0,	RLEFT|RESCC,
917 		"	clrl	UL\n	clrl	AL\n",
918 
919 ASG MUL,	INAREG|FOREFF|FORCC,
920 	SAREG|AWD,	TFLOAT,
921 	SZERO,	TANY,
922 		0,	RLEFT|RESCC,
923 		"	clrl	TAL\n",
924 
925 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
926 	SAREG|AWD,	TFLOAT,
927 	SAREG|AWD,	TFLOAT,
928 		0,	RLEFT|RESCC,
929 		"	ldf	AL\n	OF	AR\n	stf	TAL\n",
930 
931 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
932 	SAREG|AWD,	TDOUBLE,
933 	SAREG|AWD,	TDOUBLE,
934 		0,	RLEFT|RESCC,
935 		"	ldd	AL\n	OD	AR\n	std	AL\n",
936 
937 ASG PLUS,	INAREG|FOREFF|FORCC,
938 	SAREG|AWD,	TDOUBLE,
939 	SAREG|AWD,	TFLOAT,
940 		NAREG|NASL,	RLEFT|RESCC,
941 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
942 
943 ASG MUL,	INAREG|FOREFF|FORCC,
944 	SAREG|AWD,	TDOUBLE,
945 	SAREG|AWD,	TFLOAT,
946 		NAREG|NASL,	RLEFT|RESCC,
947 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
948 
949 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
950 	SAREG|AWD,	TDOUBLE,
951 	SAREG|AWD,	TFLOAT,
952 		NAREG|NASL,	RLEFT|RESCC,
953 		"	ldfd	AR\n	std	A1\n	ldd	AL\n	OD	A1\n	std	AL\n",
954 
955 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
956 	SAREG|AWD,	TFLOAT,
957 	SAREG|AWD,	TDOUBLE,
958 		0,	RLEFT|RESCC,
959 		"	ldfd	AL\n	OD	AR\n	cvdf\n	stf	TAL\n",
960 
961 ASG OPFLOAT,	INAREG|FOREFF,
962 	SAREG|AWD,	ANYFIXED,
963 	SAREG|AWD,	TFLOAT|TDOUBLE,
964 		NAREG,	RLEFT|RESCC,	/* usable() knows we may need a reg pair */
965 		"	ZG\n",
966 
967 OPSIMP,	INAREG|INTAREG,
968 	SAREG,	TFLOAT|TDOUBLE,
969 	SZERO,	TANY,
970 		0,	RLEFT,
971 #if defined(FORT) || defined(SPRECC)
972 		"T",
973 #else
974 		"",
975 #endif
976 
977 OPSIMP,	INAREG|INTAREG|FORCC,
978 	AWD,	TFLOAT,
979 	SZERO,	TANY,
980 		NAREG,	RESC1|RESCC,
981 		"	movl	AL,A1\n",
982 
983 OPSIMP,	INAREG|INTAREG|FORCC,
984 	SIREG,	TDOUBLE,
985 	SZERO,	TANY,
986 		NAREG,	RESC1|RESCC,
987 		"	ldd	AL\n	std	A1\n",
988 
989 OPSIMP,	INAREG|INTAREG|FORCC,
990 	SAREG|SNAME|SOREG,	TDOUBLE,
991 	SZERO,	TANY,
992 		NAREG,	RESC1|RESCC,
993 		"	movl	UL,U1\n	movl	AL,A1\n",
994 
995 MUL,	INAREG|INTAREG|FORCC,
996 	SIREG,	TDOUBLE,
997 	SZERO,	TANY,
998 		NAREG|NASR,	RESC1|RESCC,
999 		"	cvld	$0\n	std	A1\n",
1000 
1001 MUL,	INAREG|INTAREG|FORCC,
1002 	SAREG|SNAME|SOREG,	TDOUBLE,
1003 	SZERO,	TANY,
1004 		NAREG|NASR,	RESC1|RESCC,
1005 		"	clrl	U1\n	clrl	A1\n",
1006 
1007 MUL,	INAREG|INTAREG|FORCC,
1008 	SAREG|AWD,	TFLOAT,
1009 	SZERO,	TANY,
1010 		NAREG|NASR,	RESC1|RESCC,
1011 		"	clrl	TA1\n",
1012 
1013 OPFLOAT,	INAREG|INTAREG|FORCC,
1014 	SAREG|AWD,	TFLOAT,
1015 	SAREG|AWD,	TFLOAT,
1016 		NAREG|NASL|NASR,	RESC1|RESCC,
1017 		"	ldf	AL\n	OF	AR\n	stf	TA1\n",
1018 
1019 OPFLOAT,	INAREG|INTAREG|FORCC,
1020 	SZERO,		TANY,
1021 	SAREG|AWD,	TDOUBLE,
1022 		NAREG,	RESC1|RESCC,
1023 		"\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
1024 
1025 OPFLOAT,	INAREG|INTAREG|FORCC,
1026 	SAREG|AWD,	TDOUBLE,
1027 	SAREG|AWD,	TDOUBLE,
1028 		NAREG|NASL|NASR,	RESC1|RESCC,
1029 		"	ldd	AL\n	OD	AR\n	std	A1\n",
1030 
1031 	/* Default actions for hard trees ... */
1032 
1033 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1034 
1035 UNARY MUL, DF( UNARY MUL ),
1036 
1037 INCR, DF(INCR),
1038 
1039 DECR, DF(INCR),
1040 
1041 ASSIGN, DF(ASSIGN),
1042 
1043 STASG, DF(STASG),
1044 
1045 FLD, DF(FLD),
1046 
1047 OPLEAF, DF(NAME),
1048 
1049 OPLOG,	FORCC,
1050 	SANY,	TANY,
1051 	SANY,	TANY,
1052 		REWRITE,	BITYPE,
1053 		"",
1054 
1055 OPLOG,	DF(NOT),
1056 
1057 COMOP, DF(COMOP),
1058 
1059 INIT, DF(INIT),
1060 
1061 OPUNARY, DF(UNARY MINUS),
1062 
1063 
1064 ASG OPANY, DF(ASG PLUS),
1065 
1066 OPANY, DF(BITYPE),
1067 
1068 FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" };
1069