Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/opcodes/kvx-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* kvx-dis.c -- Kalray MPPA generic disassembler.
2
   Copyright (C) 2009-2025 Free Software Foundation, Inc.
3
   Contributed by Kalray SA.
4
5
   This file is part of the GNU opcodes library.
6
7
   This library is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; see the file COPYING3. If not,
19
   see <http://www.gnu.org/licenses/>.  */
20
21
#define STATIC_TABLE
22
#define DEFINE_TABLE
23
24
#include "sysdep.h"
25
#include "disassemble.h"
26
#include "libiberty.h"
27
#include "opintl.h"
28
#include <assert.h>
29
#include "elf-bfd.h"
30
#include "kvx-dis.h"
31
32
#include "elf/kvx.h"
33
#include "opcode/kvx.h"
34
35
/* Steering values for the kvx VLIW architecture.  */
36
37
typedef enum
38
{
39
  Steering_BCU,
40
  Steering_LSU,
41
  Steering_MAU,
42
  Steering_ALU,
43
  Steering__
44
} enum_Steering;
45
typedef uint8_t Steering;
46
47
/* BundleIssue enumeration.  */
48
49
typedef enum
50
{
51
  BundleIssue_BCU,
52
  BundleIssue_TCA,
53
  BundleIssue_ALU0,
54
  BundleIssue_ALU1,
55
  BundleIssue_MAU,
56
  BundleIssue_LSU,
57
  BundleIssue__,
58
} enum_BundleIssue;
59
typedef uint8_t BundleIssue;
60
61
/* An IMMX syllable is associated with the BundleIssue Extension_BundleIssue[extension].  */
62
static const BundleIssue Extension_BundleIssue[] = {
63
  BundleIssue_ALU0,
64
  BundleIssue_ALU1,
65
  BundleIssue_MAU,
66
  BundleIssue_LSU
67
};
68
69
static inline int
70
kvx_steering (uint32_t x)
71
566k
{
72
566k
  return (((x) & 0x60000000) >> 29);
73
566k
}
74
75
static inline int
76
kvx_extension (uint32_t x)
77
75.0k
{
78
75.0k
  return (((x) & 0x18000000) >> 27);
79
75.0k
}
80
81
static inline int
82
kvx_has_parallel_bit (uint32_t x)
83
731k
{
84
731k
  return (((x) & 0x80000000) == 0x80000000);
85
731k
}
86
87
static inline int
88
kvx_is_tca_opcode (uint32_t x)
89
189k
{
90
189k
  unsigned major = ((x) >> 24) & 0x1F;
91
189k
  return (major > 1) && (major < 8);
92
189k
}
93
94
static inline int
95
kvx_is_nop_opcode (uint32_t x)
96
7.36k
{
97
7.36k
  return ((x) << 1) == 0xFFFFFFFE;
98
7.36k
}
99
100
/* A raw instruction.  */
101
102
struct insn_s
103
{
104
  uint32_t syllables[KVXMAXSYLLABLES];
105
  int len;
106
};
107
typedef struct insn_s insn_t;
108
109
110
static uint32_t bundle_words[KVXMAXBUNDLEWORDS];
111
112
static insn_t bundle_insn[KVXMAXBUNDLEISSUE];
113
114
/* A re-interpreted instruction.  */
115
116
struct instr_s
117
{
118
  int valid;
119
  int opcode;
120
  int immx[2];
121
  int immx_valid[2];
122
  int immx_count;
123
  int nb_syllables;
124
};
125
126
/* Option for "pretty printing", ie, not the usual little endian objdump output.  */
127
static int opt_pretty = 0;
128
/* Option for not emiting a new line between all bundles.  */
129
static int opt_compact_assembly = 0;
130
131
void
132
parse_kvx_dis_option (const char *option)
133
0
{
134
  /* Try to match options that are simple flags.  */
135
0
  if (startswith (option, "pretty"))
136
0
    {
137
0
      opt_pretty = 1;
138
0
      return;
139
0
    }
140
141
0
  if (startswith (option, "compact-assembly"))
142
0
    {
143
0
      opt_compact_assembly = 1;
144
0
      return;
145
0
    }
146
147
0
  if (startswith (option, "no-compact-assembly"))
148
0
    {
149
0
      opt_compact_assembly = 0;
150
0
      return;
151
0
    }
152
153
  /* Invalid option.  */
154
0
  opcodes_error_handler (_("unrecognised disassembler option: %s"), option);
155
0
}
156
157
static void
158
parse_kvx_dis_options (const char *options)
159
0
{
160
0
  const char *option_end;
161
162
0
  if (options == NULL)
163
0
    return;
164
165
0
  while (*options != '\0')
166
0
    {
167
      /* Skip empty options.  */
168
0
      if (*options == ',')
169
0
  {
170
0
    options++;
171
0
    continue;
172
0
  }
173
174
      /* We know that *options is neither NUL or a comma.  */
175
0
      option_end = options + 1;
176
0
      while (*option_end != ',' && *option_end != '\0')
177
0
  option_end++;
178
179
0
      parse_kvx_dis_option (options);
180
181
      /* Go on to the next one.  If option_end points to a comma, it
182
         will be skipped above.  */
183
0
      options = option_end;
184
0
    }
185
0
}
186
187
struct kvx_dis_env
188
{
189
  int kvx_arch_size;
190
  struct kvxopc *opc_table;
191
  struct kvx_Register *kvx_registers;
192
  const char ***kvx_modifiers;
193
  int *kvx_dec_registers;
194
  int *kvx_regfiles;
195
  unsigned int kvx_max_dec_registers;
196
  int initialized_p;
197
};
198
199
static struct kvx_dis_env env = {
200
  .kvx_arch_size = 0,
201
  .opc_table = NULL,
202
  .kvx_registers = NULL,
203
  .kvx_modifiers = NULL,
204
  .kvx_dec_registers = NULL,
205
  .kvx_regfiles = NULL,
206
  .initialized_p = 0,
207
  .kvx_max_dec_registers = 0
208
};
209
210
static void
211
kvx_dis_init (struct disassemble_info *info)
212
2
{
213
2
  env.kvx_arch_size = 32;
214
2
  switch (info->mach)
215
2
    {
216
0
    case bfd_mach_kv3_1_64:
217
0
      env.kvx_arch_size = 64;
218
      /* fallthrough */
219
0
    case bfd_mach_kv3_1_usr:
220
1
    case bfd_mach_kv3_1:
221
2
    default:
222
2
      env.opc_table = kvx_kv3_v1_optab;
223
2
      env.kvx_regfiles = kvx_kv3_v1_regfiles;
224
2
      env.kvx_registers = kvx_kv3_v1_registers;
225
2
      env.kvx_modifiers = kvx_kv3_v1_modifiers;
226
2
      env.kvx_dec_registers = kvx_kv3_v1_dec_registers;
227
2
      break;
228
0
    case bfd_mach_kv3_2_64:
229
0
      env.kvx_arch_size = 64;
230
      /* fallthrough */
231
0
    case bfd_mach_kv3_2_usr:
232
0
    case bfd_mach_kv3_2:
233
0
      env.opc_table = kvx_kv3_v2_optab;
234
0
      env.kvx_regfiles = kvx_kv3_v2_regfiles;
235
0
      env.kvx_registers = kvx_kv3_v2_registers;
236
0
      env.kvx_modifiers = kvx_kv3_v2_modifiers;
237
0
      env.kvx_dec_registers = kvx_kv3_v2_dec_registers;
238
0
      break;
239
0
    case bfd_mach_kv4_1_64:
240
0
      env.kvx_arch_size = 64;
241
      /* fallthrough */
242
0
    case bfd_mach_kv4_1_usr:
243
0
    case bfd_mach_kv4_1:
244
0
      env.opc_table = kvx_kv4_v1_optab;
245
0
      env.kvx_regfiles = kvx_kv4_v1_regfiles;
246
0
      env.kvx_registers = kvx_kv4_v1_registers;
247
0
      env.kvx_modifiers = kvx_kv4_v1_modifiers;
248
0
      env.kvx_dec_registers = kvx_kv4_v1_dec_registers;
249
0
      break;
250
2
    }
251
252
2
  env.kvx_max_dec_registers = env.kvx_regfiles[KVX_REGFILE_DEC_REGISTERS];
253
254
2
  if (info->disassembler_options)
255
0
    parse_kvx_dis_options (info->disassembler_options);
256
257
2
  env.initialized_p = 1;
258
2
}
259
260
static bool
261
kvx_reassemble_bundle (int wordcount, int *_insncount)
262
368k
{
263
264
  /* Debugging flag.  */
265
368k
  int debug = 0;
266
267
  /* Available resources.  */
268
368k
  int bcu_taken = 0;
269
368k
  int tca_taken = 0;
270
368k
  int alu0_taken = 0;
271
368k
  int alu1_taken = 0;
272
368k
  int mau_taken = 0;
273
368k
  int lsu_taken = 0;
274
275
368k
  if (debug)
276
0
    fprintf (stderr, "kvx_reassemble_bundle: wordcount = %d\n", wordcount);
277
278
368k
  if (wordcount > KVXMAXBUNDLEWORDS)
279
14.5k
    {
280
14.5k
      if (debug)
281
0
  fprintf (stderr, "bundle exceeds maximum size\n");
282
14.5k
      return false;
283
14.5k
    }
284
285
354k
  struct instr_s instr[KVXMAXBUNDLEISSUE];
286
354k
  memset (instr, 0, sizeof (instr));
287
354k
  assert (KVXMAXBUNDLEISSUE >= BundleIssue__);
288
289
354k
  int i;
290
354k
  unsigned int j;
291
292
887k
  for (i = 0; i < wordcount; i++)
293
566k
    {
294
566k
      uint32_t syllable = bundle_words[i];
295
566k
      switch (kvx_steering (syllable))
296
566k
  {
297
254k
  case Steering_BCU:
298
    /* BCU or TCA instruction.  */
299
254k
    if (i == 0)
300
178k
      {
301
178k
        if (kvx_is_tca_opcode (syllable))
302
21.9k
    {
303
21.9k
      if (tca_taken)
304
0
        {
305
0
          if (debug)
306
0
      fprintf (stderr, "Too many TCA instructions");
307
0
          return false;
308
0
        }
309
21.9k
      if (debug)
310
0
        fprintf (stderr,
311
0
           "Syllable 0: Set valid on TCA for instr %d with 0x%x\n",
312
0
           BundleIssue_TCA, syllable);
313
21.9k
      instr[BundleIssue_TCA].valid = 1;
314
21.9k
      instr[BundleIssue_TCA].opcode = syllable;
315
21.9k
      instr[BundleIssue_TCA].nb_syllables = 1;
316
21.9k
      tca_taken = 1;
317
21.9k
    }
318
156k
        else
319
156k
    {
320
156k
      if (debug)
321
0
        fprintf (stderr,
322
0
           "Syllable 0: Set valid on BCU for instr %d with 0x%x\n",
323
0
           BundleIssue_BCU, syllable);
324
325
156k
      instr[BundleIssue_BCU].valid = 1;
326
156k
      instr[BundleIssue_BCU].opcode = syllable;
327
156k
      instr[BundleIssue_BCU].nb_syllables = 1;
328
156k
      bcu_taken = 1;
329
156k
    }
330
178k
      }
331
76.2k
    else
332
76.2k
      {
333
76.2k
        if (i == 1 && bcu_taken && kvx_is_tca_opcode (syllable))
334
1.22k
    {
335
1.22k
      if (tca_taken)
336
0
        {
337
0
          if (debug)
338
0
      fprintf (stderr, "Too many TCA instructions");
339
0
          return false;
340
0
        }
341
1.22k
      if (debug)
342
0
        fprintf (stderr,
343
0
           "Syllable 0: Set valid on TCA for instr %d with 0x%x\n",
344
0
           BundleIssue_TCA, syllable);
345
1.22k
      instr[BundleIssue_TCA].valid = 1;
346
1.22k
      instr[BundleIssue_TCA].opcode = syllable;
347
1.22k
      instr[BundleIssue_TCA].nb_syllables = 1;
348
1.22k
      tca_taken = 1;
349
1.22k
    }
350
75.0k
        else
351
75.0k
    {
352
      /* Not first syllable in bundle, IMMX.  */
353
75.0k
      struct instr_s *instr_p =
354
75.0k
        &(instr[Extension_BundleIssue[kvx_extension (syllable)]]);
355
75.0k
      int immx_count = instr_p->immx_count;
356
75.0k
      if (immx_count > 1)
357
2.91k
        {
358
2.91k
          if (debug)
359
0
      fprintf (stderr, "Too many IMMX syllables");
360
2.91k
          return false;
361
2.91k
        }
362
72.1k
      instr_p->immx[immx_count] = syllable;
363
72.1k
      instr_p->immx_valid[immx_count] = 1;
364
72.1k
      instr_p->nb_syllables++;
365
72.1k
      if (debug)
366
0
        fprintf (stderr,
367
0
           "Set IMMX[%d] on instr %d for extension %d @ %d\n",
368
0
           immx_count,
369
0
           Extension_BundleIssue[kvx_extension (syllable)],
370
0
           kvx_extension (syllable), i);
371
72.1k
      instr_p->immx_count = immx_count + 1;
372
72.1k
    }
373
76.2k
      }
374
251k
    break;
375
376
251k
  case Steering_ALU:
377
160k
    if (alu0_taken == 0)
378
100k
      {
379
100k
        if (debug)
380
0
    fprintf (stderr, "Set valid on ALU0 for instr %d with 0x%x\n",
381
0
       BundleIssue_ALU0, syllable);
382
100k
        instr[BundleIssue_ALU0].valid = 1;
383
100k
        instr[BundleIssue_ALU0].opcode = syllable;
384
100k
        instr[BundleIssue_ALU0].nb_syllables = 1;
385
100k
        alu0_taken = 1;
386
100k
      }
387
60.3k
    else if (alu1_taken == 0)
388
29.9k
      {
389
29.9k
        if (debug)
390
0
    fprintf (stderr, "Set valid on ALU1 for instr %d with 0x%x\n",
391
0
       BundleIssue_ALU1, syllable);
392
29.9k
        instr[BundleIssue_ALU1].valid = 1;
393
29.9k
        instr[BundleIssue_ALU1].opcode = syllable;
394
29.9k
        instr[BundleIssue_ALU1].nb_syllables = 1;
395
29.9k
        alu1_taken = 1;
396
29.9k
      }
397
30.3k
    else if (mau_taken == 0)
398
13.7k
      {
399
13.7k
        if (debug)
400
0
    fprintf (stderr,
401
0
       "Set valid on MAU (ALU) for instr %d with 0x%x\n",
402
0
       BundleIssue_MAU, syllable);
403
13.7k
        instr[BundleIssue_MAU].valid = 1;
404
13.7k
        instr[BundleIssue_MAU].opcode = syllable;
405
13.7k
        instr[BundleIssue_MAU].nb_syllables = 1;
406
13.7k
        mau_taken = 1;
407
13.7k
      }
408
16.5k
    else if (lsu_taken == 0)
409
9.22k
      {
410
9.22k
        if (debug)
411
0
    fprintf (stderr,
412
0
       "Set valid on LSU (ALU) for instr %d with 0x%x\n",
413
0
       BundleIssue_LSU, syllable);
414
9.22k
        instr[BundleIssue_LSU].valid = 1;
415
9.22k
        instr[BundleIssue_LSU].opcode = syllable;
416
9.22k
        instr[BundleIssue_LSU].nb_syllables = 1;
417
9.22k
        lsu_taken = 1;
418
9.22k
      }
419
7.36k
    else if (kvx_is_nop_opcode (syllable))
420
4.04k
      {
421
4.04k
        if (debug)
422
0
    fprintf (stderr, "Ignoring NOP (ALU) syllable\n");
423
4.04k
      }
424
3.31k
    else
425
3.31k
      {
426
3.31k
        if (debug)
427
0
    fprintf (stderr, "Too many ALU instructions");
428
3.31k
        return false;
429
3.31k
      }
430
157k
    break;
431
432
157k
  case Steering_MAU:
433
72.0k
    if (mau_taken == 1)
434
12.7k
      {
435
12.7k
        if (debug)
436
0
    fprintf (stderr, "Too many MAU instructions");
437
12.7k
        return false;
438
12.7k
      }
439
59.3k
    else
440
59.3k
      {
441
59.3k
        if (debug)
442
0
    fprintf (stderr, "Set valid on MAU for instr %d with 0x%x\n",
443
0
       BundleIssue_MAU, syllable);
444
59.3k
        instr[BundleIssue_MAU].valid = 1;
445
59.3k
        instr[BundleIssue_MAU].opcode = syllable;
446
59.3k
        instr[BundleIssue_MAU].nb_syllables = 1;
447
59.3k
        mau_taken = 1;
448
59.3k
      }
449
59.3k
    break;
450
451
78.5k
  case Steering_LSU:
452
78.5k
    if (lsu_taken == 1)
453
13.6k
      {
454
13.6k
        if (debug)
455
0
    fprintf (stderr, "Too many LSU instructions");
456
13.6k
        return false;
457
13.6k
      }
458
64.8k
    else
459
64.8k
      {
460
64.8k
        if (debug)
461
0
    fprintf (stderr, "Set valid on LSU for instr %d with 0x%x\n",
462
0
       BundleIssue_LSU, syllable);
463
64.8k
        instr[BundleIssue_LSU].valid = 1;
464
64.8k
        instr[BundleIssue_LSU].opcode = syllable;
465
64.8k
        instr[BundleIssue_LSU].nb_syllables = 1;
466
64.8k
        lsu_taken = 1;
467
64.8k
      }
468
566k
  }
469
533k
      if (debug)
470
0
  fprintf (stderr, "Continue %d < %d?\n", i, wordcount);
471
533k
    }
472
473
  /* Fill bundle_insn and count read syllables.  */
474
321k
  int instr_idx = 0;
475
2.25M
  for (i = 0; i < KVXMAXBUNDLEISSUE; i++)
476
1.93M
    {
477
1.93M
      if (instr[i].valid == 1)
478
395k
  {
479
395k
    int syllable_idx = 0;
480
481
    /* First copy opcode.  */
482
395k
    bundle_insn[instr_idx].syllables[syllable_idx++] = instr[i].opcode;
483
395k
    bundle_insn[instr_idx].len = 1;
484
485
1.18M
    for (j = 0; j < 2; j++)
486
791k
      {
487
791k
        if (instr[i].immx_valid[j])
488
30.7k
    {
489
30.7k
      if (debug)
490
0
        fprintf (stderr, "Instr %d valid immx[%d] is valid\n", i,
491
0
           j);
492
30.7k
      bundle_insn[instr_idx].syllables[syllable_idx++] =
493
30.7k
        instr[i].immx[j];
494
30.7k
      bundle_insn[instr_idx].len++;
495
30.7k
    }
496
791k
      }
497
498
395k
    if (debug)
499
0
      fprintf (stderr,
500
0
         "Instr %d valid, copying in bundle_insn (%d syllables <-> %d)\n",
501
0
         i, bundle_insn[instr_idx].len, instr[i].nb_syllables);
502
395k
    instr_idx++;
503
395k
  }
504
1.93M
    }
505
506
321k
  if (debug)
507
0
    fprintf (stderr, "End => %d instructions\n", instr_idx);
508
509
321k
  *_insncount = instr_idx;
510
321k
  return true;
511
354k
}
512
513
struct decoded_insn
514
{
515
  /* The entry in the opc_table. */
516
  struct kvxopc *opc;
517
  /* The number of operands.  */
518
  int nb_ops;
519
  /* The content of an operands.  */
520
  struct
521
  {
522
    enum
523
    {
524
      CAT_REGISTER,
525
      CAT_MODIFIER,
526
      CAT_IMMEDIATE,
527
    } type;
528
    /* The value of the operands.  */
529
    uint64_t val;
530
    /* If it is an immediate, its sign.  */
531
    int sign;
532
    /* If it is an immediate, is it pc relative.  */
533
    int pcrel;
534
    /* The width of the operand.  */
535
    int width;
536
    /* If it is a modifier, the modifier category.
537
       An index in the modifier table.  */
538
    int mod_idx;
539
  } operands[KVXMAXOPERANDS];
540
};
541
542
static int
543
decode_insn (bfd_vma memaddr, insn_t * insn, struct decoded_insn *res)
544
370k
{
545
546
370k
  int found = 0;
547
370k
  int idx = 0;
548
370k
  for (struct kvxopc * op = env.opc_table;
549
254M
       op->as_op && (((char) op->as_op[0]) != 0); op++)
550
254M
    {
551
      /* Find the format of this insn.  */
552
254M
      int opcode_match = 1;
553
554
254M
      if (op->wordcount != insn->len)
555
111M
  continue;
556
557
293M
      for (int i = 0; i < op->wordcount; i++)
558
150M
  if ((op->codewords[i].mask & insn->syllables[i]) !=
559
150M
      op->codewords[i].opcode)
560
143M
    opcode_match = 0;
561
562
143M
      int encoding_space_flags = env.kvx_arch_size == 32
563
143M
  ? kvxOPCODE_FLAG_MODE32 : kvxOPCODE_FLAG_MODE64;
564
565
293M
      for (int i = 0; i < op->wordcount; i++)
566
150M
  if (!(op->codewords[i].flags & encoding_space_flags))
567
0
    opcode_match = 0;
568
569
143M
      if (opcode_match)
570
276k
  {
571
276k
    res->opc = op;
572
573
988k
    for (int i = 0; op->format[i]; i++)
574
722k
      {
575
722k
        struct kvx_bitfield *bf = op->format[i]->bfield;
576
722k
        int bf_nb = op->format[i]->bitfields;
577
722k
        int width = op->format[i]->width;
578
722k
        int type = op->format[i]->type;
579
722k
        const char *type_name = op->format[i]->tname;
580
722k
        int flags = op->format[i]->flags;
581
722k
        int shift = op->format[i]->shift;
582
722k
        int bias = op->format[i]->bias;
583
722k
        uint64_t value = 0;
584
585
1.46M
        for (int bf_idx = 0; bf_idx < bf_nb; bf_idx++)
586
743k
    {
587
743k
      int insn_idx = (int) bf[bf_idx].to_offset / 32;
588
743k
      int to_offset = bf[bf_idx].to_offset % 32;
589
743k
      uint64_t encoded_value =
590
743k
        insn->syllables[insn_idx] >> to_offset;
591
743k
      encoded_value &= (1LL << bf[bf_idx].size) - 1;
592
743k
      value |= encoded_value << bf[bf_idx].from_offset;
593
743k
    }
594
722k
        if (flags & kvxSIGNED)
595
128k
    {
596
128k
      uint64_t signbit = 1LL << (width - 1);
597
128k
      value = (value ^ signbit) - signbit;
598
128k
    }
599
722k
        value = (value << shift) + bias;
600
601
722k
#define KVX_PRINT_REG(regfile,value) \
602
722k
    if(env.kvx_regfiles[regfile]+value < env.kvx_max_dec_registers) { \
603
435k
        res->operands[idx].val = env.kvx_dec_registers[env.kvx_regfiles[regfile]+value]; \
604
435k
        res->operands[idx].type = CAT_REGISTER; \
605
435k
  idx++; \
606
435k
    } else { \
607
0
        res->operands[idx].val = ~0; \
608
0
        res->operands[idx].type = CAT_REGISTER; \
609
0
  idx++; \
610
0
    }
611
612
722k
        if (env.opc_table == kvx_kv3_v1_optab)
613
722k
    {
614
722k
      switch (type)
615
722k
        {
616
327k
        case RegClass_kv3_v1_singleReg:
617
327k
          KVX_PRINT_REG (KVX_REGFILE_DEC_GPR, value)
618
327k
          break;
619
10.0k
        case RegClass_kv3_v1_pairedReg:
620
10.0k
          KVX_PRINT_REG (KVX_REGFILE_DEC_PGR, value)
621
10.0k
          break;
622
5.14k
        case RegClass_kv3_v1_quadReg:
623
5.14k
          KVX_PRINT_REG (KVX_REGFILE_DEC_QGR, value)
624
5.14k
          break;
625
0
        case RegClass_kv3_v1_systemReg:
626
216
        case RegClass_kv3_v1_aloneReg:
627
216
        case RegClass_kv3_v1_onlyraReg:
628
396
        case RegClass_kv3_v1_onlygetReg:
629
396
        case RegClass_kv3_v1_onlysetReg:
630
396
        case RegClass_kv3_v1_onlyfxReg:
631
396
          KVX_PRINT_REG (KVX_REGFILE_DEC_SFR, value)
632
396
          break;
633
765
        case RegClass_kv3_v1_coproReg0M4:
634
1.00k
        case RegClass_kv3_v1_coproReg1M4:
635
1.22k
        case RegClass_kv3_v1_coproReg2M4:
636
1.52k
        case RegClass_kv3_v1_coproReg3M4:
637
1.52k
          KVX_PRINT_REG (KVX_REGFILE_DEC_XCR, value)
638
1.52k
          break;
639
619
        case RegClass_kv3_v1_blockRegE:
640
1.19k
        case RegClass_kv3_v1_blockRegO:
641
4.39k
        case RegClass_kv3_v1_blockReg0M4:
642
5.18k
        case RegClass_kv3_v1_blockReg1M4:
643
5.91k
        case RegClass_kv3_v1_blockReg2M4:
644
6.58k
        case RegClass_kv3_v1_blockReg3M4:
645
6.58k
          KVX_PRINT_REG (KVX_REGFILE_DEC_XBR, value)
646
6.58k
          break;
647
38.1k
        case RegClass_kv3_v1_vectorReg:
648
49.0k
        case RegClass_kv3_v1_vectorRegE:
649
60.1k
        case RegClass_kv3_v1_vectorRegO:
650
60.1k
          KVX_PRINT_REG (KVX_REGFILE_DEC_XVR, value)
651
60.1k
          break;
652
11.7k
        case RegClass_kv3_v1_tileReg:
653
11.7k
          KVX_PRINT_REG (KVX_REGFILE_DEC_XTR, value)
654
11.7k
          break;
655
12.4k
        case RegClass_kv3_v1_matrixReg:
656
12.4k
          KVX_PRINT_REG (KVX_REGFILE_DEC_XMR, value)
657
12.4k
          break;
658
219
        case Immediate_kv3_v1_sysnumber:
659
73.3k
        case Immediate_kv3_v1_signed10:
660
76.5k
        case Immediate_kv3_v1_signed16:
661
77.0k
        case Immediate_kv3_v1_signed27:
662
79.9k
        case Immediate_kv3_v1_wrapped32:
663
87.9k
        case Immediate_kv3_v1_signed37:
664
88.6k
        case Immediate_kv3_v1_signed43:
665
88.7k
        case Immediate_kv3_v1_signed54:
666
89.2k
        case Immediate_kv3_v1_wrapped64:
667
115k
        case Immediate_kv3_v1_unsigned6:
668
115k
          res->operands[idx].val = value;
669
115k
          res->operands[idx].sign = flags & kvxSIGNED;
670
115k
          res->operands[idx].width = width;
671
115k
          res->operands[idx].type = CAT_IMMEDIATE;
672
115k
          res->operands[idx].pcrel = 0;
673
115k
          idx++;
674
115k
          break;
675
14.6k
        case Immediate_kv3_v1_pcrel17:
676
43.0k
        case Immediate_kv3_v1_pcrel27:
677
43.0k
          res->operands[idx].val = value + memaddr;
678
43.0k
          res->operands[idx].sign = flags & kvxSIGNED;
679
43.0k
          res->operands[idx].width = width;
680
43.0k
          res->operands[idx].type = CAT_IMMEDIATE;
681
43.0k
          res->operands[idx].pcrel = 1;
682
43.0k
          idx++;
683
43.0k
          break;
684
0
        case Modifier_kv3_v1_column:
685
9.89k
        case Modifier_kv3_v1_comparison:
686
11.7k
        case Modifier_kv3_v1_doscale:
687
11.7k
        case Modifier_kv3_v1_exunum:
688
15.9k
        case Modifier_kv3_v1_floatcomp:
689
17.7k
        case Modifier_kv3_v1_qindex:
690
19.5k
        case Modifier_kv3_v1_rectify:
691
36.0k
        case Modifier_kv3_v1_rounding:
692
40.5k
        case Modifier_kv3_v1_roundint:
693
42.8k
        case Modifier_kv3_v1_saturate:
694
82.2k
        case Modifier_kv3_v1_scalarcond:
695
98.7k
        case Modifier_kv3_v1_silent:
696
99.6k
        case Modifier_kv3_v1_simplecond:
697
104k
        case Modifier_kv3_v1_speculate:
698
106k
        case Modifier_kv3_v1_splat32:
699
129k
        case Modifier_kv3_v1_variant:
700
129k
          {
701
129k
      int sz = 0;
702
129k
      int mod_idx = type - Modifier_kv3_v1_column;
703
1.17M
      for (sz = 0; env.kvx_modifiers[mod_idx][sz]; ++sz);
704
129k
      const char *mod = value < (unsigned) sz
705
129k
        ? env.kvx_modifiers[mod_idx][value] : NULL;
706
129k
      if (!mod) goto retry;
707
118k
      res->operands[idx].val = value;
708
118k
      res->operands[idx].type = CAT_MODIFIER;
709
118k
      res->operands[idx].mod_idx = mod_idx;
710
118k
      idx++;
711
118k
          }
712
0
          break;
713
0
        default:
714
0
          fprintf (stderr, "error: unexpected operand type (%s)\n",
715
0
             type_name);
716
0
          exit (-1);
717
722k
        };
718
711k
    }
719
0
        else if (env.opc_table == kvx_kv3_v2_optab)
720
0
    {
721
0
      switch (type)
722
0
        {
723
0
        case RegClass_kv3_v2_singleReg:
724
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_GPR, value)
725
0
          break;
726
0
        case RegClass_kv3_v2_pairedReg:
727
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_PGR, value)
728
0
          break;
729
0
        case RegClass_kv3_v2_quadReg:
730
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_QGR, value)
731
0
          break;
732
0
        case RegClass_kv3_v2_systemReg:
733
0
        case RegClass_kv3_v2_aloneReg:
734
0
        case RegClass_kv3_v2_onlyraReg:
735
0
        case RegClass_kv3_v2_onlygetReg:
736
0
        case RegClass_kv3_v2_onlysetReg:
737
0
        case RegClass_kv3_v2_onlyfxReg:
738
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_SFR, value)
739
0
          break;
740
0
        case RegClass_kv3_v2_coproReg:
741
0
        case RegClass_kv3_v2_coproReg0M4:
742
0
        case RegClass_kv3_v2_coproReg1M4:
743
0
        case RegClass_kv3_v2_coproReg2M4:
744
0
        case RegClass_kv3_v2_coproReg3M4:
745
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XCR, value)
746
0
          break;
747
0
        case RegClass_kv3_v2_blockReg:
748
0
        case RegClass_kv3_v2_blockRegE:
749
0
        case RegClass_kv3_v2_blockRegO:
750
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XBR, value)
751
0
          break;
