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