Coverage Report

Created: 2023-06-29 07:13

/src/binutils-gdb/opcodes/nios2-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Altera Nios II disassemble routines
2
   Copyright (C) 2012-2023 Free Software Foundation, Inc.
3
   Contributed by Nigel Gray (ngray@altera.com).
4
   Contributed by Mentor Graphics, Inc.
5
6
   This file is part of the GNU opcodes library.
7
8
   This library is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3, or (at your option)
11
   any later version.
12
13
   It is distributed in the hope that it will be useful, but WITHOUT
14
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16
   License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with this file; see the file COPYING.  If not, write to the
20
   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
23
#include "sysdep.h"
24
#include "disassemble.h"
25
#include "opintl.h"
26
#include "opcode/nios2.h"
27
#include "libiberty.h"
28
#include <string.h>
29
#include <assert.h>
30
31
/* No symbol table is available when this code runs out in an embedded
32
   system as when it is used for disassembler support in a monitor.  */
33
#if !defined(EMBEDDED_ENV)
34
#define SYMTAB_AVAILABLE 1
35
#include "elf-bfd.h"
36
#include "elf/nios2.h"
37
#endif
38
39
/* Default length of Nios II instruction in bytes.  */
40
1.88M
#define INSNLEN 4
41
42
/* Data structures used by the opcode hash table.  */
43
typedef struct _nios2_opcode_hash
44
{
45
  const struct nios2_opcode *opcode;
46
  struct _nios2_opcode_hash *next;
47
} nios2_opcode_hash;
48
49
/* Hash table size.  */
50
260
#define OPCODE_HASH_SIZE (IW_R1_OP_UNSHIFTED_MASK + 1)
51
52
/* Extract the opcode from an instruction word.  */
53
static unsigned int
54
nios2_r1_extract_opcode (unsigned int x)
55
68.9k
{
56
68.9k
  return GET_IW_R1_OP (x);
57
68.9k
}
58
59
static unsigned int
60
nios2_r2_extract_opcode (unsigned int x)
61
1.17M
{
62
1.17M
  return GET_IW_R2_OP (x);
63
1.17M
}
64
65
/* We maintain separate hash tables for R1 and R2 opcodes, and pseudo-ops
66
   are stored in a different table than regular instructions.  */
67
68
typedef struct _nios2_disassembler_state
69
{
70
  const struct nios2_opcode *opcodes;
71
  const int *num_opcodes;
72
  unsigned int (*extract_opcode) (unsigned int);
73
  nios2_opcode_hash *hash[OPCODE_HASH_SIZE];
74
  nios2_opcode_hash *ps_hash[OPCODE_HASH_SIZE];
75
  const struct nios2_opcode *nop;
76
  bool init;
77
} nios2_disassembler_state;
78
79
static nios2_disassembler_state
80
nios2_r1_disassembler_state = {
81
  nios2_r1_opcodes,
82
  &nios2_num_r1_opcodes,
83
  nios2_r1_extract_opcode,
84
  {},
85
  {},
86
  NULL,
87
  0
88
};
89
90
static nios2_disassembler_state
91
nios2_r2_disassembler_state = {
92
  nios2_r2_opcodes,
93
  &nios2_num_r2_opcodes,
94
  nios2_r2_extract_opcode,
95
  {},
96
  {},
97
  NULL,
98
  0
99
};
100
101
/* Function to initialize the opcode hash table.  */
102
static void
103
nios2_init_opcode_hash (nios2_disassembler_state *state)
104
4
{
105
4
  unsigned int i;
106
4
  register const struct nios2_opcode *op;
107
108
260
  for (i = 0; i < OPCODE_HASH_SIZE; i++)
109
34.1k
    for (op = state->opcodes; op < &state->opcodes[*(state->num_opcodes)]; op++)
110
33.9k
      {
111
33.9k
  nios2_opcode_hash *new_hash;
112
33.9k
  nios2_opcode_hash **bucket = NULL;
113
114
33.9k
  if ((op->pinfo & NIOS2_INSN_MACRO) == NIOS2_INSN_MACRO)
115
4.99k
    {
116
4.99k
      if (i == state->extract_opcode (op->match)
117
4.99k
    && (op->pinfo & (NIOS2_INSN_MACRO_MOV | NIOS2_INSN_MACRO_MOVI)
118
78
        & 0x7fffffff))
119
22
        {
120
22
    bucket = &(state->ps_hash[i]);
121
22
    if (strcmp (op->name, "nop") == 0)
122
4
      state->nop = op;
123
22
        }
124
4.99k
    }
125
28.9k
  else if (i == state->extract_opcode (op->match))
126
452
    bucket = &(state->hash[i]);
127
128
33.9k
  if (bucket)
129
474
    {
130
474
      new_hash =
131
474
        (nios2_opcode_hash *) malloc (sizeof (nios2_opcode_hash));
132
474
      if (new_hash == NULL)
133
0
        {
134
    /* xgettext:c-format */
135
0
    opcodes_error_handler (_("out of memory"));
136
0
    exit (1);
137
0
        }
138
474
      new_hash->opcode = op;
139
474
      new_hash->next = NULL;
140
5.10k
      while (*bucket)
141
4.63k
        bucket = &((*bucket)->next);
142
474
      *bucket = new_hash;
143
474
    }
144
33.9k
      }
145
4
  state->init = 1;
146
147
#ifdef DEBUG_HASHTABLE
148
  for (i = 0; i < OPCODE_HASH_SIZE; ++i)
149
    {
150
      nios2_opcode_hash *tmp_hash = state->hash[i];
151
      printf ("index: 0x%02X  ops: ", i);
152
      while (tmp_hash != NULL)
153
  {
154
    printf ("%s ", tmp_hash->opcode->name);
155
    tmp_hash = tmp_hash->next;
156
  }
157
      printf ("\n");
158
    }
159
160
  for (i = 0; i < OPCODE_HASH_SIZE; ++i)
161
    {
162
      nios2_opcode_hash *tmp_hash = state->ps_hash[i];
163
      printf ("index: 0x%02X  ops: ", i);
164
      while (tmp_hash != NULL)
165
  {
166
    printf ("%s ", tmp_hash->opcode->name);
167
    tmp_hash = tmp_hash->next;
168
  }
169
      printf ("\n");
170
    }
171
#endif /* DEBUG_HASHTABLE */
172
4
}
173
174
/* Return a pointer to an nios2_opcode struct for a given instruction
175
   word OPCODE for bfd machine MACH, or NULL if there is an error.  */