752
0
        case RegClass_kv3_v2_vectorReg:
753
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XVR, value)
754
0
          break;
755
0
        case RegClass_kv3_v2_tileReg:
756
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XTR, value)
757
0
          break;
758
0
        case RegClass_kv3_v2_matrixReg:
759
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XMR, value)
760
0
          break;
761
0
        case RegClass_kv3_v2_buffer2Reg:
762
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X2R, value)
763
0
          break;
764
0
        case RegClass_kv3_v2_buffer4Reg:
765
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X4R, value)
766
0
          break;
767
0
        case RegClass_kv3_v2_buffer8Reg:
768
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X8R, value)
769
0
          break;
770
0
        case RegClass_kv3_v2_buffer16Reg:
771
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X16R, value)
772
0
          break;
773
0
        case RegClass_kv3_v2_buffer32Reg:
774
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X32R, value)
775
0
          break;
776
0
        case RegClass_kv3_v2_buffer64Reg:
777
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X64R, value)
778
0
          break;
779
0
        case Immediate_kv3_v2_brknumber:
780
0
        case Immediate_kv3_v2_sysnumber:
781
0
        case Immediate_kv3_v2_signed10:
782
0
        case Immediate_kv3_v2_signed16:
783
0
        case Immediate_kv3_v2_signed27:
784
0
        case Immediate_kv3_v2_wrapped32:
785
0
        case Immediate_kv3_v2_signed37:
786
0
        case Immediate_kv3_v2_signed43:
787
0
        case Immediate_kv3_v2_signed54:
788
0
        case Immediate_kv3_v2_wrapped64:
789
0
        case Immediate_kv3_v2_unsigned6:
790
0
          res->operands[idx].val = value;
791
0
          res->operands[idx].sign = flags & kvxSIGNED;
792
0
          res->operands[idx].width = width;
793
0
          res->operands[idx].type = CAT_IMMEDIATE;
794
0
          res->operands[idx].pcrel = 0;
795
0
          idx++;
796
0
          break;
797
0
        case Immediate_kv3_v2_pcrel27:
798
0
        case Immediate_kv3_v2_pcrel17:
799
0
          res->operands[idx].val = value + memaddr;
800
0
          res->operands[idx].sign = flags & kvxSIGNED;
801
0
          res->operands[idx].width = width;
802
0
          res->operands[idx].type = CAT_IMMEDIATE;
803
0
          res->operands[idx].pcrel = 1;
804
0
          idx++;
805
0
          break;
806
0
        case Modifier_kv3_v2_accesses:
807
0
        case Modifier_kv3_v2_boolcas:
808
0
        case Modifier_kv3_v2_cachelev:
809
0
        case Modifier_kv3_v2_channel:
810
0
        case Modifier_kv3_v2_coherency:
811
0
        case Modifier_kv3_v2_comparison:
812
0
        case Modifier_kv3_v2_conjugate:
813
0
        case Modifier_kv3_v2_doscale:
814
0
        case Modifier_kv3_v2_exunum:
815
0
        case Modifier_kv3_v2_floatcomp:
816
0
        case Modifier_kv3_v2_hindex:
817
0
        case Modifier_kv3_v2_lsomask:
818
0
        case Modifier_kv3_v2_lsumask:
819
0
        case Modifier_kv3_v2_lsupack:
820
0
        case Modifier_kv3_v2_qindex:
821
0
        case Modifier_kv3_v2_rounding:
822
0
        case Modifier_kv3_v2_scalarcond:
823
0
        case Modifier_kv3_v2_shuffleV:
824
0
        case Modifier_kv3_v2_shuffleX:
825
0
        case Modifier_kv3_v2_silent:
826
0
        case Modifier_kv3_v2_simplecond:
827
0
        case Modifier_kv3_v2_speculate:
828
0
        case Modifier_kv3_v2_splat32:
829
0
        case Modifier_kv3_v2_transpose:
830
0
        case Modifier_kv3_v2_variant:
831
0
          {
832
0
      int sz = 0;
833
0
      int mod_idx = type - Modifier_kv3_v2_accesses;
834
0
      for (sz = 0; env.kvx_modifiers[mod_idx][sz];
835
0
           ++sz);
836
0
      const char *mod = value < (unsigned) sz
837
0
        ? env.kvx_modifiers[mod_idx][value] : NULL;
838
0
      if (!mod) goto retry;
839
0
      res->operands[idx].val = value;
840
0
      res->operands[idx].type = CAT_MODIFIER;
841
0
      res->operands[idx].mod_idx = mod_idx;
842
0
      idx++;
843
0
          };
844
0
          break;
845
0
        default:
846
0
          fprintf (stderr,
847
0
             "error: unexpected operand type (%s)\n",
848
0
             type_name);
849
0
          exit (-1);
850
0
        };
851
0
    }
852
0
        else if (env.opc_table == kvx_kv4_v1_optab)
853
0
    {
854
0
      switch (type)
855
0
        {
856
857
0
        case RegClass_kv4_v1_singleReg:
858
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_GPR, value)
859
0
          break;
860
0
        case RegClass_kv4_v1_pairedReg:
861
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_PGR, value)
862
0
          break;
863
0
        case RegClass_kv4_v1_quadReg:
864
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_QGR, value)
865
0
          break;
866
0
        case RegClass_kv4_v1_systemReg:
867
0
        case RegClass_kv4_v1_aloneReg:
868
0
        case RegClass_kv4_v1_onlyraReg:
869
0
        case RegClass_kv4_v1_onlygetReg:
870
0
        case RegClass_kv4_v1_onlysetReg:
871
0
        case RegClass_kv4_v1_onlyfxReg:
872
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_SFR, value)
873
0
          break;
874
0
        case RegClass_kv4_v1_coproReg:
875
0
        case RegClass_kv4_v1_coproReg0M4:
876
0
        case RegClass_kv4_v1_coproReg1M4:
877
0
        case RegClass_kv4_v1_coproReg2M4:
878
0
        case RegClass_kv4_v1_coproReg3M4:
879
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XCR, value)
880
0
          break;
881
0
        case RegClass_kv4_v1_blockReg:
882
0
        case RegClass_kv4_v1_blockRegE:
883
0
        case RegClass_kv4_v1_blockRegO:
884
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XBR, value)
885
0
          break;
886
0
        case RegClass_kv4_v1_vectorReg:
887
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XVR, value)
888
0
          break;
889
0
        case RegClass_kv4_v1_tileReg:
890
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XTR, value)
891
0
          break;
892
0
        case RegClass_kv4_v1_matrixReg:
893
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_XMR, value)
894
0
          break;
895
0
        case RegClass_kv4_v1_buffer2Reg:
896
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X2R, value)
897
0
          break;
898
0
        case RegClass_kv4_v1_buffer4Reg:
899
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X4R, value)
900
0
          break;
901
0
        case RegClass_kv4_v1_buffer8Reg:
902
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X8R, value)
903
0
          break;
904
0
        case RegClass_kv4_v1_buffer16Reg:
905
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X16R, value)
906
0
          break;
907
0
        case RegClass_kv4_v1_buffer32Reg:
908
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X32R, value)
909
0
          break;
910
0
        case RegClass_kv4_v1_buffer64Reg:
911
0
          KVX_PRINT_REG (KVX_REGFILE_DEC_X64R, value)
912
0
          break;
913
0
        case Immediate_kv4_v1_brknumber:
914
0
        case Immediate_kv4_v1_sysnumber:
915
0
        case Immediate_kv4_v1_signed10:
916
0
        case Immediate_kv4_v1_signed16:
917
0
        case Immediate_kv4_v1_signed27:
918
0
        case Immediate_kv4_v1_wrapped32:
919
0
        case Immediate_kv4_v1_signed37:
920
0
        case Immediate_kv4_v1_signed43:
921
0
        case Immediate_kv4_v1_signed54:
922
0
        case Immediate_kv4_v1_wrapped64:
923
0
        case Immediate_kv4_v1_unsigned6:
924
0
          res->operands[idx].val = value;
925
0
          res->operands[idx].sign = flags & kvxSIGNED;
926
0
          res->operands[idx].width = width;
927
0
          res->operands[idx].type = CAT_IMMEDIATE;
928
0
          res->operands[idx].pcrel = 0;
929
0
          idx++;
930
0
          break;
931
0
        case Immediate_kv4_v1_pcrel27:
932
0
        case Immediate_kv4_v1_pcrel17:
933
0
          res->operands[idx].val = value + memaddr;
934
0
          res->operands[idx].sign = flags & kvxSIGNED;
935
0
          res->operands[idx].width = width;
936
0
          res->operands[idx].type = CAT_IMMEDIATE;
937
0
          res->operands[idx].pcrel = 1;
938
0
          idx++;
939
0
          break;
940
0
        case Modifier_kv4_v1_accesses:
941
0
        case Modifier_kv4_v1_boolcas:
942
0
        case Modifier_kv4_v1_cachelev:
943
0
        case Modifier_kv4_v1_channel:
944
0
        case Modifier_kv4_v1_coherency:
945
0
        case Modifier_kv4_v1_comparison:
946
0
        case Modifier_kv4_v1_conjugate:
947
0
        case Modifier_kv4_v1_doscale:
948
0
        case Modifier_kv4_v1_exunum:
949
0
        case Modifier_kv4_v1_floatcomp:
950
0
        case Modifier_kv4_v1_hindex:
951
0
        case Modifier_kv4_v1_lsomask:
952
0
        case Modifier_kv4_v1_lsumask:
953
0
        case Modifier_kv4_v1_lsupack:
954
0
        case Modifier_kv4_v1_qindex:
955
0
        case Modifier_kv4_v1_rounding:
956
0
        case Modifier_kv4_v1_scalarcond:
957
0
        case Modifier_kv4_v1_shuffleV:
958
0
        case Modifier_kv4_v1_shuffleX:
959
0
        case Modifier_kv4_v1_silent:
960
0
        case Modifier_kv4_v1_simplecond:
961
0
        case Modifier_kv4_v1_speculate:
962
0
        case Modifier_kv4_v1_splat32:
963
0
        case Modifier_kv4_v1_transpose:
964
0
        case Modifier_kv4_v1_variant:
965
0
          {
966
0
      int sz = 0;
967
0
      int mod_idx = type - Modifier_kv4_v1_accesses;
968
0
      for (sz = 0; env.kvx_modifiers[mod_idx][sz]; ++sz);
969
0
      const char *mod = value < (unsigned) sz
970
0
        ? env.kvx_modifiers[mod_idx][value] : NULL;
971
0
      if (!mod) goto retry;
972
0
      res->operands[idx].val = value;
973
0
      res->operands[idx].type = CAT_MODIFIER;
974
0
      res->operands[idx].mod_idx = mod_idx;
975
0
      idx++;
976
0
          }
977
0
          break;
978
0
        default:
979
0
          fprintf (stderr, "error: unexpected operand type (%s)\n",
980
0
             type_name);
981
0
          exit (-1);
982
0
        };
983
0
    }
984
985
722k
#undef KVX_PRINT_REG
986
722k
      }
987
988
265k
    found = 1;
989
265k
    break;
990
11.1k
  retry:;
991
11.1k
    idx = 0;
992
11.1k
    continue;
993
276k
  }
994
143M
 }
995
370k
  res->nb_ops = idx;
996
370k
  return found;
