gas/
[deliverable/binutils-gdb.git] / opcodes / sparc-dis.c
1 /* Print SPARC instructions.
2 Copyright (C) 1989, 91-97, 1998, 2000 Free Software Foundation, Inc.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
17
18 #include <stdio.h>
19
20 #include "sysdep.h"
21 #include "opcode/sparc.h"
22 #include "dis-asm.h"
23 #include "libiberty.h"
24 #include "opintl.h"
25
26 /* Bitmask of v9 architectures. */
27 #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \
28 | (1 << SPARC_OPCODE_ARCH_V9A) \
29 | (1 << SPARC_OPCODE_ARCH_V9B))
30 /* 1 if INSN is for v9 only. */
31 #define V9_ONLY_P(insn) (! ((insn)->architecture & ~MASK_V9))
32 /* 1 if INSN is for v9. */
33 #define V9_P(insn) (((insn)->architecture & MASK_V9) != 0)
34
35 /* The sorted opcode table. */
36 static const struct sparc_opcode **sorted_opcodes;
37
38 /* For faster lookup, after insns are sorted they are hashed. */
39 /* ??? I think there is room for even more improvement. */
40
41 #define HASH_SIZE 256
42 /* It is important that we only look at insn code bits as that is how the
43 opcode table is hashed. OPCODE_BITS is a table of valid bits for each
44 of the main types (0,1,2,3). */
45 static int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
46 #define HASH_INSN(INSN) \
47 ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
48 struct opcode_hash {
49 struct opcode_hash *next;
50 const struct sparc_opcode *opcode;
51 };
52 static struct opcode_hash *opcode_hash_table[HASH_SIZE];
53
54 static void build_hash_table
55 PARAMS ((const struct sparc_opcode **, struct opcode_hash **, int));
56 static int is_delayed_branch PARAMS ((unsigned long));
57 static int compare_opcodes PARAMS ((const PTR, const PTR));
58 static int compute_arch_mask PARAMS ((unsigned long));
59
60 /* Sign-extend a value which is N bits long. */
61 #define SEX(value, bits) \
62 ((((int)(value)) << ((8 * sizeof (int)) - bits)) \
63 >> ((8 * sizeof (int)) - bits) )
64
65 static char *reg_names[] =
66 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
67 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
68 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
69 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
70 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
71 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
72 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
73 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
74 "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
75 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
76 "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
77 "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
78 /* psr, wim, tbr, fpsr, cpsr are v8 only. */
79 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
80 };
81
82 #define freg_names (&reg_names[4 * 8])
83
84 /* These are ordered according to there register number in
85 rdpr and wrpr insns. */
86 static char *v9_priv_reg_names[] =
87 {
88 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
89 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
90 "wstate", "fq"
91 /* "ver" - special cased */
92 };
93
94 /* These are ordered according to there register number in
95 rd and wr insns (-16). */
96 static char *v9a_asr_reg_names[] =
97 {
98 "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
99 "softint", "tick_cmpr", "sys_tick", "sys_tick_cmpr"
100 };
101
102 /* Macros used to extract instruction fields. Not all fields have
103 macros defined here, only those which are actually used. */
104
105 #define X_RD(i) (((i) >> 25) & 0x1f)
106 #define X_RS1(i) (((i) >> 14) & 0x1f)
107 #define X_LDST_I(i) (((i) >> 13) & 1)
108 #define X_ASI(i) (((i) >> 5) & 0xff)
109 #define X_RS2(i) (((i) >> 0) & 0x1f)
110 #define X_IMM(i,n) (((i) >> 0) & ((1 << (n)) - 1))
111 #define X_SIMM(i,n) SEX (X_IMM ((i), (n)), (n))
112 #define X_DISP22(i) (((i) >> 0) & 0x3fffff)
113 #define X_IMM22(i) X_DISP22 (i)
114 #define X_DISP30(i) (((i) >> 0) & 0x3fffffff)
115
116 /* These are for v9. */
117 #define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
118 #define X_DISP19(i) (((i) >> 0) & 0x7ffff)
119 #define X_MEMBAR(i) ((i) & 0x7f)
120
121 /* Here is the union which was used to extract instruction fields
122 before the shift and mask macros were written.
123
124 union sparc_insn
125 {
126 unsigned long int code;
127 struct
128 {
129 unsigned int anop:2;
130 #define op ldst.anop
131 unsigned int anrd:5;
132 #define rd ldst.anrd
133 unsigned int op3:6;
134 unsigned int anrs1:5;
135 #define rs1 ldst.anrs1
136 unsigned int i:1;
137 unsigned int anasi:8;
138 #define asi ldst.anasi
139 unsigned int anrs2:5;
140 #define rs2 ldst.anrs2
141 #define shcnt rs2
142 } ldst;
143 struct
144 {
145 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
146 unsigned int IMM13:13;
147 #define imm13 IMM13.IMM13
148 } IMM13;
149 struct
150 {
151 unsigned int anop:2;
152 unsigned int a:1;
153 unsigned int cond:4;
154 unsigned int op2:3;
155 unsigned int DISP22:22;
156 #define disp22 branch.DISP22
157 #define imm22 disp22
158 } branch;
159 struct
160 {
161 unsigned int anop:2;
162 unsigned int a:1;
163 unsigned int z:1;
164 unsigned int rcond:3;
165 unsigned int op2:3;
166 unsigned int DISP16HI:2;
167 unsigned int p:1;
168 unsigned int _rs1:5;
169 unsigned int DISP16LO:14;
170 } branch16;
171 struct
172 {
173 unsigned int anop:2;
174 unsigned int adisp30:30;
175 #define disp30 call.adisp30
176 } call;
177 };
178
179 */
180
181 /* Nonzero if INSN is the opcode for a delayed branch. */
182 static int
183 is_delayed_branch (insn)
184 unsigned long insn;
185 {
186 struct opcode_hash *op;
187
188 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
189 {
190 CONST struct sparc_opcode *opcode = op->opcode;
191 if ((opcode->match & insn) == opcode->match
192 && (opcode->lose & insn) == 0)
193 return (opcode->flags & F_DELAYED);
194 }
195 return 0;
196 }
197
198 /* extern void qsort (); */
199
200 /* Records current mask of SPARC_OPCODE_ARCH_FOO values, used to pass value
201 to compare_opcodes. */
202 static unsigned int current_arch_mask;
203
204 /* Print one instruction from MEMADDR on INFO->STREAM.
205
206 We suffix the instruction with a comment that gives the absolute
207 address involved, as well as its symbolic form, if the instruction
208 is preceded by a findable `sethi' and it either adds an immediate
209 displacement to that register, or it is an `add' or `or' instruction
210 on that register. */
211
212 int
213 print_insn_sparc (memaddr, info)
214 bfd_vma memaddr;
215 disassemble_info *info;
216 {
217 FILE *stream = info->stream;
218 bfd_byte buffer[4];
219 unsigned long insn;
220 register struct opcode_hash *op;
221 /* Nonzero of opcode table has been initialized. */
222 static int opcodes_initialized = 0;
223 /* bfd mach number of last call. */
224 static unsigned long current_mach = 0;
225 bfd_vma (*getword) PARAMS ((const unsigned char *));
226
227 if (!opcodes_initialized
228 || info->mach != current_mach)
229 {
230 int i;
231
232 current_arch_mask = compute_arch_mask (info->mach);
233
234 if (!opcodes_initialized)
235 sorted_opcodes = (const struct sparc_opcode **)
236 xmalloc (sparc_num_opcodes * sizeof (struct sparc_opcode *));
237 /* Reset the sorted table so we can resort it. */
238 for (i = 0; i < sparc_num_opcodes; ++i)
239 sorted_opcodes[i] = &sparc_opcodes[i];
240 qsort ((char *) sorted_opcodes, sparc_num_opcodes,
241 sizeof (sorted_opcodes[0]), compare_opcodes);
242
243 build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
244 current_mach = info->mach;
245 opcodes_initialized = 1;
246 }
247
248 {
249 int status =
250 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
251 if (status != 0)
252 {
253 (*info->memory_error_func) (status, memaddr, info);
254 return -1;
255 }
256 }
257
258 /* On SPARClite variants such as DANlite (sparc86x), instructions
259 are always big-endian even when the machine is in little-endian mode. */
260 if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite)
261 getword = bfd_getb32;
262 else
263 getword = bfd_getl32;
264
265 insn = getword (buffer);
266
267 info->insn_info_valid = 1; /* We do return this info */
268 info->insn_type = dis_nonbranch; /* Assume non branch insn */
269 info->branch_delay_insns = 0; /* Assume no delay */
270 info->target = 0; /* Assume no target known */
271
272 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
273 {
274 CONST struct sparc_opcode *opcode = op->opcode;
275
276 /* If the insn isn't supported by the current architecture, skip it. */
277 if (! (opcode->architecture & current_arch_mask))
278 continue;
279
280 if ((opcode->match & insn) == opcode->match
281 && (opcode->lose & insn) == 0)
282 {
283 /* Nonzero means that we have found an instruction which has
284 the effect of adding or or'ing the imm13 field to rs1. */
285 int imm_added_to_rs1 = 0;
286 int imm_ored_to_rs1 = 0;
287
288 /* Nonzero means that we have found a plus sign in the args
289 field of the opcode table. */
290 int found_plus = 0;
291
292 /* Nonzero means we have an annulled branch. */
293 int is_annulled = 0;
294
295 /* Do we have an `add' or `or' instruction combining an
296 immediate with rs1? */
297 if (opcode->match == 0x80102000) /* or */
298 imm_ored_to_rs1 = 1;
299 if (opcode->match == 0x80002000) /* add */
300 imm_added_to_rs1 = 1;
301
302 if (X_RS1 (insn) != X_RD (insn)
303 && strchr (opcode->args, 'r') != 0)
304 /* Can't do simple format if source and dest are different. */
305 continue;
306 if (X_RS2 (insn) != X_RD (insn)
307 && strchr (opcode->args, 'O') != 0)
308 /* Can't do simple format if source and dest are different. */
309 continue;
310
311 (*info->fprintf_func) (stream, opcode->name);
312
313 {
314 register CONST char *s;
315
316 if (opcode->args[0] != ',')
317 (*info->fprintf_func) (stream, " ");
318 for (s = opcode->args; *s != '\0'; ++s)
319 {
320 while (*s == ',')
321 {
322 (*info->fprintf_func) (stream, ",");
323 ++s;
324 switch (*s) {
325 case 'a':
326 (*info->fprintf_func) (stream, "a");
327 is_annulled = 1;
328 ++s;
329 continue;
330 case 'N':
331 (*info->fprintf_func) (stream, "pn");
332 ++s;
333 continue;
334
335 case 'T':
336 (*info->fprintf_func) (stream, "pt");
337 ++s;
338 continue;
339
340 default:
341 break;
342 } /* switch on arg */
343 } /* while there are comma started args */
344
345 (*info->fprintf_func) (stream, " ");
346
347 switch (*s)
348 {
349 case '+':
350 found_plus = 1;
351
352 /* note fall-through */
353 default:
354 (*info->fprintf_func) (stream, "%c", *s);
355 break;
356
357 case '#':
358 (*info->fprintf_func) (stream, "0");
359 break;
360
361 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n])
362 case '1':
363 case 'r':
364 reg (X_RS1 (insn));
365 break;
366
367 case '2':
368 case 'O':
369 reg (X_RS2 (insn));
370 break;
371
372 case 'd':
373 reg (X_RD (insn));
374 break;
375 #undef reg
376
377 #define freg(n) (*info->fprintf_func) (stream, "%%%s", freg_names[n])
378 #define fregx(n) (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
379 case 'e':
380 freg (X_RS1 (insn));
381 break;
382 case 'v': /* double/even */
383 case 'V': /* quad/multiple of 4 */
384 fregx (X_RS1 (insn));
385 break;
386
387 case 'f':
388 freg (X_RS2 (insn));
389 break;
390 case 'B': /* double/even */
391 case 'R': /* quad/multiple of 4 */
392 fregx (X_RS2 (insn));
393 break;
394
395 case 'g':
396 freg (X_RD (insn));
397 break;
398 case 'H': /* double/even */
399 case 'J': /* quad/multiple of 4 */
400 fregx (X_RD (insn));
401 break;
402 #undef freg
403 #undef fregx
404
405 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
406 case 'b':
407 creg (X_RS1 (insn));
408 break;
409
410 case 'c':
411 creg (X_RS2 (insn));
412 break;
413
414 case 'D':
415 creg (X_RD (insn));
416 break;
417 #undef creg
418
419 case 'h':
420 (*info->fprintf_func) (stream, "%%hi(%#x)",
421 (0xFFFFFFFF
422 & ((int) X_IMM22 (insn) << 10)));
423 break;
424
425 case 'i': /* 13 bit immediate */
426 case 'I': /* 11 bit immediate */
427 case 'j': /* 10 bit immediate */
428 {
429 int imm;
430
431 if (*s == 'i')
432 imm = X_SIMM (insn, 13);
433 else if (*s == 'I')
434 imm = X_SIMM (insn, 11);
435 else
436 imm = X_SIMM (insn, 10);
437
438 /* Check to see whether we have a 1+i, and take
439 note of that fact.
440
441 Note: because of the way we sort the table,
442 we will be matching 1+i rather than i+1,
443 so it is OK to assume that i is after +,
444 not before it. */
445 if (found_plus)
446 imm_added_to_rs1 = 1;
447
448 if (imm <= 9)
449 (*info->fprintf_func) (stream, "%d", imm);
450 else
451 (*info->fprintf_func) (stream, "%#x", imm);
452 }
453 break;
454
455 case 'X': /* 5 bit unsigned immediate */
456 case 'Y': /* 6 bit unsigned immediate */
457 {
458 int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
459
460 if (imm <= 9)
461 (info->fprintf_func) (stream, "%d", imm);
462 else
463 (info->fprintf_func) (stream, "%#x", (unsigned) imm);
464 }
465 break;
466
467 case '3':
468 (info->fprintf_func) (stream, "%d", X_IMM (insn, 3));
469 break;
470
471 case 'K':
472 {
473 int mask = X_MEMBAR (insn);
474 int bit = 0x40, printed_one = 0;
475 const char *name;
476
477 if (mask == 0)
478 (info->fprintf_func) (stream, "0");
479 else
480 while (bit)
481 {
482 if (mask & bit)
483 {
484 if (printed_one)
485 (info->fprintf_func) (stream, "|");
486 name = sparc_decode_membar (bit);
487 (info->fprintf_func) (stream, "%s", name);
488 printed_one = 1;
489 }
490 bit >>= 1;
491 }
492 break;
493 }
494
495 case 'k':
496 info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
497 (*info->print_address_func) (info->target, info);
498 break;
499
500 case 'G':
501 info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
502 (*info->print_address_func) (info->target, info);
503 break;
504
505 case '6':
506 case '7':
507 case '8':
508 case '9':
509 (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
510 break;
511
512 case 'z':
513 (*info->fprintf_func) (stream, "%%icc");
514 break;
515
516 case 'Z':
517 (*info->fprintf_func) (stream, "%%xcc");
518 break;
519
520 case 'E':
521 (*info->fprintf_func) (stream, "%%ccr");
522 break;
523
524 case 's':
525 (*info->fprintf_func) (stream, "%%fprs");
526 break;
527
528 case 'o':
529 (*info->fprintf_func) (stream, "%%asi");
530 break;
531
532 case 'W':
533 (*info->fprintf_func) (stream, "%%tick");
534 break;
535
536 case 'P':
537 (*info->fprintf_func) (stream, "%%pc");
538 break;
539
540 case '?':
541 if (X_RS1 (insn) == 31)
542 (*info->fprintf_func) (stream, "%%ver");
543 else if ((unsigned) X_RS1 (insn) < 16)
544 (*info->fprintf_func) (stream, "%%%s",
545 v9_priv_reg_names[X_RS1 (insn)]);
546 else
547 (*info->fprintf_func) (stream, "%%reserved");
548 break;
549
550 case '!':
551 if ((unsigned) X_RD (insn) < 15)
552 (*info->fprintf_func) (stream, "%%%s",
553 v9_priv_reg_names[X_RD (insn)]);
554 else
555 (*info->fprintf_func) (stream, "%%reserved");
556 break;
557
558 case '/':
559 if (X_RS1 (insn) < 16 || X_RS1 (insn) > 25)
560 (*info->fprintf_func) (stream, "%%reserved");
561 else
562 (*info->fprintf_func) (stream, "%%%s",
563 v9a_asr_reg_names[X_RS1 (insn)-16]);
564 break;
565
566 case '_':
567 if (X_RD (insn) < 16 || X_RD (insn) > 25)
568 (*info->fprintf_func) (stream, "%%reserved");
569 else
570 (*info->fprintf_func) (stream, "%%%s",
571 v9a_asr_reg_names[X_RD (insn)-16]);
572 break;
573
574 case '*':
575 {
576 const char *name = sparc_decode_prefetch (X_RD (insn));
577
578 if (name)
579 (*info->fprintf_func) (stream, "%s", name);
580 else
581 (*info->fprintf_func) (stream, "%d", X_RD (insn));
582 break;
583 }
584
585 case 'M':
586 (*info->fprintf_func) (stream, "%%asr%d", X_RS1 (insn));
587 break;
588
589 case 'm':
590 (*info->fprintf_func) (stream, "%%asr%d", X_RD (insn));
591 break;
592
593 case 'L':
594 info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
595 (*info->print_address_func) (info->target, info);
596 break;
597
598 case 'n':
599 (*info->fprintf_func)
600 (stream, "%#x", SEX (X_DISP22 (insn), 22));
601 break;
602
603 case 'l':
604 info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
605 (*info->print_address_func) (info->target, info);
606 break;
607
608 case 'A':
609 {
610 const char *name = sparc_decode_asi (X_ASI (insn));
611
612 if (name)
613 (*info->fprintf_func) (stream, "%s", name);
614 else
615 (*info->fprintf_func) (stream, "(%d)", X_ASI (insn));
616 break;
617 }
618
619 case 'C':
620 (*info->fprintf_func) (stream, "%%csr");
621 break;
622
623 case 'F':
624 (*info->fprintf_func) (stream, "%%fsr");
625 break;
626
627 case 'p':
628 (*info->fprintf_func) (stream, "%%psr");
629 break;
630
631 case 'q':
632 (*info->fprintf_func) (stream, "%%fq");
633 break;
634
635 case 'Q':
636 (*info->fprintf_func) (stream, "%%cq");
637 break;
638
639 case 't':
640 (*info->fprintf_func) (stream, "%%tbr");
641 break;
642
643 case 'w':
644 (*info->fprintf_func) (stream, "%%wim");
645 break;
646
647 case 'x':
648 (*info->fprintf_func) (stream, "%d",
649 ((X_LDST_I (insn) << 8)
650 + X_ASI (insn)));
651 break;
652
653 case 'y':
654 (*info->fprintf_func) (stream, "%%y");
655 break;
656
657 case 'u':
658 case 'U':
659 {
660 int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
661 const char *name = sparc_decode_sparclet_cpreg (val);
662
663 if (name)
664 (*info->fprintf_func) (stream, "%s", name);
665 else
666 (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
667 break;
668 }
669 }
670 }
671 }
672
673 /* If we are adding or or'ing something to rs1, then
674 check to see whether the previous instruction was
675 a sethi to the same register as in the sethi.
676 If so, attempt to print the result of the add or
677 or (in this context add and or do the same thing)
678 and its symbolic value. */
679 if (imm_ored_to_rs1 || imm_added_to_rs1)
680 {
681 unsigned long prev_insn;
682 int errcode;
683
684 errcode =
685 (*info->read_memory_func)
686 (memaddr - 4, buffer, sizeof (buffer), info);
687 prev_insn = getword (buffer);
688
689 if (errcode == 0)
690 {
691 /* If it is a delayed branch, we need to look at the
692 instruction before the delayed branch. This handles
693 sequences such as
694
695 sethi %o1, %hi(_foo), %o1
696 call _printf
697 or %o1, %lo(_foo), %o1
698 */
699
700 if (is_delayed_branch (prev_insn))
701 {
702 errcode = (*info->read_memory_func)
703 (memaddr - 8, buffer, sizeof (buffer), info);
704 prev_insn = getword (buffer);
705 }
706 }
707
708 /* If there was a problem reading memory, then assume
709 the previous instruction was not sethi. */
710 if (errcode == 0)
711 {
712 /* Is it sethi to the same register? */
713 if ((prev_insn & 0xc1c00000) == 0x01000000
714 && X_RD (prev_insn) == X_RS1 (insn))
715 {
716 (*info->fprintf_func) (stream, "\t! ");
717 info->target =
718 (0xFFFFFFFF & (int) X_IMM22 (prev_insn) << 10);
719 if (imm_added_to_rs1)
720 info->target += X_SIMM (insn, 13);
721 else
722 info->target |= X_SIMM (insn, 13);
723 (*info->print_address_func) (info->target, info);
724 info->insn_type = dis_dref;
725 info->data_size = 4; /* FIXME!!! */
726 }
727 }
728 }
729
730 if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
731 {
732 /* FIXME -- check is_annulled flag */
733 if (opcode->flags & F_UNBR)
734 info->insn_type = dis_branch;
735 if (opcode->flags & F_CONDBR)
736 info->insn_type = dis_condbranch;
737 if (opcode->flags & F_JSR)
738 info->insn_type = dis_jsr;
739 if (opcode->flags & F_DELAYED)
740 info->branch_delay_insns = 1;
741 }
742
743 return sizeof (buffer);
744 }
745 }
746
747 info->insn_type = dis_noninsn; /* Mark as non-valid instruction */
748 (*info->fprintf_func) (stream, _("unknown"));
749 return sizeof (buffer);
750 }
751
752 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values. */
753
754 static int
755 compute_arch_mask (mach)
756 unsigned long mach;
757 {
758 switch (mach)
759 {
760 case 0 :
761 case bfd_mach_sparc :
762 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8);
763 case bfd_mach_sparc_sparclet :
764 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET);
765 case bfd_mach_sparc_sparclite :
766 case bfd_mach_sparc_sparclite_le :
767 /* sparclites insns are recognized by default (because that's how
768 they've always been treated, for better or worse). Kludge this by
769 indicating generic v8 is also selected. */
770 return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
771 | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8));
772 case bfd_mach_sparc_v8plus :
773 case bfd_mach_sparc_v9 :
774 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
775 case bfd_mach_sparc_v8plusa :
776 case bfd_mach_sparc_v9a :
777 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A);
778 case bfd_mach_sparc_v8plusb :
779 case bfd_mach_sparc_v9b :
780 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B);
781 }
782 abort ();
783 }
784
785 /* Compare opcodes A and B. */
786
787 static int
788 compare_opcodes (a, b)
789 const PTR a;
790 const PTR b;
791 {
792 struct sparc_opcode *op0 = * (struct sparc_opcode **) a;
793 struct sparc_opcode *op1 = * (struct sparc_opcode **) b;
794 unsigned long int match0 = op0->match, match1 = op1->match;
795 unsigned long int lose0 = op0->lose, lose1 = op1->lose;
796 register unsigned int i;
797
798 /* If one (and only one) insn isn't supported by the current architecture,
799 prefer the one that is. If neither are supported, but they're both for
800 the same architecture, continue processing. Otherwise (both unsupported
801 and for different architectures), prefer lower numbered arch's (fudged
802 by comparing the bitmasks). */
803 if (op0->architecture & current_arch_mask)
804 {
805 if (! (op1->architecture & current_arch_mask))
806 return -1;
807 }
808 else
809 {
810 if (op1->architecture & current_arch_mask)
811 return 1;
812 else if (op0->architecture != op1->architecture)
813 return op0->architecture - op1->architecture;
814 }
815
816 /* If a bit is set in both match and lose, there is something
817 wrong with the opcode table. */
818 if (match0 & lose0)
819 {
820 fprintf
821 (stderr,
822 /* xgettext:c-format */
823 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
824 op0->name, match0, lose0);
825 op0->lose &= ~op0->match;
826 lose0 = op0->lose;
827 }
828
829 if (match1 & lose1)
830 {
831 fprintf
832 (stderr,
833 /* xgettext:c-format */
834 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
835 op1->name, match1, lose1);
836 op1->lose &= ~op1->match;
837 lose1 = op1->lose;
838 }
839
840 /* Because the bits that are variable in one opcode are constant in
841 another, it is important to order the opcodes in the right order. */
842 for (i = 0; i < 32; ++i)
843 {
844 unsigned long int x = 1 << i;
845 int x0 = (match0 & x) != 0;
846 int x1 = (match1 & x) != 0;
847
848 if (x0 != x1)
849 return x1 - x0;
850 }
851
852 for (i = 0; i < 32; ++i)
853 {
854 unsigned long int x = 1 << i;
855 int x0 = (lose0 & x) != 0;
856 int x1 = (lose1 & x) != 0;
857
858 if (x0 != x1)
859 return x1 - x0;
860 }
861
862 /* They are functionally equal. So as long as the opcode table is
863 valid, we can put whichever one first we want, on aesthetic grounds. */
864
865 /* Our first aesthetic ground is that aliases defer to real insns. */
866 {
867 int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
868 if (alias_diff != 0)
869 /* Put the one that isn't an alias first. */
870 return alias_diff;
871 }
872
873 /* Except for aliases, two "identical" instructions had
874 better have the same opcode. This is a sanity check on the table. */
875 i = strcmp (op0->name, op1->name);
876 if (i)
877 {
878 if (op0->flags & F_ALIAS) /* If they're both aliases, be arbitrary. */
879 return i;
880 else
881 fprintf (stderr,
882 /* xgettext:c-format */
883 _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
884 op0->name, op1->name);
885 }
886
887 /* Fewer arguments are preferred. */
888 {
889 int length_diff = strlen (op0->args) - strlen (op1->args);
890 if (length_diff != 0)
891 /* Put the one with fewer arguments first. */
892 return length_diff;
893 }
894
895 /* Put 1+i before i+1. */
896 {
897 char *p0 = (char *) strchr (op0->args, '+');
898 char *p1 = (char *) strchr (op1->args, '+');
899
900 if (p0 && p1)
901 {
902 /* There is a plus in both operands. Note that a plus
903 sign cannot be the first character in args,
904 so the following [-1]'s are valid. */
905 if (p0[-1] == 'i' && p1[1] == 'i')
906 /* op0 is i+1 and op1 is 1+i, so op1 goes first. */
907 return 1;
908 if (p0[1] == 'i' && p1[-1] == 'i')
909 /* op0 is 1+i and op1 is i+1, so op0 goes first. */
910 return -1;
911 }
912 }
913
914 /* Put 1,i before i,1. */
915 {
916 int i0 = strncmp (op0->args, "i,1", 3) == 0;
917 int i1 = strncmp (op1->args, "i,1", 3) == 0;
918
919 if (i0 ^ i1)
920 return i0 - i1;
921 }
922
923 /* They are, as far as we can tell, identical.
924 Since qsort may have rearranged the table partially, there is
925 no way to tell which one was first in the opcode table as
926 written, so just say there are equal. */
927 /* ??? This is no longer true now that we sort a vector of pointers,
928 not the table itself. */
929 return 0;
930 }
931
932 /* Build a hash table from the opcode table.
933 OPCODE_TABLE is a sorted list of pointers into the opcode table. */
934
935 static void
936 build_hash_table (opcode_table, hash_table, num_opcodes)
937 const struct sparc_opcode **opcode_table;
938 struct opcode_hash **hash_table;
939 int num_opcodes;
940 {
941 register int i;
942 int hash_count[HASH_SIZE];
943 static struct opcode_hash *hash_buf = NULL;
944
945 /* Start at the end of the table and work backwards so that each
946 chain is sorted. */
947
948 memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
949 memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
950 if (hash_buf != NULL)
951 free (hash_buf);
952 hash_buf = (struct opcode_hash *) xmalloc (sizeof (struct opcode_hash) * num_opcodes);
953 for (i = num_opcodes - 1; i >= 0; --i)
954 {
955 register int hash = HASH_INSN (opcode_table[i]->match);
956 register struct opcode_hash *h = &hash_buf[i];
957 h->next = hash_table[hash];
958 h->opcode = opcode_table[i];
959 hash_table[hash] = h;
960 ++hash_count[hash];
961 }
962
963 #if 0 /* for debugging */
964 {
965 int min_count = num_opcodes, max_count = 0;
966 int total;
967
968 for (i = 0; i < HASH_SIZE; ++i)
969 {
970 if (hash_count[i] < min_count)
971 min_count = hash_count[i];
972 if (hash_count[i] > max_count)
973 max_count = hash_count[i];
974 total += hash_count[i];
975 }
976
977 printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
978 min_count, max_count, (double) total / HASH_SIZE);
979 }
980 #endif
981 }
This page took 0.091393 seconds and 5 git commands to generate.