176
const struct nios2_opcode *
177
nios2_find_opcode_hash (unsigned long opcode, unsigned long mach)
178
604k
{
179
604k
  nios2_opcode_hash *entry;
180
604k
  nios2_disassembler_state *state;
181
182
  /* Select the right instruction set, hash tables, and opcode accessor
183
     for the mach variant.  */
184
604k
  if (mach == bfd_mach_nios2r2)
185
577k
    state = &nios2_r2_disassembler_state;
186
27.7k
  else
187
27.7k
    state = &nios2_r1_disassembler_state;
188
189
  /* Build a hash table to shorten the search time.  */
190
604k
  if (!state->init)
191
4
    nios2_init_opcode_hash (state);
192
193
  /* Check for NOP first.  Both NOP and MOV are macros that expand into
194
     an ADD instruction, and we always want to give priority to NOP.  */
195
604k
  if (state->nop->match == (opcode & state->nop->mask))
196
6
    return state->nop;
197
198
  /* First look in the pseudo-op hashtable.  */
199
604k
  for (entry = state->ps_hash[state->extract_opcode (opcode)];
200
645k
       entry; entry = entry->next)
201
44.8k
    if (entry->opcode->match == (opcode & entry->opcode->mask))
202
4.12k
      return entry->opcode;
203
204
  /* Otherwise look in the main hashtable.  */
205
600k
  for (entry = state->hash[state->extract_opcode (opcode)];
206
1.17M
       entry; entry = entry->next)
207
1.10M
    if (entry->opcode->match == (opcode & entry->opcode->mask))
208
529k
      return entry->opcode;
209
210
71.6k
  return NULL;
211
600k
}
212
213
/* There are 32 regular registers, 32 coprocessor registers,
214
   and 32 control registers.  */
215
620k
#define NUMREGNAMES 32
216
217
/* Return a pointer to the base of the coprocessor register name array.  */
218
static struct nios2_reg *
219
nios2_coprocessor_regs (void)
220
14.3k
{
221
14.3k
  static struct nios2_reg *cached = NULL;
222
223
14.3k
  if (!cached)
224
2
    {
225
2
      int i;
226
118
      for (i = NUMREGNAMES; i < nios2_num_regs; i++)
227
118
  if (!strcmp (nios2_regs[i].name, "c0"))
228
2
    {
229
2
      cached = nios2_regs + i;
230
2
      break;
231
2
    }
232
2
      assert (cached);
233
2
    }
234
14.3k
  return cached;
235
14.3k
}
236
237
/* Return a pointer to the base of the control register name array.  */
238
static struct nios2_reg *
239
nios2_control_regs (void)
240
65
{
241
65
  static struct nios2_reg *cached = NULL;
242
243
65
  if (!cached)
244
2
    {
245
2
      int i;
246
24
      for (i = NUMREGNAMES; i < nios2_num_regs; i++)
247
24
  if (!strcmp (nios2_regs[i].name, "status"))
248
2
    {
249
2
      cached = nios2_regs + i;
250
2
      break;
251
2
    }
252
2
      assert (cached);
253
2
    }
254
65
  return cached;
255
65
}
256
257
/* Helper routine to report internal errors.  */
258
static void
259
bad_opcode (const struct nios2_opcode *op)
260
0
{
261
0
  opcodes_error_handler
262
    /* xgettext:c-format */
263
0
    (_("internal error: broken opcode descriptor for `%s %s'"),
264
0
     op->name, op->args);
265
0
  abort ();
266
0
}
267
268
/* The function nios2_print_insn_arg uses the character pointed
269
   to by ARGPTR to determine how it print the next token or separator
270
   character in the arguments to an instruction.  */
271
static int
272
nios2_print_insn_arg (const char *argptr,
273
          unsigned long opcode, bfd_vma address,
274
          disassemble_info *info,
275
          const struct nios2_opcode *op)