997
370k
}
998
999
int
1000
print_insn_kvx (bfd_vma memaddr, struct disassemble_info *info)
1001
418k
{
1002
418k
  static int insnindex = 0;
1003
418k
  static int insncount = 0;
1004
418k
  insn_t *insn;
1005
418k
  int readsofar = 0;
1006
418k
  int found = 0;
1007
418k
  int invalid_bundle = 0;
1008
1009
418k
  if (!env.initialized_p)
1010
2
    kvx_dis_init (info);
1011
1012
  /* Clear instruction information field.  */
1013
418k
  info->insn_info_valid = 0;
1014
418k
  info->branch_delay_insns = 0;
1015
418k
  info->data_size = 0;
1016
418k
  info->insn_type = dis_noninsn;
1017
418k
  info->target = 0;
1018
418k
  info->target2 = 0;
1019
1020
  /* Set line length.  */
1021
418k
  info->bytes_per_line = 16;
1022
1023
1024
  /* If this is the beginning of the bundle, read BUNDLESIZE words and apply
1025
     decentrifugate function.  */
1026
418k
  if (insnindex == 0)
1027
369k
    {
1028
369k
      int wordcount;
1029
746k
      for (wordcount = 0; wordcount < KVXMAXBUNDLEWORDS; wordcount++)
1030
732k
  {
1031
732k
    int status;
1032
732k
    status =
1033
732k
      (*info->read_memory_func) (memaddr + 4 * wordcount,
1034
732k
               (bfd_byte *) (bundle_words +
1035
732k
                 wordcount), 4, info);
1036
732k
    if (status != 0)
1037
549
      {
1038
549
        (*info->memory_error_func) (status, memaddr + 4 * wordcount,
1039
549
            info);
1040
549
        return -1;
1041
549
      }
1042
731k
    if (!kvx_has_parallel_bit (bundle_words[wordcount]))
1043
354k
      break;
1044
731k
  }
1045
368k
      wordcount++;
1046
368k
      invalid_bundle = !kvx_reassemble_bundle (wordcount, &insncount);
1047
368k
    }
1048
1049
417k
  assert (insnindex < KVXMAXBUNDLEISSUE);
1050
417k
  insn = &(bundle_insn[insnindex]);
1051
417k
  readsofar = insn->len * 4;
1052
417k
  insnindex++;
1053
1054
417k
  if (opt_pretty)
1055
0
    {
1056
0
      (*info->fprintf_func) (info->stream, "[ ");
1057
0
      for (int i = 0; i < insn->len; i++)
1058
0
  (*info->fprintf_func) (info->stream, "%08x ", insn->syllables[i]);
1059
0
      (*info->fprintf_func) (info->stream, "] ");
1060
0
    }
1061
1062
  /* Check for extension to right iff this is not the end of bundle.  */
1063
1064
417k
  struct decoded_insn dec;
1065
417k
  memset (&dec, 0, sizeof dec);
1066
417k
  if (!invalid_bundle && (found = decode_insn (memaddr, insn, &dec)))
1067
265k
    {
1068
265k
      int ch;
1069
265k
      (*info->fprintf_func) (info->stream, "%s", dec.opc->as_op);
1070
265k
      const char *fmtp = dec.opc->fmtstring;
1071
977k
      for (int i = 0; i < dec.nb_ops; ++i)
1072
711k
  {
1073
    /* Print characters in the format string up to the following % or nul.  */
1074
1.85M
    while ((ch = *fmtp) && ch != '%')
1075
1.13M
      {
1076
1.13M
        (*info->fprintf_func) (info->stream, "%c", ch);
1077
1.13M
        fmtp++;
1078
1.13M
      }
1079
1080
    /* Skip past %s.  */
1081
711k
    if (ch == '%')
1082
711k
      {
1083
711k
        ch = *fmtp++;
1084
711k
        fmtp++;
1085
711k
      }
1086
1087
711k
    switch (dec.operands[i].type)
1088
711k
      {
1089
435k
      case CAT_REGISTER:
1090
435k
        (*info->fprintf_func) (info->stream, "%s",
1091
435k
             env.kvx_registers[dec.operands[i].val].name);
1092
435k
        break;
1093
118k
      case CAT_MODIFIER:
1094
118k
        {
1095
118k
    const char *mod = env.kvx_modifiers[dec.operands[i].mod_idx][dec.operands[i].val];
1096
118k
    (*info->fprintf_func) (info->stream, "%s", !mod || !strcmp (mod, ".") ? "" : mod);
1097
118k
        }
1098
118k
        break;
1099
158k
      case CAT_IMMEDIATE:
1100
158k
        {
1101
158k
    if (dec.operands[i].pcrel)
1102
43.0k
      {
1103
        /* Fill in instruction information.  */
1104
43.0k
        info->insn_info_valid = 1;
1105
43.0k
        info->insn_type =
1106
43.0k
          dec.operands[i].width ==
1107
43.0k
          17 ? dis_condbranch : dis_branch;
1108
43.0k
        info->target = dec.operands[i].val;
1109
1110
43.0k
        info->print_address_func (dec.operands[i].val, info);
1111
43.0k
      }
1112
115k
    else if (dec.operands[i].sign)
1113
85.5k
      {
1114
85.5k
        if (dec.operands[i].width <= 32)
1115
76.8k
          {
1116
76.8k
      (*info->fprintf_func) (info->stream, "%" PRId32 " (0x%" PRIx32 ")",
1117
76.8k
                 (int32_t) dec.operands[i].val,
1118
76.8k
                 (int32_t) dec.operands[i].val);
1119
76.8k
          }
1120
8.75k
        else
1121
8.75k
          {
1122
8.75k
      (*info->fprintf_func) (info->stream, "%" PRId64 " (0x%" PRIx64 ")",
1123
8.75k
                 dec.operands[i].val,
1124
8.75k
                 dec.operands[i].val);
1125
8.75k
          }
1126
85.5k
      }
1127
29.6k
    else
1128
29.6k
      {
1129
29.6k
        if (dec.operands[i].width <= 32)
1130
29.1k
          {
1131
29.1k
      (*info->fprintf_func) (info->stream, "%" PRIu32 " (0x%" PRIx32 ")",
1132
29.1k
                 (uint32_t) dec.operands[i].
1133
29.1k
                 val,
1134
29.1k
                 (uint32_t) dec.operands[i].
1135
29.1k
                 val);
1136
29.1k
          }
1137
527
        else
1138
527
          {
1139
527
      (*info->fprintf_func) (info->stream, "%" PRIu64 " (0x%" PRIx64 ")",
1140
527
                 (uint64_t) dec.
1141
527
                 operands[i].val,
1142
527
                 (uint64_t) dec.
1143
527
                 operands[i].val);
1144
527
          }
1145
29.6k
      }
1146
158k
        }
1147
158k
        break;
1148
0
      default:
1149
0
        break;
1150
1151
711k
      }
1152
711k
  }
1153
1154
294k
      while ((ch = *fmtp))
1155
28.8k
  {
1156
28.8k
    (*info->fprintf_styled_func) (info->stream, dis_style_text, "%c",
1157
28.8k
          ch);
1158
28.8k
    fmtp++;
1159
28.8k
  }
1160
265k
    }
1161
152k
  else
1162
152k
    {
1163
152k
      (*info->fprintf_func) (info->stream, "*** invalid opcode ***\n");
1164
152k
      insnindex = 0;
1165
152k
      readsofar = 4;
1166
152k
    }
1167
1168
417k
  if (found && (insnindex == insncount))
1169
216k
    {
1170
216k
      (*info->fprintf_func) (info->stream, ";;");
1171
216k
      if (!opt_compact_assembly)
1172
216k
  (*info->fprintf_func) (info->stream, "\n");
1173
216k
      insnindex = 0;
1174
216k
    }
1175
1176
417k
  return readsofar;
1177
417k
}
1178
1179
/* This function searches in the current bundle for the instructions required
1180
   by unwinding. For prologue:
1181
     (1) addd $r12 = $r12, <res_stack>
1182
     (2) get <gpr_ra_reg> = $ra
1183
     (3) sd <ofs>[$r12] = <gpr_ra_reg> or sq/so containing <gpr_ra_reg>
1184
     (4) sd <ofs>[$r12] = $r14 or sq/so containing r14
1185
     (5) addd $r14 = $r12, <fp_ofs> or copyd $r14 = $r12
1186
   The only difference seen between the code generated by gcc and clang
1187
   is the setting/resetting r14. gcc could also generate copyd $r14=$r12
1188
   instead of add addd $r14 = $r12, <ofs> when <ofs> is 0.
1189
   Vice-versa, <ofs> is not guaranteed to be 0 for clang, so, clang
1190
   could also generate addd instead of copyd
1191
     (6) call, icall, goto, igoto, cb., ret
1192
  For epilogue:
1193
     (1) addd $r12 = $r12, <res_stack>
1194
     (2) addd $r12 = $r14, <offset> or copyd $r12 = $r14
1195
   Same comment as prologue (5).
1196
     (3) ret, goto
1197
     (4) call, icall, igoto, cb.  */
1198
1199
int
1200
decode_prologue_epilogue_bundle (bfd_vma memaddr,
1201
         struct disassemble_info *info,
1202
         struct kvx_prologue_epilogue_bundle *peb)
