Coverage Report

Created: 2023-08-28 06:30

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