276
2.20M
{
277
2.20M
  unsigned long i = 0;
278
2.20M
  long s = 0;
279
2.20M
  int32_t o = 0;
280
2.20M
  struct nios2_reg *reg_base;
281
282
2.20M
  switch (*argptr)
283
2.20M
    {
284
672k
    case ',':
285
783k
    case '(':
286
893k
    case ')':
287
893k
      (*info->fprintf_func) (info->stream, "%c", *argptr);
288
893k
      break;
289
290
65
    case 'c':
291
      /* Control register index.  */
292
65
      switch (op->format)
293
65
  {
294
11
  case iw_r_type:
295
11
    i = GET_IW_R_IMM5 (opcode);
296
11
    break;
297
54
  case iw_F3X6L5_type:
298
54
    i = GET_IW_F3X6L5_IMM5 (opcode);
299
54
    break;
300
0
  default:
301
0
    bad_opcode (op);
302
65
  }
303
65
      reg_base = nios2_control_regs ();
304
65
      (*info->fprintf_func) (info->stream, "%s", reg_base[i].name);
305
65
      break;
306
307
15.7k
    case 'd':
308
15.7k
      reg_base = nios2_regs;
309
15.7k
      switch (op->format)
310
15.7k
  {
311
60
  case iw_r_type:
312
60
    i = GET_IW_R_C (opcode);
313
60
    break;
314
939
  case iw_custom_type:
315
939
    i = GET_IW_CUSTOM_C (opcode);
316
939
    if (GET_IW_CUSTOM_READC (opcode) == 0)
317
687
      reg_base = nios2_coprocessor_regs ();
318
939
    break;
319
326
  case iw_F3X6L5_type:
320
634
  case iw_F3X6_type:
321
634
    i = GET_IW_F3X6L5_C (opcode);
322
634
    break;
323
8.75k
  case iw_F3X8_type:
324
8.75k
    i = GET_IW_F3X8_C (opcode);
325
8.75k
    if (GET_IW_F3X8_READC (opcode) == 0)
326
5.21k
      reg_base = nios2_coprocessor_regs ();
327
8.75k
    break;
328
5.40k
  case iw_F2_type:
329
5.40k
    i = GET_IW_F2_B (opcode);
330
5.40k
    break;
331
0
  default:
332
0
    bad_opcode (op);
333
15.7k
  }
334
15.7k
      if (i < NUMREGNAMES)
335
15.7k
  (*info->fprintf_func) (info->stream, "%s", reg_base[i].name);
336
0
      else
337
0
  (*info->fprintf_func) (info->stream, "unknown");
338
15.7k
      break;
339
340
301k
    case 's':
341
301k
      reg_base = nios2_regs;
342
301k
      switch (op->format)
343
301k
  {
344
51
  case iw_r_type:
345
51
    i = GET_IW_R_A (opcode);
346
51
    break;
347
10.1k
  case iw_i_type:
348
10.1k
    i = GET_IW_I_A (opcode);
349
10.1k
    break;
350
939
  case iw_custom_type:
351
939
    i = GET_IW_CUSTOM_A (opcode);
352
939
    if (GET_IW_CUSTOM_READA (opcode) == 0)
353
730
      reg_base = nios2_coprocessor_regs ();
354
939
    break;
355
256k
  case iw_F2I16_type:
356
256k
    i = GET_IW_F2I16_A (opcode);
357
256k
    break;
358
4.33k
  case iw_F2X4I12_type:
359
4.33k
    i = GET_IW_F2X4I12_A (opcode);
360
4.33k
    break;
361
35
  case iw_F1X4I12_type:
362
35
    i = GET_IW_F1X4I12_A (opcode);
363
35
    break;
364
0
  case iw_F1X4L17_type:
365
0
    i = GET_IW_F1X4L17_A (opcode);
366
0
    break;
367
346
  case iw_F3X6L5_type:
368
654
  case iw_F3X6_type:
369
654
    i = GET_IW_F3X6L5_A (opcode);
370
654
    break;
371
285
  case iw_F2X6L10_type:
372
285
    i = GET_IW_F2X6L10_A (opcode);
373
285
    break;
374
8.75k
  case iw_F3X8_type:
375
8.75k
    i = GET_IW_F3X8_A (opcode);
376
8.75k
    if (GET_IW_F3X8_READA (opcode) == 0)
377
3.30k
      reg_base = nios2_coprocessor_regs ();
378
8.75k
    break;
379
702
  case iw_F1X1_type:
380
702
    i = GET_IW_F1X1_A (opcode);
381
702
    break;
382
12.9k
  case iw_F1I5_type:
383
12.9k
    i = 27;   /* Implicit stack pointer reference.  */
384
12.9k
    break;
385
5.40k
  case iw_F2_type:
386
5.40k
    i = GET_IW_F2_A (opcode);
387
5.40k
    break;
388
0
  default:
389
0
    bad_opcode (op);
390
301k
  }
391
301k
      if (i < NUMREGNAMES)
392
301k
  (*info->fprintf_func) (info->stream, "%s", reg_base[i].name);
393
0
      else
394
0
  (*info->fprintf_func) (info->stream, "unknown");
395
301k
      break;
396
397
303k
    case 't':
398
303k
      reg_base = nios2_regs;
399
303k
      switch (op->format)
400
303k
  {
401
47
  case iw_r_type:
402
47
    i = GET_IW_R_B (opcode);
403
47
    break;
404
10.2k
  case iw_i_type:
405
10.2k
    i = GET_IW_I_B (opcode);
406
10.2k
    break;
407
939
  case iw_custom_type:
408
939
    i = GET_IW_CUSTOM_B (opcode);
409
939
    if (GET_IW_CUSTOM_READB (opcode) == 0)
410
454
      reg_base = nios2_coprocessor_regs ();
411
939
    break;
412
260k
  case iw_F2I16_type:
413
260k
    i = GET_IW_F2I16_B (opcode);
414
260k
    break;
415
4.33k
  case iw_F2X4I12_type:
416
4.33k
    i = GET_IW_F2X4I12_B (opcode);
417
4.33k
    break;
418
0
  case iw_F3X6L5_type:
419
308
  case iw_F3X6_type:
420
308
    i = GET_IW_F3X6L5_B (opcode);
421
308
    break;
422
285
  case iw_F2X6L10_type:
423
285
    i = GET_IW_F2X6L10_B (opcode);
424
285
    break;
425
8.75k
  case iw_F3X8_type:
426
8.75k
    i = GET_IW_F3X8_B (opcode);
427
8.75k
    if (GET_IW_F3X8_READB (opcode) == 0)
428
3.97k
      reg_base = nios2_coprocessor_regs ();
429
8.75k
    break;
430
12.9k
  case iw_F1I5_type:
431
12.9k
    i = GET_IW_F1I5_B (opcode);
432
12.9k
    break;
433
0
  case iw_F2_type:
434
0
    i = GET_IW_F2_B (opcode);
435
0
    break;
436
5.03k
  case iw_T1X1I6_type:
437
5.03k
    i = 0;
438
5.03k
    break;
439
0
  default:
440
0
    bad_opcode (op);
441
303k
  }
442
303k
      if (i < NUMREGNAMES)
443
303k
  (*info->fprintf_func) (info->stream, "%s", reg_base[i].name);
444
0
      else
445
0
  (*info->fprintf_func) (info->stream, "unknown");
446
303k
      break;
447
448
35.9k
    case 'D':
449
35.9k
      switch (op->format)
450
35.9k
  {
451
12.1k
  case iw_T1I7_type:
452
12.1k
    i = GET_IW_T1I7_A3 (opcode);
453
12.1k
    break;
454
4.29k
  case iw_T2X1L3_type:
455
4.29k
    i = GET_IW_T2X1L3_B3 (opcode);
456
4.29k
    break;
457
5.71k
  case iw_T2X1I3_type:
458
5.71k
    i = GET_IW_T2X1I3_B3 (opcode);
459
5.71k
    break;
460
9.78k
  case iw_T3X1_type:
461
9.78k
    i = GET_IW_T3X1_C3 (opcode);
462
9.78k
    break;
463
4.09k
  case iw_T2X3_type:
464
4.09k
    if (op->num_args == 3)
465
3.51k
      i = GET_IW_T2X3_A3 (opcode);
466
582
    else
467
582
      i = GET_IW_T2X3_B3 (opcode);
468
4.09k
    break;
469
0
  default:
470
0
    bad_opcode (op);
471
35.9k
  }
472
35.9k
      i = nios2_r2_reg3_mappings[i];
473
35.9k
      (*info->fprintf_func) (info->stream, "%s", nios2_regs[i].name);
474
35.9k
      break;
475
476
2.26k
    case 'M':
477
      /* 6-bit unsigned immediate with no shift.  */
478
2.26k
      switch (op->format)
479
2.26k
  {
480
2.26k
  case iw_T1X1I6_type:
481
2.26k
    i = GET_IW_T1X1I6_IMM6 (opcode);
482
2.26k
    break;
483
0
  default:
484
0
    bad_opcode (op);
485
2.26k
  }
486
2.26k
      (*info->fprintf_func) (info->stream, "%ld", i);
487
2.26k
      break;
488
489
2.76k
    case 'N':
490
      /* 6-bit unsigned immediate with 2-bit shift.  */
491
2.76k
      switch (op->format)
492
2.76k
  {
493
2.76k
  case iw_T1X1I6_type:
494
2.76k
    i = GET_IW_T1X1I6_IMM6 (opcode) << 2;
495
2.76k
    break;
496
0
  default:
497
0
    bad_opcode (op);
498
2.76k
  }
499
2.76k
      (*info->fprintf_func) (info->stream, "%ld", i);
500
2.76k
      break;
501
502
82.8k
    case 'S':
503
82.8k
      switch (op->format)
504
82.8k
  {
505
12.5k
  case iw_T1I7_type:
506
12.5k
    i = GET_IW_T1I7_A3 (opcode);
507
12.5k
    break;
508
41.2k
  case iw_T2I4_type:
509
41.2k
    i = GET_IW_T2I4_A3 (opcode);
510
41.2k
    break;
511
4.29k
  case iw_T2X1L3_type:
512
4.29k
    i = GET_IW_T2X1L3_A3 (opcode);
513
4.29k
    break;
514
5.71k
  case iw_T2X1I3_type:
515
5.71k
    i = GET_IW_T2X1I3_A3 (opcode);
516
5.71k
    break;
517
9.78k
  case iw_T3X1_type:
518
9.78k
    i = GET_IW_T3X1_A3 (opcode);
519
9.78k
    break;
520
4.09k
  case iw_T2X3_type:
521
4.09k
    i = GET_IW_T2X3_A3 (opcode);
522
4.09k
    break;
523
5.03k
  case iw_T1X1I6_type:
524
5.03k
    i = GET_IW_T1X1I6_A3 (opcode);
525
5.03k
    break;
526
0
  default:
527
0
    bad_opcode (op);
528
82.8k
  }
529
82.8k
      i = nios2_r2_reg3_mappings[i];
530
82.8k
      (*info->fprintf_func) (info->stream, "%s", nios2_regs[i].name);
531
82.8k
      break;
532
533
54.5k
    case 'T':
534
54.5k
      switch (op->format)
535
54.5k
  {
536
41.2k
  case iw_T2I4_type:
537
41.2k
    i = GET_IW_T2I4_B3 (opcode);
538
41.2k
    break;
539
9.78k
  case iw_T3X1_type:
540
9.78k
    i = GET_IW_T3X1_B3 (opcode);
541
9.78k
    break;
542
3.51k
  case iw_T2X3_type:
543
3.51k
    i = GET_IW_T2X3_B3 (opcode);
544
3.51k
    break;
545
0
  default:
546
0
    bad_opcode (op);
547
54.5k
  }
548
54.5k
      i = nios2_r2_reg3_mappings[i];
549
54.5k
      (*info->fprintf_func) (info->stream, "%s", nios2_regs[i].name);
550
54.5k
      break;
551
552
158k
    case 'i':
553
      /* 16-bit signed immediate.  */
554
158k
      switch (op->format)
555
158k
  {
556
6.45k
  case iw_i_type:
557
6.45k
    s = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000)
558
6.45k
         - 0x8000);
559
6.45k
    break;
560
152k
  case iw_F2I16_type:
561
152k
    s = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000)