1203
0
{
1204
0
  int i, nb_insn, nb_syl;
1205
1206
0
  peb->nb_insn = 0;
1207
1208
0
  if (info->arch != bfd_arch_kvx)
1209
0
    return -1;
1210
1211
0
  if (!env.initialized_p)
1212
0
    kvx_dis_init (info);
1213
1214
  /* Read the bundle.  */
1215
0
  for (nb_syl = 0; nb_syl < KVXMAXBUNDLEWORDS; nb_syl++)
1216
0
    {
1217
0
      if ((*info->read_memory_func) (memaddr + 4 * nb_syl,
1218
0
             (bfd_byte *) &bundle_words[nb_syl], 4,
1219
0
             info))
1220
0
  return -1;
1221
0
      if (!kvx_has_parallel_bit (bundle_words[nb_syl]))
1222
0
  break;
1223
0
    }
1224
0
  nb_syl++;
1225
0
  if (!kvx_reassemble_bundle (nb_syl, &nb_insn))
1226
0
    return -1;
1227
1228
  /* Check for extension to right if this is not the end of bundle
1229
     find the format of this insn.  */
1230
0
  for (int idx_insn = 0; idx_insn < nb_insn; idx_insn++)
1231
0
    {
1232
0
      insn_t *insn = &bundle_insn[idx_insn];
1233
0
      int is_add = 0, is_get = 0, is_a_peb_insn = 0, is_copyd = 0;
1234
1235
0
      struct decoded_insn dec;
1236
0
      memset (&dec, 0, sizeof dec);
1237
0
      if (!decode_insn (memaddr, insn, &dec))
1238
0
  continue;
1239
1240
0
      const char *op_name = dec.opc->as_op;
1241
0
      struct kvx_prologue_epilogue_insn *crt_peb_insn;
1242
1243
0
      crt_peb_insn = &peb->insn[peb->nb_insn];
1244
0
      crt_peb_insn->nb_gprs = 0;
1245
1246
0
      if (!strcmp (op_name, "addd"))
1247
0
  is_add = 1;
1248
0
      else if (!strcmp (op_name, "copyd"))
1249
0
  is_copyd = 1;
1250
0
      else if (!strcmp (op_name, "get"))
1251
0
  is_get = 1;
1252
0
      else if (!strcmp (op_name, "sd"))
1253
0
  {
1254
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_SD;
1255
0
    is_a_peb_insn = 1;
1256
0
  }
1257
0
      else if (!strcmp (op_name, "sq"))
1258
0
  {
1259
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_SQ;
1260
0
    is_a_peb_insn = 1;
1261
0
  }
1262
0
      else if (!strcmp (op_name, "so"))
1263
0
  {
1264
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_SO;
1265
0
    is_a_peb_insn = 1;
1266
0
  }
1267
0
      else if (!strcmp (op_name, "ret"))
1268
0
  {
1269
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_RET;
1270
0
    is_a_peb_insn = 1;
1271
0
  }
1272
0
      else if (!strcmp (op_name, "goto"))
1273
0
  {
1274
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_GOTO;
1275
0
    is_a_peb_insn = 1;
1276
0
  }
1277
0
      else if (!strcmp (op_name, "igoto"))
1278
0
  {
1279
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_IGOTO;
1280
0
    is_a_peb_insn = 1;
1281
0
  }
1282
0
      else if (!strcmp (op_name, "call") || !strcmp (op_name, "icall"))
1283
0
  {
1284
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_CALL;
1285
0
    is_a_peb_insn = 1;
1286
0
  }
1287
0
      else if (!strncmp (op_name, "cb", 2))
1288
0
  {
1289
0
    crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_CB;
1290
0
    is_a_peb_insn = 1;
1291
0
  }
1292
0
      else
1293
0
  continue;
1294
1295
0
      for (i = 0; dec.opc->format[i]; i++)
1296
0
  {
1297
0
    struct kvx_operand *fmt = dec.opc->format[i];
1298
0
    struct kvx_bitfield *bf = fmt->bfield;
1299
0
    int bf_nb = fmt->bitfields;
1300
0
    int width = fmt->width;
1301
0
    int type = fmt->type;
1302
0
    int flags = fmt->flags;
1303
0
    int shift = fmt->shift;
1304
0
    int bias = fmt->bias;
1305
0
    uint64_t encoded_value, value = 0;
1306
1307
0
    for (int bf_idx = 0; bf_idx < bf_nb; bf_idx++)
1308
0
      {
1309
0
        int insn_idx = (int) bf[bf_idx].to_offset / 32;
1310
0
        int to_offset = bf[bf_idx].to_offset % 32;
1311
0
        encoded_value = insn->syllables[insn_idx] >> to_offset;
1312
0
        encoded_value &= (1LL << bf[bf_idx].size) - 1;
1313
0
        value |= encoded_value << bf[bf_idx].from_offset;
1314
0
      }
1315
0
    if (flags & kvxSIGNED)
1316
0
      {
1317
0
        uint64_t signbit = 1LL << (width - 1);
1318
0
        value = (value ^ signbit) - signbit;
1319
0
      }
1320
0
    value = (value << shift) + bias;
1321
1322
0
#define chk_type(core_, val_) \
1323
0
      (env.opc_table == kvx_## core_ ##_optab && type == (val_))
1324
1325
0
    if (chk_type (kv3_v1, RegClass_kv3_v1_singleReg)
1326
0
        || chk_type (kv3_v2, RegClass_kv3_v2_singleReg)
1327
0
        || chk_type (kv4_v1, RegClass_kv4_v1_singleReg))
1328
0
      {
1329
0
        if (env.kvx_regfiles[KVX_REGFILE_DEC_GPR] + value
1330
0
      >= env.kvx_max_dec_registers)
1331
0
    return -1;
1332
0
        if (is_add && i < 2)
1333
0
    {
1334
0
      if (i == 0)
1335
0
        {
1336
0
          if (value == KVX_GPR_REG_SP)
1337
0
      crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_ADD_SP;
1338
0
          else if (value == KVX_GPR_REG_FP)
1339
0
      crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_ADD_FP;
1340
0
          else
1341
0
      is_add = 0;
1342
0
        }
1343
0
      else if (i == 1)
1344
0
        {
1345
0
          if (value == KVX_GPR_REG_SP)
1346
0
      is_a_peb_insn = 1;
1347
0
          else if (value == KVX_GPR_REG_FP
1348
0
             && crt_peb_insn->insn_type
1349
0
             == KVX_PROL_EPIL_INSN_ADD_SP)
1350
0
      {
1351
0
        crt_peb_insn->insn_type
1352
0
          = KVX_PROL_EPIL_INSN_RESTORE_SP_FROM_FP;
1353
0
        is_a_peb_insn = 1;
1354
0
      }
1355
0
          else
1356
0
      is_add = 0;
1357
0
        }
1358
0
    }
1359
0
        else if (is_copyd && i < 2)
1360
0
    {
1361
0
      if (i == 0)
1362
0
        {
1363
0
          if (value == KVX_GPR_REG_FP)
1364
0
      {
1365
0
        crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_ADD_FP;
1366
0
        crt_peb_insn->immediate = 0;
1367
0
      }
1368
0
          else if (value == KVX_GPR_REG_SP)
1369
0
      {
1370
0
        crt_peb_insn->insn_type
1371
0
          = KVX_PROL_EPIL_INSN_RESTORE_SP_FROM_FP;
1372
0
        crt_peb_insn->immediate = 0;
1373
0
      }
1374
0
          else
1375
0
      is_copyd = 0;
1376
0
        }
1377
0
      else if (i == 1)
1378
0
        {
1379
0
          if (value == KVX_GPR_REG_SP
1380
0
        && crt_peb_insn->insn_type
1381
0
        == KVX_PROL_EPIL_INSN_ADD_FP)
1382
0
      is_a_peb_insn = 1;
1383
0
          else if (value == KVX_GPR_REG_FP
1384
0
             && crt_peb_insn->insn_type
1385
0
             == KVX_PROL_EPIL_INSN_RESTORE_SP_FROM_FP)
1386
0
      is_a_peb_insn = 1;
1387
0
          else
1388
0
      is_copyd = 0;
1389
0
        }
1390
0
    }
1391
0
        else
1392
0
    crt_peb_insn->gpr_reg[crt_peb_insn->nb_gprs++] = value;
1393
0
      }
1394
0
    else if (chk_type (kv3_v1, RegClass_kv3_v1_pairedReg)
1395
0
       || chk_type (kv3_v2, RegClass_kv3_v2_pairedReg)
1396
0
       || chk_type (kv4_v1, RegClass_kv4_v1_pairedReg))
1397
0
      crt_peb_insn->gpr_reg[crt_peb_insn->nb_gprs++] = value * 2;
1398
0
    else if (chk_type (kv3_v1, RegClass_kv3_v1_quadReg)
1399
0
       || chk_type (kv3_v2, RegClass_kv3_v2_quadReg)
1400
0
       || chk_type (kv4_v1, RegClass_kv4_v1_quadReg))
1401
0
      crt_peb_insn->gpr_reg[crt_peb_insn->nb_gprs++] = value * 4;
1402
0
    else if (chk_type (kv3_v1, RegClass_kv3_v1_systemReg)
1403
0
       || chk_type (kv3_v2, RegClass_kv3_v2_systemReg)
1404
0
       || chk_type (kv4_v1, RegClass_kv4_v1_systemReg)
1405
0
       || chk_type (kv3_v1, RegClass_kv3_v1_aloneReg)
1406
0
       || chk_type (kv3_v2, RegClass_kv3_v2_aloneReg)
1407
0
       || chk_type (kv4_v1, RegClass_kv4_v1_aloneReg)
1408
0
       || chk_type (kv3_v1, RegClass_kv3_v1_onlyraReg)
1409
0
       || chk_type (kv3_v2, RegClass_kv3_v2_onlyraReg)
1410
0
       || chk_type (kv4_v1, RegClass_kv4_v1_onlygetReg)
1411
0
       || chk_type (kv3_v1, RegClass_kv3_v1_onlygetReg)
1412
0
       || chk_type (kv3_v2, RegClass_kv3_v2_onlygetReg)
1413
0
       || chk_type (kv4_v1, RegClass_kv4_v1_onlygetReg)
1414
0
       || chk_type (kv3_v1, RegClass_kv3_v1_onlysetReg)
1415
0
       || chk_type (kv3_v2, RegClass_kv3_v2_onlysetReg)
1416
0
       || chk_type (kv4_v1, RegClass_kv4_v1_onlysetReg)
1417
0
       || chk_type (kv3_v1, RegClass_kv3_v1_onlyfxReg)
1418
0
       || chk_type (kv3_v2, RegClass_kv3_v2_onlyfxReg)
1419
0
       || chk_type (kv4_v1, RegClass_kv4_v1_onlyfxReg))
1420
0
      {
1421
0
        if (env.kvx_regfiles[KVX_REGFILE_DEC_GPR] + value
1422
0
      >= env.kvx_max_dec_registers)
1423
0
    return -1;
1424
0
        if (is_get && !strcmp (env.kvx_registers[env.kvx_dec_registers[env.kvx_regfiles[KVX_REGFILE_DEC_SFR] + value]].name, "$ra"))
1425
0
    {
1426
0
      crt_peb_insn->insn_type = KVX_PROL_EPIL_INSN_GET_RA;
1427
0
      is_a_peb_insn = 1;
1428
0
    }
1429
0
      }
1430
0
    else if (chk_type (kv3_v1, RegClass_kv3_v1_coproReg)
1431
0
       || chk_type (kv3_v2, RegClass_kv3_v2_coproReg)
1432
0
       || chk_type (kv4_v1, RegClass_kv4_v1_coproReg)
1433
0
       || chk_type (kv3_v1, RegClass_kv3_v1_blockReg)
1434
0
       || chk_type (kv3_v2, RegClass_kv3_v2_blockReg)
1435
0
       || chk_type (kv4_v1, RegClass_kv4_v1_blockReg)
1436
0
       || chk_type (kv3_v1, RegClass_kv3_v1_vectorReg)
1437
0
       || chk_type (kv3_v2, RegClass_kv3_v2_vectorReg)
1438
0
       || chk_type (kv4_v1, RegClass_kv4_v1_vectorReg)
1439
0
       || chk_type (kv3_v1, RegClass_kv3_v1_tileReg)
1440
0
       || chk_type (kv3_v2, RegClass_kv3_v2_tileReg)
1441
0
       || chk_type (kv4_v1, RegClass_kv4_v1_tileReg)
1442
0
       || chk_type (kv3_v1, RegClass_kv3_v1_matrixReg)
1443
0
       || chk_type (kv3_v2, RegClass_kv3_v2_matrixReg)
1444
0
       || chk_type (kv4_v1, RegClass_kv4_v1_matrixReg)
1445
0
       || chk_type (kv3_v1, Modifier_kv3_v1_scalarcond)
1446
0
       || chk_type (kv3_v1, Modifier_kv3_v1_column)
1447
0
       || chk_type (kv3_v1, Modifier_kv3_v1_comparison)
1448
0
       || chk_type (kv3_v1, Modifier_kv3_v1_doscale)
1449
0
       || chk_type (kv3_v1, Modifier_kv3_v1_exunum)
1450
0
       || chk_type (kv3_v1, Modifier_kv3_v1_floatcomp)
1451
0
       || chk_type (kv3_v1, Modifier_kv3_v1_qindex)
1452
0
       || chk_type (kv3_v1, Modifier_kv3_v1_rectify)
1453
0
       || chk_type (kv3_v1, Modifier_kv3_v1_rounding)
1454
0
       || chk_type (kv3_v1, Modifier_kv3_v1_roundint)
1455
0
       || chk_type (kv3_v1, Modifier_kv3_v1_saturate)
1456
0
       || chk_type (kv3_v1, Modifier_kv3_v1_scalarcond)
1457
0
       || chk_type (kv3_v1, Modifier_kv3_v1_silent)
1458
0
       || chk_type (kv3_v1, Modifier_kv3_v1_simplecond)
1459
0
       || chk_type (kv3_v1, Modifier_kv3_v1_speculate)
1460
0
       || chk_type (kv3_v1, Modifier_kv3_v1_splat32)
1461
0
       || chk_type (kv3_v1, Modifier_kv3_v1_variant)
1462
0
       || chk_type (kv3_v2, Modifier_kv3_v2_accesses)
1463
0
       || chk_type (kv3_v2, Modifier_kv3_v2_boolcas)
1464
0
       || chk_type (kv3_v2, Modifier_kv3_v2_cachelev)
1465
0
       || chk_type (kv3_v2, Modifier_kv3_v2_channel)
1466
0
       || chk_type (kv3_v2, Modifier_kv3_v2_coherency)
1467
0
       || chk_type (kv3_v2, Modifier_kv3_v2_comparison)
1468
0
       || chk_type (kv3_v2, Modifier_kv3_v2_conjugate)
1469
0
       || chk_type (kv3_v2, Modifier_kv3_v2_doscale)
1470
0
       || chk_type (kv3_v2, Modifier_kv3_v2_exunum)
1471
0
       || chk_type (kv3_v2, Modifier_kv3_v2_floatcomp)
1472
0
       || chk_type (kv3_v2, Modifier_kv3_v2_hindex)
1473
0
       || chk_type (kv3_v2, Modifier_kv3_v2_lsomask)
1474
0
       || chk_type (kv3_v2, Modifier_kv3_v2_lsumask)
1475
0
       || chk_type (kv3_v2, Modifier_kv3_v2_lsupack)
1476
0
       || chk_type (kv3_v2, Modifier_kv3_v2_qindex)
1477
0
       || chk_type (kv3_v2, Modifier_kv3_v2_rounding)
1478
0
       || chk_type (kv3_v2, Modifier_kv3_v2_scalarcond)
1479
0
       || chk_type (kv3_v2, Modifier_kv3_v2_shuffleV)
1480
0
       || chk_type (kv3_v2, Modifier_kv3_v2_shuffleX)
1481
0
       || chk_type (kv3_v2, Modifier_kv3_v2_silent)
1482
0
       || chk_type (kv3_v2, Modifier_kv3_v2_simplecond)
1483
0
       || chk_type (kv3_v2, Modifier_kv3_v2_speculate)
1484
0
       || chk_type (kv3_v2, Modifier_kv3_v2_splat32)
1485
0
       || chk_type (kv3_v2, Modifier_kv3_v2_transpose)
1486
0
       || chk_type (kv3_v2, Modifier_kv3_v2_variant)
1487
0
       || chk_type (kv4_v1, Modifier_kv4_v1_accesses)
1488
0
       || chk_type (kv4_v1, Modifier_kv4_v1_boolcas)
1489
0
       || chk_type (kv4_v1, Modifier_kv4_v1_cachelev)
1490
0
       || chk_type (kv4_v1, Modifier_kv4_v1_channel)
1491
0
       || chk_type (kv4_v1, Modifier_kv4_v1_coherency)
1492
0
       || chk_type (kv4_v1, Modifier_kv4_v1_comparison)
1493
0
       || chk_type (kv4_v1, Modifier_kv4_v1_conjugate)
1494
0
       || chk_type (kv4_v1, Modifier_kv4_v1_doscale)
1495
0
       || chk_type (kv4_v1, Modifier_kv4_v1_exunum)
1496
0
       || chk_type (kv4_v1, Modifier_kv4_v1_floatcomp)
1497
0
       || chk_type (kv4_v1, Modifier_kv4_v1_hindex)
1498
0
       || chk_type (kv4_v1, Modifier_kv4_v1_lsomask)
1499
0
       || chk_type (kv4_v1, Modifier_kv4_v1_lsumask)
1500
0
       || chk_type (kv4_v1, Modifier_kv4_v1_lsupack)
1501
0
       || chk_type (kv4_v1, Modifier_kv4_v1_qindex)
1502
0
       || chk_type (kv4_v1, Modifier_kv4_v1_rounding)
1503
0
       || chk_type (kv4_v1, Modifier_kv4_v1_scalarcond)
1504
0
       || chk_type (kv4_v1, Modifier_kv4_v1_shuffleV)
1505
0
       || chk_type (kv4_v1, Modifier_kv4_v1_shuffleX)
1506
0
       || chk_type (kv4_v1, Modifier_kv4_v1_silent)
1507
0
       || chk_type (kv4_v1, Modifier_kv4_v1_simplecond)
1508
0
       || chk_type (kv4_v1, Modifier_kv4_v1_speculate)
1509
0
       || chk_type (kv4_v1, Modifier_kv4_v1_splat32)
1510
0
       || chk_type (kv4_v1, Modifier_kv4_v1_transpose)
1511
0
       || chk_type (kv4_v1, Modifier_kv4_v1_variant))
1512
0
      {
1513
        /* Do nothing.  */
1514
0
      }
1515
0
    else if (chk_type (kv3_v1, Immediate_kv3_v1_sysnumber)
1516
0
       || chk_type (kv3_v2, Immediate_kv3_v2_sysnumber)
1517
0
       || chk_type (kv4_v1, Immediate_kv4_v1_sysnumber)
1518
0
       || chk_type (kv3_v2, Immediate_kv3_v2_wrapped8)
1519
0
       || chk_type (kv4_v1, Immediate_kv4_v1_wrapped8)
1520
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed10)
1521
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed10)
1522
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed10)
1523
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed16)
1524
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed16)
1525
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed16)
1526
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed27)
1527
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed27)
1528
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed27)
1529
0
       || chk_type (kv3_v1, Immediate_kv3_v1_wrapped32)
