xref: /original-bsd/old/pcc/ccom.tahoe/table.c (revision 048a349a)
1 #ifndef lint
2 static char sccsid[] = "@(#)table.c	1.24 (Berkeley) 07/14/88";
3 #endif
4 
5 # include "pass2.h"
6 /* special shapes (SSOREG,SZERO etc.) shouldn't be or-ed */
7 # define AWD SNAME|SOREG|SCON|STARNM|STARREG
8 /* tbl */
9 # define ANYSIGNED TPOINT|TINT|TSHORT|TCHAR
10 # define ANYUSIGNED TUNSIGNED|TUSHORT|TUCHAR
11 # define ANYFIXED ANYSIGNED|ANYUSIGNED
12 # define TWORD TINT|TUNSIGNED|TPOINT
13 /* tbl */
14 
15 struct optab  table[] = {
16 
17 #ifdef REG_CHAR
18 PCONV,	INAREG|INTAREG,
19 	SAREG|AWD,	TCHAR|TSHORT,
20 	SANY,	TPOINT,
21 		NAREG|NASL,	RESC1,
22 		"	cvtZLl	AL,A1\n",
23 
24 PCONV,	INAREG|INTAREG,
25 	SAREG|AWD,	TUCHAR|TUSHORT,
26 	SANY,	TPOINT,
27 		NAREG|NASL,	RESC1,
28 		"	movzZLl	AL,A1\n",
29 #endif
30 
31 	/* the following entry is to fix a problem with
32 	   the manner that the first pass handles the
33 	   type of a shift expression                 */
34 PCONV,	INAREG|INTAREG,
35 	SAREG|AWD,	TINT|TUNSIGNED,
36 	SANY,	TPOINT,
37 		NAREG|NASL,	RLEFT,
38 		"",
39 
40 /* take care of redundant conversions introduced by reclaim() */
41 SCONV,	INAREG|INTAREG,
42 	STAREG,	TWORD,
43 	SANY,	TWORD,
44 		0,	RLEFT,
45 		"",
46 
47 SCONV,	INAREG|INTAREG,
48 	SAREG|AWD,	ANYFIXED,
49 	SANY,	ANYFIXED,
50 		NAREG|NASL,	RESC1,
51 		"	ZU\n",
52 
53 SCONV,	FORCC,
54 	SAREG|AWD,	ANYFIXED,
55 	SANY,	ANYFIXED,
56 		NAREG|NASL,	RESCC,
57 		"	ZV\n",
58 
59 SCONV,	INAREG|INTAREG|FORCC,
60 	SAREG|AWD,	TDOUBLE,
61 	SANY,	TFLOAT,
62 		NAREG|NASL,	RESC1|RESCC,
63 		"	ldd	AL\n	cvdf\n	stf	TA1\n",
64 
65 SCONV,	INAREG|INTAREG|FORCC,
66 	SAREG|AWD,	TFLOAT,
67 	SANY,	TDOUBLE,
68 		NAREG|NASL,	RESC1|RESCC,
69 		"	ldfd	AL\n	std	A1\n",
70 
71 SCONV,	INAREG|INTAREG|FORCC,
72 	SAREG|AWD,	TINT,
73 	SANY,	TFLOAT|TDOUBLE,
74 		NAREG|NASL,	RESC1|RESCC,
75 		"	cvlZR	AL\n	stZR	TA1\n",
76 
77 /* the hard stuff */
78 /* XXX how about TUCHAR|TUSHORT to TFLOAT|TDOUBLE? */
79 SCONV,	INAREG|INTAREG|FORCC,
80 	SAREG|AWD,	TUNSIGNED,
81 	SANY,	TFLOAT|TDOUBLE,
82 		NAREG|NASL,	RESC1|RESCC,
83 		"	ZY\n",
84 
85 SCONV,	INAREG|INTAREG|FORCC,
86 	SAREG|AWD,	TFLOAT|TDOUBLE,
87 	SANY,	ANYUSIGNED,
88 		NAREG|NASL,	RESC1|RESCC,
89 		"	ZW\n",
90 
91 /* XXX need to trim significance here? */
92 SCONV,	INAREG|INTAREG|FORCC,
93 	SAREG|AWD,	TFLOAT|TDOUBLE,
94 	SANY,	ANYSIGNED,
95 		NAREG|NASL,	RESC1|RESCC,
96 		"	ldZL	AL\n	cvZLl	A1\n",
97 
98 INIT,	FOREFF,
99 	SCON,	TANY,
100 	SANY,	TWORD,
101 		0,	RNOP,
102 		"	.long	CL\n",
103 
104 INIT,	FOREFF,
105 	SCON,	TANY,
106 	SANY,	TSHORT|TUSHORT,
107 		0,	RNOP,
108 		"	.word	CL\n",
109 
110 INIT,	FOREFF,
111 	SCON,	TANY,
112 	SANY,	TCHAR|TUCHAR,
113 		0,	RNOP,
114 		"	.byte	CL\n",
115 
116 #ifdef FORT
117 	/* for the use of fortran only */
118 
119 GOTO,	FOREFF,
120 	SCON,	TANY,
121 	SANY,	TANY,
122 		0,	RNOP,
123 		"	jbr	CL\n",
124 #endif
125 
126 GOTO,	FOREFF,
127 	AWD,	TANY,
128 	SANY,	TANY,
129 		0,	RNOP,
130 		"	jmp	*AL\n",
131 
132 GOTO,	FOREFF,
133 	SAREG,	TANY,
134 	SANY,	TANY,
135 		0,	RNOP,
136 		"	jmp	(AL)\n",
137 
138 STARG,	FORARG,
139 	SCON|SOREG,	TANY,
140 	SANY,	TANY,
141 		NTEMP+2*NAREG,	RESC3,
142 		"ZS",
143 
144 STASG,	FORARG,
145 	SNAME|SOREG,	TANY,
146 	SCON|SAREG,	TANY,
147 		0,	RNULL,
148 		"	ZT\nZS",
149 
150 STASG,	FOREFF,
151 	SNAME|SOREG,	TANY,
152 	SCON|SAREG,	TANY,
153 		0,	RNOP,
154 		"ZS",
155 
156 STASG,	INAREG,
157 	SNAME|SOREG,	TANY,
158 	SCON,	TANY,
159 		NAREG,	RESC1,
160 		"ZS	movl	AR,A1\n",
161 
162 STASG,	INAREG,
163 	SNAME|SOREG,	TANY,
164 	SAREG,	TANY,
165 		0,	RRIGHT,
166 		"	pushl	AR\nZS	movl	(sp)+,AR\n",
167 
168 OPLOG,	FORCC,
169 	SAREG|AWD,	TWORD,
170 	SAREG|AWD,	TWORD,
171 		0,	RESCC,
172 		"	cmpl	AL,AR\nZP",
173 
174 /* more grot: constants in unsigned char/short comparisons sign-extend */
175 /* optim2() ensures that SCCON/SSCON iff high bit is not set */
176 OPLOG,	FORCC,
177 	SAREG|AWD,	TUCHAR,
178 	SCCON,	TANY,
179 		0,	RESCC,
180 		"	cmpZL	AL,AR\nZP",
181 
182 OPLOG,	FORCC,
183 	AWD,		TUCHAR,
184 	SCON,	TANY,
185 		NAREG,	RESCC,
186 		"	movzZLl	AL,A1\n	cmpl	A1,AR\nZP",
187 
188 OPLOG,	FORCC,
189 	SAREG|AWD,	TUSHORT,
190 	SSCON,	TANY,
191 		0,	RESCC,
192 		"	cmpZL	AL,AR\nZP",
193 
194 OPLOG,	FORCC,
195 	AWD,		TUSHORT,
196 	SCON,	TANY,
197 		NAREG,	RESCC,
198 		"	movzZLl	AL,A1\n	cmpl	A1,AR\nZP",
199 
200 /* optim2() handles degenerate comparisons with constants */
201 OPLOG,	FORCC,
202 	SAREG|AWD,	TCHAR|TSHORT,
203 	SCON,	TANY,
204 		0,	RESCC,
205 		"	cmpZL	AL,AR\nZP",
206 
207 OPLOG,	FORCC,
208 	SAREG|AWD,	TSHORT,
209 	SAREG|AWD,	TSHORT,
210 		0,	RESCC,
211 		"	cmpw	AL,AR\nZP",
212 
213 OPLOG,	FORCC,
214 	SAREG|AWD,	TUSHORT,
215 	SAREG|AWD,	TUSHORT,
216 		0,	RESCC,
217 		"	cmpw	AL,AR\nZP",
218 
219 OPLOG,	FORCC,
220 	SAREG|AWD,	TCHAR,
221 	SAREG|AWD,	TCHAR,
222 		0,	RESCC,
223 		"	cmpb	AL,AR\nZP",
224 
225 OPLOG,	FORCC,
226 	SAREG|AWD,	TUCHAR,
227 	SAREG|AWD,	TUCHAR,
228 		0,	RESCC,
229 		"	cmpb	AL,AR\nZP",
230 
231 OPLOG,	FORCC,
232 	SAREG|AWD,	TFLOAT,
233 	SAREG|AWD,	TFLOAT,
234 		0,	RESCC,
235 		"	cmpZL2	AL,AR\nZP",
236 
237 OPLOG,	FORCC,
238 	SZERO,		TDOUBLE,
239 	SAREG|AWD,	TDOUBLE,
240 		0,	RESCC,
241 		"	cmpf2	AL,AR\nZP",
242 
243 OPLOG,	FORCC,
244 	SAREG|AWD,	TDOUBLE,
245 	SAREG|AWD,	TDOUBLE,
246 		0,	RESCC,
247 		"	cmpZL2	AL,AR\nZP",
248 
249 #ifdef FORT
250 /* some implicit conversions made explicit to help f77 out (sigh) */
251 OPLOG,	FORCC,
252 	SAREG|AWD,	TFLOAT,
253 	SAREG|AWD,	TDOUBLE,
254 		0,	RESCC,
255 		"	ldfd	AL\n	cmpd	AR\nZP",
256 
257 /* ought to flip this comparison, save an instruction */
258 OPLOG,	FORCC,
259 	SAREG|AWD,	TDOUBLE,
260 	SAREG|AWD,	TFLOAT,
261 		NAREG|NEVEN|NASR,	RESCC,
262 		"	ldfd	AR\n	std	A1\n	cmpd2	AL,A1\nZP",
263 #endif
264 
265 CCODES,	INAREG|INTAREG,
266 	SANY,	TANY,
267 	SANY,	TANY,
268 		NAREG,	RESC1,
269 		"	movl	$1,A1\nZN",
270 
271 UNARY CALL,	INAREG|INTAREG,
272 	SCON,	TANY,
273 	SANY,	TANY,
274 		NAREG|NASL,	RESC1, /* should be register 0 */
275 		"	ZC,CL\n",
276 
277 UNARY CALL,	INAREG|INTAREG,
278 	SAREG,	TANY,
279 	SANY,	TANY,
280 		NAREG|NASL,	RESC1,	/* should be 0 */
281 		"	ZC,(AL)\n",
282 
283 UNARY CALL,	INAREG|INTAREG,
284 	SNAME,	TANY,
285 	SANY,	TANY,
286 		NAREG|NASL,	RESC1,	/* really reg 0 */
287 		"	ZC,*AL\n",
288 
289 UNARY CALL,	INAREG|INTAREG,
290 	SSOREG,	TANY,
291 	SANY,	TANY,
292 		NAREG|NASL,	RESC1,	/* really reg 0 */
293 		"	ZC,*AL\n",
294 
295 FORTCALL,	INAREG|INTAREG,
296 	SCON,	TANY,
297 	SAREG|AWD,	TFLOAT,
298 		NAREG|NASL|NASR,	RESC1,
299 		"	ldf	AR\n	CLf\n	stf	TA1\n",
300 
301 ASG OPSHFT,	INAREG|FOREFF|FORCC,
302 	SAREG|AWD,	TWORD,
303 	SAREG|SCON,	ANYFIXED,
304 		0,	RLEFT|RESCC,
305 		"	ZH	AR,AL,AL\n",
306 
307 ASG OPSHFT,	INAREG|FOREFF|FORCC,
308 	SAREG|AWD,	TWORD,
309 	AWD,	TCHAR|TUCHAR,
310 		0,	RLEFT|RESCC,
311 		"	ZH	AR,AL,AL\n",
312 
313 ASG OPSHFT,	INAREG|FOREFF|FORCC,
314 	SAREG|AWD,	TWORD,
315 	AWD,	ANYFIXED,
316 		NAREG,	RLEFT|RESCC,
317 		"	ZB	AR,A1\n	ZH	A1,AL,AL\n",
318 
319 OPSHFT,	INAREG|INTAREG|FORCC,
320 	SAREG|AWD,	TWORD,
321 	SAREG|SCON,	ANYFIXED,
322 		NAREG|NASL|NASR,	RESC1|RESCC,
323 		"	ZH	AR,AL,A1\n",
324 
325 OPSHFT,	INAREG|INTAREG|FORCC,
326 	SAREG|AWD,	TWORD,
327 	AWD,	TCHAR|TUCHAR,
328 		NAREG|NASL|NASR,	RESC1|RESCC,
329 		"	ZH	AR,AL,A1\n",
330 
331 OPSHFT,	INAREG|INTAREG|FORCC,
332 	SAREG|AWD,	TWORD,
333 	AWD,	ANYFIXED,
334 		NAREG|NASR,	RESC1|RESCC,
335 		"	ZB	AR,A1\n	ZH	A1,AL,A1\n",
336 
337 INCR,	FOREFF,
338 	SAREG|AWD,	TANY,
339 	SCON|SNAME,	TANY,
340 		0,	RLEFT,
341 		"	ZE\n",
342 
343 DECR,	FOREFF,
344 	SAREG|AWD,	TANY,
345 	SCON|SNAME,	TANY,
346 		0,	RLEFT,
347 		"	ZE\n",
348 
349 INCR,	INAREG|INTAREG,
350 	SAREG|AWD,	TANY,
351 	SCON|SNAME,	TANY,
352 		NAREG,	RESC1,
353 		"	ZD\n",
354 
355 DECR,	INAREG|INTAREG,
356 	SAREG|AWD,	TANY,
357 	SCON|SNAME,	TANY,
358 		NAREG,	RESC1,
359 		"	ZD\n",
360 
361 ASSIGN,	INAREG|FOREFF,
362 	SAREG|AWD,	ANYFIXED,
363 	SAREG|AWD,	ANYFIXED,
364 		0,	RLEFT,
365 		"	ZU\n",
366 
367 ASSIGN,	FORCC,
368 	SAREG|AWD,	ANYFIXED,
369 	SAREG|AWD,	ANYFIXED,
370 		0,	RESCC,
371 		"	ZV\n",
372 
373 ASSIGN,	INAREG|FOREFF|FORCC,
374 	SIREG,	TDOUBLE,
375 	SZERO,	TANY,
376 		0,	RLEFT|RESCC,
377 		"	cvld	$0\n	std	AL\n",
378 
379 ASSIGN,	INAREG|FOREFF|FORCC,
380 	SAREG|SNAME|SOREG,	TDOUBLE,
381 	SZERO,	TANY,
382 		0,	RLEFT|RESCC,
383 		"	clrl	UL\n	clrl	AL\n",
384 
385 ASSIGN,	INAREG|FOREFF|FORCC,
386 	SAREG|AWD,	TDOUBLE,
387 	SIREG,	TDOUBLE,
388 		0,	RLEFT|RRIGHT|RESCC,
389 		"	ldd	AR\n	std	AL\n",
390 
391 ASSIGN,	INAREG|FOREFF|FORCC,
392 	SIREG,	TDOUBLE,
393 	SAREG|AWD,	TDOUBLE,
394 		0,	RLEFT|RRIGHT|RESCC,
395 		"	ldd	AR\n	std	AL\n",
396 
397 ASSIGN,	INAREG|FOREFF|FORCC,
398 	SAREG|SNAME|SOREG,	TDOUBLE,
399 	SAREG|SNAME|SOREG,	TDOUBLE,
400 		0,	RLEFT|RRIGHT|RESCC,
401 		"	movl	UR,UL\n	movl	AR,AL\n",
402 
403 ASSIGN,	INAREG|FOREFF|FORCC,
404 	SAREG|AWD,	TDOUBLE,
405 	STARNM,	TDOUBLE,
406 		0,	RLEFT|RRIGHT|RESCC,
407 		"	ldd	AR\n	std	AL\n",
408 
409 ASSIGN,	INAREG|FOREFF|FORCC,
410 	STARNM,	TDOUBLE,
411 	SAREG|AWD,	TDOUBLE,
412 		0,	RLEFT|RRIGHT|RESCC,
413 		"	ldd	AR\n	std	AL\n",
414 
415 ASSIGN,	INAREG|FOREFF|FORCC,
416 	SAREG|AWD,	TFLOAT,
417 	SZERO,	TANY,
418 		0,	RLEFT|RESCC,
419 		"	clrl	TAL\n",
420 
421 ASSIGN,	INAREG|FOREFF|FORCC,
422 	SAREG|AWD,	TFLOAT,
423 	SAREG|AWD,	TFLOAT,
424 		0,	RLEFT|RRIGHT|RESCC,
425 		"	movl	AR,TAL\n",
426 
427 ASSIGN,	INAREG|FOREFF|FORCC,
428 	SAREG|AWD,	TFLOAT,
429 	SAREG|AWD,	TDOUBLE,
430 		0,	RLEFT|RESCC,
431 		"	ldd	AR\n	cvdf\n	stf	AL\n",
432 
433 ASSIGN,	INAREG|FOREFF|FORCC,
434 	SAREG|AWD,	TDOUBLE,
435 	SAREG|AWD,	TFLOAT,
436 		0,	RLEFT|RESCC,
437 		"	ldfd	AR\n	std	AL\n",
438 
439 ASSIGN,	INAREG|FOREFF|FORCC,
440 	SAREG|AWD,	TFLOAT|TDOUBLE,
441 	SAREG|AWD,	TINT,
442 		0,	RLEFT|RESCC,
443 		"	cvlZL	AR\n	stZL	AL\n",
444 
445 /* XXX need to trim significance here? */
446 ASSIGN,	INAREG|FOREFF|FORCC,
447 	SAREG|AWD,	TINT,
448 	SAREG|AWD,	TFLOAT|TDOUBLE,
449 		0,	RLEFT|RESCC,
450 		"	ldZR	AR\n	cvZRl	AL\n",
451 
452 /* unfortunately assignments are exempt from type balancing */
453 ASSIGN,	INAREG|FOREFF|FORCC,
454 	SAREG|AWD,	TCHAR|TUCHAR|TSHORT|TUSHORT,
455 	SAREG|AWD,	TFLOAT|TDOUBLE,
456 		NAREG|NASR,	RLEFT|RESCC,
457 		"	ldZR	AR\n	cvZRl	A1\n	cvtlZL	A1,AL\n",
458 
459 ASSIGN,	INAREG|FOREFF|FORCC,
460 	SAREG|AWD,	TFLOAT|TDOUBLE,
461 	SAREG|AWD,	TCHAR|TSHORT,
462 		NAREG|NASR,	RLEFT|RESCC,
463 		"	cvtZRl	AR,A1\n	cvlZL	A1\n	stZL	AL\n",
464 
465 ASSIGN,	INAREG|FOREFF|FORCC,
466 	SAREG|AWD,	TFLOAT|TDOUBLE,
467 	SAREG|AWD,	TUCHAR|TUSHORT,
468 		NAREG|NASR,	RLEFT|RESCC,
469 		"	movzZRl	AR,A1\n	cvlZL	A1\n	stZL	AL\n",
470 
471 ASSIGN, INAREG|FOREFF|FORCC,
472 	SAREG|AWD,	TUNSIGNED,
473 	SAREG|AWD,	TFLOAT|TDOUBLE,
474 		0,	RLEFT|RESCC,
475 		"	ZW\n",
476 
477 ASSIGN, INAREG|FOREFF|FORCC,
478 	SAREG|AWD,	TFLOAT|TDOUBLE,
479 	SAREG|AWD,	TUNSIGNED,
480 		0,	RLEFT|RESCC,
481 		"	ZY\n",
482 
483 ASSIGN,	INAREG|FOREFF,
484 	SFLD,	TANY,
485 	SZERO,	TANY,
486 		0,	RRIGHT,
487 		"	andl2	N,AL\n",
488 
489 ASSIGN,	FOREFF,
490 	SFLD,	TANY,
491 	SCON,	TANY,
492 		0,	RNOP,
493 		"	andl2	N,AL\n	orl2	ZF,AL\n",
494 
495 ASSIGN,	INAREG,
496 	SFLD,	TANY,
497 	SCON,	TANY,
498 		NAREG,	RESC1,
499 		"	andl2	N,AL\n	orl2	ZF,AL\n	ZI\n",
500 
501 ASSIGN,	FOREFF,
502 	SFLD,	TANY,
503 	SAREG|AWD,	TWORD,
504 		NAREG|NASR,	RNOP,
505 		"	shll	$H,AR,A1\n	andl2	M,A1\n	andl2	N,AL\n\
506 	orl2	A1,AL\n",
507 
508 ASSIGN,	INAREG,
509 	SFLD,	TANY,
510 	SAREG|AWD,	TWORD,
511 		NAREG,	RESC1,
512 		"	shll	$H,AR,A1\n	andl2	M,A1\n	andl2	N,AL\n\
513 	orl2	A1,AL\n	ZI\n",
514 
515 /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
516 UNARY MUL,	FOREFF,
517 	SCC,	TANY,
518 	SCC,	TANY,
519 		0,	RNULL,
520 		"	help help help\n",
521 
522 REG,	INTEMP,
523 	SANY,	TANY,
524 	SAREG,	TDOUBLE,
525 		2*NTEMP,	RESC1,
526 		"	movl	UR,U1\n	movl	AR,A1\n",
527 
528 REG,	INTEMP,
529 	SANY,	TANY,
530 	SAREG,	TANY,
531 		NTEMP,	RESC1,
532 		"	movl	AR,A1\n",
533 
534 REG,	FORARG,
535 	SANY,	TANY,
536 	SAREG,	TFLOAT,
537 		0,	RNULL,
538 		"	pushl	$0\n	pushl	AR\n",
539 
540 REG,	FORARG,
541 	SANY,	TANY,
542 	SAREG,	TDOUBLE,
543 		0,	RNULL,
544 		"	pushl	UR\n	pushl	AR\n",
545 
546 OREG,	INTEMP,
547 	SANY,	TANY,
548 	SOREG,	TWORD|TFLOAT,
549 		NTEMP,	RESC1,
550 		"	movl	AR,A1\n",
551 
552 OREG,	INTEMP,
553 	SANY,	TANY,
554 	SIREG,	TDOUBLE,
555 		2*NTEMP,	RESC1,
556 		"	ldd	UR\n	std	A1\n",
557 
558 OREG,	INTEMP,
559 	SANY,	TANY,
560 	SOREG,	TDOUBLE,
561 		2*NTEMP,	RESC1,
562 		"	movl	UR,U1\n	movl	AR,A1\n",
563 
564 OREG,	INTEMP,
565 	SANY,	TANY,
566 	SOREG,	TANY,
567 		NTEMP,	RESC1,
568 		"	movZR	AR,A1\n",
569 
570 OPLEAF,	FOREFF,
571 	SANY,	TANY,
572 	SAREG|AWD,	TANY,
573 		0,	RLEFT,
574 		"",
575 
576 OPLTYPE,	INAREG|INTAREG,
577 	SANY,	TANY,
578 	SZERO,	TDOUBLE,
579 		NAREG|NASR,	RESC1,
580 		"	clrl	U1\n	clrl	A1\n",
581 
582 OPLTYPE,	INAREG|INTAREG,
583 	SANY,	TANY,
584 	SIREG,	TDOUBLE,
585 		NAREG|NASR,	RESC1,
586 		"	ldd	AR\n	std	A1\n",
587 
588 OPLTYPE,	INAREG|INTAREG,
589 	SANY,	TANY,
590 	SAREG|SNAME|SOREG|SCON,	TDOUBLE,
591 		NAREG,		RESC1,
592 		"	movl	AR,A1\n	movl	UR,U1\n",
593 
594 OPLTYPE,	INAREG|INTAREG,
595 	SANY,	TANY,
596 	STARNM,	TDOUBLE,
597 		NAREG|NASR,	RESC1,
598 		"	ldd	AR\n	std	A1\n",
599 
600 OPLTYPE,	INAREG|INTAREG,
601 	SANY,	TANY,
602 	SZERO,	TANY,
603 		NAREG|NASR,	RESC1,
604 		"	clrl	TA1\n",
605 
606 OPLTYPE,	INAREG|INTAREG,
607 	SANY,	TANY,
608 	SAREG|AWD,	TFLOAT,
609 		NAREG|NASR,	RESC1,
610 		"	movl	AR,TA1\n",
611 
612 OPLTYPE,	INAREG|INTAREG,
613 	SANY,	TANY,
614 	SANY,	ANYFIXED,
615 		NAREG|NASR,	RESC1,
616 		"	ZU\n",
617 
618 OPLTYPE,	FORCC,
619 	SANY,	TANY,
620 	SAREG|AWD,	TFLOAT,
621 		0,	RESCC,
622 		"	ldf	AR\n	tstf\n",
623 
624 OPLTYPE,	FORCC,
625 	SANY,	TANY,
626 	SAREG|AWD,	TDOUBLE,
627 		0,	RESCC,
628 		"	ldd	AR\n	tstd\n",
629 
630 OPLTYPE,	FORCC,
631 	SANY,	TANY,
632 	SANY,	ANYFIXED,
633 		0,	RESCC,
634 		"	tstZR	AR\n",
635 
636 OPLTYPE,	FORARG,
637 	SANY,	TANY,
638 	SANY,	TWORD,
639 		0,	RNULL,
640 		"	pushl	AR\n",
641 
642 OPLTYPE,	FORARG,
643 	SANY,	TANY,
644 	SANY,	TCHAR|TSHORT,
645 		0,	RNULL,
646 		"	pushZR	AR\n",
647 
648 OPLTYPE,	FORARG,
649 	SANY,	TANY,
650 	SANY,	TUCHAR|TUSHORT,
651 		0,	RNULL,
652 		"	movzZRl	AR,-(sp)\n",
653 
654 OPLTYPE,	FORARG,
655 	SANY,	TANY,
656 	SZERO,	TFLOAT|TDOUBLE,
657 		0,	RNULL,
658 		"	pushl	$0\n	pushl	$0\n",
659 
660 OPLTYPE,	FORARG,
661 	SANY,	TANY,
662 	SIREG,	TDOUBLE,
663 		0,	RNULL,
664 		"	ldd	AR\n	pushd\n",
665 
666 OPLTYPE,	FORARG,
667 	SANY,	TANY,
668 	SAREG|SNAME|SOREG,	TDOUBLE,
669 		0,	RNULL,
670 		"	pushl	UR\n	pushl	AR\n",
671 
672 OPLTYPE,	FORARG,
673 	SANY,	TANY,
674 	STARNM,	TDOUBLE,
675 		0,	RNULL,
676 		"	ldd	AR\n	pushd\n",
677 
678 OPLTYPE,	FORARG,
679 	SANY,	TANY,
680 	SAREG|AWD,	TFLOAT,
681 		0,	RNULL,
682 		"	pushl	$0\n	pushl	AR\n",
683 
684 UNARY MINUS,	INAREG|INTAREG|FORCC,
685 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
686 	SANY,	TANY,
687 		NAREG|NASL,	RESC1|RESCC,
688 		"	mnegZL	AL,A1\n",
689 
690 UNARY MINUS,	INAREG|INTAREG|FORCC,
691 	SAREG|AWD,	TFLOAT|TDOUBLE,
692 	SANY,	TANY,
693 		NAREG|NASL,	RESC1|RESCC,
694 		"	lnZL	AL\n	stZL	TA1\n",
695 
696 COMPL,	INAREG|INTAREG|FORCC,
697 	SAREG|AWD,	ANYSIGNED|TUNSIGNED,
698 	SANY,	TANY,
699 		NAREG|NASL,	RESC1|RESCC,
700 		"	mcomZL	AL,A1\n",
701 
702 COMPL,	INAREG|INTAREG|FORCC,
703 	SAREG|AWD,	ANYFIXED,
704 	SANY,	TANY,
705 		NAREG|NASL,	RESC1|RESCC,
706 		"	movzZLl	AL,A1\n	mcoml	A1,A1\n",
707 
708 AND,	FORCC,
709 	SAREG|AWD,	TWORD,
710 	SAREG|AWD,	TWORD,
711 		0,	RESCC,
712 		"	bitl	AR,AL\n",
713 
714 AND,	FORCC,
715 	SAREG|AWD,	TSHORT|TUSHORT,
716 	SSCON,	TWORD,
717 		0,	RESCC,
718 		"	bitw	AR,AL\n",
719 
720 AND,	FORCC,
721 	SAREG|AWD,	TSHORT|TUSHORT,
722 	SAREG|AWD,	TSHORT|TUSHORT,
723 		0,	RESCC,
724 		"	bitw	AR,AL\n",
725 
726 AND,	FORCC,
727 	SAREG|AWD,	TCHAR|TUCHAR,
728 	SCCON,	TWORD,
729 		0,	RESCC,
730 		"	bitb	AR,AL\n",
731 
732 AND,	FORCC,
733 	SAREG|AWD,	TCHAR|TUCHAR,
734 	SAREG|AWD,	TCHAR|TUCHAR,
735 		0,	RESCC,
736 		"	bitb	AR,AL\n",
737 
738 /* General cases for DIV and ASG DIV are handled below with OPMUL */
739 /* Some special cases are handled in optim2() */
740 
741 DIV,	INAREG|FOREFF|FORCC,
742 	SAREG|AWD,	TUNSIGNED|TULONG,
743 	SCON,	ANYUSIGNED,
744 		NAREG|NEVEN,	RESC1|RESCC,
745 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,A1,U1\n",
746 
747 ASG DIV,	INAREG|FOREFF|FORCC,
748 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
749 	SMCON,	ANYUSIGNED,
750 		0,	RLEFT|RESCC,
751 		"	ZJ\n",
752 
753 ASG DIV,	INAREG|FOREFF|FORCC,
754 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
755 	SCON,	ANYUSIGNED,
756 		NAREG|NEVEN,	RLEFT|RESCC,
757 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,AL,U1\n",
758 
759 MOD,	INAREG|INTAREG,
760 	SAREG|AWD,	TINT|TLONG,
761 	SAREG|AWD,	TINT|TLONG,
762 		NAREG|NEVEN,	RESC1,
763 		"	ZM	ediv	AR,A1,U1,A1\n",
764 
765 MOD,	INAREG|FOREFF,
766 	SAREG|AWD,	TUNSIGNED|TULONG,
767 	SMCON,	ANYUSIGNED,
768 		NAREG|NASL,	RLEFT|RESC1,
769 		"	ZJ\n",
770 
771 MOD,	INAREG|FOREFF,
772 	SAREG|AWD,	TUNSIGNED|TULONG,
773 	SCON,	ANYUSIGNED,
774 		NAREG|NEVEN,	RESC1,
775 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n",
776 
777 /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
778 /* beware -- the ediv remainder operand must be a register */
779 ASG MOD,	INAREG|FOREFF|FORCC,
780 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
781 	SAREG|AWD,	TINT|TLONG,
782 		NAREG|NEVEN,	RLEFT|RESCC,
783 		"	ZM	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
784 
785 ASG MOD,	INAREG|FOREFF,
786 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
787 	SMCON,	ANYUSIGNED,
788 		0,	RLEFT,
789 		"	ZJ\n",
790 
791 ASG MOD,	INAREG|FOREFF,
792 	SAREG|AWD,	TINT|TLONG|TUNSIGNED|TULONG,
793 	SCON,	ANYUSIGNED,
794 		NAREG|NEVEN,	RLEFT,
795 		"	movl	AL,U1\n	clrl	A1\n	ediv	AR,A1,U1,A1\n	movl	A1,AL\n",
796 
797 /* XXX is this supposed to help on overflow? */
798 ASG MUL,	INAREG|FOREFF|FORCC,
799 	SAREG|AWD,	TUNSIGNED,
800 	SAREG|AWD,	TUNSIGNED|TINT,
801 		NAREG|NEVEN,	RLEFT|RESCC,
802 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
803 
804 ASG MUL,	INAREG|FOREFF|FORCC,
805 	SAREG|AWD,	TUNSIGNED|TINT,
806 	SAREG|AWD,	TUNSIGNED,
807 		NAREG|NEVEN,	RLEFT|RESCC,
808 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
809 
810 ASG OPMUL,	INAREG|FOREFF|FORCC,
811 	SAREG|AWD,	TWORD,
812 	SAREG|AWD,	TWORD,
813 		0,	RLEFT|RESCC,
814 		"	OL2	AR,AL\n",
815 
816 MUL,	INAREG|INTAREG|FORCC,
817 	STAREG,		TUNSIGNED,
818 	SAREG|AWD,	TUNSIGNED,
819 		NAREG|NEVEN,	RLEFT|RESCC,
820 		"	emul	AR,AL,$0,A1\n	movl	U1,AL\n",
821 
822 OPMUL,	INAREG|INTAREG|FORCC,
823 	STAREG,		TWORD,
824 	SAREG|AWD,	TWORD,
825 		0,	RLEFT|RESCC,
826 		"	OL2	AR,AL\n",
827 
828 MUL,	INAREG|INTAREG|FORCC,
829 	SAREG|AWD,	TUNSIGNED,
830 	SAREG|AWD,	TUNSIGNED,
831 		NAREG|NEVEN,	RESC1|RESCC,
832 		"	emul	AR,AL,$0,A1\n	movl	U1,A1\n",
833 
834 OPMUL,	INAREG|INTAREG|FORCC,
835 	SAREG|AWD,	TWORD,
836 	SAREG|AWD,	TWORD,
837 		NAREG|NASL|NASR,	RESC1|RESCC,
838 		"	OL3	AR,AL,A1\n",
839 
840 #ifdef REG_CHAR
841 ASG PLUS,	INAREG|FOREFF|FORCC,
842 	SAREG,	TWORD,
843 	SONE,	TINT,
844 		0,	RLEFT|RESCC,
845 		"	incZL	AL\n",
846 
847 ASG PLUS,	INAREG|FOREFF|FORCC,
848 	AWD,	ANYFIXED,
849 	SONE,	TINT,
850 		0,	RLEFT|RESCC,
851 		"	incZL	AL\n",
852 
853 ASG MINUS,	INAREG|FOREFF|FORCC,
854 	SAREG,	TWORD,
855 	SONE,	TINT,
856 		0,	RLEFT|RESCC,
857 		"	decZL	AL\n",
858 
859 ASG MINUS,	INAREG|FOREFF|FORCC,
860 	AWD,	ANYFIXED,
861 	SONE,	TINT,
862 		0,	RLEFT|RESCC,
863 		"	decZL	AL\n",
864 #else
865 ASG PLUS,       INAREG|FOREFF|FORCC,
866 	SAREG|AWD,	ANYFIXED,
867 	SONE,	TANY,
868 		0,	RLEFT|RESCC,
869 		"	incZL	AL\n",
870 
871 ASG MINUS,       INAREG|FOREFF|FORCC,
872 	SAREG|AWD,	ANYFIXED,
873 	SONE,	TANY,
874 		0,	RLEFT|RESCC,
875 		"	decZL	AL\n",
876 #endif
877 
878 PLUS,	INAREG|INTAREG|FORCC,
879 	STAREG,	TWORD,
880 	SONE,	TWORD,
881 		0,	RLEFT|RESCC,
882 		"	incZL	AL\n",
883 
884 MINUS,	INAREG|INTAREG|FORCC,
885 	STAREG,	TWORD,
886 	SONE,	TWORD,
887 		0,	RLEFT|RESCC,
888 		"	decZL	AL\n",
889 
890 ASG OPSIMP,	INAREG|FOREFF|FORCC,
891 	SAREG|AWD,	TWORD,
892 	SAREG|AWD,	TWORD,
893 		0,	RLEFT|RESCC,
894 		"	OL2	AR,AL\n",
895 
896 ASG OPSIMP,	INAREG|FOREFF|FORCC,
897 	SAREG,	TWORD,
898 	SAREG,	TSHORT|TUSHORT|TCHAR|TUCHAR,
899 		0,	RLEFT|RESCC,
900 		"	OL2	AR,AL\n",
901 
902 ASG OPSIMP,	INAREG|FOREFF|FORCC,
903 	AWD,	TSHORT|TUSHORT,
904 	SAREG|AWD,	TSHORT|TUSHORT,
905 		0,	RLEFT|RESCC,
906 		"	OW2	AR,AL\n",
907 
908 ASG OPSIMP,	INAREG|FOREFF|FORCC,
909 	AWD,	TSHORT|TUSHORT,
910 	SSCON,	TWORD,
911 		0,	RLEFT|RESCC,
912 		"	OW2	AR,AL\n",
913 
914 ASG OPSIMP,	INAREG|FOREFF|FORCC,
915 	AWD,	TCHAR|TUCHAR,
916 	SAREG|AWD,	TCHAR|TUCHAR,
917 		0,	RLEFT|RESCC,
918 		"	OB2	AR,AL\n",
919 
920 ASG OPSIMP,	INAREG|FOREFF|FORCC,
921 	AWD,	TCHAR|TUCHAR,
922 	SCCON,	TWORD,
923 		0,	RLEFT|RESCC,
924 		"	OB2	AR,AL\n",
925 
926 OPSIMP,	INAREG|INTAREG|FORCC,
927 	STAREG,	ANYFIXED,
928 	SAREG|AWD,	TWORD,
929 		0,	RLEFT|RESCC,
930 		"	OL2	AR,AL\n",
931 
932 OPSIMP,	INAREG|INTAREG|FORCC,
933 	SAREG|AWD,	TWORD,
934 	SAREG|AWD,	TWORD,
935 		NAREG|NASL|NASR,	RESC1|RESCC,
936 		"	OL3	AR,AL,A1\n",
937 
938 ASG OPSIMP,	INAREG|FOREFF,
939 	SAREG|AWD,	TFLOAT|TDOUBLE,
940 	SZERO,	TANY,
941 		0,	RLEFT,
942 		"",
943 
944 ASG MUL,	INAREG|FOREFF|FORCC,
945 	SIREG,	TDOUBLE,
946 	SZERO,	TANY,
947 		0,	RLEFT|RESCC,
948 		"	cvld	$0\n	std	AL\n",
949 
950 ASG MUL,	INAREG|FOREFF|FORCC,
951 	SAREG|SNAME|SOREG,	TDOUBLE,
952 	SZERO,	TANY,
953 		0,	RLEFT|RESCC,
954 		"	clrl	UL\n	clrl	AL\n",
955 
956 ASG MUL,	INAREG|FOREFF|FORCC,
957 	SAREG|AWD,	TFLOAT,
958 	SZERO,	TANY,
959 		0,	RLEFT|RESCC,
960 		"	clrl	TAL\n",
961 
962 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
963 	SAREG|AWD,	TFLOAT,
964 	SAREG|AWD,	TFLOAT,
965 		0,	RLEFT|RESCC,
966 		"	ldf	AL\n	OF	AR\n	stf	TAL\n",
967 
968 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
969 	SAREG|AWD,	TDOUBLE,
970 	SAREG|AWD,	TDOUBLE,
971 		0,	RLEFT|RESCC,
972 		"	ldd	AL\n	OD	AR\n	std	AL\n",
973 
974 ASG PLUS,	INAREG|FOREFF|FORCC,
975 	SAREG|AWD,	TDOUBLE,
976 	SAREG|AWD,	TFLOAT,
977 		NAREG|NASL,	RLEFT|RESCC,
978 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
979 
980 ASG MUL,	INAREG|FOREFF|FORCC,
981 	SAREG|AWD,	TDOUBLE,
982 	SAREG|AWD,	TFLOAT,
983 		NAREG|NASL,	RLEFT|RESCC,
984 		"	ldfd	AR\n	OD	AL\n	std	AL\n",
985 
986 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
987 	SAREG|AWD,	TDOUBLE,
988 	SAREG|AWD,	TFLOAT,
989 		NAREG|NASL,	RLEFT|RESCC,
990 		"	ldfd	AR\n	std	A1\n	ldd	AL\n	OD	A1\n	std	AL\n",
991 
992 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
993 	SAREG|AWD,	TFLOAT,
994 	SAREG|AWD,	TDOUBLE,
995 		0,	RLEFT|RESCC,
996 		"	ldfd	AL\n	OD	AR\n	cvdf\n	stf	TAL\n",
997 
998 ASG OPFLOAT,	INAREG|FOREFF|FORCC,
999 	SAREG|AWD,	ANYFIXED,
1000 	SAREG|AWD,	TFLOAT|TDOUBLE,
1001 		NAREG,	RLEFT|RESCC,	/* usable() knows we may need a reg pair */
1002 		"	ZG\n",
1003 
1004 OPSIMP,	INAREG|INTAREG,
1005 	SAREG,	TFLOAT|TDOUBLE,
1006 	SZERO,	TANY,
1007 		0,	RLEFT,
1008 #if defined(FORT) || defined(SPRECC)
1009 		"T",
1010 #else
1011 		"",
1012 #endif
1013 
1014 OPSIMP,	INAREG|INTAREG|FORCC,
1015 	AWD,	TFLOAT,
1016 	SZERO,	TANY,
1017 		NAREG,	RESC1|RESCC,
1018 		"	movl	AL,A1\n",
1019 
1020 OPSIMP,	INAREG|INTAREG|FORCC,
1021 	SIREG,	TDOUBLE,
1022 	SZERO,	TANY,
1023 		NAREG,	RESC1|RESCC,
1024 		"	ldd	AL\n	std	A1\n",
1025 
1026 OPSIMP,	INAREG|INTAREG|FORCC,
1027 	SAREG|SNAME|SOREG,	TDOUBLE,
1028 	SZERO,	TANY,
1029 		NAREG,	RESC1|RESCC,
1030 		"	movl	UL,U1\n	movl	AL,A1\n",
1031 
1032 MUL,	INAREG|INTAREG|FORCC,
1033 	SIREG,	TDOUBLE,
1034 	SZERO,	TANY,
1035 		NAREG|NASR,	RESC1|RESCC,
1036 		"	cvld	$0\n	std	A1\n",
1037 
1038 MUL,	INAREG|INTAREG|FORCC,
1039 	SAREG|SNAME|SOREG,	TDOUBLE,
1040 	SZERO,	TANY,
1041 		NAREG|NASR,	RESC1|RESCC,
1042 		"	clrl	U1\n	clrl	A1\n",
1043 
1044 MUL,	INAREG|INTAREG|FORCC,
1045 	SAREG|AWD,	TFLOAT,
1046 	SZERO,	TANY,
1047 		NAREG|NASR,	RESC1|RESCC,
1048 		"	clrl	TA1\n",
1049 
1050 OPFLOAT,	INAREG|INTAREG|FORCC,
1051 	SAREG|AWD,	TFLOAT,
1052 	SAREG|AWD,	TFLOAT,
1053 		NAREG|NASL|NASR,	RESC1|RESCC,
1054 		"	ldf	AL\n	OF	AR\n	stf	TA1\n",
1055 
1056 OPFLOAT,	INAREG|INTAREG|FORCC,
1057 	SZERO,		TANY,
1058 	SAREG|AWD,	TDOUBLE,
1059 		NAREG,	RESC1|RESCC,
1060 		"\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n",
1061 
1062 OPFLOAT,	INAREG|INTAREG|FORCC,
1063 	SAREG|AWD,	TDOUBLE,
1064 	SAREG|AWD,	TDOUBLE,
1065 		NAREG|NASL|NASR,	RESC1|RESCC,
1066 		"	ldd	AL\n	OD	AR\n	std	A1\n",
1067 
1068 	/* Default actions for hard trees ... */
1069 
1070 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1071 
1072 UNARY MUL, DF( UNARY MUL ),
1073 
1074 INCR, DF(INCR),
1075 
1076 DECR, DF(INCR),
1077 
1078 ASSIGN, DF(ASSIGN),
1079 
1080 STASG, DF(STASG),
1081 
1082 FLD, DF(FLD),
1083 
1084 OPLEAF, DF(NAME),
1085 
1086 OPLOG,	FORCC,
1087 	SANY,	TANY,
1088 	SANY,	TANY,
1089 		REWRITE,	BITYPE,
1090 		"",
1091 
1092 OPLOG,	DF(NOT),
1093 
1094 COMOP, DF(COMOP),
1095 
1096 INIT, DF(INIT),
1097 
1098 OPUNARY, DF(UNARY MINUS),
1099 
1100 
1101 ASG OPANY, DF(ASG PLUS),
1102 
1103 OPANY, DF(BITYPE),
1104 
1105 FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" };
1106