562
152k
         - 0x8000);
563
152k
    break;
564
0
  default:
565
0
    bad_opcode (op);
566
158k
  }
567
158k
      (*info->fprintf_func) (info->stream, "%ld", s);
568
158k
      break;
569
570
4.37k
    case 'I':
571
      /* 12-bit signed immediate.  */
572
4.37k
      switch (op->format)
573
4.37k
  {
574
4.33k
  case iw_F2X4I12_type:
575
4.33k
    s = ((int32_t) ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
576
4.33k
         - 0x800);
577
4.33k
    break;
578
35
  case iw_F1X4I12_type:
579
35
    s = ((int32_t) ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800)
580
35
         - 0x800);
581
35
    break;
582
0
  default:
583
0
    bad_opcode (op);
584
4.37k
  }
585
4.37k
      (*info->fprintf_func) (info->stream, "%ld", s);
586
4.37k
      break;
587
588
79.3k
    case 'u':
589
      /* 16-bit unsigned immediate.  */
590
79.3k
      switch (op->format)
591
79.3k
  {
592
2.16k
  case iw_i_type:
593
2.16k
    i = GET_IW_I_IMM16 (opcode);
594
2.16k
    break;
595
77.1k
  case iw_F2I16_type:
596
77.1k
    i = GET_IW_F2I16_IMM16 (opcode);
597
77.1k
    break;
598
0
  default:
599
0
    bad_opcode (op);
600
79.3k
  }
