Coverage Report

Created: 2026-05-11 07:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/sparc-dis.c
Line
Count
Source
1
/* Print SPARC instructions.
2
   Copyright (C) 1989-2026 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
536
#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
1.49M
  ((((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
302k
  ((int) (((value & ((1u << (bits - 1) << 1) - 1))  \
67
302k
     ^ (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
16.4k
#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
1.51M
#define X_RD(i)      (((i) >> 25) & 0x1f)
122
374k
#define X_RS1(i)     (((i) >> 14) & 0x1f)
123
333
#define X_LDST_I(i)  (((i) >> 13) & 1)
124
18.1k
#define X_ASI(i)     (((i) >> 5) & 0xff)
125
373k
#define X_RS2(i)     (((i) >> 0) & 0x1f)
126
84
#define X_RS3(i)     (((i) >> 9) & 0x1f)
127
1.69k
#define X_IMM(i,n)   (((i) >> 0) & ((1 << (n)) - 1))
128
46.2k
#define X_SIMM(i,n)  SEX (X_IMM ((i), (n)), (n))
129
33.9k
#define X_DISP22(i)  (((i) >> 0) & 0x3fffff)
130
33.9k
#define X_IMM22(i)   X_DISP22 (i)
131
#define X_DISP30(i)  (((i) >> 0) & 0x3fffffff)
132
243
#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
0
#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
12.2k
{
203
12.2k
  sparc_opcode_hash *op;
204
205
199k
  for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
206
196k
    {
207
196k
      const sparc_opcode *opcode = op->opcode;
208
209
196k
      if ((opcode->match & insn) == opcode->match
210
24.8k
    && (opcode->lose & insn) == 0)
211
9.19k
  return opcode->flags & F_DELAYED;
212
196k
    }
213
3.04k
  return 0;
214
12.2k
}
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
268
{
227
268
  switch (mach)
228
268
    {
229
44
    case 0 :
230
60
    case bfd_mach_sparc :
231
60
      return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8)
232
60
              | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_LEON));
233
19
    case bfd_mach_sparc_sparclet :
234
19
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET);
235
8
    case bfd_mach_sparc_sparclite :
236
19
    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
19
      return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
241
19
        | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8));
242
33
    case bfd_mach_sparc_v8plus :
243
37
    case bfd_mach_sparc_v9 :
244
37
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
245
2
    case bfd_mach_sparc_v8plusa :
246
2
    case bfd_mach_sparc_v9a :
247
2
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A);
248
7
    case bfd_mach_sparc_v8plusb :
249
10
    case bfd_mach_sparc_v9b :
250
10
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B);
251
1
    case bfd_mach_sparc_v8plusc :
252
3
    case bfd_mach_sparc_v9c :
253
3
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9C);
254
1
    case bfd_mach_sparc_v8plusd :
255
9
    case bfd_mach_sparc_v9d :
256
9
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9D);
257
0
    case bfd_mach_sparc_v8pluse :
258
20
    case bfd_mach_sparc_v9e :
259
20
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9E);
260
6
    case bfd_mach_sparc_v8plusv :
261
10
    case bfd_mach_sparc_v9v :
262
10
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9V);
263
7
    case bfd_mach_sparc_v8plusm :
264
7
    case bfd_mach_sparc_v9m :
265
7
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9M);
266
45
    case bfd_mach_sparc_v8plusm8 :
267
72
    case bfd_mach_sparc_v9m8 :
268
72
      return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_M8);
269
268
    }
270
0
  abort ();
271
268
}
272
273
/* Compare opcodes A and B.  */
274
275
static int
276
compare_opcodes (const void * a, const void * b)
277
9.48M
{
278
9.48M
  sparc_opcode *op0 = * (sparc_opcode **) a;
279
9.48M
  sparc_opcode *op1 = * (sparc_opcode **) b;
280
9.48M
  unsigned long int match0 = op0->match, match1 = op1->match;
281
9.48M
  unsigned long int lose0 = op0->lose, lose1 = op1->lose;
282
9.48M
  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
9.48M
  if (op0->architecture & current_arch_mask)
290
6.18M
    {
291
6.18M
      if (! (op1->architecture & current_arch_mask))
292
166k
  return -1;
293
6.18M
    }
294
3.30M
  else
295
3.30M
    {
296
3.30M
      if (op1->architecture & current_arch_mask)
297
115k
  return 1;
298
3.18M
      else if (op0->architecture != op1->architecture)
299
410k
  return op0->architecture - op1->architecture;
300
3.30M
    }
301
302
  /* If a bit is set in both match and lose, there is something
303
     wrong with the opcode table.  */
304
8.79M
  if (match0 & lose0)
305
0
    {
306
0
      opcodes_error_handler
307
  /* xgettext:c-format */
308
0
  (_("internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
309
0
   op0->name, match0, lose0);
310
0
      op0->lose &= ~op0->match;
311
0
      lose0 = op0->lose;
312
0
    }
313
314
8.79M
  if (match1 & lose1)
315
0
    {
316
0
      opcodes_error_handler
317
  /* xgettext:c-format */
318
0
  (_("internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
319
0
   op1->name, match1, lose1);
320
0
      op1->lose &= ~op1->match;
321
0
      lose1 = op1->lose;
322
0
    }
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
174M
  for (i = 0; i < 32; ++i)
327
173M
    {
328
173M
      unsigned long int x = 1ul << i;
329
173M
      int x0 = (match0 & x) != 0;
330
173M
      int x1 = (match1 & x) != 0;
331
332
173M
      if (x0 != x1)
333
8.17M
  return x1 - x0;
334
173M
    }
335
336
13.2M
  for (i = 0; i < 32; ++i)
337
12.9M
    {
338
12.9M
      unsigned long int x = 1ul << i;
339
12.9M
      int x0 = (lose0 & x) != 0;
340
12.9M
      int x1 = (lose1 & x) != 0;
341
342
12.9M
      if (x0 != x1)
343
283k
  return x1 - x0;
344
12.9M
    }
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
335k
  {
351
335k
    int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
352
353
335k
    if (alias_diff != 0)
354
      /* Put the one that isn't an alias first.  */
355
170k
      return alias_diff;
356
335k
  }
357
358
  /* Except for aliases, two "identical" instructions had
359
     better have the same opcode.  This is a sanity check on the table.  */
360
164k
  i = strcmp (op0->name, op1->name);
361
164k
  if (i)
362
41.8k
    {
363
41.8k
      if (op0->flags & F_ALIAS)
364
41.8k
  {
365
41.8k
    if (op0->flags & F_PREFERRED)
366
4.82k
      return -1;
367
37.0k
    if (op1->flags & F_PREFERRED)
368
0
      return 1;
369
370
    /* If they're both aliases, and neither is marked as preferred,
371
       be arbitrary.  */
372
37.0k
    return i;
373
37.0k
  }
374
0
      else
375
0
  opcodes_error_handler
376
    /* xgettext:c-format */
377
0
    (_("internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
378
0
     op0->name, op1->name);
379
41.8k
    }
380
381
  /* Fewer arguments are preferred.  */
382
123k
  {
383
123k
    int length_diff = strlen (op0->args) - strlen (op1->args);
384
385
123k
    if (length_diff != 0)
386
      /* Put the one with fewer arguments first.  */
387
79.4k
      return length_diff;
388
123k
  }
389
390
  /* They are, as far as we can tell, identical.  Keep the order in
391
     the sparc_opcodes table.  */
392
43.6k
  if (op0 < op1)
393
43.6k
    return -1;
394
0
  if (op0 > op1)
395
0
    return 1;
396
0
  return 0;
397
0
}
398
399
/* Build a hash table from the opcode table.
400
   OPCODE_TABLE is a sorted list of pointers into the opcode table.  */
401
402
static void
403
build_hash_table (const sparc_opcode **opcode_table,
404
      sparc_opcode_hash **hash_table,
405
      int num_opcodes)
406
268
{
407
268
  int i;
408
268
  int hash_count[HASH_SIZE];
409
268
  static sparc_opcode_hash *hash_buf = NULL;
410
411
  /* Start at the end of the table and work backwards so that each
412
     chain is sorted.  */
413
414
268
  memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
415
268
  memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
416
268
  free (hash_buf);
417
268
  hash_buf = xmalloc (sizeof (* hash_buf) * num_opcodes);
418
947k
  for (i = num_opcodes - 1; i >= 0; --i)
419
947k
    {
420
947k
      int hash = HASH_INSN (opcode_table[i]->match);
421
947k
      sparc_opcode_hash *h = &hash_buf[i];
422
423
947k
      h->next = hash_table[hash];
424
947k
      h->opcode = opcode_table[i];
425
947k
      hash_table[hash] = h;
426
947k
      ++hash_count[hash];
427
947k
    }
428
429
#if 0 /* for debugging */
430
  {
431
    int min_count = num_opcodes, max_count = 0;
432
    int total;
433
434
    for (i = 0; i < HASH_SIZE; ++i)
435
      {
436
        if (hash_count[i] < min_count)
437
    min_count = hash_count[i];
438
  if (hash_count[i] > max_count)
439
    max_count = hash_count[i];
440
  total += hash_count[i];
441
      }
442
443
    printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
444
      min_count, max_count, (double) total / HASH_SIZE);
445
  }
446
#endif
447
268
}
448
449
/* Print one instruction from MEMADDR on INFO->STREAM.
450
451
   We suffix the instruction with a comment that gives the absolute
452
   address involved, as well as its symbolic form, if the instruction
453
   is preceded by a findable `sethi' and it either adds an immediate
454
   displacement to that register, or it is an `add' or `or' instruction
455
   on that register.  */
456
457
int
458
print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
459
532k
{
460
532k
  FILE *stream = info->stream;
461
532k
  bfd_byte buffer[4];
462
532k
  unsigned long insn;
463
532k
  sparc_opcode_hash *op;
464
  /* Nonzero of opcode table has been initialized.  */
465
532k
  static int opcodes_initialized = 0;
466
  /* bfd mach number of last call.  */
467
532k
  static unsigned long current_mach = 0;
468
532k
  bfd_vma (*getword) (const void *);
469
470
532k
  if (!opcodes_initialized
471
532k
      || info->mach != current_mach)
472
268
    {
473
268
      int i;
474
475
268
      current_arch_mask = compute_arch_mask (info->mach);
476
477
268
      if (!opcodes_initialized)
478
2
  sorted_opcodes =
479
2
    xmalloc (sparc_num_opcodes * sizeof (sparc_opcode *));
480
      /* Reset the sorted table so we can resort it.  */
481
947k
      for (i = 0; i < sparc_num_opcodes; ++i)
482
947k
  sorted_opcodes[i] = &sparc_opcodes[i];
483
268
      qsort ((char *) sorted_opcodes, sparc_num_opcodes,
484
268
       sizeof (sorted_opcodes[0]), compare_opcodes);
485
486
268
      build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
487
268
      current_mach = info->mach;
488
268
      opcodes_initialized = 1;
489
268
    }
490
491
532k
  {
492
532k
    int status =
493
532k
      (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
494
495
532k
    if (status != 0)
496
252
      {
497
252
  (*info->memory_error_func) (status, memaddr, info);
498
252
  return -1;
499
252
      }
500
532k
  }
501
502
  /* On SPARClite variants such as DANlite (sparc86x), instructions
503
     are always big-endian even when the machine is in little-endian mode.  */
504
531k
  if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite)
505
354k
    getword = bfd_getb32;
506
177k
  else
507
177k
    getword = bfd_getl32;
508
509
531k
  insn = getword (buffer);
510
511
531k
  info->insn_info_valid = 1;      /* We do return this info.  */
512
531k
  info->insn_type = dis_nonbranch;    /* Assume non branch insn.  */
513
531k
  info->branch_delay_insns = 0;     /* Assume no delay.  */
514
531k
  info->target = 0;       /* Assume no target known.  */
515
516
11.3M
  for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
517
11.2M
    {
518
11.2M
      const sparc_opcode *opcode = op->opcode;
519
520
      /* If the insn isn't supported by the current architecture, skip it.  */
521
11.2M
      if (! (opcode->architecture & current_arch_mask))
522
4.18M
  continue;
523
524
7.03M
      if ((opcode->match & insn) == opcode->match
525
736k
    && (opcode->lose & insn) == 0)
526
373k
  {
527
    /* Nonzero means that we have found an instruction which has
528
       the effect of adding or or'ing the imm13 field to rs1.  */
529
373k
    int imm_added_to_rs1 = 0;
530
373k
    int imm_ored_to_rs1 = 0;
531
532
    /* Nonzero means that we have found a plus sign in the args
533
       field of the opcode table.  */
534
373k
    int found_plus = 0;
535
536
    /* Nonzero means we have an annulled branch.  */
537
373k
    int is_annulled = 0;
538
539
    /* Do we have an `add' or `or' instruction combining an
540
             immediate with rs1?  */
541
373k
    if (opcode->match == 0x80102000) /* or */
542
411
      imm_ored_to_rs1 = 1;
543
373k
    if (opcode->match == 0x80002000) /* add */
544
1.16k
      imm_added_to_rs1 = 1;
545
546
373k
    if (X_RS1 (insn) != X_RD (insn)
547
286k
        && strchr (opcode->args, 'r') != 0)
548
        /* Can't do simple format if source and dest are different.  */
549
136
        continue;
550
373k
    if (X_RS2 (insn) != X_RD (insn)
551
292k
        && strchr (opcode->args, 'O') != 0)
552
        /* Can't do simple format if source and dest are different.  */
553
62
        continue;
554
555
373k
    (*info->fprintf_func) (stream, "%s", opcode->name);
556
557
373k
    {
558
373k
      const char *s;
559
560
373k
      if (opcode->args[0] != ',')
561
351k
        (*info->fprintf_func) (stream, " ");
562
563
1.13M
      for (s = opcode->args; *s != '\0'; ++s)
564
763k
        {
565
958k
    while (*s == ',')
566
195k
      {
567
195k
        (*info->fprintf_func) (stream, ",");
568
195k
        ++s;
569
195k
        switch (*s)
570
195k
          {
571
15.1k
          case 'a':
572
15.1k
      (*info->fprintf_func) (stream, "a");
573
15.1k
      is_annulled = 1;
574
15.1k
      ++s;
575
15.1k
      continue;
576
10.6k
          case 'N':
577
10.6k
      (*info->fprintf_func) (stream, "pn");
578
10.6k
      ++s;
579
10.6k
      continue;
580
581
0
          case 'T':
582
0
      (*info->fprintf_func) (stream, "pt");
583
0
      ++s;
584
0
      continue;
585
586
169k
          default:
587
169k
      break;
588
195k
          }
589
195k
      }
590
591
763k
    (*info->fprintf_func) (stream, " ");
592
593
763k
    switch (*s)
594
763k
      {
595
38.4k
      case '+':
596
38.4k
        found_plus = 1;
597
        /* Fall through.  */
598
599
156k
      default:
600
156k
        (*info->fprintf_func) (stream, "%c", *s);
601
156k
        break;
602
603
0
      case '#':
604
0
        (*info->fprintf_func) (stream, "0");
605
0
        break;
606
607
195k
#define reg(n)  (*info->fprintf_func) (stream, "%%%s", reg_names[n])
608
80.7k
      case '1':
609
80.7k
      case 'r':
610
80.7k
        reg (X_RS1 (insn));
611
80.7k
        break;
612
613
25.1k
      case '2':
614
25.1k
      case 'O':
615
25.1k
        reg (X_RS2 (insn));
616
25.1k
        break;
617
618
89.3k
      case 'd':
619
89.3k
        reg (X_RD (insn));
620
89.3k
        break;
621
0
#undef  reg
622
623
9.69k
#define freg(n)   (*info->fprintf_func) (stream, "%%%s", freg_names[n])
624
6.76k
#define fregx(n)  (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
625
542
      case 'e':
626
542
        freg (X_RS1 (insn));
627
542
        break;
628
611
      case 'v': /* Double/even.  */
629
628
      case 'V': /* Quad/multiple of 4.  */
630
638
                  case ';': /* Double/even multiple of 8 doubles.  */
631
638
        fregx (X_RS1 (insn));
632
638
        break;
633
634
652
      case 'f':
635
652
        freg (X_RS2 (insn));
636
652
        break;
637
438
      case 'B': /* Double/even.  */
638
493
      case 'R': /* Quad/multiple of 4.  */
639
503
                  case ':': /* Double/even multiple of 8 doubles.  */
640
503
        fregx (X_RS2 (insn));
641
503
        break;
642
643
496
      case '4':
644
496
        freg (X_RS3 (insn));
645
496
        break;
646
246
      case '5': /* Double/even.  */
647
246
        fregx (X_RS3 (insn));
648
246
        break;
649
650
8.00k
      case 'g':
651
8.00k
        freg (X_RD (insn));
652
8.00k
        break;
653
2.50k
      case 'H': /* Double/even.  */
654
5.07k
      case 'J': /* Quad/multiple of 4.  */
655
5.12k
      case '}':     /* Double/even.  */
656
5.12k
        fregx (X_RD (insn));
657
5.12k
        break;
658
                    
659
10
                  case '^': /* Double/even multiple of 8 doubles.  */
660
10
                    fregx (X_RD (insn) & ~0x6);
661
10
                    break;
662
                    
663
243
                  case '\'':  /* Double/even in FPCMPSHL.  */
664
243
                    fregx (X_RS2 (insn | 0x11));
665
243
                    break;
666
                    
667
0
#undef  freg
668
0
#undef  fregx
669
670
511
#define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
671
0
      case 'b':
672
0
        creg (X_RS1 (insn));
673
0
        break;
674
675
0
      case 'c':
676
0
        creg (X_RS2 (insn));
677
0
        break;
678
679
511
      case 'D':
680
511
        creg (X_RD (insn));
681
511
        break;
682
0
#undef  creg
683
684
33.9k
      case 'h':
685
33.9k
        (*info->fprintf_func) (stream, "%%hi(%#x)",
686
33.9k
             (unsigned) X_IMM22 (insn) << 10);
687
33.9k
        break;
688
689
45.5k
      case 'i': /* 13 bit immediate.  */
690
45.7k
      case 'I': /* 11 bit immediate.  */
691
46.2k
      case 'j': /* 10 bit immediate.  */
692
46.2k
        {
693
46.2k
          int imm;
694
695
46.2k
          if (*s == 'i')
696
45.5k
            imm = X_SIMM (insn, 13);
697
688
          else if (*s == 'I')
698
281
      imm = X_SIMM (insn, 11);
699
407
          else
700
407
      imm = X_SIMM (insn, 10);
701
702
          /* Check to see whether we have a 1+i, and take
703
       note of that fact.
704
705
       Note: because of the way we sort the table,
706
       we will be matching 1+i rather than i+1,
707
       so it is OK to assume that i is after +,
708
       not before it.  */
709
46.2k
          if (found_plus)
710
23.3k
      imm_added_to_rs1 = 1;
711
712
46.2k
          if (imm <= 9)
713
22.3k
      (*info->fprintf_func) (stream, "%d", imm);
714
23.8k
          else
715
23.8k
      (*info->fprintf_func) (stream, "%#x", imm);
716
46.2k
        }
717
46.2k
        break;
718
719
84
      case ')': /* 5 bit unsigned immediate from RS3.  */
720
84
        (info->fprintf_func) (stream, "%#x", (unsigned int) X_RS3 (insn));
721
84
        break;
722
723
739
      case 'X': /* 5 bit unsigned immediate.  */
724
846
      case 'Y': /* 6 bit unsigned immediate.  */
725
846
        {
726
846
          int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
727
728
846
          if (imm <= 9)
729
366
      (info->fprintf_func) (stream, "%d", imm);
730
480
          else
731
480
      (info->fprintf_func) (stream, "%#x", (unsigned) imm);
732
846
        }
733
846
        break;
734
735
0
      case '3':
736
0
        (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
737
0
        break;
738
739
0
      case 'K':
740
0
        {
741
0
          int mask = X_MEMBAR (insn);
742
0
          int bit = 0x40, printed_one = 0;
743
0
          const char *name;
744
745
0
          if (mask == 0)
746
0
      (info->fprintf_func) (stream, "0");
747
0
          else
748
0
      while (bit)
749
0
        {
750
0
          if (mask & bit)
751
0
            {
752
0
        if (printed_one)
753
0
          (info->fprintf_func) (stream, "|");
754
0
        name = sparc_decode_membar (bit);
755
0
        (info->fprintf_func) (stream, "%s", name);
756
0
        printed_one = 1;
757
0
            }
758
0
          bit >>= 1;
759
0
        }
760
0
          break;
761
739
        }
762
763
951
      case '=':
764
951
        info->target = memaddr + SEX (X_DISP10 (insn), 10) * 4;
765
951
        (*info->print_address_func) (info->target, info);
766
951
        break;
767
768
2.46k
      case 'k':
769
2.46k
        info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
770
2.46k
        (*info->print_address_func) (info->target, info);
771
2.46k
        break;
772
773
18.0k
      case 'G':
774
18.0k
        info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
775
18.0k
        (*info->print_address_func) (info->target, info);
776
18.0k
        break;
777
778
1.30k
      case '6':
779
2.91k
      case '7':
780
4.48k
      case '8':
781
6.89k
      case '9':
782
6.89k
        (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
783
6.89k
        break;
784
785
4.99k
      case 'z':
786
4.99k
        (*info->fprintf_func) (stream, "%%icc");
787
4.99k
        break;
788
789
6.84k
      case 'Z':
790
6.84k
        (*info->fprintf_func) (stream, "%%xcc");
791
6.84k
        break;
792
793
8
      case 'E':
794
8
        (*info->fprintf_func) (stream, "%%ccr");
795
8
        break;
796
797
194
      case 's':
798
194
        (*info->fprintf_func) (stream, "%%fprs");
799
194
        break;
800
801
161
      case '{':
802
161
        (*info->fprintf_func) (stream, "%%mcdper");
803
161
        break;
804
805
0
                  case '&':
806
0
                    (*info->fprintf_func) (stream, "%%entropy");
807
0
                    break;
808
809
14.6k
      case 'o':
810
14.6k
        (*info->fprintf_func) (stream, "%%asi");
811
14.6k
        break;
812
813
75
      case 'W':
814
75
        (*info->fprintf_func) (stream, "%%tick");
815
75
        break;
816
817
49
      case 'P':
818
49
        (*info->fprintf_func) (stream, "%%pc");
819
49
        break;
820
821
21
      case '?':
822
21
        if (X_RS1 (insn) == 31)
823
0
          (*info->fprintf_func) (stream, "%%ver");
824
21
        else if (X_RS1 (insn) == 23)
825
0
          (*info->fprintf_func) (stream, "%%pmcdper");
826
21
        else if ((unsigned) X_RS1 (insn) < 17)
827
21
          (*info->fprintf_func) (stream, "%%%s",
828
21
               v9_priv_reg_names[X_RS1 (insn)]);
829
0
        else
830
0
          (*info->fprintf_func) (stream, "%%reserved");
831
21
        break;
832
833
1.14k
      case '!':
834
1.14k
                    if (X_RD (insn) == 31)
835
18
                      (*info->fprintf_func) (stream, "%%ver");
836
1.12k
        else if (X_RD (insn) == 23)
837
28
          (*info->fprintf_func) (stream, "%%pmcdper");
838
1.09k
        else if ((unsigned) X_RD (insn) < 17)
839
1.09k
          (*info->fprintf_func) (stream, "%%%s",
840
1.09k
               v9_priv_reg_names[X_RD (insn)]);
841
0
        else
842
0
          (*info->fprintf_func) (stream, "%%reserved");
843
1.14k
        break;
844
845
87
      case '$':
846
87
        if ((unsigned) X_RS1 (insn) < 32)
847
87
          (*info->fprintf_func) (stream, "%%%s",
848
87
               v9_hpriv_reg_names[X_RS1 (insn)]);
849
0
        else
850
0
          (*info->fprintf_func) (stream, "%%reserved");
851
87
        break;
852
853
121
      case '%':
854
121
        if ((unsigned) X_RD (insn) < 32)
855
121
          (*info->fprintf_func) (stream, "%%%s",
856
121
               v9_hpriv_reg_names[X_RD (insn)]);
857
0
        else
858
0
          (*info->fprintf_func) (stream, "%%reserved");
859
121
        break;
860
861
41
      case '/':
862
41
        if (X_RS1 (insn) < 16 || X_RS1 (insn) > 28)
863
0
          (*info->fprintf_func) (stream, "%%reserved");
864
41
        else
865
41
          (*info->fprintf_func) (stream, "%%%s",
866
41
               v9a_asr_reg_names[X_RS1 (insn)-16]);
867
41
        break;
868
869
955
      case '_':
870
955
        if (X_RD (insn) < 16 || X_RD (insn) > 28)
871
0
          (*info->fprintf_func) (stream, "%%reserved");
872
955
        else
873
955
          (*info->fprintf_func) (stream, "%%%s",
874
955
               v9a_asr_reg_names[X_RD (insn)-16]);
875
955
        break;
876
877
5.56k
      case '*':
878
5.56k
        {
879
5.56k
          const char *name = sparc_decode_prefetch (X_RD (insn));
880
881
5.56k
          if (name)
882
4.09k
      (*info->fprintf_func) (stream, "%s", name);
883
1.47k
          else
884
1.47k
      (*info->fprintf_func) (stream, "%ld", X_RD (insn));
885
5.56k
          break;
886
4.48k
        }
887
888
53
      case 'M':
889
53
        (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
890
53
        break;
891
892
525
      case 'm':
893
525
        (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
894
525
        break;
895
896
98.9k
      case 'L':
897
98.9k
        info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
898
98.9k
        (*info->print_address_func) (info->target, info);
899
98.9k
        break;
900
901
110k
      case 'n':
902
110k
        (*info->fprintf_func)
903
110k
          (stream, "%#x", SEX (X_DISP22 (insn), 22));
904
110k
        break;
905
906
25.9k
      case 'l':
907
25.9k
        info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
908
25.9k
        (*info->print_address_func) (info->target, info);
909
25.9k
        break;
910
911
12.2k
      case 'A':
912
12.2k
        {
913
12.2k
          const char *name = sparc_decode_asi (X_ASI (insn));
914
915
12.2k
          if (name)
916
6.75k
      (*info->fprintf_func) (stream, "%s", name);
917
5.51k
          else
918
5.51k
      (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
919
12.2k
          break;
920
4.48k
        }
921
922
319
      case 'C':
923
319
        (*info->fprintf_func) (stream, "%%csr");
924
319
        break;
925
926
102
      case 'F':
927
102
        (*info->fprintf_func) (stream, "%%fsr");
928
102
        break;
929
930
39
      case '(':
931
39
        (*info->fprintf_func) (stream, "%%efsr");
932
39
        break;
933
934
52
      case 'p':
935
52
        (*info->fprintf_func) (stream, "%%psr");
936
52
        break;
937
938
197
      case 'q':
939
197
        (*info->fprintf_func) (stream, "%%fq");
940
197
        break;
941
942
141
      case 'Q':
943
141
        (*info->fprintf_func) (stream, "%%cq");
944
141
        break;
945
946
254
      case 't':
947
254
        (*info->fprintf_func) (stream, "%%tbr");
948
254
        break;
949
950
22
      case 'w':
951
22
        (*info->fprintf_func) (stream, "%%wim");
952
22
        break;
953
954
333
      case 'x':
955
333
        (*info->fprintf_func) (stream, "%ld",
956
333
             ((X_LDST_I (insn) << 8)
957
333
              + X_ASI (insn)));
958
333
        break;
959
960
243
                  case '|': /* 2-bit immediate  */
961
243
                    (*info->fprintf_func) (stream, "%ld", X_IMM2 (insn));
962
243
                    break;
963
964
220
      case 'y':
965
220
        (*info->fprintf_func) (stream, "%%y");
966
220
        break;
967
968
106
      case 'u':
969
181
      case 'U':
970
181
        {
971
181
          int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
972
181
          const char *name = sparc_decode_sparclet_cpreg (val);
973
974
181
          if (name)
975
106
      (*info->fprintf_func) (stream, "%s", name);
976
75
          else
977
75
      (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
978
181
          break;
979
106
        }
980
763k
      }
981
763k
        }
982
373k
    }
983
984
    /* If we are adding or or'ing something to rs1, then
985
       check to see whether the previous instruction was
986
       a sethi to the same register as in the sethi.
987
       If so, attempt to print the result of the add or
988
       or (in this context add and or do the same thing)
989
       and its symbolic value.  */
990
373k
    if (imm_ored_to_rs1 || imm_added_to_rs1)
991
24.8k
      {
992
24.8k
        unsigned long prev_insn;
993
24.8k
        int errcode;
994
995
24.8k
        if (memaddr >= 4)
996
24.8k
    errcode =
997
24.8k
      (*info->read_memory_func)
998
24.8k
      (memaddr - 4, buffer, sizeof (buffer), info);
999
0
        else
1000
0
    errcode = 1;
1001
1002
24.8k
        prev_insn = getword (buffer);
1003
1004
24.8k
        if (errcode == 0)
1005
12.2k
    {
1006
      /* If it is a delayed branch, we need to look at the
1007
         instruction before the delayed branch.  This handles
1008
         sequences such as:
1009
1010
         sethi %o1, %hi(_foo), %o1
1011
         call _printf
1012
         or %o1, %lo(_foo), %o1  */
1013
1014
12.2k
      if (is_delayed_branch (prev_insn))
1015
3.67k
        {
1016
3.67k
          if (memaddr >= 8)
1017
3.67k
      errcode = (*info->read_memory_func)
1018
3.67k
        (memaddr - 8, buffer, sizeof (buffer), info);
1019
1
          else
1020
1
      errcode = 1;
1021
1022
3.67k
          prev_insn = getword (buffer);
1023
3.67k
        }
1024
12.2k
    }
1025
1026
        /* If there was a problem reading memory, then assume
1027
     the previous instruction was not sethi.  */
1028
24.8k
        if (errcode == 0)
1029
12.2k
    {
1030
      /* Is it sethi to the same register?  */
1031
12.2k
      if ((prev_insn & 0xc1c00000) == 0x01000000
1032
806
          && X_RD (prev_insn) == X_RS1 (insn))
1033
33
        {
1034
33
          (*info->fprintf_func) (stream, "\t! ");
1035
33
          info->target = (unsigned) X_IMM22 (prev_insn) << 10;
1036
33
          if (imm_added_to_rs1)
1037
16
      info->target += X_SIMM (insn, 13);
1038
17
          else
1039
17
      info->target |= X_SIMM (insn, 13);
1040
33
          (*info->print_address_func) (info->target, info);
1041
33
          info->insn_type = dis_dref;
1042
33
          info->data_size = 4;  /* FIXME!!! */
1043
33
        }
1044
12.2k
    }
1045
24.8k
      }
1046
1047
373k
    if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
1048
146k
      {
1049
        /* FIXME -- check is_annulled flag.  */
1050
146k
        (void) is_annulled;
1051
146k
        if (opcode->flags & F_UNBR)
1052
6.78k
    info->insn_type = dis_branch;
1053
146k
        if (opcode->flags & F_CONDBR)
1054
40.2k
    info->insn_type = dis_condbranch;
1055
146k
        if (opcode->flags & F_JSR)
1056
99.4k
    info->insn_type = dis_jsr;
1057
146k
        if (opcode->flags & F_DELAYED)
1058
145k
    info->branch_delay_insns = 1;
1059
146k
      }
1060
1061
373k
    return sizeof (buffer);
1062
373k
  }
1063
7.03M
    }
1064
1065
158k
  info->insn_type = dis_noninsn;  /* Mark as non-valid instruction.  */
1066
  (*info->fprintf_func) (stream, _("unknown"));
1067
158k
  return sizeof (buffer);
1068
531k
}