xref: /netbsd/external/bsd/pcc/dist/pcc/arch/hppa/table.c (revision 6550d01e)
1 /*	$OpenBSD: table.c,v 1.2 2007/12/19 20:19:54 otto Exp $	*/
2 
3 /*
4  * Copyright (c) 2007 Michael Shalayeff
5  * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include "pass2.h"
32 
33 #define	TLL		TLONGLONG|TULONGLONG
34 #define	ANYSIGNED	TINT|TLONG|TSHORT|TCHAR
35 #define	ANYUSIGNED	TUNSIGNED|TULONG|TUSHORT|TUCHAR
36 #define	ANYFIXED	ANYSIGNED|ANYUSIGNED
37 #define	TUWORD		TUNSIGNED|TULONG
38 #define	TSWORD		TINT|TLONG
39 #define	TWORD		TUWORD|TSWORD
40 #define	THWORD		TUSHORT|TSHORT
41 #define	TBYTE		TUCHAR|TCHAR
42 
43 #define	SHINT	SAREG	/* char, short and int */
44 #define	ININT	INAREG
45 #define	SHLL	SBREG	/* shape for long long */
46 #define	INLL	INBREG
47 #define	SHFL	SCREG	/* shape for float */
48 #define	INFL	INCREG
49 #define	SHDBL	SDREG	/* shape for double */
50 #define	INDBL	INDREG
51 
52 struct optab table[] = {
53 /* First entry must be an empty entry */
54 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
55 
56 /* PCONVs are usually not necessary */
57 { PCONV,	INAREG,
58 	SAREG,	TWORD|TPOINT,
59 	SAREG,	TWORD|TPOINT,
60 		0,	RLEFT,
61 		"", },
62 /*
63  * A bunch conversions of integral<->integral types
64  * There are lots of them, first in table conversions to itself
65  * and then conversions from each type to the others.
66  */
67 
68 /* itself to itself, including pointers */
69 
70 /* convert int,short,char <-> int,short,char. */
71 { SCONV,	ININT,
72 	SHINT,	TBYTE,
73 	SHINT,	TBYTE,
74 		0,	RLEFT,
75 		"", },
76 
77 { SCONV,	ININT,
78 	SHINT,	THWORD,
79 	SHINT,	THWORD,
80 		0,	RLEFT,
81 		"", },
82 
83 { SCONV,	ININT,
84 	SHINT,	TWORD,
85 	SHINT,	TWORD,
86 		0,	RLEFT,
87 		"", },
88 
89 /* convert pointers to int. */
90 { SCONV,	ININT,
91 	SHINT,	TWORD|TPOINT,
92 	SANY,	TWORD,
93 		0,	RLEFT,
94 		"", },
95 
96 /* convert (u)longlong to (u)longlong. */
97 { SCONV,	INLL,
98 	SHLL,	TLL,
99 	SHLL,	TLL,
100 		0,	RLEFT,
101 		"", },
102 
103 /* convert pointers to pointers. */
104 { SCONV,	ININT,
105 	SHINT,	TPOINT,
106 	SANY,	TPOINT,
107 		0,	RLEFT,
108 		"", },
109 
110 /* convert double <-> ldouble. nothing to do here (or support quads later) */
111 { SCONV,	INDBL,
112 	SHDBL,	TDOUBLE|TLDOUBLE,
113 	SHDBL,	TDOUBLE|TLDOUBLE,
114 		0,	RLEFT,
115 		"", },
116 
117 /* convert float -> double */
118 { SCONV,	INFL,
119 	SHFL,	TFLOAT,
120 	SHDBL,	TDOUBLE|TLDOUBLE,
121 		0,	0,
122 		"\tfcnvff,sgl,dbl AL,AR\n", },
123 
124 /* convert double -> float */
125 { SCONV,	INDBL,
126 	SHDBL,	TDOUBLE|TLDOUBLE,
127 	SHFL,	TFLOAT,
128 		0,	0,
129 		"\tfcnvff,dbl,sgl\tAL,AR\n", },
130 
131 /* convert int,short,char to (u)long long */
132 { SCONV,	INLL,
133 	SHINT,	ANYSIGNED,
134 	SANY,	TLL,
135 		NBREG,	RESC1,
136 		"\tcopy\tAL,A1\n"
137 		"\textrs\tAL,0,1,U1\n", },
138 
139 /* convert unsigned int,short,char to (u)long long */
140 { SCONV,	INLL,
141 	SHINT,	TWORD,
142 	SANY,	TLL,
143 		NBREG,	RESC1,
144 		"\tcopy\tAL,A1\n"
145 		"\tcopy\t%r0,U1\n", },
146 
147 /* convert int,short,char (in memory) to float */
148 { SCONV,	INFL,
149 	SOREG,	ANYSIGNED,
150 	SHFL,	TFLOAT,
151 		NCREG,	RESC1,
152 		"\tfldws\tAL,A1\n"
153 		"\tfcnvxf,sgl,sgl\tA1,A1\n", },
154 
155 /* convert int,short,char (in memory) to double */
156 { SCONV,	INDBL,
157 	SOREG,	TSWORD,
158 	SHDBL,	TDOUBLE|TLDOUBLE,
159 		NDREG,	RESC1,
160 		"\tfldws\tAL,A1\n"
161 		"\tfcnvxf,sgl,dbl\tA1,A1\n", },
162 
163 /* convert (u)long (in memory) to double */
164 { SCONV,	INDBL,
165 	SOREG,	TLL,
166 	SHDBL,	TDOUBLE|TLDOUBLE,
167 		NDREG,	RESC1,
168 		"\tfldds\tAL,A1\n"
169 		"\tfcnvxf,dbl,dbl\tA1,A1\n", },
170 
171 /* convert int,short,char (in register) to float */
172 { SCONV,	INFL,
173 	SHINT,	TSWORD,
174 	SHFL,	TFLOAT,
175 		NCREG,	RESC1,
176 		"\tstw,ma\tAL,4(%sp)\n"
177 		"\tfldws,ma\t-4(%sp),A1\n"
178 		"\tfcnvxf,sgl,sgl\tA1,A1\n", },
179 
180 /* convert int,short,char (in register) to double */
181 { SCONV,	INDBL,
182 	SHINT,	TSWORD,
183 	SHDBL,	TDOUBLE|TLDOUBLE,
184 		NDREG,	RESC1,
185 		"\tstw,ma\tAL,4(%sp)\n"
186 		"\tfldws,mb\t-4(%sp),AR\n"
187 		"\tfcnvxf,sgl,dbl\tA1,A1\n", },
188 
189 /* convert (u)long (in register) to double */
190 { SCONV,	INDBL,
191 	SHLL,	TLL,
192 	SHDBL,	TDOUBLE|TLDOUBLE,
193 		NDREG,	RESC1,
194 		"\tldo\t8(%sp),%sp\n"
195 		"\tstw\tAL,-8(%sp)\n"
196 		"\tstw\tUL,-4(%sp)\n"
197 		"\tfldds,mb\t-8(%sp),A1\n"
198 		"\tfcnvxf,dbl,dbl\tA1,A1\n", },
199 
200 /* convert char to (unsigned) short/int. */
201 { SCONV,	ININT,
202 	SAREG,	TCHAR,
203 	SAREG,	THWORD|TWORD,
204 		NASL|NAREG,	RESC1,
205 		"\textrs\tAL,31,8,A1\n", },
206 
207 /* convert unsigned char to (unsigned) short/int. */
208 { SCONV,	ININT,
209 	SAREG,	TUCHAR,
210 	SAREG,	THWORD|TWORD,
211 		NASL|NAREG,	RESC1,
212 		"\textru\tAL,31,8,A1\n", },
213 
214 /* convert char to (unsigned) long long. */
215 { SCONV,	INLL,
216 	SAREG,	TCHAR,
217 	SBREG,	TLL,
218 		NBSL|NBREG,	RESC1,
219 		"\textrs\tAL,31,8,A1\n\textrs\tA1,0,1,U1", },
220 
221 /* convert unsigned char to (unsigned) long long. */
222 { SCONV,	INLL,
223 	SAREG,	TUCHAR,
224 	SBREG,	TLL,
225 		NBSL|NBREG,	RESC1,
226 		"\textru\tAL,31,8,A1\n\tcopy\t%r0,U1", },
227 
228 /* convert short to (unsigned) int. */
229 { SCONV,	ININT,
230 	SAREG,	TSHORT,
231 	SAREG,	TWORD,
232 		NASL|NAREG,	RESC1,
233 		"\textrs\tAL,31,16,A1\n", },
234 
235 /* convert unsigned short to (unsigned) int. */
236 { SCONV,	ININT,
237 	SAREG,	TUSHORT,
238 	SAREG,	THWORD,
239 		NASL|NAREG,	RESC1,
240 		"\textru\tAL,31,16,A1\n", },
241 
242 /* convert short to (unsigned) long long. */
243 { SCONV,	INLL,
244 	SAREG,	TSHORT,
245 	SBREG,	TLL,
246 		NBSL|NBREG,	RESC1,
247 		"\textrs\tAL,31,16,A1\n\textrs\tA1,0,1,U1", },
248 
249 /* convert unsigned short to (unsigned) long long. */
250 { SCONV,	INLL,
251 	SAREG,	TUSHORT,
252 	SBREG,	TLL,
253 		NBSL|NBREG,	RESC1,
254 		"\textru\tAL,31,16,A1\n\tcopy\t%r0,U1", },
255 
256 /* convert int,short,char (in memory) to int,short,char */
257 { SCONV,	ININT,
258 	SOREG,	TBYTE,
259 	SHINT,	TBYTE|TPOINT,
260 		NAREG|NASL,	RESC1,
261 		"\tldb\tAL,A1\n", },
262 
263 { SCONV,	ININT,
264 	SOREG,	THWORD,
265 	SHINT,	THWORD|TPOINT,
266 		NAREG|NASL,	RESC1,
267 		"\tldh\tAL,A1\n", },
268 
269 { SCONV,	ININT,
270 	SOREG,	TWORD,
271 	SHINT,	TWORD|TPOINT,
272 		NAREG|NASL,	RESC1,
273 		"\tldw\tAL,A1\n", },
274 
275 /* convert (u)long long (in register) to int,short,char */
276 { SCONV,	ININT,
277 	SHLL,	TLL,
278 	SHINT,	ANYFIXED,
279 		NAREG|NASL,	RESC1,
280 		"\tcopy\tAL,A1\n", },
281 
282 /* convert (u)long (in memory) to int,short,char */
283 { SCONV,	ININT,
284 	SOREG,	TLL,
285 	SHINT,	ANYFIXED,
286 		NAREG|NASL,	RESC1,
287 		"\tldw\tAL,A1\n", },
288 
289 /* convert float (in register) to (u)int */
290 { SCONV,	ININT,
291 	SHFL,	TFLOAT,
292 	SHINT,	TWORD,
293 		NAREG,	RESC1,
294 		"\tfcnvfxt,sgl,sgl\tAL,AL\n"
295 		"\tfstws,ma\tAL,4(%sp)\n"
296 		"\tldw,mb\t-4(%sp),A1\n", },
297 
298 /* convert double (in register) to (u)int */
299 { SCONV,	ININT,
300 	SHDBL,	TDOUBLE|TLDOUBLE,
301 	SHINT,	TWORD,
302 		NCREG|NCSL|NAREG,	RESC2,
303 		"\tfcnvfxt,dbl,sgl\tAL,A1\n"
304 		"\tfstws,ma\tA1,4(%sp)\n"
305 		"\tldw,mb\t-4(%sp),A2\n", },
306 
307 /* convert float (in register) to (u)long */
308 { SCONV,	INLL,
309 	SHFL,	TFLOAT,
310 	SHLL,	TLL,
311 		NDREG|NDSL|NBREG,	RESC2,
312 		"\tfcnvfxt,sgl,dbl\tAL,A1\n"
313 		"\tfstds,ma\tA1,8(%sp)\n"
314 		"\tldw\t-8(%sp),A2\n"
315 		"\tldw\t-4(%sp),U2\n"
316 		"\tldo\t-8(%sp),%sp)\n", },
317 
318 /* convert double (in register) to (u)long */
319 { SCONV,	INLL,
320 	SHDBL,	TDOUBLE|TLDOUBLE,
321 	SHLL,	TLL,
322 		NBREG,	RESC1,
323 		"\tfcnvfxt,dbl,dbl\tAL,AL\n"
324 		"\tfstds,ma\tAL,8(%sp)\n"
325 		"\tldw\t-8(%sp),A1\n"
326 		"\tldw\t-4(%sp),U1\n"
327 		"\tldo\t-8(%sp),%sp)\n", },
328 
329 /*
330  * Subroutine calls.
331  */
332 
333 { CALL,		FOREFF,
334 	SAREG,	TANY,
335 	SANY,	TANY,
336 		0,	0,
337 		"ZP\tblr\t%r0, %rp\n"
338 		"\tbv,n\t%r0(AL)\n"
339 		"\tnop\nZC",	},
340 
341 { UCALL,	FOREFF,
342 	SAREG,	TANY,
343 	SANY,	TANY,
344 		0,	0,
345 		"ZP\tblr\t%r0, %rp\n"
346 		"\tbv,n\t%r0(AL)\n"
347 		"\tnop\nZC",	},
348 
349 { CALL,		ININT,
350 	SAREG,	TANY,
351 	SHINT,	ANYFIXED|TPOINT,
352 		NAREG|NASL,	RESC1,
353 		"ZP\tblr\t%r0, %rp\n"
354 		"\tbv,n\t%r0(AL)\n"
355 		"\tnop\nZC",	},
356 
357 { UCALL,	ININT,
358 	SAREG,	TANY,
359 	SHINT,	ANYFIXED|TPOINT,
360 		NAREG|NASL,	RESC1,
361 		"ZP\tblr\t%r0, %rp\n"
362 		"\tbv,n\t%r0(AL)\n"
363 		"\tnop\nZC",	},
364 
365 { CALL,		INLL,
366 	SAREG,	TANY,
367 	SHLL,	TLL,
368 		NBREG|NBSL,	RESC1,
369 		"ZP\tblr\t%r0, %rp\n"
370 		"\tbv,n\t%r0(AL)\n"
371 		"\tnop\nZC",	},
372 
373 { UCALL,	INLL,
374 	SAREG,	TANY,
375 	SHLL,	TLL,
376 		NBREG|NBSL,	RESC1,
377 		"ZP\tblr\t%r0, %rp\n"
378 		"\tbv,n\t%r0(AL)\n"
379 		"\tnop\nZC",	},
380 
381 { CALL,		INFL,
382 	SAREG,	TANY,
383 	SHFL,	TFLOAT,
384 		NCREG|NCSL,	RESC1,
385 		"ZP\tblr\t%r0, %rp\n"
386 		"\tbv,n\t%r0(AL)\n"
387 		"\tnop\nZC",	},
388 
389 { UCALL,	INFL,
390 	SAREG,	TANY,
391 	SHFL,	TFLOAT,
392 		NCREG|NCSL,	RESC1,
393 		"ZP\tblr\t%r0, %rp\n"
394 		"\tbv,n\t%r0(AL)\n"
395 		"\tnop\nZC",	},
396 
397 { CALL,		INDBL,
398 	SAREG,	TANY,
399 	SHDBL,	TDOUBLE|TLDOUBLE,
400 		NDREG|NDSL,	RESC1,
401 		"ZP\tblr\t%r0, %rp\n"
402 		"\tbv,n\t%r0(AL)\n"
403 		"\tnop\nZC",	},
404 
405 { UCALL,	INDBL,
406 	SAREG,	TANY,
407 	SHDBL,	TDOUBLE|TLDOUBLE,
408 		NDREG|NDSL,	RESC1,
409 		"ZP\tblr\t%r0, %rp\n"
410 		"\tbv,n\t%r0(AL)\n"
411 		"\tnop\nZC",	},
412 
413 /*
414  * The next rules handle all binop-style operators.
415  */
416 /* TODO fix char/short overflows */
417 
418 { PLUS,		INLL,
419 	SHLL,	TLL,
420 	SPICON,	TANY,
421 		NBREG|NBSL,	RESC1,
422 		"\taddi\tAL,AR,A1\n"
423 		"\taddc\tUL,%r0,U1\n", },
424 
425 { PLUS,		INLL,
426 	SHLL,	TLL,
427 	SHLL,	TLL,
428 		NBREG|NBSL|NBSR,	RESC1,
429 		"\tadd\tAL,AR,A1\n"
430 		"\taddc\tUL,UR,U1\n", },
431 
432 { PLUS,		INFL,
433 	SHFL,	TFLOAT,
434 	SHFL,	TFLOAT,
435 		NCREG|NCSL|NCSR,	RESC1,
436 		"\tfadd,sgl\tAL,AR,A1\n", },
437 
438 { PLUS,		INDBL,
439 	SHDBL,	TDOUBLE|TLDOUBLE,
440 	SHDBL,	TDOUBLE|TLDOUBLE,
441 		NDREG|NDSL|NDSR,	RESC1,
442 		"\tfadd,dbl\tAL,AR,A1\n", },
443 
444 { PLUS,		ININT,
445 	SHINT,	ANYFIXED|TPOINT,
446 	SONE,	TANY,
447 		NAREG|NASL,	RESC1,
448 		"\tldo\t1(AL),A1\n", },
449 
450 { PLUS,		ININT,
451 	SHINT,	ANYFIXED|TPOINT,
452 	SPCON,	TANY,
453 		NAREG|NASL,	RESC1,
454 		"\tldo\tCR(AL),A1\n", },
455 
456 { MINUS,	INLL,
457 	SHLL,	TLL,
458 	SPICON,	TANY,
459 		NBREG|NBSL|NBSR,	RESC1,
460 		"\tsubi\tAL,AR,A1\n"
461 		"\tsubb\tUL,%r0,U1\n", },
462 
463 { PLUS,		ININT,
464 	SHINT,	TANY|TPOINT,
465 	SPNAME,	TANY,
466 		NAREG|NASL,	RESC1,
467 		"\tldo\tAR(AL),A1\n", },
468 
469 { MINUS,	INLL,
470 	SHLL,	TLL,
471 	SHLL,	TLL,
472 		NBREG|NBSL|NBSR,	RESC1,
473 		"\tsub\tAL,AR,A1\n"
474 		"\tsubb\tUL,UR,U1\n", },
475 
476 { MINUS,	INFL,
477 	SHFL,	TFLOAT,
478 	SHFL,	TFLOAT,
479 		NCREG|NCSL|NCSR,	RESC1,
480 		"\tfsub,sgl\tAL,AR,A1\n", },
481 
482 { MINUS,	INDBL,
483 	SHDBL,	TDOUBLE|TLDOUBLE,
484 	SHDBL,	TDOUBLE|TLDOUBLE,
485 		NDREG|NDSL|NDSR,	RESC1,
486 		"\tfsub,dbl\tAL,AR,A1\n", },
487 
488 { MINUS,	ININT,
489 	SHINT,	ANYFIXED|TPOINT,
490 	SONE,	TANY,
491 		NAREG|NASL,	RESC1,
492 		"\tldo\t-1(AL),A1\n", },
493 
494 { MINUS,	ININT,
495 	SHINT,	ANYFIXED|TPOINT,
496 	SPCON,	TANY,
497 		NAREG|NASL,	RESC1,
498 		"\tldo\t-CR(AL),A1\n", },
499 
500 /* Simple reg->reg ops */
501 { OPSIMP,	ININT,
502 	SAREG,	TWORD|TPOINT,
503 	SAREG,	TWORD|TPOINT,
504 		NAREG|NASL,	RESC1,
505 		"\tO\tAL,AR,A1\n", },
506 
507 { OPSIMP,	INLL,
508 	SHLL,	TLL,
509 	SHLL,	TLL,
510 		NBREG|NBSL|NBSR,	RESC1,
511 		"\tO\tAL,AR,A1\n"
512 		"\tO\tUL,UR,U1\n", },
513 
514 /*
515  * The next rules handle all shift operators.
516  */
517 { LS,	ININT,
518 	SHINT,	ANYFIXED,
519 	SCON,	ANYFIXED,
520 		NAREG|NASL,	RESC1,
521 		"\tzdep\tAL,31-AR,32-AR,A1\n", },
522 
523 { LS,	ININT,
524 	SHINT,	ANYFIXED,
525 	SHINT,	ANYFIXED,
526 		NAREG|NASR,	RESC1,
527 		"\tsubi\t31,AR,A1\n"
528 		"\tmtsar\tA1\n"
529 		"\tzvdep\tAL,32,A1\n", },
530 
531 { RS,	INLL,
532 	SHLL,	TLONGLONG,
533 	SCON,	ANYFIXED,
534 		NBREG|NBSL,	RESC1,
535 		"\tshd\tUL,AL,31-AR,A1\n"
536 		"\textrs\tUL,31-AR,32,U1\n", },
537 
538 { RS,	INLL,
539 	SHLL,	TULONGLONG,
540 	SCON,	ANYFIXED,
541 		NBREG|NBSL,	RESC1,
542 		"\tshd\tUL,AL,AR,A1\n"
543 		"\textru\tUL,31-AR,32,U1\n", },
544 
545 { RS,	ININT,
546 	SHINT,	ANYSIGNED,
547 	SCON,	ANYFIXED,
548 		NAREG|NASL,	RESC1,
549 		"\textrs\tAL,31-AR,32,A1\n", },
550 
551 { RS,	ININT,
552 	SHINT,	ANYUSIGNED,
553 	SCON,	ANYFIXED,
554 		NAREG|NASL,	RESC1,
555 		"\textru\tAL,31-AR,32,A1\n", },
556 
557 /* TODO the following should be split into mtsar and actual shift parts */
558 { RS,	ININT,
559 	SHINT,	ANYSIGNED,
560 	SHINT,	ANYFIXED,
561 		NAREG|NASR,	RESC1,
562 		"\tsubi\t31,AR,A1\n"
563 		"\tmtsar\tA1\n"
564 		"\tvextrs\tAL,32,A1\n", },
565 
566 { RS,	ININT,
567 	SHINT,	ANYUSIGNED,
568 	SHINT,	ANYFIXED,
569 		NAREG|NASR,	RESC1,
570 		"\tsubi\t31,AR,A1\n"
571 		"\tmtsar\tA1\n"
572 		"\tvextru\tAL,32,A1\n", },
573 
574 /*
575  * The next rules takes care of assignments. "=".
576  */
577 
578 { ASSIGN,	FOREFF|INAREG,
579 	SAREG,	TWORD|TPOINT,
580 	SPCON,	TANY,
581 		0,	RDEST,
582 		"\tldi\tAR,AL\n", },
583 
584 { ASSIGN,	FOREFF|INAREG,
585 	SOREG,	TBYTE,
586 	SHINT,	TBYTE,
587 		0,	RDEST,
588 		"\tstb\tAR,AL\n", },
589 
590 { ASSIGN,	FOREFF|INAREG,
591 	SOREG,	THWORD,
592 	SHINT,	THWORD,
593 		0,	RDEST,
594 		"\tsth\tAR,AL\n", },
595 
596 { ASSIGN,	FOREFF|INAREG,
597 	SOREG,	TWORD|TPOINT,
598 	SHINT,	TWORD|TPOINT,
599 		0,	RDEST,
600 		"\tstw\tAR,AL\n", },
601 
602 { ASSIGN,	FOREFF|INLL,
603 	SOREG,	TLL,
604 	SHLL,	TLL,
605 		0,	RDEST,
606 		"\tstw\tAR,AL\n"
607 		"\tstw\tUR,UL\n", },
608 
609 { ASSIGN,	FOREFF|INAREG,
610 	SHINT,	TBYTE,
611 	SOREG,	TBYTE,
612 		0,	RDEST,
613 		"\tldb\tAR,AL\n", },
614 
615 { ASSIGN,	FOREFF|INAREG,
616 	SHINT,	THWORD,
617 	SOREG,	THWORD,
618 		0,	RDEST,
619 		"\tldh\tAR,AL\n", },
620 
621 { ASSIGN,	FOREFF|INAREG,
622 	SHINT,	TWORD|TPOINT,
623 	SOREG,	TWORD|TPOINT,
624 		0,	RDEST,
625 		"\tldw\tAR,AL\n", },
626 
627 { ASSIGN,	FOREFF|INLL,
628 	SHLL,	TLL,
629 	SOREG,	TLL,
630 		0,	RDEST,
631 		"\tldw\tAR,AL\n"
632 		"\tldw\tUR,UL\n", },
633 
634 { ASSIGN,	FOREFF|ININT,
635 	SHINT,	TWORD|TPOINT,
636 	SHINT,	TWORD|TPOINT,
637 		0,	RDEST,
638 		"\tcopy\tAR,AL\n", },
639 
640 { ASSIGN,	FOREFF|ININT,
641 	SHINT,	ANYFIXED,
642 	SHINT,	ANYFIXED,
643 		0,	RDEST,
644 		"\tcopy\tAR,AL\n", },
645 
646 { ASSIGN,	FOREFF|ININT,
647 	SFLD,	TANY,
648 	SPIMM,	TANY,
649 		0,	RDEST,
650 		"\tdepi\tAR,31-H,S,AL\n", },
651 
652 { ASSIGN,	FOREFF|ININT,
653 	SFLD,	TANY,
654 	SHINT,	TANY,
655 		0,	RDEST,
656 		"\tdep\tAR,31-H,S,AL\n", },
657 
658 { ASSIGN,	FOREFF|INLL,
659 	SHLL,	TLL,
660 	SHLL,	TLL,
661 		0,	RDEST,
662 		"\tcopy\tAR,AL\n"
663 		"\tcopy\tUR,UL\n", },
664 
665 { ASSIGN,	FOREFF|INFL,
666 	SHFL,	TFLOAT,
667 	SHFL,	TFLOAT,
668 		0,	RDEST,
669 		"\tfcpy,sgl\tAR,AL\n", },
670 
671 { ASSIGN,	FOREFF|INDBL,
672 	SHDBL,	TDOUBLE|TLDOUBLE,
673 	SHDBL,	TDOUBLE|TLDOUBLE,
674 		0,	RDEST,
675 		"\tfcpy,dbl\tAR,AL\n", },
676 
677 { ASSIGN,	FOREFF|INFL,
678 	SHFL,	TFLOAT,
679 	SOREG,	TFLOAT,
680 		0,	RDEST,
681 		"\tfldws\tAR,AL\n", },
682 
683 { ASSIGN,	FOREFF|INDBL,
684 	SHDBL,	TDOUBLE|TLDOUBLE,
685 	SOREG,	TDOUBLE|TLDOUBLE,
686 		0,	RDEST,
687 		"\tfldds\tAR,AL\n", },
688 
689 { ASSIGN,	FOREFF|INFL,
690 	SOREG,	TFLOAT,
691 	SHFL,	TFLOAT,
692 		0,	RDEST,
693 		"\tfstws\tAR,AL\n", },
694 
695 { ASSIGN,	FOREFF|INDBL,
696 	SOREG,	TDOUBLE|TLDOUBLE,
697 	SHDBL,	TDOUBLE|TLDOUBLE,
698 		0,	RDEST,
699 		"\tfstds\tAR,AL\n", },
700 
701 /*
702  * DIV/MOD/MUL
703  */
704 { DIV,	INFL,
705 	SHFL,	TFLOAT,
706 	SHFL,	TFLOAT,
707 		NCREG|NCSL|NCSR,	RESC1,
708 		"\tfdiv,sgl\tAL,AR,A1\n", },
709 
710 { DIV,	INDBL,
711 	SHDBL,	TDOUBLE|TLDOUBLE,
712 	SHDBL,	TDOUBLE|TLDOUBLE,
713 		NDREG|NDSL|NDSR,	RESC1,
714 		"\tfdiv,dbl\tAL,AR,A1\n", },
715 
716 { MUL,	INFL,
717 	SHFL,	TFLOAT,
718 	SHFL,	TFLOAT,
719 		NCREG|NCSL|NCSR,	RESC1,
720 		"\tfmul,sgl\tAL,AR,A1\n", },
721 
722 { MUL,	INDBL,
723 	SHDBL,	TDOUBLE|TLDOUBLE,
724 	SHDBL,	TDOUBLE|TLDOUBLE,
725 		NDREG|NDSL|NDSR,	RESC1,
726 		"\tfmul,dbl\tAL,AR,A1\n", },
727 
728 /*
729  * Indirection operators.
730  */
731 { UMUL,	INLL,
732 	SANY,	TANY,
733 	SOREG,	TLL,
734 		NBREG,	RESC1,
735 		"\tldw\tAL,A1\n"
736 		"\tldw\tUL,U1\n", },
737 
738 { UMUL,	ININT,
739 	SANY,	TPOINT|TWORD,
740 	SOREG,	TPOINT|TWORD,
741 		NAREG|NASL,	RESC1,
742 		"\tldw\tAL,A1\n", },
743 
744 { UMUL,	ININT,
745 	SANY,	TANY,
746 	SOREG,	THWORD,
747 		NAREG|NASL,	RESC1,
748 		"\tldh\tAL,A1\n", },
749 
750 { UMUL,	ININT,
751 	SANY,	TANY,
752 	SOREG,	TBYTE,
753 		NAREG|NASL,	RESC1,
754 		"\tldb\tAL,A1\n", },
755 
756 { UMUL,	INDBL,
757 	SANY,	TANY,
758 	SOREG,	TDOUBLE|TLDOUBLE,
759 		NDREG|NDSL,	RESC1,
760 		"\tfldds\tAL,A1\n", },
761 
762 { UMUL,	INFL,
763 	SANY,	TANY,
764 	SOREG,	TFLOAT,
765 		NCREG|NCSL,	RESC1,
766 		"\tfldws\tAL,A1\n", },
767 
768 /*
769  * Logical/branching operators
770  */
771 { OPLOG,	FORCC,
772 	SHLL,	TLL,
773 	SHLL,	TLL,
774 		0,	0,
775 		"ZD", },
776 
777 { OPLOG,	FORCC,
778 	SHINT,	ANYFIXED|TPOINT,
779 	SPIMM,	ANYFIXED|TPOINT,
780 		0,	0,
781 		"\tcomib,O\tAR,AL,LC\n\tnop\n", },
782 
783 { OPLOG,	FORCC,
784 	SHINT,	ANYFIXED|TPOINT,
785 	SHINT,	ANYFIXED|TPOINT,
786 		0,	0,
787 		"\tcomb,O\tAR,AL,LC\n\tnop\n", },
788 
789 { OPLOG,	FORCC,
790 	SHFL,	TFLOAT,
791 	SHFL,	TFLOAT,
792 		0,	RESCC,
793 		"\tfcmp,sgl,!O\tAR,AL\n"
794 		"\tftest\n"
795 		"\tb\tLC\n"
796 		"\tnop", },
797 
798 { OPLOG,	FORCC,
799 	SHDBL,	TDOUBLE|TLDOUBLE,
800 	SHDBL,	TDOUBLE|TLDOUBLE,
801 		0,	RESCC,
802 		"\tfcmp,dbl,!O\tAR,AL\n"
803 		"\tftest\n"
804 		"\tb\tLC\n"
805 		"\tnop", },
806 
807 /*
808  * Jumps.
809  */
810 { GOTO,		FOREFF,
811 	SCON,	TANY,
812 	SANY,	TANY,
813 		0,	RNOP,
814 		"\tb\tLL\n\tnop\n", },
815 
816 #ifdef GCC_COMPAT
817 { GOTO,		FOREFF,
818 	SAREG,	TANY,
819 	SANY,	TANY,
820 		0,	RNOP,
821 		"\tbv\t%r0(AL)\n\tnop\n", },
822 #endif
823 
824 
825 /*
826  * Convert LTYPE to reg.
827  */
828 
829 { OPLTYPE,	INAREG,
830 	SAREG,	TANY,
831 	SNAME,	TANY,
832 		0,	RDEST,
833 		"\taddil\tUR,%r27\n", },
834 
835 { OPLTYPE,	INAREG,
836 	SAREG,	TANY,
837 	SCON,	TPOINT,
838 		0,	RDEST,
839 		"\taddil\tUR,%r27\n", },
840 
841 { OPLTYPE,	INLL,
842 	SANY,	TANY,
843 	SOREG,	TLL,
844 		NBREG|NBSL,	RESC1,
845 		"\tldw\tAL,A1\n"
846 		"\tldw\tUL,U1\n", },
847 
848 { OPLTYPE,	INAREG,
849 	SANY,	TANY,
850 	SOREG,	TWORD|TPOINT,
851 		NAREG|NASL,	RESC1,
852 		"\tldw\tAL,A1\n", },
853 
854 { OPLTYPE,	INAREG,
855 	SANY,	TANY,
856 	SAREG,	TWORD|TPOINT,
857 		NAREG|NASL,	RESC1,
858 		"\tcopy\tAL,A1\n", },
859 
860 { OPLTYPE,	INAREG,
861 	SANY,	TANY,
862 	SPCNHI,	ANYFIXED,
863 		NAREG,		RESC1,
864 		"\tldil\tUR,A1\n", },
865 
866 { OPLTYPE,	INAREG,
867 	SANY,	TANY,
868 	SPCON,	ANYFIXED,
869 		NAREG,		RESC1,
870 		"\tldi\tAR,A1\n", },
871 
872 { OPLTYPE,	INLL,
873 	SANY,	TANY,
874 	SPCON,	TLL,
875 		NBREG,		RESC1,
876 		"\tldi\tAR,A1\n"
877 		"\tcopy\t%r0,U1\n", },
878 
879 { OPLTYPE,	ININT,
880 	SANY,	TANY,
881 	SCON,	TWORD,
882 		NAREG,		RESC1,
883 		"\tldil\tUR,A1\n"
884 		"\tldo\tAR(A1),A1\n", },
885 
886 { OPLTYPE,	INLL,
887 	SHLL,	TLL,
888 	SPCNHW,	TLL,
889 		NBREG,		RESC1,
890 		"\tldil\tUR>>32,U1\n"
891 		"\tldo\tAR>>32(U1),U1\n"
892 		"\tcopy\t%r0,A1\n", },
893 
894 { OPLTYPE,	INLL,
895 	SHLL,	TLL,
896 	SPCNLW,	TLL,
897 		NBREG,		RESC1,
898 		"\tcopy\t%r0,U1\n"
899 		"\tldil\tUR,A1\n"
900 		"\tldo\tAR(A1),A1\n", },
901 
902 { OPLTYPE,	INLL,
903 	SHLL,	TLL,
904 	SCON,	TLL,
905 		NBREG,		RESC1,
906 		"\tldil\tUR,A1\n"
907 		"\tldo\tAR(A1),A1\n"
908 		"\tldil\tUR>>32,U1\n"
909 		"\tldo\tAR>>32(U1),U1\n", },
910 
911 { OPLTYPE,	INCREG,
912 	SANY,	TFLOAT,
913 	SHFL,	TFLOAT,
914 		NCREG,	RESC1,
915 		"\tfldws\tAL,A1\n", },
916 
917 { OPLTYPE,	INDREG,
918 	SANY,	TDOUBLE|TLDOUBLE,
919 	SHDBL,	TDOUBLE|TLDOUBLE,
920 		NDREG,	RESC1,
921 		"\tfldds\tAL,A1\n", },
922 
923 /*
924  * Negate a word.
925  */
926 { UMINUS,	INLL,
927 	SHLL,	TLL,
928 	SHLL,	TLL,
929 		NBREG|NBSL,	RESC1,
930 		"\tsub\t%r0,AL,A1\n"
931 		"\tsubb\t%r0,UL,A1\n", },
932 
933 { UMINUS,	ININT,
934 	SHINT,	TWORD,
935 	SHINT,	TWORD,
936 		NAREG|NASL,	RESC1,
937 		"\tsub\t%r0,AL,A1\n", },
938 
939 { UMINUS,	INFL,
940 	SHFL,	TFLOAT,
941 	SHFL,	TFLOAT,
942 		NCREG|NCSL,	RESC1,
943 		"\tfsub,sgl\t%fr0,AL,A1\n", },
944 
945 { UMINUS,	INDBL,
946 	SHDBL,	TDOUBLE|TLDOUBLE,
947 	SHDBL,	TDOUBLE|TLDOUBLE,
948 		NDREG|NDSL,	RESC1,
949 		"\tfsub,dbl\t%fr0,AL,A1\n", },
950 
951 { COMPL,	INLL,
952 	SHLL,	TLL,
953 	SANY,	TANY,
954 		NBREG|NBSL,	RESC1,
955 		"\tuaddcm\t%r0,AL,A1\n"
956 		"\tuaddcm\t%r0,UL,U1\n", },
957 
958 { COMPL,	ININT,
959 	SHINT,	ANYFIXED,
960 	SANY,	TANY,
961 		NAREG|NASL,	RESC1,
962 		"\tuaddcm\t%r0,AL,A1\n", },
963 
964 /*
965  * Arguments to functions.
966  */
967 
968 { STARG,	FOREFF,
969 	SAREG|SOREG|SNAME|SCON,	TANY,
970 	SANY,	TSTRUCT,
971 		NAREG | RNULL,	0,
972 		"ZS", },
973 
974 /*
975  * struct field ops
976  */
977 { FLD,	ININT,
978 	SHINT,	TANY,
979 	SFLD,	ANYSIGNED,
980 		NAREG|NASL,	RESC1,
981 		"\textrs\tAL,31-H,S,A1\n", },
982 
983 { FLD,	ININT,
984 	SHINT,	TANY,
985 	SFLD,	ANYUSIGNED,
986 		NAREG|NASL,	RESC1,
987 		"\textru\tAL,31-H,S,A1\n", },
988 
989 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
990 
991 { UMUL, DF( UMUL ), },
992 
993 { ASSIGN, DF(ASSIGN), },
994 
995 { STASG, DF(STASG), },
996 
997 { FLD, DF(FLD), },
998 
999 { OPLEAF, DF(NAME), },
1000 
1001 /* { INIT, DF(INIT), }, */
1002 
1003 { OPUNARY, DF(UMINUS), },
1004 
1005 { OPANY, DF(BITYPE), },
1006 
1007 { FREE,		FREE,
1008 	FREE,	FREE,
1009 	FREE,	FREE,
1010 		FREE,	FREE,
1011 		"HELP; I'm in trouble\n" },
1012 };
1013 
1014 int tablesize = sizeof(table)/sizeof(table[0]);
1015