601
79.3k
      (*info->fprintf_func) (info->stream, "%ld", i);
602
79.3k
      break;
603
604
11.9k
    case 'U':
605
      /* 7-bit unsigned immediate with 2-bit shift.  */
606
11.9k
      switch (op->format)
607
11.9k
  {
608
5.99k
  case iw_T1I7_type:
609
5.99k
    i = GET_IW_T1I7_IMM7 (opcode) << 2;
610
5.99k
    break;
611
5.95k
  case iw_X1I7_type:
612
5.95k
    i = GET_IW_X1I7_IMM7 (opcode) << 2;
613
5.95k
    break;
614
0
  default:
615
0
    bad_opcode (op);
616
11.9k
  }
617
11.9k
      (*info->fprintf_func) (info->stream, "%ld", i);
618
11.9k
      break;
619
620
12.9k
    case 'V':
621
      /* 5-bit unsigned immediate with 2-bit shift.  */
622
12.9k
      switch (op->format)
623
12.9k
  {
624
12.9k
  case iw_F1I5_type:
625
12.9k
    i = GET_IW_F1I5_IMM5 (opcode) << 2;
626
12.9k
    break;
627
0
  default:
628
0
    bad_opcode (op);
629
12.9k
  }
630
12.9k
      (*info->fprintf_func) (info->stream, "%ld", i);
631
12.9k
      break;
632
633
17.8k
    case 'W':
634
      /* 4-bit unsigned immediate with 2-bit shift.  */
635
17.8k
      switch (op->format)
636
17.8k
  {
637
9.35k
  case iw_T2I4_type:
638
9.35k
    i = GET_IW_T2I4_IMM4 (opcode) << 2;
639
9.35k
    break;
640
8.45k
  case iw_L5I4X1_type:
641
8.45k
    i = GET_IW_L5I4X1_IMM4 (opcode) << 2;
642
8.45k
    break;
643
0
  default:
644
0
    bad_opcode (op);
645
17.8k
  }
646
17.8k
      (*info->fprintf_func) (info->stream, "%ld", i);
647
17.8k
      break;
648
649
10.6k
    case 'X':
650
      /* 4-bit unsigned immediate with 1-bit shift.  */
651
10.6k
      switch (op->format)
652
10.6k
  {
653
10.6k
  case iw_T2I4_type:
654
10.6k
    i = GET_IW_T2I4_IMM4 (opcode) << 1;
655
10.6k
    break;
656
0
  default:
657
0
    bad_opcode (op);
658
10.6k
  }
