Commit | Line | Data |
---|---|---|
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 | |
17 | extern "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 | ||
27 | typedef 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 | */ | |
816 | typedef enum { | |
817 | SPIX_SPARC_V8, | |
818 | SPIX_SPARC_V9 | |
819 | } spix_sparc_ver_t; | |
820 | ||
821 | ||
822 | /* | |
823 | * Instruction types. | |
824 | */ | |
825 | typedef 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 | */ | |
880 | typedef 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 | */ | |
906 | typedef 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 | */ | |
918 | typedef 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 | */ | |
935 | spix_sparc_iop_t spix_sparc_iop(spix_sparc_ver_t, const void *); | |
936 | ||
937 | ||
938 | /* | |
939 | * Disassemble an instruction. | |
940 | */ | |
941 | #ifdef SPIX_I64 | |
942 | size_t spix_sparc_dis(char *, size_t, spix_sparc_iop_t, const void *, | |
943 | spix_addr64_t); | |
944 | #endif | |
945 | size_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 | */ | |
952 | const char * spix_sparc_ireg_name(unsigned); | |
953 | const char * spix_sparc_asreg_name(unsigned); | |
954 | ||
955 | ||
956 | /* | |
957 | * Classify instruction opcode values. | |
958 | */ | |
959 | spix_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 | */ | |
1046 | void 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 | */ | |
1053 | spix_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 | */ | |
1060 | const char * spix_sparc_iop_name(spix_sparc_iop_t); | |
1061 | extern 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 | */ | |
1070 | int 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 | */ | |
1075 | size_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 | */ | |
1086 | typedef 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 | ||
1099 | extern const spix_sparc_iop_field* spix_sparc_get_iop_field(const char*); | |
1100 | ||
1101 | /* | |
1102 | * Returns iop type name as a string | |
1103 | */ | |
1104 | ||
1105 | extern 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*/ |