1 /*        Id: table.c,v 1.29 2011/06/05 08:54:42 plunky Exp           */
2 /*        $NetBSD: table.c,v 1.1.1.3 2011/09/01 12:46:50 plunky Exp $ */
3 
4 /*
5  * Copyright (c) 2008 David Crawshaw <david@zentus.com>
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include "pass2.h"
21 
22 #define TS64   TLONG|TLONGLONG
23 #define TU64   TULONG|TULONGLONG|TPOINT
24 #define T64    TS64|TU64
25 
26 struct optab table[] = {
27 
28 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },      /* empty */
29 
30 { PCONV,  INAREG,
31           SAREG,    T64|TINT,
32           SAREG,    T64,
33                     0,        RLEFT,
34                     "         ! convert between word and pointer\n", },
35 
36 /* Conversions. */
37 
38 { SCONV,  INAREG,
39           SAREG,    T64|TUNSIGNED,
40           SAREG,    TINT,
41                     NAREG|NASL,         RESC1,
42                     "         sra AL,0,A1         \t\t! (u)int64/32 -> (u)int32\n", },
43 
44 { SCONV,  INAREG,
45           SAREG,    T64|TINT|TUNSIGNED,
46           SAREG,    TSHORT,
47                     NAREG|NASL,         RESC1,
48                     "         sll AL,16,A1        \t\t! (u)int64/32 -> int16\n"
49                     "         sra AL,16,A1\n"
50                     "         sra AL, 0,A1\n", },
51 
52 { SCONV,  INAREG,
53           SAREG,    T64|TINT|TUNSIGNED,
54           SAREG,    TUSHORT,
55                     NAREG|NASL,         RESC1,
56                     "         sll AL,16,A1        \t\t! (u)int64/32 -> uint16\n"
57                     "         srl AL,16,A1\n", },
58 
59 { SCONV,  INAREG,
60           SAREG,    T64|TINT|TUNSIGNED|TSHORT|TUSHORT,
61           SAREG,    TCHAR,
62                     NAREG|NASL,         RESC1,
63                     "         sll AL,24,A1        \t\t! (u)int64/32/16 -> int8\n"
64                     "         sra AL,24,A1\n"
65                     "         sra AL, 0,A1\n", },
66 
67 { SCONV,  INAREG,
68           SAREG,    T64|TINT|TUNSIGNED|TSHORT|TUSHORT,
69           SAREG,    TUCHAR,
70                     NAREG|NASL,         RESC1,
71                     "         and AL,0xff,A1      \t\t! (u)int64/32/16 -> uint8\n", },
72 
73 { SCONV,  INAREG,
74           SAREG,    T64|TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, /* TCHAR|TUCHAR added to handle char -> long (among others) */
75           SAREG,    T64,
76                     0,        RLEFT,
77                     "                             \t\t! (u)int64...8 -> (u)int64\n", },
78 
79 { SCONV,  INAREG,
80           SAREG,    TSHORT|TUSHORT|TCHAR|TUCHAR,
81           SAREG,    TINT,
82                     0,        RLEFT,
83                     "                             \t\t! (u)int16/8 -> int32\n", },
84 
85 { SCONV,  INAREG,
86           SAREG,    T64|TINT|TSHORT|TCHAR,
87           SAREG,    TUNSIGNED,
88                     0,        RLEFT,
89                     "         srl AL, 0,A1        \t\t! int32/16/8 -> uint32\n", },
90 
91 { SCONV,  INAREG,
92           SAREG,    TUSHORT|TUCHAR,
93           SAREG,    TUNSIGNED,
94                     0,        RLEFT,
95                     "                             \t\t! uint16/8 -> uint32\n", },
96 
97 { SCONV,  INBREG,
98           SBREG,    TINT|TUNSIGNED,
99           SBREG,    TFLOAT,
100                     NBREG|NASL,         RESC1,
101                     "         fitos AL,A1         \t\t! (u)int32 -> float\n", },
102 
103 { SCONV,  INBREG,
104           SBREG,    T64,
105           SBREG,    TFLOAT,
106                     NBREG|NASL,         RESC1,
107                     "         fxtos AL,A1         \t\t! (u)int64 -> float\n", },
108 
109 { SCONV,  INCREG,
110           SCREG,    TINT|TUNSIGNED,
111           SCREG,    TDOUBLE,
112                     NCREG|NASL,         RESC1,
113                     "         fitod AL,A1         \t\t! (u)int32 -> double\n", },
114 
115 { SCONV,  INCREG,
116           SCREG,    T64,
117           SCREG,    TDOUBLE,
118                     NCREG|NASL,         RESC1,
119                     "         fxtod AL,A1         \t\t! (u)int64 -> double\n", },
120 
121 
122 /* Floating-point conversions must be stored and loaded. */
123 
124 { SCONV,  INAREG,
125           SOREG,    TFLOAT,
126           SAREG,    TINT,
127                     NAREG|(2*NBREG),    RESC1,
128                     "         ld [AL],A2    \t\t! float -> int32\n"
129                     "         nop\n"
130                     "         fmovs A2,A3\n"
131                     "         fstoi A2,A2\n"
132                     "         st A2,[AL]\n"
133                     "         nop\n"
134                     "         ld [AL],A1\n"
135                     "         nop\n"
136                     "         st A3,[AL]\n"
137                     "         nop\n", },
138 
139 { SCONV,  INAREG,
140           SOREG,    TDOUBLE,
141           SAREG,    TINT,
142                     NAREG|(2*NCREG),    RESC1,
143                     "         ld [AL],A2    \t\t! double -> int32\n"
144                     "         nop\n"
145                     "         fmovd A2,A3\n"
146                     "         fdtoi A2,A2\n"
147                     "         std A2,[AL]\n"
148                     "         nop\n"
149                     "         ldd [AL],A1\n"
150                     "         nop\n"
151                     "         std A3,[AL]\n"
152                     "         nop\n", },
153 
154 { SCONV,  INBREG,
155           SOREG,    T64|TUNSIGNED,
156           SBREG,    TFLOAT,
157                     NBREG,    RESC1,
158                     "         ld [AL],A1          \t\t! int64 -> float\n"
159                     "         fxtos A1,A1\n", },
160 
161 { SCONV,  INBREG,
162           SOREG,    TINT|TSHORT|TCHAR,
163           SBREG,    TFLOAT,
164                     NBREG,    RESC1,
165                     "         ld [AL],A1          \t\t! int32/16/8 -> float\n"
166                     "         fitos A1,A1\n", }, // XXX need 'lds', 'ldh', etc
167 
168 { SCONV,  INCREG,
169           SOREG,    T64|TUNSIGNED,
170           SCREG,    TDOUBLE,
171                     NCREG,    RESC1,
172                     "         ldd [AL],A1         \t\t! (u)int64 -> double\n"
173                     "         fxtod A1,A1\n", },
174 
175 { SCONV,  INCREG,
176           SOREG,    TINT|TSHORT|TCHAR,
177           SCREG,    TDOUBLE,
178                     NCREG,    RESC1,
179                     "         ld [AL],A1          \t\t! int32/16/8 -> double\n"
180                     "         fitod A1,A1\n", }, // XXX need 'lds' 'ldh' 'ld', etc.
181 
182 { SCONV,  INBREG,
183           SCREG,    TDOUBLE,
184           SBREG,    TFLOAT,
185                     NBREG,    RESC1,
186                     "         fdtos AL,A1         \t\t! double -> float\n",},
187 
188 { SCONV,  INCREG,
189           SBREG,    TFLOAT,
190           SCREG,    TDOUBLE,
191                     NCREG,    RESC1,
192                     "         fstod AL,A1         \t\t! float -> double\n",},
193 
194 { SCONV,    INAREG,
195           SBREG,  TFLOAT,
196           SAREG,  TINT,
197                     NAREG|NBREG,    RESC1,
198                     "         fstoi AL,A2     \t\t! float -> int\n"
199                     "         st A2,[%fp+2047]\n"
200                     "         nop\n"
201                     "         ld [%fp+2047],A1\n"
202                     "         nop\n",},
203 
204 { SCONV,    INAREG,
205           SCREG,  TDOUBLE,
206           SAREG,  TINT,
207                     NAREG|NCREG,    RESC1,
208                     "         fdtoi AL,A2     \t\t! double -> int\n"
209                     "         st A2,[%fp+2047]\n"
210                     "         nop\n"
211                     "         ld [%fp+2047],A1\n"
212         " nop\n",},
213 
214 
215 /* Multiplication and division */
216 
217 { MUL,    INAREG,
218           SAREG,    TANY,
219           SAREG,    TANY,
220                     NAREG|NASR|NASL,    RESC1,
221                     "         mulx AL,AR,A1                 ! multiply\n", },
222 
223 { MUL,    INBREG,
224           SBREG,    TFLOAT,
225           SBREG,    TFLOAT,
226                     NBREG|NBSR|NBSL,    RESC1,
227                     "         fmuls AL,AR,A1                ! multiply float\n", },
228 
229 { MUL,    INCREG,
230           SCREG,    TDOUBLE,
231           SCREG,    TDOUBLE,
232                     NCREG|NCSR|NCSL,    RESC1,
233                     "         fmuld AL,AR,A1                ! multiply double\n", },
234 
235 { DIV,    INAREG,
236           SAREG,    TUNSIGNED|TUSHORT|TUCHAR|TU64,
237           SAREG,    TUNSIGNED|TUSHORT|TUCHAR|TU64,
238                     NAREG|NASR|NASL,    RESC1,
239                     "         udivx AL,AR,A1                ! unsigned division\n", },
240 
241 { DIV,    INAREG,
242           SAREG,    TINT|TSHORT|TCHAR|TS64,
243           SAREG,    TINT|TSHORT|TCHAR|TS64,
244                     NAREG|NASR|NASL,    RESC1,
245                     "         sdivx AL,AR,A1                ! signed division\n", },
246 
247 { DIV,    INBREG,
248           SBREG,    TFLOAT,
249           SBREG,    TFLOAT,
250                     NBREG|NBSR|NBSL,    RESC1,
251                     "         fdivs AL,AR,A1                ! divide float\n", },
252 
253 { DIV,    INCREG,
254           SCREG,    TDOUBLE,
255           SCREG,    TDOUBLE,
256                     NCREG|NCSR|NCSL,    RESC1,
257                     "         fdivd AL,AR,A1                ! divide double\n", },
258 
259 { MOD,    INAREG,
260           SAREG,    TUNSIGNED|TUSHORT|TUCHAR|TU64,
261           SAREG,    TUNSIGNED|TUSHORT|TUCHAR|TU64,
262                     NAREG, RESC1,
263                     "         udivx AL,AR,A1                ! unsigned modulo\n"
264                     "         mulx A1,AR,A1\n"
265                     "         sub AL,A1,A1\n", },
266 
267 { MOD,    INAREG,
268           SAREG,    TINT|TSHORT|TCHAR|TS64,
269           SAREG,    TINT|TSHORT|TCHAR|TS64,
270                     NAREG, RESC1,
271                     "         sdivx AL,AR,A1                ! signed modulo\n"
272                     "         mulx A1,AR,A1\n"
273                     "         sub AL,A1,A1\n", },
274 
275 { PLUS,   INAREG,
276           SAREG,    TANY,
277           SAREG,    TANY,
278                     NAREG|NASL,         RESC1,
279                     "         add AL,AR,A1\n", },
280 
281 { PLUS,   INBREG,
282           SBREG,    TFLOAT,
283           SBREG,    TFLOAT,
284                     NBREG|NBSL,         RESC1,
285                     "         fadds AL,AR,A1\n", },
286 
287 { PLUS,   INCREG,
288           SCREG,    TDOUBLE,
289           SCREG,    TDOUBLE,
290                     NCREG|NCSL,         RESC1,
291                     "         faddd AL,AR,A1\n", },
292 
293 { PLUS,   INAREG,
294           SAREG,    TANY,
295           SCON,     TANY,
296                     (3*NAREG),          RESC1,
297                     "ZA", },
298 
299 { MINUS,  INAREG,
300           SAREG,    TANY,
301           SAREG,    TANY,
302                     NAREG|NASL,         RESC1,
303                     "         sub AL,AR,A1\n", },
304 
305 { MINUS,  INBREG,
306           SBREG,    TANY,
307           SBREG,    TANY,
308                     NBREG|NBSL|NBSR,    RESC1,
309                     "         fsubs AL,AR,A1\n", },
310 
311 { MINUS,  INCREG,
312           SCREG,    TANY,
313           SCREG,    TANY,
314                     NCREG|NCSL|NBSR,    RESC1,
315                     "         fsubd AL,AR,A1\n", },
316 
317 { MINUS,  INAREG,
318           SAREG,    TANY,
319           SCON,     TANY,
320                     (3*NAREG),          RESC1,
321                     "ZB", },
322 
323 { UMINUS, INAREG,
324           SAREG,    TANY,
325           SANY,     TANY,
326                     NAREG|NASL,         RESC1,
327                     "         sub %g0,AL,A1\n", },
328 
329 { UMINUS, INBREG,
330           SBREG,    TANY,
331           SANY,     TANY,
332                     NBREG|NBSL,         RESC1,
333                     "         fsubs %g0,AL,A1\n", },
334 
335 { UMINUS, INCREG,
336           SCREG,    TANY,
337           SANY,     TANY,
338                     NCREG|NCSL,         RESC1,
339                     "         fsubd %g0,AL,A1\n", },
340 
341 /* Shifts */
342 
343 { RS,     INAREG,
344           SAREG,    TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
345           SAREG|SCON,         TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
346                     NAREG|NASL,         RESC1,
347                     "         srl AL,AR,A1                            ! shift right\n", },
348 
349 { RS,     INAREG,
350           SAREG,    T64,
351           SAREG|SCON,         T64|TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
352                     NAREG|NASL,         RESC1,
353                     "         srlx AL,AR,A1                           ! shift right\n", },
354 
355 { LS,     INAREG,
356           SAREG,    TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
357           SAREG|SCON,         TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
358                     NAREG|NASL,         RESC1,
359                     "         sll AL,AR,A1                            ! shift left\n", },
360 
361 { LS,     INAREG,
362           SAREG,    T64,
363           SAREG|SCON,         TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR,
364                     NAREG|NASL,         RESC1,
365                     "         sllx AL,AR,A1                           ! shift left\n", },
366 
367 { COMPL,  INAREG,
368           SAREG,    TANY,
369           SANY,     TANY,
370                     NAREG|NASL,         RESC1,
371                     "         not AL,A1                     ! complement\n", },
372 
373 /* Assignments */
374 
375 { ASSIGN, FOREFF|INAREG,                          /* FIXME: Remove [,] here and add them in adrput instead. */
376           SAREG|SOREG,        TINT|TUNSIGNED,
377           SAREG,    TINT|TUNSIGNED,
378                     0,        RDEST,
379                     "         stw AR,[AL]                   ! store (u)int32\n"
380                     "         nop\n", },
381 
382 { ASSIGN, FOREFF|INAREG,
383           SOREG,    TSHORT|TUSHORT,
384           SAREG,    TSHORT|TUSHORT,
385                     0,        RDEST,
386           "         sth AR,[AL]                   ! store (u)int16\n"
387                     "         nop\n", },
388 
389 { ASSIGN, FOREFF|INAREG,
390           SOREG,    TCHAR|TUCHAR,
391           SAREG,    TCHAR|TUCHAR,
392                     0,        RDEST,
393           "         stb AR,[AL]                   ! store (u)int8\n"
394                     "         nop\n", },
395 
396 { ASSIGN, FOREFF|INAREG,
397           SOREG,    T64,
398           SAREG,    T64,
399                     0,        RDEST,
400                     "         stx AR,[AL]                   ! store (u)int64\n"
401                     "         nop\n", },
402 
403 { ASSIGN, FOREFF|INBREG,
404           SOREG,    TFLOAT,
405           SBREG,    TFLOAT,
406                     0,        RDEST,
407                     "         st AR,[AL]                    ! store float\n"
408                     "         nop\n", },
409 
410 { ASSIGN, FOREFF|INBREG,
411           SOREG,    TINT,
412           SBREG,    TINT,
413                     0,        RDEST,
414                     "         st AR,[AL]                    ! store int from fp address\n"
415                     "         nop\n", },
416 
417 { ASSIGN, FOREFF|INCREG,
418           SOREG,    TDOUBLE,
419           SCREG,    TDOUBLE,
420                     0,        RDEST,
421                     "         std AR,[AL]                   ! store double\n"
422                     "         nop\n", },
423 
424 { ASSIGN, FOREFF|INCREG,
425           SOREG,    TINT,
426           SCREG,    TINT,
427                     0,        RDEST,
428                     "         st AR,[AL]                    ! store int from fp address\n"
429                     "         nop\n", },
430 
431 
432 { ASSIGN, FOREFF|INAREG,
433           SNAME,    TINT|TUNSIGNED,
434           SAREG,    TINT|TUNSIGNED,
435                     NAREG,    RDEST,
436                     "         sethi %h44(AL),A1   \t! store (u)int32 into sname\n"
437                     "         or A1,%m44(AL),A1\n"
438                     "         sllx A1,12,A1\n"
439                     "         stw AR,[A1+%l44(AL)]\n"
440                     "         nop\n", },
441 
442 { ASSIGN, FOREFF|INAREG,
443           SNAME,    TSHORT|TUSHORT,
444           SAREG,    TSHORT|TUSHORT,
445                     NAREG,    RDEST,
446                     "         sethi %h44(AL),A1   \t! store (u)int16 into sname\n"
447                     "         or A1,%m44(AL),A1\n"
448                     "         sllx A1,12,A1\n"
449                     "         sth AR,[A1+%l44(AL)]\n"
450                     "         nop\n", },
451 
452 { ASSIGN, FOREFF|INAREG,
453           SNAME,    TCHAR|TUCHAR,
454           SAREG,    TCHAR|TUCHAR,
455                     NAREG,    RDEST,
456                     "         sethi %h44(AL),A1   \t! store (u)int8 into sname\n"
457                     "         or A1,%m44(AL),A1\n"
458                     "         sllx A1,12,A1\n"
459                     "         stb AR,[A1+%l44(AL)]\n"
460                     "         nop\n", },
461 
462 { ASSIGN, FOREFF|INAREG,
463           SNAME,    T64,
464           SAREG,    T64,
465                     NAREG,    RDEST,
466                     "         sethi %h44(AL),A1   \t! store (u)int64 into sname\n"
467                     "         or A1,%m44(AL),A1\n"
468                     "         sllx A1,12,A1\n"
469                     "         stx AR,[A1+%l44(AL)]\n"
470                     "         nop\n", },
471 
472 { ASSIGN, FOREFF|INBREG,
473           SNAME,    TFLOAT|TINT,
474           SBREG,    TFLOAT|TINT,
475                     NAREG,    RDEST,
476                     "         sethi %h44(AL),A1   \t! store float into sname\n"
477                     "         or A1,%m44(AL),A1\n"
478                     "         sllx A1,12,A1\n"
479                     "         st AR,[A1+%l44(AL)]\n"
480                     "         nop\n", },
481 
482 { ASSIGN, FOREFF|INCREG,
483           SNAME,    TDOUBLE,
484           SCREG,    TDOUBLE,
485                     NAREG,    RDEST,
486                     "         sethi %h44(AL),A1   \t! store double into sname\n"
487                     "         or A1,%m44(AL),A1\n"
488                     "         sllx A1,12,A1\n"
489                     "         std AR,[A1+%l44(AL)]\n"
490                     "         nop\n", },
491 
492 { ASSIGN, FOREFF|INCREG,
493           SNAME,    TINT,
494           SCREG,    TINT,
495                     NAREG,    RDEST,
496                     "         sethi %h44(AL),A1   \t! store int into sname\n"
497                     "         or A1,%m44(AL),A1\n"
498                     "         sllx A1,12,A1\n"
499                     "         st AR,[A1+%l44(AL)]\n"
500                     "         nop\n", },
501 
502 { ASSIGN, FOREFF|INAREG,
503           SAREG,    TANY,
504           SAREG,    TANY,
505                     0,        RDEST,
506                     "         mov AR,AL                     ! register move\n", },
507 
508 { ASSIGN, FOREFF|INBREG,
509           SBREG,    TANY,
510           SBREG,    TANY,
511                     0,        RDEST,
512                     "         fmovs AR,AL                             ! move float\n", },
513 
514 { ASSIGN, FOREFF|INCREG,
515           SCREG,    TANY,
516           SCREG,    TANY,
517                     0,        RDEST,
518                     "         fmovd AR,AL                             ! move double\n", },
519 
520 /* Structure assignment. */
521 
522 { STASG,  INAREG|FOREFF,
523           SOREG|SNAME,        TANY,
524           SAREG,              TPTRTO|TANY,
525                     NSPECIAL, RDEST,
526                     "ZQ", },
527 
528 /* Comparisons. */
529 
530 { EQ,     FORCC,
531         SAREG,      TANY,
532         SAREG,      TANY,
533                 0,      RESCC,
534                     "         cmp AL,AR                     ! eq\n"
535                     "         be LC\n"
536                     "         nop\n", },
537 
538 { NE,     FORCC,
539         SAREG,      TANY,
540         SAREG,      TANY,
541                 0,      RESCC,
542                     "         cmp AL,AR                     ! ne\n"
543                 "   bne LC\n"
544                     "         nop\n", },
545 
546 { OPLOG,  FORCC,
547           SAREG,    TANY,
548           SZERO,    TANY,
549                     0,        RESCC,
550                     "         O AL,LC\n"
551                     "         nop\n", },
552 
553 { OPLOG,  FORCC,
554           SAREG,    TANY,
555           SAREG,    TANY,
556                     NAREG|NASL,         RESCC,
557                     "         sub AL,AR,A1                            ! oplog\n"
558                     "         O A1,LC\n"
559                     "         nop\n", },
560 
561 { OPLOG,  FORCC,
562           SAREG,    TANY,
563           SCCON,    TANY,
564                     NAREG|NASL,         RESCC,
565                     "         sub AL,AR,A1                            ! oplog sccon\n"
566                     "         O A1,LC\n"
567                     "         nop\n", },
568 
569 { OPLOG,  FORCC,
570           SBREG,    TFLOAT,
571           SBREG,    TFLOAT,
572                     NBREG, RESCC,
573                     "         fcmps AL,AR                             ! oplog float\n"
574                     "         ZF LC\n", },
575 
576 { OPLOG,  FORCC,
577           SOREG,    TFLOAT,
578           SBREG,    TFLOAT,
579                     NBREG, RESCC,
580                     "         ld [AL], A1                             ! oplog float oreg\n"
581                     "         nop\n"
582                     "         fcmps A1,AR\n"
583                     "         ZF LC\n", },
584 
585 { OPLOG,  FORCC,
586           SCREG,    TDOUBLE,
587           SCREG,    TDOUBLE,
588                     NCREG, RESCC,
589                     "         fcmpd AL,AR                             ! oplog double\n"
590                     "         ZF LC\n", },
591 
592 { OPLOG,  FORCC,
593           SOREG,    TDOUBLE,
594           SCREG,    TDOUBLE,
595                     NCREG, RESCC,
596                     "         ldd [AL], A1                            ! oplog double oreg\n"
597                     "         nop\n"
598                     "         fcmpd A1,AR\n"
599                     "         ZF LC\n", },
600 
601 
602 /* Load constants to register. */
603 
604 { OPLTYPE,          INAREG,
605           SCON,               TANY,
606           SNAME,              T64,
607                     NAREG,    RESC1,
608                     "         sethi %h44(AL),A1\t ! load const (u)int64 to reg\n"
609                     "         or A1,%m44(AL),A1\n"
610                     "         sllx A1,12,A1\n"
611                     "         ldx [A1+%l44(AL)],A1\n"
612                     "         nop\n", },
613 { OPLTYPE,          INAREG,
614           SCON,               TANY,
615           SNAME,              TINT,
616                     NAREG,    RESC1,
617                     "         sethi %h44(AL),A1\t ! load const int32 to reg\n"
618                     "         or A1,%m44(AL),A1\n"
619                     "         sllx A1,12,A1\n"
620                     "         ldsw [A1+%l44(AL)],A1\n"
621                     "         nop\n", },
622 
623 { OPLTYPE,          INAREG,
624           SCON,               TANY,
625           SNAME,              TUNSIGNED,
626                     NAREG,    RESC1,
627                     "         sethi %h44(AL),A1\t! load const uint32 to reg\n"
628                     "         or A1,%m44(AL),A1\n"
629                     "         sllx A1,12,A1\n"
630                     "         lduw [A1+%l44(AL)],A1\n"
631                     "         nop\n", },
632 { OPLTYPE,          INAREG,
633           SCON,               TANY,
634           SNAME,              TSHORT,
635                     NAREG,    RESC1,
636                     "         sethi %h44(AL),A1\t! load const int16 to reg\n"
637                     "         or A1,%m44(AL),A1\n"
638                     "         sllx A1,12,A1\n"
639                     "         ldsh [A1+%l44(AL)],A1\n"
640                     "         nop\n", },
641 { OPLTYPE,          INAREG,
642           SCON,               TANY,
643           SNAME,              TUSHORT,
644                     NAREG,    RESC1,
645                     "         sethi %h44(AL),A1\t ! load const uint16 to reg\n"
646                     "         or A1,%m44(AL),A1\n"
647                     "         sllx A1,12,A1\n"
648                     "         lduh [A1+%l44(AL)],A1\n"
649                     "         nop\n", },
650 { OPLTYPE,          INAREG,
651           SCON,               TANY,
652           SNAME,              TCHAR,
653                     NAREG,    RESC1,
654                     "         sethi %h44(AL),A1\t\t! load const int8 to reg\n"
655                     "         or A1,%m44(AL),A1\n"
656                     "         sllx A1,12,A1\n"
657                     "         ldsb [A1+%l44(AL)],A1\n"
658                     "         nop\n", },
659 { OPLTYPE,          INAREG,
660           SCON,               TANY,
661           SNAME,              TUCHAR,
662                     NAREG,    RESC1,
663                     "         sethi %h44(AL),A1\t! load const uint8 to reg\n"
664                     "         or A1,%m44(AL),A1\n"
665                     "         sllx A1,12,A1\n"
666                     "         ldub [A1+%l44(AL)],A1\n"
667                     "         nop\n", },
668 
669 { OPLTYPE,          INBREG,
670           SBREG,    TANY,
671           SNAME,    TANY,
672                     NAREG|NBREG,        RESC2,
673                     "         sethi %h44(AL),A1\t\t! load const to fp reg\n"
674                     "         or A1,%m44(AL),A1\n"
675                     "         sllx A1,12,A1\n"
676                     "         ld [A1+%l44(AL)],A2\n"
677                     "         nop\n", },
678 
679 { OPLTYPE,          INCREG,
680           SCREG,    TANY,
681           SNAME,    TANY,
682                     NAREG|NCREG,        RESC2,
683                     "         sethi %h44(AL),A1\t\t! load const to fp reg\n"
684                     "         or A1,%m44(AL),A1\n"
685                     "         sllx A1,12,A1\n"
686                     "         ldd [A1+%l44(AL)],A2\n"
687                     "         nop\n", },
688 
689 { OPLTYPE,          INAREG,
690           SANY,     TANY,
691           SCON,     TANY,
692                     (2*NAREG),          RESC1,
693                     "ZC" },
694 
695 /* Convert LTYPE to reg. */
696 
697 { OPLTYPE,          INAREG,
698           SAREG,    TANY,
699           SOREG,    TCHAR,
700                     NAREG,    RESC1,
701                     "         ldsb [AL],A1                  ! load int8 to reg\n"
702                     "         nop\n", },
703 
704 { OPLTYPE,          INAREG,
705           SAREG,    TANY,
706           SOREG,    TUCHAR,
707                     NAREG,    RESC1,
708                     "         ldub [AL],A1                  ! load uint8 to reg\n"
709                     "         nop\n", },
710 
711 { OPLTYPE,          INAREG,
712           SAREG,    TANY,
713           SOREG,    TSHORT,
714                     NAREG,    RESC1,
715                     "         ldsh [AL],A1                  ! load int16 to reg\n"
716                     "         nop\n", },
717 
718 { OPLTYPE,          INAREG,
719           SAREG,    TANY,
720           SOREG,    TUSHORT,
721                     NAREG,    RESC1,
722                     "         lduh [AL],A1                  ! load uint16 to reg\n"
723                     "         nop\n", },
724 
725 { OPLTYPE,          INAREG,
726           SAREG,    TANY,
727           SOREG,    TINT,
728                     NAREG,    RESC1,
729                     "         ldsw [AL],A1                  ! load int32 to reg\n"
730                     "         nop\n", },
731 
732 { OPLTYPE,          INAREG,
733           SAREG,    TANY,
734           SOREG,    TUNSIGNED,
735                     NAREG,    RESC1,
736                     "         lduw [AL],A1                  ! load uint32 to reg\n"
737                     "         nop\n", },
738 
739 { OPLTYPE,          INAREG,
740           SAREG,    TANY,
741           SOREG,    T64,
742                     NAREG,    RESC1,
743                     "         ldx [AL],A1                   ! load (u)int64 to reg\n"
744                     "         nop\n", },
745 
746 { OPLTYPE,          INAREG,
747           SANY,     TANY,
748           SZERO,    TANY,
749                     NAREG,    RESC1,
750                     "         mov \%g0,A1\t                 ! load 0 to reg\n", },
751 
752 { OPLTYPE,          INBREG,
753           SBREG,    TFLOAT,
754           SOREG,    TFLOAT,
755                     NBREG,    RESC1,
756                     "         ld [AL],A1                    ! load float to reg\n"
757                     "         nop\n", },
758 
759 { OPLTYPE,          INCREG,
760           SCREG,    TDOUBLE,
761           SOREG,    TDOUBLE,
762                     NCREG,    RESC1,
763                     "         ldd [AL],A1                   ! load double to reg\n"
764                     "         nop\n", },
765 
766 /* Jumps. */
767 
768 { GOTO,   FOREFF,
769           SCON,     TANY,
770           SANY,     TANY,
771                     0,        RNOP,
772                     "         call LL                       ! goto LL\n"
773                     "         nop\n", },
774 
775 { UCALL,  FOREFF,
776           SCON,               TANY,
777           SANY,               TANY,
778                     0,        0,
779                     "         call CL                       ! void CL()\n"
780                     "         nop\n", },
781 
782 { UCALL,         INAREG,
783         SCON,                 TANY,
784         SAREG,          TANY,
785                 NAREG,     RESC1,
786                     "         call CL                       ! = CL()\n"
787                     "         nop\n", },
788 
789 { CALL,             FOREFF,
790           SCON,               TANY,
791           SANY,               TANY,
792                     0,        0,
793                     "         call CL                       ! void CL(constant)\n"
794                     "         nop\n", },
795 
796 { CALL,             INAREG,
797           SCON,               TANY,
798           SAREG,              TANY,
799                     NAREG,              RESC1,
800                     "         call CL                       ! = CL(constant)\n"
801                     "         nop\n", },
802 
803 { CALL,             INBREG,
804           SCON,               TANY,
805           SBREG,              TFLOAT,
806                     NBREG,              RESC1,
807                     "         call CL                       ! = CL(constant)\n"
808                     "         nop\n", },
809 
810 { CALL,             INCREG,
811           SCON,               TANY,
812           SCREG,              TDOUBLE,
813                     NCREG,              RESC1,
814                     "         call CL                       ! = CL(constant)\n"
815                     "         nop\n", },
816 
817 { CALL,         INAREG,
818         SAREG,                TANY,
819         SAREG,                TANY,
820                 NAREG,     RESC1,
821                     "         call AL                       ! = AL(args)\n"
822                     "         nop\n", },
823 
824 { CALL,             FOREFF,
825           SAREG,              TANY,
826           SANY,               TANY,
827                     0,                  0,
828                     "         call AL                       ! void AL(args)\n"
829                     "         nop\n", },
830 
831 { UCALL,  FOREFF,
832           SAREG,              TANY,
833           SANY,               TANY,
834                     0,        0,
835                     "         call AL                       ! (*AL)()\n"
836                     "         nop\n", },
837 
838 { UCALL,  INAREG,
839           SAREG,              TANY,
840           SAREG,              TANY,
841                     NAREG,              RESC1,
842                     "         call AL                       ! = (*AL)()\n"
843                     "         nop\n", },
844 
845 { CALL,             INAREG,
846           SAREG,              TANY,
847           SAREG,              TANY,
848                     NAREG,              RESC1,
849                     "         call AL                       ! = (*AL)(args)\n"
850                     "         nop\n", },
851 
852 /* Function arguments. */
853 
854 { FUNARG,       FOREFF,
855         SAREG,  T64,
856         SANY,   TANY,
857                 0,      0,
858                 "   stx AL,[%sp+AR]     \t! save func arg to stack\n"
859                     "         nop\n", },
860 
861 { FUNARG,       FOREFF,
862         SAREG,  TINT|TUNSIGNED,
863         SANY,   TANY,
864                 0,      0,
865                 "   stw AL,[%sp+AR]     \t! save func arg to stack\n"
866                     "         nop\n", },
867 
868 { FUNARG,       FOREFF,
869         SAREG,  TSHORT|TUSHORT,
870         SANY,   TANY,
871                 0,      0,
872                 "   sth AL,[%sp+AR]     \t! save func arg to stack\n"
873                     "         nop\n", },
874 
875 { FUNARG,       FOREFF,
876         SAREG,  TCHAR|TUCHAR,
877         SANY,   TANY,
878                 0,      0,
879                 "   stb AL,[%sp+AR]     \t! save func arg to stack\n"
880                     "         nop\n", },
881 
882 { FUNARG,       FOREFF,
883         SBREG,  TFLOAT,
884         SANY,   TANY,
885                 0,      0,
886                 "   st AL,[%sp+AR]      \t! save func arg to stack\n"
887                     "         nop\n", },
888 
889 { FUNARG,       FOREFF,
890         SCREG,  TDOUBLE,
891         SANY,   TANY,
892                 0,      0,
893                 "   std AL,[%sp+AR]     \t! save func arg to stack\n"
894                     "         nop\n", },
895 
896 
897 /* Indirection. */
898 
899 { OPSIMP, INAREG,
900           SAREG,    TANY,
901           SAREG,    TANY,
902                     NAREG|NASR|NASL,    RESC1,
903                     "         O AL,AR,A1\n", },
904 
905 { UMUL, INAREG,
906           SAREG,    T64,
907           SOREG,    T64,
908                     NAREG,              RESC1,
909                     "         ldx [AL],A1                   ! (u)int64 load\n"
910                     "         nop\n", },
911 { UMUL, INAREG,
912           SAREG,    TINT,
913           SOREG,    TINT,
914                     NAREG,              RESC1,
915                     "         ldsw [AL],A1                  ! int32 load\n"
916                     "         nop\n", },
917 { UMUL, INAREG,
918           SAREG,    TUNSIGNED,
919           SOREG,    TUNSIGNED,
920                     NAREG,              RESC1,
921                     "         lduw [AL],A1                  ! uint32 load\n"
922                     "         nop\n", },
923 { UMUL, INAREG,
924           SAREG,    TCHAR,
925           SOREG,    TCHAR,
926                     NAREG,              RESC1,
927                     "         ldsb [AL],A1                  ! int8 load\n"
928                     "         nop\n", },
929 { UMUL, INAREG,
930           SAREG,    TUCHAR,
931           SOREG,    TUCHAR,
932                     NAREG,              RESC1,
933                     "         ldub [AL],A1                  ! uint8 load\n"
934                     "         nop\n", },
935 { UMUL, INAREG,
936           SAREG,    TSHORT,
937           SOREG,    TSHORT,
938                     NAREG,              RESC1,
939                     "         ldsh [AL],A1                  ! int16 load\n"
940                     "         nop\n", },
941 { UMUL, INAREG,
942           SAREG,    TUSHORT,
943           SOREG,    TUSHORT,
944                     NAREG,              RESC1,
945                     "         lduh [AL],A1                  ! uint16 load\n"
946                     "         nop\n", },
947 
948 { UMUL, INBREG,
949           SAREG,    TFLOAT,
950           SOREG,    TFLOAT,
951                     NBREG,              RESC1,
952                     "         ld [AL],A1                    ! load float\n"
953                     "         nop\n", },
954 
955 { UMUL, INCREG,
956           SAREG,    TDOUBLE,
957           SOREG,    TDOUBLE,
958                     NCREG,              RESC1,
959                     "         ldd [AL],A1                   ! load double\n"
960                     "         nop\n", },
961 
962 { FREE,FREE,FREE,FREE,FREE,FREE,FREE,FREE, "ERR: printing free op\n" },
963 
964 };
965 
966 int tablesize = sizeof(table)/sizeof(table[0]);
967