659
10.6k
      (*info->fprintf_func) (info->stream, "%ld", i);
660
10.6k
      break;
661
662
15.6k
    case 'Y':
663
      /* 4-bit unsigned immediate without shift.  */
664
15.6k
      switch (op->format)
665
15.6k
  {
666
15.6k
  case iw_T2I4_type:
667
15.6k
    i = GET_IW_T2I4_IMM4 (opcode);
668
15.6k
    break;
669
0
  default:
670
0
    bad_opcode (op);
671
15.6k
  }
672
15.6k
      (*info->fprintf_func) (info->stream, "%ld", i);
673
15.6k
      break;
674
675
35.0k
    case 'o':
676
      /* 16-bit signed immediate address offset.  */
677
35.0k
      switch (op->format)
678
35.0k
  {
679
1.78k
  case iw_i_type:
680
1.78k
    o = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
681
1.78k
    break;
682
33.2k
  case iw_F2I16_type:
683
33.2k
    o = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000;
684
33.2k
    break;
685
0
  default:
686
0
    bad_opcode (op);
687
35.0k
  }
688
35.0k
      address = address + 4 + o;
689
35.0k
      (*info->print_address_func) (address, info);
690
35.0k
      break;
691
692
8.72k
    case 'O':
693
      /* 10-bit signed address offset with 1-bit shift.  */
694
8.72k
      switch (op->format)
