source: mainline/uspace/app/pcc/arch/sparc64/table.c@ 423e5e87

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 423e5e87 was a7de7182, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 14 years ago

Added pcc source tree (contents of pcc-1.0.0.tgz)

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