Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v8plus / include / spix_sparc.h
CommitLineData
920dae64
AT
1/* %COPYRIGHT% */
2
3#ifndef SPIX_SPARC_H
4#define SPIX_SPARC_H
5
6#pragma ident "@(#)spix_sparc.h 1.32"
7
8
9#include <stddef.h>
10#include <spixtypes.h>
11#include <spix_sparc_iop.h>
12#include <spix_sparc_inames.h>
13#include <spix_sparc_iwords.h>
14#include <IHASH.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#define DOUBLE_REGNO(x) (((x) & 0x1e) | (((x) & 1) << 5))
21#define QUAD_REGNO(x) (((x) & 0x1c) | (((x) & 1) << 5))
22
23/*
24 * The format of a SPARC instruction.
25 */
26
27typedef union {
28 unsigned inst;
29
30#ifdef ARCH_X64
31 /*
32 * On x64 platform, bit-fields are allocated from right to left,
33 * which is the reverse of SPARC platform.
34 */
35
36 /*
37 * SPIX_SPARC_IOP_CALL
38 */
39 struct {
40 signed disp:30;
41 unsigned op:2;
42 } call;
43
44 /*
45 * SPIX_SPARC_IOP_SETHI, SPIX_SPARC_IOP_NOP, SPIX_SPARC_IOP_ILLTRAP
46 */
47 struct {
48 unsigned imm:22;
49 unsigned op2:3;
50 unsigned rd:5;
51 unsigned op:2;
52 } sethi;
53
54 /*
55 * SPIX_SPARC_ITYPE_BICC, SPIX_SPARC_ITYPE_FBFCC
56 */
57 struct {
58 signed disp:22;
59 unsigned op2:3;
60 unsigned cond:4;
61 unsigned a:1;
62 unsigned op:2;
63 } bcc;
64
65 /*
66 * SPIX_SPARC_ITYPE_BPCC, SPIX_SPARC_ITYPE_FBPFCC
67 */
68 struct {
69 signed disp:19;
70 unsigned p:1;
71 unsigned cc:2;
72 unsigned op2:3;
73 unsigned cond:4;
74 unsigned a:1;
75 unsigned op:2;
76 } bpcc;
77
78 /*
79 * SPIX_SPARC_ITYPE_BPR
80 */
81 struct {
82 unsigned displo:14;
83 unsigned rs1:5;
84 unsigned p:1;
85 unsigned disphi:2;
86 unsigned op2:3;
87 unsigned rcond:3;
88 unsigned :1;
89 unsigned a:1;
90 unsigned op:2;
91 } bpr;
92
93 /*
94 * SPIX_SPARC_ITYPE_LOAD, SPIX_SPARC_ITYPE_USTORE,
95 * SPIX_SPARC_ITYPE_CSTORE
96 *
97 * SPIX_SPARC_IOP_ADD, SPIX_SPARC_IOP_ADDC, SPIX_SPARC_IOP_ADDCC,
98 * SPIX_SPARC_IOP_ADDCCC, SPIX_SPARC_IOP_AND, SPIX_SPARC_IOP_ANDCC,
99 * SPIX_SPARC_IOP_ANDN, SPIX_SPARC_IOP_ANDNCC, SPIX_SPARC_IOP_JMPL,
100 * SPIX_SPARC_IOP_MULSCC, SPIX_SPARC_IOP_MULX, SPIX_SPARC_IOP_OR,
101 * SPIX_SPARC_IOP_ORCC, SPIX_SPARC_IOP_ORN, SPIX_SPARC_IOP_ORNCC,
102 * SPIX_SPARC_IOP_POPC, SPIX_SPARC_IOP_PREFETCH, SPIX_SPARC_IOP_RDASI,
103 * SPIX_SPARC_IOP_RDASR, SPIX_SPARC_IOP_RDCCR, SPIX_SPARC_IOP_RDFPRS,
104 * SPIX_SPARC_IOP_RDPC, SPIX_SPARC_IOP_RDTICK, SPIX_SPARC_IOP_RDY,
105 * SPIX_SPARC_IOP_RESTORE, SPIX_SPARC_IOP_RETURN, SPIX_SPARC_IOP_SAVE,
106 * SPIX_SPARC_IOP_SDIV, SPIX_SPARC_IOP_SDIVCC, SPIX_SPARC_IOP_SDIVX,
107 * SPIX_SPARC_IOP_RDGSR, SPIX_SPARC_IOP_SIR, SPIX_SPARC_IOP_SMUL,
108 * SPIX_SPARC_IOP_SMULCC, SPIX_SPARC_IOP_SUB, SPIX_SPARC_IOP_SUBC,
109 * SPIX_SPARC_IOP_SUBCC, SPIX_SPARC_IOP_SUBCCC, SPIX_SPARC_IOP_TADDCC,
110 * SPIX_SPARC_IOP_TADDCCTV, SPIX_SPARC_IOP_TSUBCC,
111 * SPIX_SPARC_IOP_TSUBCCTV, SPIX_SPARC_IOP_UDIV, SPIX_SPARC_IOP_UDIVCC,
112 * SPIX_SPARC_IOP_UDIVX, SPIX_SPARC_IOP_UMUL, SPIX_SPARC_IOP_UMULCC,
113 * SPIX_SPARC_IOP_WRGSR, SPIX_SPARC_IOP_WRASI, SPIX_SPARC_IOP_WRASR,
114 * SPIX_SPARC_IOP_WRCCR, SPIX_SPARC_IOP_WRFPRS, SPIX_SPARC_IOP_WRY,
115 * SPIX_SPARC_IOP_XNOR, SPIX_SPARC_IOP_XNORCC, SPIX_SPARC_IOP_XOR,
116 * SPIX_SPARC_IOP_XORCC, SPIX_SPARC_IOP_FLUSHW, SPIX_SPARC_IOP_WRPR,
117 * SPIX_SPARC_IOP_FLUSH, SPIX_SPARC_IOP_RDPR, SPIX_SPARC_IOP_WRHPR,
118 * SPIX_SPARC_IOP_RDHPR
119 */
120 struct {
121 unsigned rs2:5;
122 unsigned :8;
123 unsigned i:1;
124 unsigned rs1:5;
125 unsigned op3:6;
126 unsigned rd:5;
127 unsigned op:2;
128 } memarithr;
129
130 struct {
131 unsigned rs2:5;
132 unsigned :8;
133 unsigned i:1;
134 unsigned rs1:5;
135 unsigned op3:6;
136 unsigned fcn:5;
137 unsigned op:2;
138 } prefetch;
139
140 struct {
141 unsigned imm13:13;
142 unsigned i:1;
143 unsigned rs1:5;
144 unsigned op3:6;
145 unsigned fcn:5;
146 unsigned op:2;
147 } prefetchi;
148
149 struct {
150 unsigned rs2:5;
151 unsigned imm_asi:8;
152 unsigned i:1;
153 unsigned rs1:5;
154 unsigned op3:6;
155 unsigned fcn:5;
156 unsigned op:2;
157 } prefetcha;
158
159 struct {
160 unsigned imm13:13;
161 unsigned i:1;
162 unsigned rs1:5;
163 unsigned op3:6;
164 unsigned fcn:5;
165 unsigned op:2;
166 } prefetchai;
167
168
169 struct {
170 signed imm:13;
171 unsigned i:1;
172 unsigned rs1:5;
173 unsigned op3:6;
174 unsigned rd:5;
175 unsigned op:2;
176 } memarithi;
177
178 struct {
179 unsigned rs2:5;
180 unsigned imm_asi:8;
181 unsigned i:1;
182 unsigned rs1:5;
183 unsigned op3:6;
184 unsigned rd:5;
185 unsigned op:2;
186 } memasi;
187
188 /*
189 * SPIX_SPARC_ITYPE_MOVR
190 */
191 struct {
192 unsigned rs2:5;
193 unsigned :5;
194 unsigned rcond:3;
195 unsigned i:1;
196 unsigned rs1:5;
197 unsigned op3:6;
198 unsigned rd:5;
199 unsigned op:2;
200 } movrr;
201 struct {
202 signed imm:10;
203 unsigned rcond:3;
204 unsigned i:1;
205 unsigned rs1:5;
206 unsigned op3:6;
207 unsigned rd:5;
208 unsigned op:2;
209 } movri;
210
211 /*
212 * SPIX_SPARC_IOP_MEMBAR
213 */
214 struct {
215 unsigned mmask:4;
216 unsigned cmask:3;
217 unsigned :6;
218 unsigned i:1;
219 unsigned rs1:5;
220 unsigned op3:6;
221 unsigned rd:5;
222 unsigned op:2;
223 } membar;
224
225 /*
226 * SPIX_SPARC_IOP_IMPDEP1, SPIX_SPARC_IOP_IMPDEP2
227 */
228 struct {
229 unsigned impdep2:19;
230 unsigned op3:6;
231 unsigned impdep1:5;
232 unsigned op:2;
233 } impdep;
234
235 /*
236 * SPIX_SPARC_IOP_FMADDS, SPIX_SPARC_IOP_FMADDD,
237 * SPIX_SPARC_IOP_FMSUBS, SPIX_SPARC_IOP_FMSUBD,
238 * SPIX_SPARC_IOP_FNMADDS, SPIX_SPARC_IOP_FNMADDD,
239 * SPIX_SPARC_IOP_FNMSUBS, SPIX_SPARC_IOP_FNMSUBD
240 * SPIX_SPARC_IOP_FUMADDS, SPIX_SPARC_IOP_FUMADDD,
241 * SPIX_SPARC_IOP_FUMSUBS, SPIX_SPARC_IOP_FUMSUBD,
242 * SPIX_SPARC_IOP_FUNMADDS, SPIX_SPARC_IOP_FUNMADDD,
243 * SPIX_SPARC_IOP_FUNMSUBS, SPIX_SPARC_IOP_FUNMSUBD
244 */
245 struct {
246 unsigned rs2:5;
247 unsigned size:2;
248 unsigned var:2;
249 unsigned rs3:5;
250 unsigned rs1:5;
251 unsigned op3:6;
252 unsigned rd:5;
253 unsigned op:2;
254 } fmadd;
255
256 /*
257 * SPIX_SPARC_IOP_SLL, SPIX_SPARC_IOP_SLLX,
258 * SPIX_SPARC_IOP_SRL, SPIX_SPARC_IOP_SRLX,
259 * SPIX_SPARC_IOP_SRA, SPIX_SPARC_IOP_SRAX
260 */
261 struct {
262 unsigned rs2:5;
263 unsigned :7;
264 unsigned x:1;
265 unsigned i:1;
266 unsigned rs1:5;
267 unsigned op3:6;
268 unsigned rd:5;
269 unsigned op:2;
270 } shiftr;
271
272 struct {
273 unsigned shcnt32:5;
274 unsigned :7;
275 unsigned x:1;
276 unsigned i:1;
277 unsigned rs1:5;
278 unsigned op3:6;
279 unsigned rd:5;
280 unsigned op:2;
281 } shifti32;
282
283 struct {
284 unsigned shcnt64:6;
285 unsigned :6;
286 unsigned x:1;
287 unsigned i:1;
288 unsigned rs1:5;
289 unsigned op3:6;
290 unsigned rd:5;
291 unsigned op:2;
292 } shifti64;
293
294 /*
295 * SPIX_SPARC_IOP_FCMPS, SPIX_SPARC_IOP_FCMPD, SPIX_SPARC_IOP_FCMPQ,
296 * SPIX_SPARC_IOP_FCMPES, SPIX_SPARC_IOP_FCMPED, SPIX_SPARC_IOP_FCMPEQ
297 */
298 struct {
299 unsigned rs2:5;
300 unsigned opf:9;
301 unsigned rs1:5;
302 unsigned op3:6;
303 unsigned cc:2;
304 unsigned :3;
305 unsigned op:2;
306 } fcmp;
307
308 /*
309 * SPIX_SPARC_ITYPE_FPOP1
310 */
311 struct {
312 unsigned rs2:5;
313 unsigned opf:9;
314 unsigned rs1:5;
315 unsigned op3:6;
316 unsigned rd:5;
317 unsigned op:2;
318 } fpop1;
319
320 /*
321 * SPIX_SPARC_IOP_SAVED, SPIX_SPARC_IOP_RESTORED,
322 * SPIX_SPARC_IOP_DONE, SPIX_SPARC_IOP_RETRY
323 */
324 struct {
325 unsigned :19;
326 unsigned op3:6;
327 unsigned fcn:5;
328 unsigned op:2;
329 } fcn;
330
331 /*
332 * SPIX_SPARC_ITYPE_TRAP
333 */
334 struct {
335 unsigned rs2:5;
336 unsigned :6;
337 unsigned cc:2;
338 unsigned i:1;
339 unsigned rs1:5;
340 unsigned op3:6;
341 unsigned cond:4;
342 unsigned :1;
343 unsigned op:2;
344 } tccr;
345 struct {
346 unsigned sw_trap:7;
347 unsigned :4;
348 unsigned cc:2;
349 unsigned i:1;
350 unsigned rs1:5;
351 unsigned op3:6;
352 unsigned cond:4;
353 unsigned :1;
354 unsigned op:2;
355 } tcci;
356
357 /*
358 * SPIX_SPARC_ITYPE_MOVCC
359 */
360 struct {
361 unsigned rs2:5;
362 unsigned :6;
363 unsigned cc:2;
364 unsigned i:1;
365 unsigned cond:4;
366 unsigned cc2:1;
367 unsigned op3:6;
368 unsigned rd:5;
369 unsigned op:2;
370 } movccr;
371 struct {
372 signed imm:11;
373 unsigned cc:2;
374 unsigned i:1;
375 unsigned cond:4;
376 unsigned cc2:1;
377 unsigned op3:6;
378 unsigned rd:5;
379 unsigned op:2;
380 } movcci;
381
382 /*
383 * SPIX_SPARC_ITYPE_FMOVR
384 */
385 struct {
386 unsigned rs2:5;
387 unsigned opf_low:5;
388 unsigned rcond:3;
389 unsigned :1;
390 unsigned rs1:5;
391 unsigned op3:6;
392 unsigned rd:5;
393 unsigned op:2;
394 } fmovr;
395
396 /*
397 * SPIX_SPARC_ITYPE_FMOVCC
398 */
399 struct {
400 unsigned rs2:5;
401 unsigned opf_low:6;
402 unsigned opf_cc:3;
403 unsigned cond:4;
404 unsigned :1;
405 unsigned op3:6;
406 unsigned rd:5;
407 unsigned op:2;
408 } fmovcc;
409
410 /*
411 * SPIX_SPARC_ITYPE_SIAM
412 */
413 struct {
414 unsigned mode:3;
415 unsigned :2;
416 unsigned opf:9;
417 unsigned :5;
418 unsigned op3:6;
419 unsigned :5;
420 unsigned op:2;
421 } siam;
422#else
423 /*
424 * SPIX_SPARC_IOP_CALL
425 */
426 struct {
427 unsigned op:2;
428 signed disp:30;
429 } call;
430
431 /*
432 * SPIX_SPARC_IOP_SETHI, SPIX_SPARC_IOP_NOP, SPIX_SPARC_IOP_ILLTRAP
433 */
434 struct {
435 unsigned op:2;
436 unsigned rd:5;
437 unsigned op2:3;
438 unsigned imm:22;
439 } sethi;
440
441 /*
442 * SPIX_SPARC_ITYPE_BICC, SPIX_SPARC_ITYPE_FBFCC
443 */
444 struct {
445 unsigned op:2;
446 unsigned a:1;
447 unsigned cond:4;
448 unsigned op2:3;
449 signed disp:22;
450 } bcc;
451
452 /*
453 * SPIX_SPARC_ITYPE_BPCC, SPIX_SPARC_ITYPE_FBPFCC
454 */
455 struct {
456 unsigned op:2;
457 unsigned a:1;
458 unsigned cond:4;
459 unsigned op2:3;
460 unsigned cc:2;
461 unsigned p:1;
462 signed disp:19;
463 } bpcc;
464
465 /*
466 * SPIX_SPARC_ITYPE_BPR
467 */
468 struct {
469 unsigned op:2;
470 unsigned a:1;
471 unsigned :1;
472 unsigned rcond:3;
473 unsigned op2:3;
474 unsigned disphi:2;
475 unsigned p:1;
476 unsigned rs1:5;
477 unsigned displo:14;
478 } bpr;
479
480 /*
481 * SPIX_SPARC_ITYPE_LOAD, SPIX_SPARC_ITYPE_USTORE,
482 * SPIX_SPARC_ITYPE_CSTORE
483 *
484 * SPIX_SPARC_IOP_ADD, SPIX_SPARC_IOP_ADDC, SPIX_SPARC_IOP_ADDCC,
485 * SPIX_SPARC_IOP_ADDCCC, SPIX_SPARC_IOP_AND, SPIX_SPARC_IOP_ANDCC,
486 * SPIX_SPARC_IOP_ANDN, SPIX_SPARC_IOP_ANDNCC, SPIX_SPARC_IOP_JMPL,
487 * SPIX_SPARC_IOP_MULSCC, SPIX_SPARC_IOP_MULX, SPIX_SPARC_IOP_OR,
488 * SPIX_SPARC_IOP_ORCC, SPIX_SPARC_IOP_ORN, SPIX_SPARC_IOP_ORNCC,
489 * SPIX_SPARC_IOP_POPC, SPIX_SPARC_IOP_PREFETCH, SPIX_SPARC_IOP_RDASI,
490 * SPIX_SPARC_IOP_RDASR, SPIX_SPARC_IOP_RDCCR, SPIX_SPARC_IOP_RDFPRS,
491 * SPIX_SPARC_IOP_RDPC, SPIX_SPARC_IOP_RDTICK, SPIX_SPARC_IOP_RDY,
492 * SPIX_SPARC_IOP_RESTORE, SPIX_SPARC_IOP_RETURN, SPIX_SPARC_IOP_SAVE,
493 * SPIX_SPARC_IOP_SDIV, SPIX_SPARC_IOP_SDIVCC, SPIX_SPARC_IOP_SDIVX,
494 * SPIX_SPARC_IOP_RDGSR, SPIX_SPARC_IOP_SIR, SPIX_SPARC_IOP_SMUL,
495 * SPIX_SPARC_IOP_SMULCC, SPIX_SPARC_IOP_SUB, SPIX_SPARC_IOP_SUBC,
496 * SPIX_SPARC_IOP_SUBCC, SPIX_SPARC_IOP_SUBCCC, SPIX_SPARC_IOP_TADDCC,
497 * SPIX_SPARC_IOP_TADDCCTV, SPIX_SPARC_IOP_TSUBCC,
498 * SPIX_SPARC_IOP_TSUBCCTV, SPIX_SPARC_IOP_UDIV, SPIX_SPARC_IOP_UDIVCC,
499 * SPIX_SPARC_IOP_UDIVX, SPIX_SPARC_IOP_UMUL, SPIX_SPARC_IOP_UMULCC,
500 * SPIX_SPARC_IOP_WRGSR, SPIX_SPARC_IOP_WRASI, SPIX_SPARC_IOP_WRASR,
501 * SPIX_SPARC_IOP_WRCCR, SPIX_SPARC_IOP_WRFPRS, SPIX_SPARC_IOP_WRY,
502 * SPIX_SPARC_IOP_XNOR, SPIX_SPARC_IOP_XNORCC, SPIX_SPARC_IOP_XOR,
503 * SPIX_SPARC_IOP_XORCC, SPIX_SPARC_IOP_FLUSHW, SPIX_SPARC_IOP_WRPR,
504 * SPIX_SPARC_IOP_FLUSH, SPIX_SPARC_IOP_RDPR, SPIX_SPARC_IOP_WRHPR,
505 * SPIX_SPARC_IOP_RDHPR
506 */
507 struct {
508 unsigned op:2;
509 unsigned rd:5;
510 unsigned op3:6;
511 unsigned rs1:5;
512 unsigned i:1;
513 unsigned :8;
514 unsigned rs2:5;
515 } memarithr;
516
517 struct {
518 unsigned op:2;
519 unsigned fcn:5;
520 unsigned op3:6;
521 unsigned rs1:5;
522 unsigned i:1;
523 unsigned :8;
524 unsigned rs2:5;
525 } prefetch;
526
527 struct {
528 unsigned op:2;
529 unsigned fcn:5;
530 unsigned op3:6;
531 unsigned rs1:5;
532 unsigned i:1;
533 unsigned imm13:13;
534 } prefetchi;
535
536 struct {
537 unsigned op:2;
538 unsigned fcn:5;
539 unsigned op3:6;
540 unsigned rs1:5;
541 unsigned i:1;
542 unsigned imm_asi:8;
543 unsigned rs2:5;
544 } prefetcha;
545
546 struct {
547 unsigned op:2;
548 unsigned fcn:5;
549 unsigned op3:6;
550 unsigned rs1:5;
551 unsigned i:1;
552 unsigned imm13:13;
553 } prefetchai;
554
555
556 struct {
557 unsigned op:2;
558 unsigned rd:5;
559 unsigned op3:6;
560 unsigned rs1:5;
561 unsigned i:1;
562 signed imm:13;
563 } memarithi;
564
565 struct {
566 unsigned op:2;
567 unsigned rd:5;
568 unsigned op3:6;
569 unsigned rs1:5;
570 unsigned i:1;
571 unsigned imm_asi:8;
572 unsigned rs2:5;
573 } memasi;
574
575 /*
576 * SPIX_SPARC_ITYPE_MOVR
577 */
578 struct {
579 unsigned op:2;
580 unsigned rd:5;
581 unsigned op3:6;
582 unsigned rs1:5;
583 unsigned i:1;
584 unsigned rcond:3;
585 unsigned :5;
586 unsigned rs2:5;
587 } movrr;
588 struct {
589 unsigned op:2;
590 unsigned rd:5;
591 unsigned op3:6;
592 unsigned rs1:5;
593 unsigned i:1;
594 unsigned rcond:3;
595 signed imm:10;
596 } movri;
597
598 /*
599 * SPIX_SPARC_IOP_MEMBAR
600 */
601 struct {
602 unsigned op:2;
603 unsigned rd:5;
604 unsigned op3:6;
605 unsigned rs1:5;
606 unsigned i:1;
607 unsigned :6;
608 unsigned cmask:3;
609 unsigned mmask:4;
610 } membar;
611
612 /*
613 * SPIX_SPARC_IOP_IMPDEP1, SPIX_SPARC_IOP_IMPDEP2
614 */
615 struct {
616 unsigned op:2;
617 unsigned impdep1:5;
618 unsigned op3:6;
619 unsigned impdep2:19;
620 } impdep;
621
622 /*
623 * SPIX_SPARC_IOP_FMADDS, SPIX_SPARC_IOP_FMADDD,
624 * SPIX_SPARC_IOP_FMSUBS, SPIX_SPARC_IOP_FMSUBD,
625 * SPIX_SPARC_IOP_FNMADDS, SPIX_SPARC_IOP_FNMADDD,
626 * SPIX_SPARC_IOP_FNMSUBS, SPIX_SPARC_IOP_FNMSUBD
627 * SPIX_SPARC_IOP_FUMADDS, SPIX_SPARC_IOP_FUMADDD,
628 * SPIX_SPARC_IOP_FUMSUBS, SPIX_SPARC_IOP_FUMSUBD,
629 * SPIX_SPARC_IOP_FUNMADDS, SPIX_SPARC_IOP_FUNMADDD,
630 * SPIX_SPARC_IOP_FUNMSUBS, SPIX_SPARC_IOP_FUNMSUBD
631 */
632 struct {
633 unsigned op:2;
634 unsigned rd:5;
635 unsigned op3:6;
636 unsigned rs1:5;
637 unsigned rs3:5;
638 unsigned var:2;
639 unsigned size:2;
640 unsigned rs2:5;
641 } fmadd;
642
643 /*
644 * SPIX_SPARC_IOP_SLL, SPIX_SPARC_IOP_SLLX,
645 * SPIX_SPARC_IOP_SRL, SPIX_SPARC_IOP_SRLX,
646 * SPIX_SPARC_IOP_SRA, SPIX_SPARC_IOP_SRAX
647 */
648 struct {
649 unsigned op:2;
650 unsigned rd:5;
651 unsigned op3:6;
652 unsigned rs1:5;
653 unsigned i:1;
654 unsigned x:1;
655 unsigned :7;
656 unsigned rs2:5;
657 } shiftr;
658
659 struct {
660 unsigned op:2;
661 unsigned rd:5;
662 unsigned op3:6;
663 unsigned rs1:5;
664 unsigned i:1;
665 unsigned x:1;
666 unsigned :7;
667 unsigned shcnt32:5;
668 } shifti32;
669
670 struct {
671 unsigned op:2;
672 unsigned rd:5;
673 unsigned op3:6;
674 unsigned rs1:5;
675 unsigned i:1;
676 unsigned x:1;
677 unsigned :6;
678 unsigned shcnt64:6;
679 } shifti64;
680
681 /*
682 * SPIX_SPARC_IOP_FCMPS, SPIX_SPARC_IOP_FCMPD, SPIX_SPARC_IOP_FCMPQ,
683 * SPIX_SPARC_IOP_FCMPES, SPIX_SPARC_IOP_FCMPED, SPIX_SPARC_IOP_FCMPEQ
684 */
685 struct {
686 unsigned op:2;
687 unsigned :3;
688 unsigned cc:2;
689 unsigned op3:6;
690 unsigned rs1:5;
691 unsigned opf:9;
692 unsigned rs2:5;
693 } fcmp;
694
695 /*
696 * SPIX_SPARC_ITYPE_FPOP1
697 */
698 struct {
699 unsigned op:2;
700 unsigned rd:5;
701 unsigned op3:6;
702 unsigned rs1:5;
703 unsigned opf:9;
704 unsigned rs2:5;
705 } fpop1;
706
707 /*
708 * SPIX_SPARC_IOP_SAVED, SPIX_SPARC_IOP_RESTORED,
709 * SPIX_SPARC_IOP_DONE, SPIX_SPARC_IOP_RETRY
710 */
711 struct {
712 unsigned op:2;
713 unsigned fcn:5;
714 unsigned op3:6;
715 unsigned :19;
716 } fcn;
717
718 /*
719 * SPIX_SPARC_ITYPE_TRAP
720 */
721 struct {
722 unsigned op:2;
723 unsigned :1;
724 unsigned cond:4;
725 unsigned op3:6;
726 unsigned rs1:5;
727 unsigned i:1;
728 unsigned cc:2;
729 unsigned :6;
730 unsigned rs2:5;
731 } tccr;
732 struct {
733 unsigned op:2;
734 unsigned :1;
735 unsigned cond:4;
736 unsigned op3:6;
737 unsigned rs1:5;
738 unsigned i:1;
739 unsigned cc:2;
740 unsigned :4;
741 unsigned sw_trap:7;
742 } tcci;
743
744 /*
745 * SPIX_SPARC_ITYPE_MOVCC
746 */
747 struct {
748 unsigned op:2;
749 unsigned rd:5;
750 unsigned op3:6;
751 unsigned cc2:1;
752 unsigned cond:4;
753 unsigned i:1;
754 unsigned cc:2;
755 unsigned :6;
756 unsigned rs2:5;
757 } movccr;
758 struct {
759 unsigned op:2;
760 unsigned rd:5;
761 unsigned op3:6;
762 unsigned cc2:1;
763 unsigned cond:4;
764 unsigned i:1;
765 unsigned cc:2;
766 signed imm:11;
767 } movcci;
768
769 /*
770 * SPIX_SPARC_ITYPE_FMOVR
771 */
772 struct {
773 unsigned op:2;
774 unsigned rd:5;
775 unsigned op3:6;
776 unsigned rs1:5;
777 unsigned :1;
778 unsigned rcond:3;
779 unsigned opf_low:5;
780 unsigned rs2:5;
781 } fmovr;
782
783 /*
784 * SPIX_SPARC_ITYPE_FMOVCC
785 */
786 struct {
787 unsigned op:2;
788 unsigned rd:5;
789 unsigned op3:6;
790 unsigned :1;
791 unsigned cond:4;
792 unsigned opf_cc:3;
793 unsigned opf_low:6;
794 unsigned rs2:5;
795 } fmovcc;
796
797 /*
798 * SPIX_SPARC_ITYPE_SIAM
799 */
800 struct {
801 unsigned op:2;
802 unsigned :5;
803 unsigned op3:6;
804 unsigned :5;
805 unsigned opf:9;
806 unsigned :2;
807 unsigned mode:3;
808 } siam;
809#endif
810} spix_sparc_inst_t;
811
812
813/*
814 * SPARC architecture versions.
815 */
816typedef enum {
817 SPIX_SPARC_V8,
818 SPIX_SPARC_V9
819} spix_sparc_ver_t;
820
821
822/*
823 * Instruction types.
824 */
825typedef enum {
826 /*
827 * These correspond to the architecture independent instruction
828 * classifications in Shade.
829 */
830 SPIX_SPARC_ITYPE_FP,
831 SPIX_SPARC_ITYPE_LOAD,
832 SPIX_SPARC_ITYPE_USTORE,
833 SPIX_SPARC_ITYPE_CSTORE,
834 SPIX_SPARC_ITYPE_BRANCH,
835 SPIX_SPARC_ITYPE_UBRANCH,
836 SPIX_SPARC_ITYPE_CBRANCH,
837 SPIX_SPARC_ITYPE_TRAP,
838
839 /*
840 * These are SPARC specific instruction classifications.
841 */
842 SPIX_SPARC_ITYPE_V8,
843 SPIX_SPARC_ITYPE_V9,
844 SPIX_SPARC_ITYPE_VIS,
845 SPIX_SPARC_ITYPE_PRIV,
846 SPIX_SPARC_ITYPE_BAA,
847 SPIX_SPARC_ITYPE_DCTI,
848 SPIX_SPARC_ITYPE_USECCR,
849 SPIX_SPARC_ITYPE_SETCCR,
850 SPIX_SPARC_ITYPE_SETFCC,
851 SPIX_SPARC_ITYPE_MOVCC,
852 SPIX_SPARC_ITYPE_FMOVCC,
853 SPIX_SPARC_ITYPE_MOVR,
854 SPIX_SPARC_ITYPE_FMOVR,
855 SPIX_SPARC_ITYPE_BICC,
856 SPIX_SPARC_ITYPE_FBFCC,
857 SPIX_SPARC_ITYPE_BPCC,
858 SPIX_SPARC_ITYPE_FBPFCC,
859 SPIX_SPARC_ITYPE_BPR,
860 SPIX_SPARC_ITYPE_FPOP1,
861 SPIX_SPARC_ITYPE_ALU,
862 SPIX_SPARC_ITYPE_ILOAD,
863 SPIX_SPARC_ITYPE_ISTORE,
864 SPIX_SPARC_ITYPE_ANNUL,
865 SPIX_SPARC_ITYPE_PREDICTION,
866 SPIX_SPARC_ITYPE_PRED_TRUE,
867
868 /* SPIX EXT */
869 SPIX_SPARC_ITYPE_PREFETCH,
870 SPIX_SPARC_ITYPE_SAVE,
871 SPIX_SPARC_ITYPE_RESTORE,
872
873 SPIX_SPARC_NITYPE
874} spix_sparc_itype_t;
875
876
877/*
878 * Register usage, action performed.
879 */
880typedef enum {
881 SPIX_SPARC_RUACT_NONE, /* register position not used */
882 SPIX_SPARC_RUACT_RI, /* read int reg */
883 SPIX_SPARC_RUACT_R2I, /* read int reg pair */
884 SPIX_SPARC_RUACT_WI, /* write int reg */
885 SPIX_SPARC_RUACT_W2I, /* write int reg pair */
886 SPIX_SPARC_RUACT_RWI, /* read/write int reg */
887 SPIX_SPARC_RUACT_RW2I, /* read/write int reg pair */
888 SPIX_SPARC_RUACT_RF, /* read single FP reg */
889 SPIX_SPARC_RUACT_R2F, /* read double FP reg */
890 SPIX_SPARC_RUACT_R4F, /* read quad FP reg */
891 SPIX_SPARC_RUACT_WF, /* write single FP reg */
892 SPIX_SPARC_RUACT_W2F, /* write double FP reg */
893 SPIX_SPARC_RUACT_W4F, /* write quad FP reg */
894 SPIX_SPARC_RUACT_RWF, /* read/write single FP reg */
895 SPIX_SPARC_RUACT_RW2F, /* read/write double FP reg */
896 SPIX_SPARC_RUACT_RW4F, /* read/write quad FP reg */
897 SPIX_SPARC_RUACT_RS, /* read special register */
898 SPIX_SPARC_RUACT_WS, /* write special register */
899 SPIX_SPARC_RUACT_RWS /* read/write special register */
900} spix_sparc_ruact_t;
901
902
903/*
904 * Register usage, register position.
905 */
906typedef enum {
907 SPIX_SPARC_RUPOS_RS1, /* rs1 field */
908 SPIX_SPARC_RUPOS_RS2, /* rs2 field */
909 SPIX_SPARC_RUPOS_RS3, /* rs3 field (for fmadd) */
910 SPIX_SPARC_RUPOS_RD, /* rd field */
911 SPIX_SPARC_RUPOS_IMP /* implied register */
912} spix_sparc_rupos_t;
913
914
915/*
916 * Special registers.
917 */
918typedef enum {
919 SPIX_SPARC_SREG_Y, /* %y register */
920 SPIX_SPARC_SREG_ASI, /* %asi register */
921 SPIX_SPARC_SREG_CCR, /* %ccr register */
922 SPIX_SPARC_SREG_FPRS, /* %fprs register */
923 SPIX_SPARC_SREG_FCC, /* condition code fields of %fsr */
924 SPIX_SPARC_SREG_RM, /* rounding mode field of %fsr */
925 SPIX_SPARC_SREG_FSR, /* %fsr register (other than fcc or rm) */
926 SPIX_SPARC_SREG_TICK, /* %tick register */
927 SPIX_SPARC_SREG_GSR /* %gsr register */
928} spix_sparc_sreg_t;
929
930
931
932/*
933 * Return opcode value for instruction encoding.
934 */
935spix_sparc_iop_t spix_sparc_iop(spix_sparc_ver_t, const void *);
936
937
938/*
939 * Disassemble an instruction.
940 */
941#ifdef SPIX_I64
942size_t spix_sparc_dis(char *, size_t, spix_sparc_iop_t, const void *,
943 spix_addr64_t);
944#endif
945size_t spix_sparc_dis32(char *, size_t, spix_sparc_iop_t, const void *,
946 spix_addr32_t);
947
948
949/*
950 * Return software names for register numbers.
951 */
952const char * spix_sparc_ireg_name(unsigned);
953const char * spix_sparc_asreg_name(unsigned);
954
955
956/*
957 * Classify instruction opcode values.
958 */
959spix_bool_t spix_sparc_iop_istype(spix_sparc_iop_t, spix_sparc_itype_t);
960
961#define spix_sparc_iop_isfp(iop) \
962 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FP)
963#define spix_sparc_iop_isload(iop) \
964 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_LOAD)
965#define spix_sparc_iop_isustore(iop) \
966 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_USTORE)
967#define spix_sparc_iop_iscstore(iop) \
968 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_CSTORE)
969#define spix_sparc_iop_isbranch(iop) \
970 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_BRANCH)
971#define spix_sparc_iop_isubranch(iop) \
972 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_UBRANCH)
973#define spix_sparc_iop_iscbranch(iop) \
974 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_CBRANCH)
975#define spix_sparc_iop_isannul(iop) \
976 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_ANNUL)
977#define spix_sparc_iop_istrap(iop) \
978 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_TRAP)
979#define spix_sparc_iop_isv8(iop) \
980 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_V8)
981#define spix_sparc_iop_isv9(iop) \
982 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_V9)
983#define spix_sparc_iop_isvis(iop) \
984 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_VIS)
985#define spix_sparc_iop_ispriv(iop) \
986 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_PRIV)
987#define spix_sparc_iop_isbaa(iop) \
988 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_BAA)
989#define spix_sparc_iop_isdcti(iop) \
990 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_DCTI)
991#define spix_sparc_iop_isuseccr(iop) \
992 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_USECCR)
993#define spix_sparc_iop_issetccr(iop) \
994 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_SETCCR)
995#define spix_sparc_iop_issetfcc(iop) \
996 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_SETFCC)
997#define spix_sparc_iop_ismovcc(iop) \
998 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_MOVCC)
999#define spix_sparc_iop_isfmovcc(iop) \
1000 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FMOVCC)
1001#define spix_sparc_iop_ismovr(iop) \
1002 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_MOVR)
1003#define spix_sparc_iop_isfmovr(iop) \
1004 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FMOVR)
1005#define spix_sparc_iop_isbicc(iop) \
1006 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_BICC)
1007#define spix_sparc_iop_isfbfcc(iop) \
1008 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FBFCC)
1009#define spix_sparc_iop_isbpcc(iop) \
1010 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_BPCC)
1011#define spix_sparc_iop_isfbpfcc(iop) \
1012 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FBPFCC)
1013#define spix_sparc_iop_isbpr(iop) \
1014 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_BPR)
1015#define spix_sparc_iop_isfpop1(iop) \
1016 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_FPOP1)
1017#define spix_sparc_iop_isalu(iop) \
1018 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_ALU)
1019#define spix_sparc_iop_isiload(iop) \
1020 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_ILOAD)
1021#define spix_sparc_iop_isistore(iop) \
1022 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_ISTORE)
1023#define spix_sparc_iop_isprediction(iop) \
1024 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_PREDICTION)
1025#define spix_sparc_iop_ispredtrue(iop) \
1026 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_PRED_TRUE)
1027#define spix_sparc_iop_isproc(iop) \
1028 ( (iop == SPIX_SPARC_IOP_CALL) || (iop == SPIX_SPARC_IOP_JMPL) || (iop == SPIX_SPARC_IOP_RETURN) )
1029#define spix_sparc_iop_isvalid(iop) ((unsigned) iop < SPIX_SPARC_NIOP)
1030
1031
1032#define spix_sparc_iop_isprefetch(iop) \
1033 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_PREFETCH)
1034
1035
1036#define spix_sparc_iop_issave(iop) \
1037 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_SAVE)
1038
1039#define spix_sparc_iop_isrestore(iop) \
1040 spix_sparc_iop_istype(iop, SPIX_SPARC_ITYPE_RESTORE)
1041
1042
1043/*
1044 * Compute register usage of instruction.
1045 */
1046void spix_sparc_reguse(spix_sparc_iop_t, const void *,
1047 void (*)(spix_sparc_ruact_t, spix_sparc_rupos_t, unsigned, void *),
1048 void *);
1049
1050/*
1051 * Determine how an instruction uses a given register position.
1052 */
1053spix_sparc_ruact_t spix_sparc_iop_regpos(spix_sparc_iop_t,
1054 spix_sparc_rupos_t);
1055
1056
1057/*
1058 * Return the name of an instruction opcode.
1059 */
1060const char * spix_sparc_iop_name(spix_sparc_iop_t);
1061extern const size_t spix_sparc_iop_Lname;
1062
1063
1064/*
1065 * Return the register id at a given location, or -1 if does not apply.
1066 * iop must be the correct iop previously computed for instr using
1067 * spix_sparc_iop()
1068 * pos must be one of SPIX_SPARC_RUPOS_RS1, RS2, RS3 or RD
1069 */
1070int spix_sparc_regid(spix_sparc_iop_t iop, unsigned instr, spix_sparc_rupos_t pos);
1071
1072/*
1073 * Return the number of bytes of memory referenced by a load or store.
1074 */
1075size_t spix_sparc_iop_memsize(spix_sparc_iop_t);
1076
1077
1078#define spix_sparc_ofsize(of) ((of)->of_msb - (of)->of_lsb + 1)
1079#define spix_sparc_ofmask(of) (ofsize(of) == 32 ? 0xffffffff : \
1080 (((1 << ofsize(of)) - 1) << (of)->of_lsb))
1081
1082
1083/*
1084 * Field description structure
1085 */
1086typedef struct {
1087 const char *of_name;
1088 char of_msb;
1089 char of_lsb;
1090 char of_signed;
1091 char of_pcrel;
1092} spix_sparc_iop_field;
1093
1094
1095/*
1096 * Return the op_field description by its name
1097 */
1098
1099extern const spix_sparc_iop_field* spix_sparc_get_iop_field(const char*);
1100
1101/*
1102 * Returns iop type name as a string
1103 */
1104
1105extern const char* spix_sparc_iop_type_name(spix_sparc_itype_t);
1106
1107
1108#ifdef __cplusplus
1109}
1110#endif
1111
1112#endif /*SPIX_SPARC_H*/