695
8.72k
  {
696
8.72k
  case iw_I10_type:
697
8.72k
    o = (((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x200) - 0x200) * 2;
698
8.72k
    break;
699
0
  default:
700
0
    bad_opcode (op);
701
8.72k
  }
702
8.72k
      address = address + 2 + o;
703
8.72k
      (*info->print_address_func) (address, info);
704
8.72k
      break;
705
706
12.5k
    case 'P':
707
      /* 7-bit signed address offset with 1-bit shift.  */
708
12.5k
      switch (op->format)
709
12.5k
  {
710
12.5k
  case iw_T1I7_type:
711
12.5k
    o = (((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) - 0x40) * 2;
712
12.5k
    break;
713
0
  default:
714
0
    bad_opcode (op);
715
12.5k
  }
716
12.5k
      address = address + 2 + o;
717
12.5k
      (*info->print_address_func) (address, info);
718
12.5k
      break;
719
720
1.35k
    case 'j':
721
      /* 5-bit unsigned immediate.  */
722
1.35k
      switch (op->format)
723
1.35k
  {
724
3
  case iw_r_type:
725
3
    i = GET_IW_R_IMM5 (opcode);
726
3
    break;
727
118
  case iw_F3X6L5_type:
728
118
    i = GET_IW_F3X6L5_IMM5 (opcode);
729
118
    break;
730
285
  case iw_F2X6L10_type:
731
285
    i = GET_IW_F2X6L10_MSB (opcode);
732
285
    break;
733
948
  case iw_X2L5_type:
734
948
    i = GET_IW_X2L5_IMM5 (opcode);
735
948
    break;
736
0
  default:
737
0
    bad_opcode (op);
738
1.35k
  }
739
1.35k
      (*info->fprintf_func) (info->stream, "%ld", i);
740
1.35k
      break;
741
742
285
    case 'k':
743
      /* Second 5-bit unsigned immediate field.  */
744
285
      switch (op->format)
745
285
  {
746
285
  case iw_F2X6L10_type:
747
285
    i = GET_IW_F2X6L10_LSB (opcode);
748
285
    break;
749
0
  default:
750
0
    bad_opcode (op);
751
285
  }
752
285
      (*info->fprintf_func) (info->stream, "%ld", i);
753
285
      break;
754
755
9.69k
    case 'l':
756
      /* 8-bit unsigned immediate.  */
757
9.69k
      switch (op->format)
758
9.69k
  {
759
939
  case iw_custom_type:
760
939
    i = GET_IW_CUSTOM_N (opcode);
761
939
    break;
762
8.75k
  case iw_F3X8_type:
763
8.75k
    i = GET_IW_F3X8_N (opcode);
764
8.75k
    break;
765
0
  default:
766
0
    bad_opcode (op);
767
9.69k
  }
768
9.69k
      (*info->fprintf_func) (info->stream, "%lu", i);
769
9.69k
      break;
770
771
105k
    case 'm':
772
      /* 26-bit unsigned immediate.  */
773
105k
      switch (op->format)
774
105k
  {
775
6.41k
  case iw_j_type:
776
6.41k
    i = GET_IW_J_IMM26 (opcode);
777
6.41k
    break;
778
99.5k
  case iw_L26_type:
779
99.5k
    i = GET_IW_L26_IMM26 (opcode);
780
99.5k
    break;
781
0
  default:
782
0
    bad_opcode (op);
783
105k
  }
784
      /* This translates to an address because it's only used in call
785
   instructions.  */
786
105k
      address = (address & 0xf0000000) | (i << 2);
787
105k
      (*info->print_address_func) (address, info);
788
105k
      break;
789
790
5.71k
    case 'e':
791
      /* Encoded enumeration for addi.n/subi.n.  */
792
5.71k
      switch (op->format)
793
5.71k
  {
794
5.71k
  case iw_T2X1I3_type:
795
5.71k
    i = nios2_r2_asi_n_mappings[GET_IW_T2X1I3_IMM3 (opcode)];
796
5.71k
    break;
797
0
  default:
798
0
    bad_opcode (op);
799
5.71k
  }
800
5.71k
      (*info->fprintf_func) (info->stream, "%lu", i);
801
5.71k
      break;
802
803
4.29k
    case 'f':
804
      /* Encoded enumeration for slli.n/srli.n.  */
805
4.29k
      switch (op->format)
806
4.29k
  {
807
4.29k
  case iw_T2X1L3_type:
808
4.29k
    i = nios2_r2_shi_n_mappings[GET_IW_T2X1I3_IMM3 (opcode)];
809
4.29k
    break;
810
0
  default:
811
0
    bad_opcode (op);
812
4.29k
  }
813
4.29k
      (*info->fprintf_func) (info->stream, "%lu", i);
814
4.29k
      break;
815
816
5.68k
    case 'g':
817
      /* Encoded enumeration for andi.n.  */
818
5.68k
      switch (op->format)
819
5.68k
  {
820
5.68k
  case iw_T2I4_type:
821
5.68k
    i = nios2_r2_andi_n_mappings[GET_IW_T2I4_IMM4 (opcode)];
822
5.68k
    break;
823
0
  default:
824
0
    bad_opcode (op);
825
5.68k
  }
826
5.68k
      (*info->fprintf_func) (info->stream, "%lu", i);
827
5.68k
      break;
828
829
6.11k
    case 'h':
830
      /* Encoded enumeration for movi.n.  */
831
6.11k
      switch (op->format)
832
6.11k
  {
833
6.11k
  case iw_T1I7_type:
834
6.11k
    i = GET_IW_T1I7_IMM7 (opcode);
835
6.11k
    if (i == 125)
836
31
      i = 0xff;
837
6.07k
    else if (i == 126)
838
124
      i = -2;
839
5.95k
    else if (i == 127)
840
136
      i = -1;
841
6.11k
    break;
842
0
  default:
843
0
    bad_opcode (op);
844
6.11k
  }
845
6.11k
      (*info->fprintf_func) (info->stream, "%ld", i);
846
6.11k
      break;
847
848
9.21k
    case 'R':
849
9.21k
      {
850
9.21k
  unsigned long reglist = 0;
851
9.21k
  int dir = 1;
852
9.21k
  int k, t;
853
854
9.21k
  switch (op->format)
855
9.21k
    {
856
757
    case iw_F1X4L17_type:
857
      /* Encoding for ldwm/stwm.  */
858
757
      i = GET_IW_F1X4L17_REGMASK (opcode);
859
757
      if (GET_IW_F1X4L17_RS (opcode))
860
430
        {
861
430
    reglist = ((i << 14) & 0x00ffc000);
862
430
    if (i & (1 << 10))
863
214
      reglist |= (1 << 28);
864
430
    if (i & (1 << 11))
865
206
      reglist |= (1u << 31);
866
430
        }
867
327
      else
868
327
        reglist = i << 2;
869
757
      dir = GET_IW_F1X4L17_REGMASK (opcode) ? 1 : -1;
870
757
      break;
871
872
8.45k
    case iw_L5I4X1_type:
873
      /* Encoding for push.n/pop.n.  */
874
8.45k
      reglist |= (1u << 31);
875
8.45k
      if (GET_IW_L5I4X1_FP (opcode))
876
5.19k
        reglist |= (1 << 28);
877
8.45k
      if (GET_IW_L5I4X1_CS (opcode))
878
4.01k
        {
879
4.01k
    int val = GET_IW_L5I4X1_REGRANGE (opcode);
880
4.01k
    reglist |= nios2_r2_reg_range_mappings[val];
881
4.01k
        }
882
8.45k
      dir = (op->match == MATCH_R2_POP_N ? 1 : -1);
883
8.45k
      break;
884
885
0
    default:
886
0
      bad_opcode (op);
887
9.21k
    }
888
889
9.21k
  t = 0;
890
9.21k
  (*info->fprintf_func) (info->stream, "{");
891
9.21k
  for (k = (dir == 1 ? 0 : 31);
892
304k
       (dir == 1 && k < 32) || (dir == -1 && k >= 0);
893
294k
       k += dir)
894
294k
    if (reglist & (1u << k))
895
31.9k
      {
896
31.9k
        if (t)
897
22.7k
    (*info->fprintf_func) (info->stream, ",");
898
9.21k
        else
899
9.21k
    t++;
900
31.9k
        (*info->fprintf_func) (info->stream, "%s", nios2_regs[k].name);
901
31.9k
      }
902
9.21k
  (*info->fprintf_func) (info->stream, "}");
903
9.21k
  break;
904
9.21k
      }
905
906
757
    case 'B':
907
      /* Base register and options for ldwm/stwm.  */
908
757
      switch (op->format)
909
757
  {
910
757
  case iw_F1X4L17_type:
911
757
    if (GET_IW_F1X4L17_ID (opcode) == 0)
912
486
      (*info->fprintf_func) (info->stream, "--");
913
914
757
    i = GET_IW_F1X4I12_A (opcode);
915
757
    (*info->fprintf_func) (info->stream, "(%s)",
916
757
         nios2_builtin_regs[i].name);
917
918
757
    if (GET_IW_F1X4L17_ID (opcode))
919
271
      (*info->fprintf_func) (info->stream, "++");
920
757
    if (GET_IW_F1X4L17_WB (opcode))
921
420
      (*info->fprintf_func) (info->stream, ",writeback");
922
757
    if (GET_IW_F1X4L17_PC (opcode))
923
432
      (*info->fprintf_func) (info->stream, ",ret");
924
757
    break;
925
0
  default:
926
0
    bad_opcode (op);
927
757
  }
928
757
      break;
929
930
757
    default:
931
0
      (*info->fprintf_func) (info->stream, "unknown");
932
0
      break;
933
2.20M
    }
934
2.20M
  return 0;
935
2.20M
}
936
937
/* nios2_disassemble does all the work of disassembling a Nios II
938
   instruction opcode.  */
