1/* Print SPARC instructions.
2   Copyright (C) 1989-2022 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.  */
44static 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).  */
53static int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
54#define HASH_INSN(INSN) \
55  ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
56typedef struct sparc_opcode_hash
57{
58  struct sparc_opcode_hash *next;
59  const sparc_opcode *opcode;
60} sparc_opcode_hash;
61
62static 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
69static  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.  */
90static 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.  */
100static 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).  */
111static 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
200static int
201is_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.  */
220static unsigned int current_arch_mask;
221
222/* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values.  */
223
224static int
225compute_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
275static int
276compare_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
430static void
431build_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
485int
486print_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}
1097