1530
0
       || chk_type (kv3_v2, Immediate_kv3_v2_wrapped32)
1531
0
       || chk_type (kv4_v1, Immediate_kv4_v1_wrapped32)
1532
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed37)
1533
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed37)
1534
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed37)
1535
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed43)
1536
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed43)
1537
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed43)
1538
0
       || chk_type (kv3_v1, Immediate_kv3_v1_signed54)
1539
0
       || chk_type (kv3_v2, Immediate_kv3_v2_signed54)
1540
0
       || chk_type (kv4_v1, Immediate_kv4_v1_signed54)
1541
0
       || chk_type (kv3_v1, Immediate_kv3_v1_wrapped64)
1542
0
       || chk_type (kv3_v2, Immediate_kv3_v2_wrapped64)
1543
0
       || chk_type (kv4_v1, Immediate_kv4_v1_wrapped64)
1544
0
       || chk_type (kv3_v1, Immediate_kv3_v1_unsigned6)
1545
0
       || chk_type (kv3_v2, Immediate_kv3_v2_unsigned6)
1546
0
       || chk_type (kv4_v1, Immediate_kv4_v1_unsigned6))
1547
0
      crt_peb_insn->immediate = value;
1548
0
    else if (chk_type (kv3_v1, Immediate_kv3_v1_pcrel17)
1549
0
       || chk_type (kv3_v2, Immediate_kv3_v2_pcrel17)
1550
0
       || chk_type (kv4_v1, Immediate_kv4_v1_pcrel17)
1551
0
       || chk_type (kv3_v1, Immediate_kv3_v1_pcrel27)
1552
0
       || chk_type (kv3_v2, Immediate_kv3_v2_pcrel27)
1553
0
       || chk_type (kv4_v1, Immediate_kv4_v1_pcrel27))
1554
0
      crt_peb_insn->immediate = value + memaddr;
1555
0
    else
1556
0
      return -1;
1557
0
  }
1558
1559
0
      if (is_a_peb_insn)
1560
0
  peb->nb_insn++;
1561
0
      continue;
1562
0
    }
1563
1564
0
  return nb_syl * 4;
1565
0
#undef chk_type
1566
0
}
1567
1568
void
1569
print_kvx_disassembler_options (FILE * stream)
1570
0
{
1571
0
  fprintf (stream, _("\n\
1572
0
The following KVX specific disassembler options are supported for use\n\
1573
0
with the -M switch (multiple options should be separated by commas):\n"));
1574
1575
0
  fprintf (stream, _("\n\
1576
0
  pretty               Print 32-bit words in natural order corresponding to \
1577
0
re-ordered instruction.\n"));
1578
1579
0
  fprintf (stream, _("\n\
1580
0
  compact-assembly     Do not emit a new line between bundles of instructions.\
1581
0
\n"));
1582
1583
0
  fprintf (stream, _("\n\
1584
0
  no-compact-assembly  Emit a new line between bundles of instructions.\n"));
1585
1586
0
  fprintf (stream, _("\n"));
1587
0
}