939
static int
940
nios2_disassemble (bfd_vma address, unsigned long opcode,
941
       disassemble_info *info)
942
604k
{
943
604k
  const struct nios2_opcode *op;
944
945
604k
  info->bytes_per_line = INSNLEN;
946
604k
  info->bytes_per_chunk = INSNLEN;
947
604k
  info->display_endian = info->endian;
948
604k
  info->insn_info_valid = 1;
949
604k
  info->branch_delay_insns = 0;
950
604k
  info->data_size = 0;
951
604k
  info->insn_type = dis_nonbranch;
952
604k
  info->target = 0;
953
604k
  info->target2 = 0;
954
955
  /* Find the major opcode and use this to disassemble
956
     the instruction and its arguments.  */
957
604k
  op = nios2_find_opcode_hash (opcode, info->mach);
958
959
604k
  if (op != NULL)
960
533k
    {
961
533k
      const char *argstr = op->args;
962
533k
      (*info->fprintf_func) (info->stream, "%s", op->name);
963
533k
      if (argstr != NULL && *argstr != '\0')
964
533k
  {
965
533k
    (*info->fprintf_func) (info->stream, "\t");
966
2.74M
    while (*argstr != '\0')
967
2.20M
      {
968
2.20M
        nios2_print_insn_arg (argstr, opcode, address, info, op);
969
2.20M
        ++argstr;
970
2.20M
      }
971
533k
  }
972
      /* Tell the caller how far to advance the program counter.  */
973
533k
      info->bytes_per_chunk = op->size;
974
533k
      return op->size;
975
533k
    }
976
71.6k
  else
977
71.6k
    {
978
      /* Handle undefined instructions.  */
979
71.6k
      info->insn_type = dis_noninsn;
980
71.6k
      (*info->fprintf_func) (info->stream, "0x%lx", opcode);
981
71.6k
      return INSNLEN;
982
71.6k
    }
983
604k
}
984
985
986
/* print_insn_nios2 is the main disassemble function for Nios II.
987
   The function diassembler(abfd) (source in disassemble.c) returns a
988
   pointer to this either print_insn_big_nios2 or
989
   print_insn_little_nios2, which in turn call this function when the
990
   bfd machine type is Nios II. print_insn_nios2 reads the
991
   instruction word at the address given, and prints the disassembled
992
   instruction on the stream info->stream using info->fprintf_func. */
993
994
static int
995
print_insn_nios2 (bfd_vma address, disassemble_info *info,
996
      enum bfd_endian endianness)
997
605k
{
998
605k
  bfd_byte buffer[INSNLEN];
999
605k
  int status;
1000
1001
605k
  status = (*info->read_memory_func) (address, buffer, INSNLEN, info);
1002
605k
  if (status == 0)
1003
604k
    {
1004
604k
      unsigned long insn;
1005
604k
      if (endianness == BFD_ENDIAN_BIG)
1006
418k
  insn = (unsigned long) bfd_getb32 (buffer);
1007
186k
      else
1008
186k
  insn = (unsigned long) bfd_getl32 (buffer);
1009
604k
      return nios2_disassemble (address, insn, info);
1010
604k
    }
1011
1012
  /* We might have a 16-bit R2 instruction at the end of memory.  Try that.  */
1013
473
  if (info->mach == bfd_mach_nios2r2)
1014
410
    {
1015
410
      status = (*info->read_memory_func) (address, buffer, 2, info);
1016
410
      if (status == 0)
1017
304
  {
1018
304
    unsigned long insn;
1019
304
    if (endianness == BFD_ENDIAN_BIG)
1020
213
      insn = (unsigned long) bfd_getb16 (buffer);
1021
91
    else
1022
91
      insn = (unsigned long) bfd_getl16 (buffer);
1023
304
    return nios2_disassemble (address, insn, info);
1024
304
  }
1025
410
    }
1026
1027
  /* If we got here, we couldn't read anything.  */
1028
169
  (*info->memory_error_func) (status, address, info);
1029
169
  return -1;
1030
473
}
1031
1032
/* These two functions are the main entry points, accessed from
1033
   disassemble.c.  */
1034
int
1035
print_insn_big_nios2 (bfd_vma address, disassemble_info *info)
1036
418k
{
1037
418k
  return print_insn_nios2 (address, info, BFD_ENDIAN_BIG);
1038
418k
}
1039
1040
int
1041
print_insn_little_nios2 (bfd_vma address, disassemble_info *info)
1042
186k
{
1043
186k
  return print_insn_nios2 (address, info, BFD_ENDIAN_LITTLE);
1044
186k
}