Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/opcodes/arc-opc.c
Line
Count
Source (jump to first uncovered line)
1
/* Opcode table for the ARC.
2
   Copyright (C) 1994-2025 Free Software Foundation, Inc.
3
4
   Contributed by Claudiu Zissulescu (claziss@synopsys.com)
5
6
   This file is part of libopcodes.
7
8
   This library is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3, or (at your option)
11
   any later version.
12
13
   It is distributed in the hope that it will be useful, but WITHOUT
14
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16
   License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software Foundation,
20
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include <stdio.h>
24
#include "bfd.h"
25
#include "opcode/arc.h"
26
#include "opintl.h"
27
#include "libiberty.h"
28
29
/* ARC NPS400 Support: The ARC NPS400 core is an ARC700 with some custom
30
   instructions. All NPS400 features are built into all ARC target builds as
31
   this reduces the chances that regressions might creep in.  */
32
33
/* Insert RA register into a 32-bit opcode, with checks.  */
34
35
static unsigned long long
36
insert_ra_chk (unsigned long long  insn,
37
         long long           value,
38
         const char **       errmsg)
39
0
{
40
0
  if (value == 60)
41
0
    *errmsg = _("LP_COUNT register cannot be used as destination register");
42
43
0
  return insn | (value & 0x3F);
44
0
}
45
46
/* Insert RB register into a 32-bit opcode.  */
47
48
static unsigned long long
49
insert_rb (unsigned long long  insn,
50
     long long           value,
51
     const char **       errmsg ATTRIBUTE_UNUSED)
52
0
{
53
0
  return insn | ((value & 0x07) << 24) | (((value >> 3) & 0x07) << 12);
54
0
}
55
56
/* Insert RB register with checks.  */
57
58
static unsigned long long
59
insert_rb_chk (unsigned long long  insn,
60
         long long           value,
61
         const char **       errmsg)
62
0
{
63
0
  if (value == 60)
64
0
    *errmsg = _("LP_COUNT register cannot be used as destination register");
65
66
0
  return insn | ((value & 0x07) << 24) | (((value >> 3) & 0x07) << 12);
67
0
}
68
69
static long long
70
extract_rb (unsigned long long insn,
71
      bool *invalid)
72
171k
{
73
171k
  int value = (((insn >> 12) & 0x07) << 3) | ((insn >> 24) & 0x07);
74
75
171k
  if (value == 0x3e && invalid)
76
6.71k
    *invalid = true; /* A limm operand, it should be extracted in a
77
      different way.  */
78
79
171k
  return value;
80
171k
}
81
82
static unsigned long long
83
insert_rad (unsigned long long  insn,
84
      long long           value,
85
      const char **       errmsg)
86
0
{
87
0
  if (value & 0x01)
88
0
    *errmsg = _("cannot use odd number destination register");
89
0
  if (value == 60)
90
0
    *errmsg = _("LP_COUNT register cannot be used as destination register");
91
92
0
  return insn | (value & 0x3F);
93
0
}
94
95
static unsigned long long
96
insert_rcd (unsigned long long  insn,
97
      long long           value,
98
      const char **       errmsg)
99
0
{
100
0
  if (value & 0x01)
101
0
    *errmsg = _("cannot use odd number source register");
102
103
0
  return insn | ((value & 0x3F) << 6);
104
0
}
105
106
static unsigned long long
107
insert_rbd (unsigned long long  insn,
108
      long long           value,
109
      const char **       errmsg)
110
0
{
111
0
  if (value & 0x01)
112
0
    *errmsg = _("cannot use odd number source register");
113
0
  if (value == 60)
114
0
    *errmsg = _("LP_COUNT register cannot be used as destination register");
115
116
0
  return insn | ((value & 0x07) << 24) | (((value >> 3) & 0x07) << 12);
117
0
}
118
119
/* Dummy insert ZERO operand function.  */
120
121
static unsigned long long
122
insert_za (unsigned long long  insn,
123
     long long           value,
124
     const char **       errmsg)
125
0
{
126
0
  if (value)
127
0
    *errmsg = _("operand is not zero");
128
0
  return insn;
129
0
}
130
131
/* Insert Y-bit in bbit/br instructions.  This function is called only
132
   when solving fixups.  */
133
134
static unsigned long long
135
insert_Ybit (unsigned long long  insn,
136
       long long           value,
137
       const char **       errmsg ATTRIBUTE_UNUSED)
138
0
{
139
0
  if (value > 0)
140
0
    insn |= 0x08;
141
142
0
  return insn;
143
0
}
144
145
/* Insert Y-bit in bbit/br instructions.  This function is called only
146
   when solving fixups.  */
147
148
static unsigned long long
149
insert_NYbit (unsigned long long  insn,
150
        long long           value,
151
        const char **       errmsg ATTRIBUTE_UNUSED)
152
0
{
153
0
  if (value < 0)
154
0
    insn |= 0x08;
155
156
0
  return insn;
157
0
}
158
159
/* Insert H register into a 16-bit opcode.  */
160
161
static unsigned long long
162
insert_rhv1 (unsigned long long  insn,
163
       long long           value,
164
       const char **       errmsg ATTRIBUTE_UNUSED)
165
0
{
166
0
  return insn |= ((value & 0x07) << 5) | ((value >> 3) & 0x07);
167
0
}
168
169
static long long
170
extract_rhv1 (unsigned long long insn,
171
        bool *invalid ATTRIBUTE_UNUSED)
172
20.5k
{
173
20.5k
  int value = ((insn & 0x7) << 3) | ((insn >> 5) & 0x7);
174
175
20.5k
  return value;
176
20.5k
}
177
178
/* Insert H register into a 16-bit opcode.  */
179
180
static unsigned long long
181
insert_rhv2 (unsigned long long  insn,
182
       long long           value,
183
       const char **       errmsg)
184
0
{
185
0
  if (value == 0x1E)
186
0
    *errmsg = _("register R30 is a limm indicator");
187
0
  else if (value < 0 || value > 31)
188
0
    *errmsg = _("register out of range");
189
0
  return insn |= ((value & 0x07) << 5) | ((value >> 3) & 0x03);
190
0
}
191
192
static long long
193
extract_rhv2 (unsigned long long insn,
194
        bool *invalid ATTRIBUTE_UNUSED)
195
31.4k
{
196
31.4k
  int value = ((insn >> 5) & 0x07) | ((insn & 0x03) << 3);
197
198
31.4k
  return value;
199
31.4k
}
200
201
static unsigned long long
202
insert_r0 (unsigned long long  insn,
203
     long long           value,
204
     const char **       errmsg)
205
0
{
206
0
  if (value != 0)
207
0
    *errmsg = _("register must be R0");
208
0
  return insn;
209
0
}
210
211
static long long
212
extract_r0 (unsigned long long insn ATTRIBUTE_UNUSED,
213
      bool *invalid ATTRIBUTE_UNUSED)
214
39.5k
{
215
39.5k
  return 0;
216
39.5k
}
217
218
219
static unsigned long long
220
insert_r1 (unsigned long long  insn,
221
     long long           value,
222
     const char **       errmsg)
223
0
{
224
0
  if (value != 1)
225
0
    *errmsg = _("register must be R1");
226
0
  return insn;
227
0
}
228
229
static long long
230
extract_r1 (unsigned long long insn ATTRIBUTE_UNUSED,
231
      bool* invalid ATTRIBUTE_UNUSED)
232
5.55k
{
233
5.55k
  return 1;
234
5.55k
}
235
236
static unsigned long long
237
insert_r2 (unsigned long long  insn,
238
     long long           value,
239
     const char **       errmsg)
240
0
{
241
0
  if (value != 2)
242
0
    *errmsg = _("register must be R2");
243
0
  return insn;
244
0
}
245
246
static long long
247
extract_r2 (unsigned long long insn ATTRIBUTE_UNUSED,
248
      bool *invalid ATTRIBUTE_UNUSED)
249
2.63k
{
250
2.63k
  return 2;
251
2.63k
}
252
253
static unsigned long long
254
insert_r3 (unsigned long long  insn,
255
     long long           value,
256
     const char **       errmsg)
257
0
{
258
0
  if (value != 3)
259
0
    *errmsg = _("register must be R3");
260
0
  return insn;
261
0
}
262
263
static long long
264
extract_r3 (unsigned long long insn ATTRIBUTE_UNUSED,
265
      bool *invalid ATTRIBUTE_UNUSED)
266
2.04k
{
267
2.04k
  return 3;
268
2.04k
}
269
270
static unsigned long long
271
insert_sp (unsigned long long  insn,
272
     long long           value,
273
     const char **       errmsg)
274
0
{
275
0
  if (value != 28)
276
0
    *errmsg = _("register must be SP");
277
0
  return insn;
278
0
}
279
280
static long long
281
extract_sp (unsigned long long insn ATTRIBUTE_UNUSED,
282
      bool *invalid ATTRIBUTE_UNUSED)
283
13.8k
{
284
13.8k
  return 28;
285
13.8k
}
286
287
static unsigned long long
288
insert_gp (unsigned long long  insn,
289
     long long           value,
290
     const char **       errmsg)
291
0
{
292
0
  if (value != 26)
293
0
    *errmsg = _("register must be GP");
294
0
  return insn;
295
0
}
296
297
static long long
298
extract_gp (unsigned long long insn ATTRIBUTE_UNUSED,
299
      bool *invalid ATTRIBUTE_UNUSED)
300
30.8k
{
301
30.8k
  return 26;
302
30.8k
}
303
304
static unsigned long long
305
insert_pcl (unsigned long long  insn,
306
      long long           value,
307
      const char **       errmsg)
308
0
{
309
0
  if (value != 63)
310
0
    *errmsg = _("register must be PCL");
311
0
  return insn;
312
0
}
313
314
static long long
315
extract_pcl (unsigned long long insn ATTRIBUTE_UNUSED,
316
       bool *invalid ATTRIBUTE_UNUSED)
317
29.2k
{
318
29.2k
  return 63;
319
29.2k
}
320
321
static unsigned long long
322
insert_blink (unsigned long long  insn,
323
        long long           value,
324
        const char **       errmsg)
325
0
{
326
0
  if (value != 31)
327
0
    *errmsg = _("register must be BLINK");
328
0
  return insn;
329
0
}
330
331
static long long
332
extract_blink (unsigned long long insn ATTRIBUTE_UNUSED,
333
         bool *invalid ATTRIBUTE_UNUSED)
334
2.20k
{
335
2.20k
  return 31;
336
2.20k
}
337
338
static unsigned long long
339
insert_ilink1 (unsigned long long  insn,
340
         long long           value,
341
         const char **       errmsg)
342
0
{
343
0
  if (value != 29)
344
0
    *errmsg = _("register must be ILINK1");
345
0
  return insn;
346
0
}
347
348
static long long
349
extract_ilink1 (unsigned long long insn ATTRIBUTE_UNUSED,
350
    bool *invalid ATTRIBUTE_UNUSED)
351
724
{
352
724
  return 29;
353
724
}
354
355
static unsigned long long
356
insert_ilink2 (unsigned long long  insn,
357
         long long           value,
358
         const char **       errmsg)
359
0
{
360
0
  if (value != 30)
361
0
    *errmsg = _("register must be ILINK2");
362
0
  return insn;
363
0
}
364
365
static long long
366
extract_ilink2 (unsigned long long insn ATTRIBUTE_UNUSED,
367
    bool *invalid ATTRIBUTE_UNUSED)
368
456
{
369
456
  return 30;
370
456
}
371
372
static unsigned long long
373
insert_ras (unsigned long long  insn,
374
      long long           value,
375
      const char **       errmsg)
376
0
{
377
0
  switch (value)
378
0
    {
379
0
    case 0:
380
0
    case 1:
381
0
    case 2:
382
0
    case 3:
383
0
      insn |= value;
384
0
      break;
385
0
    case 12:
386
0
    case 13:
387
0
    case 14:
388
0
    case 15:
389
0
      insn |= (value - 8);
390
0
      break;
391
0
    default:
392
0
      *errmsg = _("register must be either r0-r3 or r12-r15");
393
0
      break;
394
0
    }
395
0
  return insn;
396
0
}
397
398
static long long
399
extract_ras (unsigned long long insn,
400
       bool *invalid ATTRIBUTE_UNUSED)
401
44.4k
{
402
44.4k
  int value = insn & 0x07;
403
404
44.4k
  if (value > 3)
405
23.6k
    return (value + 8);
406
20.8k
  else
407
20.8k
    return value;
408
44.4k
}
409
410
static unsigned long long
411
insert_rbs (unsigned long long  insn,
412
      long long           value,
413
      const char **       errmsg)
414
0
{
415
0
  switch (value)
416
0
    {
417
0
    case 0:
418
0
    case 1:
419
0
    case 2:
420
0
    case 3:
421
0
      insn |= value << 8;
422
0
      break;
423
0
    case 12:
424
0
    case 13:
425
0
    case 14:
426
0
    case 15:
427
0
      insn |= ((value - 8)) << 8;
428
0
      break;
429
0
    default:
430
0
      *errmsg = _("register must be either r0-r3 or r12-r15");
431
0
      break;
432
0
    }
433
0
  return insn;
434
0
}
435
436
static long long
437
extract_rbs (unsigned long long insn,
438
       bool *invalid ATTRIBUTE_UNUSED)
439
482k
{
440
482k
  int value = (insn >> 8) & 0x07;
441
442
482k
  if (value > 3)
443
239k
    return (value + 8);
444
242k
  else
445
242k
    return value;
446
482k
}
447
448
static unsigned long long
449
insert_rcs (unsigned long long  insn,
450
      long long           value,
451
      const char **       errmsg)
452
0
{
453
0
  switch (value)
454
0
    {
455
0
    case 0:
456
0
    case 1:
457
0
    case 2:
458
0
    case 3:
459
0
      insn |= value << 5;
460
0
      break;
461
0
    case 12:
462
0
    case 13:
463
0
    case 14:
464
0
    case 15:
465
0
      insn |= ((value - 8)) << 5;
466
0
      break;
467
0
    default:
468
0
      *errmsg = _("register must be either r0-r3 or r12-r15");
469
0
      break;
470
0
    }
471
0
  return insn;
472
0
}
473
474
static long long
475
extract_rcs (unsigned long long insn,
476
       bool *invalid ATTRIBUTE_UNUSED)
477
247k
{
478
247k
  int value = (insn >> 5) & 0x07;
479
480
247k
  if (value > 3)
481
129k
    return (value + 8);
482
117k
  else
483
117k
    return value;
484
247k
}
485
486
static unsigned long long
487
insert_simm3s (unsigned long long  insn,
488
         long long           value,
489
         const char **       errmsg)
490
0
{
491
0
  int tmp = 0;
492
0
  switch (value)
493
0
    {
494
0
    case -1:
495
0
      tmp = 0x07;
496
0
      break;
497
0
    case 0:
498
0
      tmp = 0x00;
499
0
      break;
500
0
    case 1:
501
0
      tmp = 0x01;
502
0
      break;
503
0
    case 2:
504
0
      tmp = 0x02;
505
0
      break;
506
0
    case 3:
507
0
      tmp = 0x03;
508
0
      break;
509
0
    case 4:
510
0
      tmp = 0x04;
511
0
      break;
512
0
    case 5:
513
0
      tmp = 0x05;
514
0
      break;
515
0
    case 6:
516
0
      tmp = 0x06;
517
0
      break;
518
0
    default:
519
0
      *errmsg = _("accepted values are from -1 to 6");
520
0
      break;
521
0
    }
522
523
0
  insn |= tmp << 8;
524
0
  return insn;
525
0
}
526
527
static long long
528
extract_simm3s (unsigned long long insn,
529
    bool *invalid ATTRIBUTE_UNUSED)
530
6.95k
{
531
6.95k
  int value = (insn >> 8) & 0x07;
532
533
6.95k
  if (value == 7)
534
2.10k
    return -1;
535
4.85k
  else
536
4.85k
    return value;
537
6.95k
}
538
539
static unsigned long long
540
insert_rrange (unsigned long long  insn,
541
         long long           value,
542
         const char **       errmsg)
543
0
{
544
0
  int reg1 = (value >> 16) & 0xFFFF;
545
0
  int reg2 = value & 0xFFFF;
546
547
0
  if (reg1 != 13)
548
0
    *errmsg = _("first register of the range should be r13");
549
0
  else if (reg2 < 13 || reg2 > 26)
550
0
    *errmsg = _("last register of the range doesn't fit");
551
0
  else
552
0
    insn |= ((reg2 - 12) & 0x0F) << 1;
553
0
  return insn;
554
0
}
555
556
static long long
557
extract_rrange (unsigned long long insn,
558
    bool *invalid ATTRIBUTE_UNUSED)
559
9.12k
{
560
9.12k
  return (insn >> 1) & 0x0F;
561
9.12k
}
562
563
static unsigned long long
564
insert_r13el (unsigned long long insn,
565
        long long int value,
566
        const char **errmsg)
567
0
{
568
0
  if (value != 13)
569
0
    {
570
0
      *errmsg = _("invalid register number, should be fp");
571
0
      return insn;
572
0
    }
573
574
0
  insn |= 0x02;
575
0
  return insn;
576
0
}
577
578
static unsigned long long
579
insert_fpel (unsigned long long  insn,
580
       long long           value,
581
       const char **       errmsg)
582
0
{
583
0
  if (value != 27)
584
0
    {
585
0
      *errmsg = _("invalid register number, should be fp");
586
0
      return insn;
587
0
    }
588
589
0
  insn |= 0x0100;
590
0
  return insn;
591
0
}
592
593
static long long
594
extract_fpel (unsigned long long insn,
595
        bool *invalid ATTRIBUTE_UNUSED)
596
9.12k
{
597
9.12k
  return (insn & 0x0100) ? 27 : -1;
598
9.12k
}
599
600
static unsigned long long
601
insert_blinkel (unsigned long long  insn,
602
    long long           value,
603
    const char **       errmsg)
604
0
{
605
0
  if (value != 31)
606
0
    {
607
0
      *errmsg = _("invalid register number, should be blink");
608
0
      return insn;
609
0
    }
610
611
0
  insn |= 0x0200;
612
0
  return insn;
613
0
}
614
615
static long long
616
extract_blinkel (unsigned long long insn,
617
     bool *invalid ATTRIBUTE_UNUSED)
618
9.12k
{
619
9.12k
  return (insn & 0x0200) ? 31 : -1;
620
9.12k
}
621
622
static unsigned long long
623
insert_pclel (unsigned long long  insn,
624
        long long           value,
625
        const char **       errmsg)
626
0
{
627
0
  if (value != 63)
628
0
    {
629
0
      *errmsg = _("invalid register number, should be pcl");
630
0
      return insn;
631
0
    }
632
633
0
  insn |= 0x0400;
634
0
  return insn;
635
0
}
636
637
static long long
638
extract_pclel (unsigned long long insn,
639
         bool *invalid ATTRIBUTE_UNUSED)
640
8.25k
{
641
8.25k
  return (insn & 0x0400) ? 63 : -1;
642
8.25k
}
643
644
#define INSERT_W6
645
646
/* mask = 00000000000000000000111111000000
647
   insn = 00011bbb000000000BBBwwwwwwDaaZZ1.  */
648
649
static unsigned long long
650
insert_w6 (unsigned long long  insn,
651
     long long           value,
652
     const char **       errmsg ATTRIBUTE_UNUSED)
653
0
{
654
0
  insn |= ((value >> 0) & 0x003f) << 6;
655
656
0
  return insn;
657
0
}
658
659
#define EXTRACT_W6
660
661
/* mask = 00000000000000000000111111000000.  */
662
663
static long long
664
extract_w6 (unsigned long long insn,
665
      bool *invalid ATTRIBUTE_UNUSED)
666
5.89k
{
667
5.89k
  int value = 0;
668
669
5.89k
  value |= ((insn >> 6) & 0x003f) << 0;
670
671
  /* Extend the sign.  */
672
5.89k
  int signbit = 1 << 5;
673
5.89k
  value = (value ^ signbit) - signbit;
674
675
5.89k
  return value;
676
5.89k
}
677
678
#define INSERT_G_S
679
680
/* mask = 0000011100022000
681
   insn = 01000ggghhhGG0HH.  */
682
683
static unsigned long long
684
insert_g_s (unsigned long long  insn,
685
      long long           value,
686
      const char **       errmsg ATTRIBUTE_UNUSED)
687
0
{
688
0
  insn |= ((value >> 0) & 0x0007) << 8;
689
0
  insn |= ((value >> 3) & 0x0003) << 3;
690
691
0
  return insn;
692
0
}
693
694
#define EXTRACT_G_S
695
696
/* mask = 0000011100022000.  */
697
698
static long long
699
extract_g_s (unsigned long long insn,
700
       bool *invalid ATTRIBUTE_UNUSED)
701
6.91k
{
702
6.91k
  int value = 0;
703
6.91k
  int signbit = 1 << (6 - 1);
704
705
6.91k
  value |= ((insn >> 8) & 0x0007) << 0;
706
6.91k
  value |= ((insn >> 3) & 0x0003) << 3;
707
708
  /* Extend the sign.  */
709
6.91k
  value = (value ^ signbit) - signbit;
710
711
6.91k
  return value;
712
6.91k
}
713
714
/* ARC NPS400 Support: See comment near head of file.  */
715
#define MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(NAME,OFFSET)          \
716
static unsigned long long          \
717
insert_nps_3bit_reg_at_##OFFSET##_##NAME             \
718
                    (unsigned long long  insn,                   \
719
                     long long           value,                  \
720
0
                     const char **       errmsg)           \
721
0
{                \
722
0
  switch (value)             \
723
0
    {                \
724
0
    case 0:                                                      \
725
0
    case 1:                                                      \
726
0
    case 2:                                                      \
727
0
    case 3:                                                      \
728
0
      insn |= value << (OFFSET);                                 \
729
0
      break;                                                     \
730
0
    case 12:                                                     \
731
0
    case 13:                                                     \
732
0
    case 14:                                                     \
733
0
    case 15:                                                     \
734
0
      insn |= (value - 8) << (OFFSET);                           \
735
0
      break;                                                     \
736
0
    default:                                                     \
737
0
      *errmsg = _("register must be either r0-r3 or r12-r15");   \
738
0
      break;                                                     \
739
0
    }                                                            \
740
0
  return insn;                                                   \
741
0
}                                                                \
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_24_dst
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_21_src2
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_8_dst
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_5_src2
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_40_dst
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_37_src2
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_56_dst
Unexecuted instantiation: arc-opc.c:insert_nps_3bit_reg_at_53_src2
742
                                                                 \
743
static long long             \
744
extract_nps_3bit_reg_at_##OFFSET##_##NAME      \
745
  (unsigned long long insn,          \
746
105k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
105k
{                                                                \
748
105k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
105k
  if (value > 3)                                                 \
750
105k
    value += 8;                                                  \
751
105k
  return value;                                                  \
752
105k
}                                                                \
arc-opc.c:extract_nps_3bit_reg_at_24_dst
Line
Count
Source
746
44.7k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
44.7k
{                                                                \
748
44.7k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
44.7k
  if (value > 3)                                                 \
750
44.7k
    value += 8;                                                  \
751
44.7k
  return value;                                                  \
752
44.7k
}                                                                \
arc-opc.c:extract_nps_3bit_reg_at_21_src2
Line
Count
Source
746
30.4k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
30.4k
{                                                                \
748
30.4k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
30.4k
  if (value > 3)                                                 \
750
30.4k
    value += 8;                                                  \
751
30.4k
  return value;                                                  \
752
30.4k
}                                                                \
Unexecuted instantiation: arc-opc.c:extract_nps_3bit_reg_at_8_dst
Unexecuted instantiation: arc-opc.c:extract_nps_3bit_reg_at_5_src2
arc-opc.c:extract_nps_3bit_reg_at_40_dst
Line
Count
Source
746
7.86k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
7.86k
{                                                                \
748
7.86k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
7.86k
  if (value > 3)                                                 \
750
7.86k
    value += 8;                                                  \
751
7.86k
  return value;                                                  \
752
7.86k
}                                                                \
arc-opc.c:extract_nps_3bit_reg_at_37_src2
Line
Count
Source
746
4.61k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
4.61k
{                                                                \
748
4.61k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
4.61k
  if (value > 3)                                                 \
750
4.61k
    value += 8;                                                  \
751
4.61k
  return value;                                                  \
752
4.61k
}                                                                \
arc-opc.c:extract_nps_3bit_reg_at_56_dst
Line
Count
Source
746
11.1k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
11.1k
{                                                                \
748
11.1k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
11.1k
  if (value > 3)                                                 \
750
11.1k
    value += 8;                                                  \
751
11.1k
  return value;                                                  \
752
11.1k
}                                                                \
arc-opc.c:extract_nps_3bit_reg_at_53_src2
Line
Count
Source
746
7.10k
   bool *invalid ATTRIBUTE_UNUSED)         \
747
7.10k
{                                                                \
748
7.10k
  int value = (insn >> (OFFSET)) & 0x07;       \
749
7.10k
  if (value > 3)                                                 \
750
7.10k
    value += 8;                                                  \
751
7.10k
  return value;                                                  \
752
7.10k
}                                                                \
753
754
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(dst,8)
755
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(dst,24)
756
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(dst,40)
757
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(dst,56)
758
759
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(src2,5)
760
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(src2,21)
761
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(src2,37)
762
MAKE_3BIT_REG_INSERT_EXTRACT_FUNCS(src2,53)
763
764
static unsigned long long
765
insert_nps_bitop_size_2b (unsigned long long  insn,
766
                          long long           value,
767
                          const char **       errmsg)
768
0
{
769
0
  switch (value)
770
0
    {
771
0
    case 1:
772
0
      value = 0;
773
0
      break;
774
0
    case 2:
775
0
      value = 1;
776
0
      break;
777
0
    case 4:
778
0
      value = 2;
779
0
      break;
780
0
    case 8:
781
0
      value = 3;
782
0
      break;
783
0
    default:
784
0
      value = 0;
785
0
      *errmsg = _("invalid size, should be 1, 2, 4, or 8");
786
0
      break;
787
0
    }
788
789
0
  insn |= value << 10;
790
0
  return insn;
791
0
}
792
793
static long long
794
extract_nps_bitop_size_2b (unsigned long long insn,
795
                           bool *invalid ATTRIBUTE_UNUSED)
796
2.32k
{
797
2.32k
  return  1 << ((insn >> 10) & 0x3);
798
2.32k
}
799
800
static unsigned long long
801
insert_nps_bitop_uimm8 (unsigned long long  insn,
802
                        long long           value,
803
                        const char **       errmsg ATTRIBUTE_UNUSED)
804
0
{
805
0
  insn |= ((value >> 5) & 7) << 12;
806
0
  insn |= (value & 0x1f);
807
0
  return insn;
808
0
}
809
810
static long long
811
extract_nps_bitop_uimm8 (unsigned long long insn,
812
                         bool *invalid ATTRIBUTE_UNUSED)
813
2.32k
{
814
2.32k
  return (((insn >> 12) & 0x7) << 5) | (insn & 0x1f);
815
2.32k
}
816
817
static unsigned long long
818
insert_nps_rflt_uimm6 (unsigned long long  insn,
819
                       long long           value,
820
                       const char **       errmsg)
821
0
{
822
0
  switch (value)
823
0
    {
824
0
    case 1:
825
0
    case 2:
826
0
    case 4:
827
0
      break;
828
829
0
    default:
830
0
      *errmsg = _("invalid immediate, must be 1, 2, or 4");
831
0
      value = 0;
832
0
    }
833
834
0
  insn |= (value << 6);
835
0
  return insn;
836
0
}
837
838
static long long
839
extract_nps_rflt_uimm6 (unsigned long long insn,
840
      bool *invalid ATTRIBUTE_UNUSED)
841
324
{
842
324
  return (insn >> 6) & 0x3f;
843
324
}
844
845
static unsigned long long
846
insert_nps_dst_pos_and_size (unsigned long long  insn,
847
                             long long           value,
848
                             const char **       errmsg ATTRIBUTE_UNUSED)
849
0
{
850
0
  insn |= ((value & 0x1f) | (((32 - value - 1) & 0x1f) << 10));
851
0
  return insn;
852
0
}
853
854
static long long
855
extract_nps_dst_pos_and_size (unsigned long long insn,
856
                              bool *invalid ATTRIBUTE_UNUSED)
857
324
{
858
324
  return (insn & 0x1f);
859
324
}
860
861
static unsigned long long
862
insert_nps_cmem_uimm16 (unsigned long long  insn,
863
                        long long           value,
864
                        const char **       errmsg)
865
0
{
866
0
  int top = (value >> 16) & 0xffff;
867
868
0
  if (top != 0x0 && top != NPS_CMEM_HIGH_VALUE)
869
0
    *errmsg = _("invalid value for CMEM ld/st immediate");
870
0
  insn |= (value & 0xffff);
871
0
  return insn;
872
0
}
873
874
static long long
875
extract_nps_cmem_uimm16 (unsigned long long insn,
876
                         bool *invalid ATTRIBUTE_UNUSED)
877
3.27k
{
878
3.27k
  return (NPS_CMEM_HIGH_VALUE << 16) | (insn & 0xffff);
879
3.27k
}
880
881
static unsigned long long
882
insert_nps_imm_offset (unsigned long long  insn,
883
           long long           value,
884
           const char **       errmsg)
885
0
{
886
0
  switch (value)
887
0
    {
888
0
    case 0:
889
0
    case 16:
890
0
    case 32:
891
0
    case 48:
892
0
    case 64:
893
0
      value = value >> 4;
894
0
      break;
895
0
    default:
896
0
      *errmsg = _("invalid position, should be 0, 16, 32, 48 or 64.");
897
0
      value = 0;
898
0
    }
899
0
  insn |= (value << 10);
900
0
  return insn;
901
0
}
902
903
static long long
904
extract_nps_imm_offset (unsigned long long insn,
905
      bool *invalid ATTRIBUTE_UNUSED)
906
478
{
907
478
  return ((insn >> 10) & 0x7) * 16;
908
478
}
909
910
static unsigned long long
911
insert_nps_imm_entry (unsigned long long  insn,
912
          long long           value,
913
          const char **       errmsg)
914
0
{
915
0
  switch (value)
916
0
    {
917
0
    case 16:
918
0
      value = 0;
919
0
      break;
920
0
    case 32:
921
0
      value = 1;
922
0
      break;
923
0
    case 64:
924
0
      value = 2;
925
0
      break;
926
0
    case 128:
927
0
    value = 3;
928
0
    break;
929
0
    default:
930
0
      *errmsg = _("invalid position, should be 16, 32, 64 or 128.");
931
0
      value = 0;
932
0
    }
933
0
  insn |= (value << 2);
934
0
  return insn;
935
0
}
936
937
static long long
938
extract_nps_imm_entry (unsigned long long insn,
939
           bool *invalid ATTRIBUTE_UNUSED)
940
478
{
941
478
  int imm_entry = ((insn >> 2) & 0x7);
942
478
  return (1 << (imm_entry + 4));
943
478
}
944
945
static unsigned long long
946
insert_nps_size_16bit (unsigned long long  insn,
947
           long long           value,
948
           const char **       errmsg)
949
0
{
950
0
  if ((value < 1) || (value > 64))
951
0
    {
952
0
      *errmsg = _("invalid size value must be on range 1-64.");
953
0
      value = 0;
954
0
    }
955
0
  value = value & 0x3f;
956
0
  insn |= (value << 6);
957
0
  return insn;
958
0
}
959
960
static long long
961
extract_nps_size_16bit (unsigned long long insn,
962
      bool *invalid ATTRIBUTE_UNUSED)
963
974
{
964
974
  return ((insn & 0xfc0) >> 6) ? ((insn & 0xfc0) >> 6) : 64;
965
974
}
966
967
968
#define MAKE_SRC_POS_INSERT_EXTRACT_FUNCS(NAME,SHIFT)       \
969
static unsigned long long             \
970
insert_nps_##NAME##_pos (unsigned long long  insn,        \
971
       long long            value,        \
972
0
       const char **        errmsg)       \
973
0
{                                                             \
974
0
 switch (value)                                               \
975
0
   {                                                          \
976
0
   case 0:                                                    \
977
0
   case 8:                                                    \
978
0
   case 16:                                                   \
979
0
   case 24:                                                   \
980
0
     value = value / 8;                                       \
981
0
     break;                                                   \
982
0
   default:                                                   \
983
0
     *errmsg = _("invalid position, should be 0, 8, 16, or 24");       \
984
0
     value = 0;                                               \
985
0
  }                                                           \
986
0
  insn |= (value << SHIFT);                                   \
987
0
  return insn;                                                \
988
0
}                                                             \
Unexecuted instantiation: arc-opc.c:insert_nps_src2_pos
Unexecuted instantiation: arc-opc.c:insert_nps_src1_pos
989
                                                              \
990
static long long                                              \
991
extract_nps_##NAME##_pos (unsigned long long insn,        \
992
14.2k
                          bool *invalid ATTRIBUTE_UNUSED)     \
993
14.2k
{                                                             \
994
14.2k
  return ((insn >> SHIFT) & 0x3) * 8;                         \
995
14.2k
}
arc-opc.c:extract_nps_src2_pos
Line
Count
Source
992
11.6k
                          bool *invalid ATTRIBUTE_UNUSED)     \
993
11.6k
{                                                             \
994
11.6k
  return ((insn >> SHIFT) & 0x3) * 8;                         \
995
11.6k
}
arc-opc.c:extract_nps_src1_pos
Line
Count
Source
992
2.57k
                          bool *invalid ATTRIBUTE_UNUSED)     \
993
2.57k
{                                                             \
994
2.57k
  return ((insn >> SHIFT) & 0x3) * 8;                         \
995
2.57k
}
996
997
MAKE_SRC_POS_INSERT_EXTRACT_FUNCS (src2, 12)
998
MAKE_SRC_POS_INSERT_EXTRACT_FUNCS (src1, 10)
999
1000
#define MAKE_BIAS_INSERT_EXTRACT_FUNCS(NAME,LOWER,UPPER,BITS,BIAS,SHIFT) \
1001
static unsigned long long                                               \
1002
insert_nps_##NAME (unsigned long long  insn,        \
1003
       long long           value,       \
1004
       const char **       errmsg)        \
1005
0
  {                                                                     \
1006
0
    if (value < LOWER || value > UPPER)                                 \
1007
0
      {                                                                 \
1008
0
        *errmsg = _("invalid size, value must be "                      \
1009
0
                    #LOWER " to " #UPPER ".");                          \
1010
0
        return insn;                                                    \
1011
0
      }                                                                 \
1012
0
    value -= BIAS;                                                      \
1013
0
    insn |= (value << SHIFT);                                           \
1014
0
    return insn;                                                        \
1015
0
  }                                                                     \
Unexecuted instantiation: arc-opc.c:insert_nps_bitop_size
Unexecuted instantiation: arc-opc.c:insert_nps_addb_size
Unexecuted instantiation: arc-opc.c:insert_nps_andb_size
Unexecuted instantiation: arc-opc.c:insert_nps_fxorb_size
Unexecuted instantiation: arc-opc.c:insert_nps_wxorb_size
Unexecuted instantiation: arc-opc.c:insert_nps_qcmp_size
Unexecuted instantiation: arc-opc.c:insert_nps_bitop2_size
Unexecuted instantiation: arc-opc.c:insert_nps_bitop1_size
Unexecuted instantiation: arc-opc.c:insert_nps_hash_width
Unexecuted instantiation: arc-opc.c:insert_nps_hash_len
Unexecuted instantiation: arc-opc.c:insert_nps_index3
1016
                                                                        \
1017
static long long                                                        \
1018
extract_nps_##NAME (unsigned long long insn,        \
1019
31.5k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
31.5k
{                                                                       \
1021
31.5k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
31.5k
}
arc-opc.c:extract_nps_bitop_size
Line
Count
Source
1019
5.44k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
5.44k
{                                                                       \
1021
5.44k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
5.44k
}
arc-opc.c:extract_nps_addb_size
Line
Count
Source
1019
1.01k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
1.01k
{                                                                       \
1021
1.01k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
1.01k
}
arc-opc.c:extract_nps_andb_size
Line
Count
Source
1019
1.08k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
1.08k
{                                                                       \
1021
1.08k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
1.08k
}
arc-opc.c:extract_nps_fxorb_size
Line
Count
Source
1019
262
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
262
{                                                                       \
1021
262
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
262
}
arc-opc.c:extract_nps_wxorb_size
Line
Count
Source
1019
246
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
246
{                                                                       \
1021
246
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
246
}
arc-opc.c:extract_nps_qcmp_size
Line
Count
Source
1019
9.05k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
9.05k
{                                                                       \
1021
9.05k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
9.05k
}
arc-opc.c:extract_nps_bitop2_size
Line
Count
Source
1019
608
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
608
{                                                                       \
1021
608
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
608
}
arc-opc.c:extract_nps_bitop1_size
Line
Count
Source
1019
608
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
608
{                                                                       \
1021
608
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
608
}
arc-opc.c:extract_nps_hash_width
Line
Count
Source
1019
4.99k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
4.99k
{                                                                       \
1021
4.99k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
4.99k
}
arc-opc.c:extract_nps_hash_len
Line
Count
Source
1019
4.75k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
4.75k
{                                                                       \
1021
4.75k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
4.75k
}
arc-opc.c:extract_nps_index3
Line
Count
Source
1019
3.44k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1020
3.44k
{                                                                       \
1021
3.44k
  return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS;                  \
1022
3.44k
}
1023
1024
MAKE_BIAS_INSERT_EXTRACT_FUNCS (addb_size,2,32,5,1,5)
1025
MAKE_BIAS_INSERT_EXTRACT_FUNCS (andb_size,1,32,5,1,5)
1026
MAKE_BIAS_INSERT_EXTRACT_FUNCS (fxorb_size,8,32,5,8,5)
1027
MAKE_BIAS_INSERT_EXTRACT_FUNCS (wxorb_size,16,32,5,16,5)
1028
MAKE_BIAS_INSERT_EXTRACT_FUNCS (bitop_size,1,32,5,1,10)
1029
MAKE_BIAS_INSERT_EXTRACT_FUNCS (qcmp_size,1,8,3,1,9)
1030
MAKE_BIAS_INSERT_EXTRACT_FUNCS (bitop1_size,1,32,5,1,20)
1031
MAKE_BIAS_INSERT_EXTRACT_FUNCS (bitop2_size,1,32,5,1,25)
1032
MAKE_BIAS_INSERT_EXTRACT_FUNCS (hash_width,1,32,5,1,6)
1033
MAKE_BIAS_INSERT_EXTRACT_FUNCS (hash_len,1,8,3,1,2)
1034
MAKE_BIAS_INSERT_EXTRACT_FUNCS (index3,4,7,2,4,0)
1035
1036
static long long
1037
extract_nps_qcmp_m3 (unsigned long long insn,
1038
                     bool *invalid)
1039
20.9k
{
1040
20.9k
  int m3 = (insn >> 5) & 0xf;
1041
20.9k
  if (m3 == 0xf)
1042
17.1k
    *invalid = true;
1043
20.9k
  return m3;
1044
20.9k
}
1045
1046
static long long
1047
extract_nps_qcmp_m2 (unsigned long long insn,
1048
                     bool *invalid)
1049
11.5k
{
1050
11.5k
  bool tmp_invalid = false;
1051
11.5k
  int m2 = (insn >> 15) & 0x1;
1052
11.5k
  int m3 = extract_nps_qcmp_m3 (insn, &tmp_invalid);
1053
1054
11.5k
  if (m2 == 0 && m3 == 0xf)
1055
7.06k
    *invalid = true;
1056
11.5k
  return m2;
1057
11.5k
}
1058
1059
static long long
1060
extract_nps_qcmp_m1 (unsigned long long insn,
1061
                     bool *invalid)
1062
6.55k
{
1063
6.55k
  bool tmp_invalid = false;
1064
6.55k
  int m1 = (insn >> 14) & 0x1;
1065
6.55k
  int m2 = extract_nps_qcmp_m2 (insn, &tmp_invalid);
1066
6.55k
  int m3 = extract_nps_qcmp_m3 (insn, &tmp_invalid);
1067
1068
6.55k
  if (m1 == 0 && m2 == 0 && m3 == 0xf)
1069
3.75k
    *invalid = true;
1070
6.55k
  return m1;
1071
6.55k
}
1072
1073
static unsigned long long
1074
insert_nps_calc_entry_size (unsigned long long  insn,
1075
                            long long           value,
1076
                            const char **       errmsg)
1077
0
{
1078
0
  unsigned pwr;
1079
1080
0
  if (value < 1 || value > 256)
1081
0
    {
1082
0
      *errmsg = _("value out of range 1 - 256");
1083
0
      return 0;
1084
0
    }
1085
1086
0
  for (pwr = 0; (value & 1) == 0; value >>= 1)
1087
0
    ++pwr;
1088
1089
0
  if (value != 1)
1090
0
    {
1091
0
      *errmsg = _("value must be power of 2");
1092
0
      return 0;
1093
0
    }
1094
1095
0
  return insn | (pwr << 8);
1096
0
}
1097
1098
static long long
1099
extract_nps_calc_entry_size (unsigned long long insn,
1100
                             bool *invalid ATTRIBUTE_UNUSED)
1101
312
{
1102
312
  unsigned entry_size = (insn >> 8) & 0xf;
1103
312
  return 1 << entry_size;
1104
312
}
1105
1106
static unsigned long long
1107
insert_nps_bitop_mod4 (unsigned long long  insn,
1108
                           long long       value,
1109
                           const char **   errmsg ATTRIBUTE_UNUSED)
1110
0
{
1111
0
  return insn | ((value & 0x2) << 30) | ((value & 0x1) << 47);
1112
0
}
1113
1114
static long long
1115
extract_nps_bitop_mod4 (unsigned long long insn,
1116
                            bool *invalid ATTRIBUTE_UNUSED)
1117
5.42k
{
1118
5.42k
  return ((insn >> 30) & 0x2) | ((insn >> 47) & 0x1);
1119
5.42k
}
1120
1121
static unsigned long long
1122
insert_nps_bitop_dst_pos3_pos4 (unsigned long long  insn,
1123
                                long long           value,
1124
                                const char **       errmsg ATTRIBUTE_UNUSED)
1125
0
{
1126
0
  return insn | (value << 42) | (value << 37);
1127
0
}
1128
1129
static long long
1130
extract_nps_bitop_dst_pos3_pos4 (unsigned long long insn,
1131
                                 bool *invalid)
1132
1.68k
{
1133
1.68k
  if (((insn >> 42) & 0x1f) != ((insn >> 37) & 0x1f))
1134
1.16k
    *invalid = true;
1135
1.68k
  return ((insn >> 37) & 0x1f);
1136
1.68k
}
1137
1138
static unsigned long long
1139
insert_nps_bitop_ins_ext (unsigned long long  insn,
1140
                          long long           value,
1141
                          const char **       errmsg)
1142
0
{
1143
0
  if (value < 0 || value > 28)
1144
0
    *errmsg = _("value must be in the range 0 to 28");
1145
0
  return insn | (value << 20);
1146
0
}
1147
1148
static long long
1149
extract_nps_bitop_ins_ext (unsigned long long insn,
1150
                           bool *invalid)
1151
1.52k
{
1152
1.52k
  int value = (insn >> 20) & 0x1f;
1153
1154
1.52k
  if (value > 28)
1155
480
    *invalid = true;
1156
1.52k
  return value;
1157
1.52k
}
1158
1159
#define MAKE_1BASED_INSERT_EXTRACT_FUNCS(NAME,SHIFT,UPPER,BITS)         \
1160
static unsigned long long           \
1161
insert_nps_##NAME (unsigned long long  insn,        \
1162
       long long           value,                           \
1163
0
       const char **       errmsg)        \
1164
0
{                                                                       \
1165
0
  if (value < 1 || value > UPPER)                                       \
1166
0
    *errmsg = _("value must be in the range 1 to " #UPPER);             \
1167
0
  if (value == UPPER)                                                   \
1168
0
    value = 0;                                                          \
1169
0
  return insn | (value << SHIFT);                                       \
1170
0
}                                                                       \
Unexecuted instantiation: arc-opc.c:insert_nps_field_size
Unexecuted instantiation: arc-opc.c:insert_nps_shift_factor
Unexecuted instantiation: arc-opc.c:insert_nps_bits_to_scramble
Unexecuted instantiation: arc-opc.c:insert_nps_bdlen_max_len
Unexecuted instantiation: arc-opc.c:insert_nps_bd_num_buff
Unexecuted instantiation: arc-opc.c:insert_nps_pmu_num_job
Unexecuted instantiation: arc-opc.c:insert_nps_proto_size
1171
                                                                        \
1172
static long long              \
1173
extract_nps_##NAME (unsigned long long insn,        \
1174
5.14k
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
5.14k
{                                                                       \
1176
5.14k
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
5.14k
  if (value == 0)                                                       \
1178
5.14k
    value = UPPER;                                                      \
1179
5.14k
  return value;                                                         \
1180
5.14k
}
arc-opc.c:extract_nps_field_size
Line
Count
Source
1174
922
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
922
{                                                                       \
1176
922
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
922
  if (value == 0)                                                       \
1178
922
    value = UPPER;                                                      \
1179
922
  return value;                                                         \
1180
922
}
arc-opc.c:extract_nps_shift_factor
Line
Count
Source
1174
922
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
922
{                                                                       \
1176
922
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
922
  if (value == 0)                                                       \
1178
922
    value = UPPER;                                                      \
1179
922
  return value;                                                         \
1180
922
}
arc-opc.c:extract_nps_bits_to_scramble
Line
Count
Source
1174
482
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
482
{                                                                       \
1176
482
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
482
  if (value == 0)                                                       \
1178
482
    value = UPPER;                                                      \
1179
482
  return value;                                                         \
1180
482
}
arc-opc.c:extract_nps_bdlen_max_len
Line
Count
Source
1174
558
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
558
{                                                                       \
1176
558
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
558
  if (value == 0)                                                       \
1178
558
    value = UPPER;                                                      \
1179
558
  return value;                                                         \
1180
558
}
arc-opc.c:extract_nps_bd_num_buff
Line
Count
Source
1174
772
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
772
{                                                                       \
1176
772
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
772
  if (value == 0)                                                       \
1178
772
    value = UPPER;                                                      \
1179
772
  return value;                                                         \
1180
772
}
arc-opc.c:extract_nps_pmu_num_job
Line
Count
Source
1174
496
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
496
{                                                                       \
1176
496
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
496
  if (value == 0)                                                       \
1178
496
    value = UPPER;                                                      \
1179
496
  return value;                                                         \
1180
496
}
arc-opc.c:extract_nps_proto_size
Line
Count
Source
1174
994
                    bool *invalid ATTRIBUTE_UNUSED)     \
1175
994
{                                                                       \
1176
994
  int value = (insn >> SHIFT) & ((1 << BITS) - 1);                      \
1177
994
  if (value == 0)                                                       \
1178
994
    value = UPPER;                                                      \
1179
994
  return value;                                                         \
1180
994
}
1181
1182
MAKE_1BASED_INSERT_EXTRACT_FUNCS (field_size, 6, 8, 3)
1183
MAKE_1BASED_INSERT_EXTRACT_FUNCS (shift_factor, 9, 8, 3)
1184
MAKE_1BASED_INSERT_EXTRACT_FUNCS (bits_to_scramble, 12, 8, 3)
1185
MAKE_1BASED_INSERT_EXTRACT_FUNCS (bdlen_max_len, 5, 256, 8)
1186
MAKE_1BASED_INSERT_EXTRACT_FUNCS (bd_num_buff, 6, 8, 3)
1187
MAKE_1BASED_INSERT_EXTRACT_FUNCS (pmu_num_job, 6, 4, 2)
1188
MAKE_1BASED_INSERT_EXTRACT_FUNCS (proto_size, 16, 64, 6)
1189
1190
static unsigned long long
1191
insert_nps_min_hofs (unsigned long long  insn,
1192
                     long long           value,
1193
                     const char **       errmsg)
1194
0
{
1195
0
  if (value < 0 || value > 240)
1196
0
    *errmsg = _("value must be in the range 0 to 240");
1197
0
  if ((value % 16) != 0)
1198
0
    *errmsg = _("value must be a multiple of 16");
1199
0
  value = value / 16;
1200
0
  return insn | (value << 6);
1201
0
}
1202
1203
static long long
1204
extract_nps_min_hofs (unsigned long long insn,
1205
                      bool *invalid ATTRIBUTE_UNUSED)
1206
802
{
1207
802
  int value = (insn >> 6) & 0xF;
1208
802
  return value * 16;
1209
802
}
1210
1211
#define MAKE_INSERT_NPS_ADDRTYPE(NAME, VALUE)                          \
1212
static unsigned long long                                              \
1213
insert_nps_##NAME (unsigned long long  insn,             \
1214
                   long long           value,            \
1215
0
                   const char **       errmsg)             \
1216
0
{                                                                      \
1217
0
  if (value != ARC_NPS400_ADDRTYPE_##VALUE)                            \
1218
0
    *errmsg = _("invalid address type for operand");                   \
1219
0
  return insn;                                                         \
1220
0
}                                                                      \
Unexecuted instantiation: arc-opc.c:insert_nps_bd
Unexecuted instantiation: arc-opc.c:insert_nps_jid
Unexecuted instantiation: arc-opc.c:insert_nps_lbd
Unexecuted instantiation: arc-opc.c:insert_nps_mbd
Unexecuted instantiation: arc-opc.c:insert_nps_sd
Unexecuted instantiation: arc-opc.c:insert_nps_sm
Unexecuted instantiation: arc-opc.c:insert_nps_xa
Unexecuted instantiation: arc-opc.c:insert_nps_xd
Unexecuted instantiation: arc-opc.c:insert_nps_cd
Unexecuted instantiation: arc-opc.c:insert_nps_cbd
Unexecuted instantiation: arc-opc.c:insert_nps_cjid
Unexecuted instantiation: arc-opc.c:insert_nps_clbd
Unexecuted instantiation: arc-opc.c:insert_nps_cm
Unexecuted instantiation: arc-opc.c:insert_nps_csd
Unexecuted instantiation: arc-opc.c:insert_nps_cxa
Unexecuted instantiation: arc-opc.c:insert_nps_cxd
1221
                                                                       \
1222
static long long                   \
1223
extract_nps_##NAME (unsigned long long insn ATTRIBUTE_UNUSED,        \
1224
7.71k
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
7.71k
{                                                                      \
1226
7.71k
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
7.71k
}
Unexecuted instantiation: arc-opc.c:extract_nps_bd
arc-opc.c:extract_nps_jid
Line
Count
Source
1224
188
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
188
{                                                                      \
1226
188
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
188
}
Unexecuted instantiation: arc-opc.c:extract_nps_lbd
Unexecuted instantiation: arc-opc.c:extract_nps_mbd
arc-opc.c:extract_nps_sd
Line
Count
Source
1224
500
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
500
{                                                                      \
1226
500
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
500
}
Unexecuted instantiation: arc-opc.c:extract_nps_sm
arc-opc.c:extract_nps_xa
Line
Count
Source
1224
194
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
194
{                                                                      \
1226
194
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
194
}
arc-opc.c:extract_nps_xd
Line
Count
Source
1224
214
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
214
{                                                                      \
1226
214
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
214
}
Unexecuted instantiation: arc-opc.c:extract_nps_cd
Unexecuted instantiation: arc-opc.c:extract_nps_cbd
arc-opc.c:extract_nps_cjid
Line
Count
Source
1224
293
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
293
{                                                                      \
1226
293
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
293
}
Unexecuted instantiation: arc-opc.c:extract_nps_clbd
arc-opc.c:extract_nps_cm
Line
Count
Source
1224
6.33k
        bool *invalid ATTRIBUTE_UNUSED)          \
1225
6.33k
{                                                                      \
1226
6.33k
  return ARC_NPS400_ADDRTYPE_##VALUE;                                  \
1227
6.33k
}
Unexecuted instantiation: arc-opc.c:extract_nps_csd
Unexecuted instantiation: arc-opc.c:extract_nps_cxa
Unexecuted instantiation: arc-opc.c:extract_nps_cxd
1228
1229
MAKE_INSERT_NPS_ADDRTYPE (bd, BD)
1230
MAKE_INSERT_NPS_ADDRTYPE (jid, JID)
1231
MAKE_INSERT_NPS_ADDRTYPE (lbd, LBD)
1232
MAKE_INSERT_NPS_ADDRTYPE (mbd, MBD)
1233
MAKE_INSERT_NPS_ADDRTYPE (sd, SD)
1234
MAKE_INSERT_NPS_ADDRTYPE (sm, SM)
1235
MAKE_INSERT_NPS_ADDRTYPE (xa, XA)
1236
MAKE_INSERT_NPS_ADDRTYPE (xd, XD)
1237
MAKE_INSERT_NPS_ADDRTYPE (cd, CD)
1238
MAKE_INSERT_NPS_ADDRTYPE (cbd, CBD)
1239
MAKE_INSERT_NPS_ADDRTYPE (cjid, CJID)
1240
MAKE_INSERT_NPS_ADDRTYPE (clbd, CLBD)
1241
MAKE_INSERT_NPS_ADDRTYPE (cm, CM)
1242
MAKE_INSERT_NPS_ADDRTYPE (csd, CSD)
1243
MAKE_INSERT_NPS_ADDRTYPE (cxa, CXA)
1244
MAKE_INSERT_NPS_ADDRTYPE (cxd, CXD)
1245
1246
static unsigned long long
1247
insert_nps_rbdouble_64 (unsigned long long  insn,
1248
                        long long           value,
1249
                        const char **       errmsg)
1250
0
{
1251
0
  if (value < 0 || value > 31)
1252
0
    *errmsg = _("value must be in the range 0 to 31");
1253
0
  return insn | (value << 43) | (value << 48);
1254
0
}
1255
1256
1257
static long long
1258
extract_nps_rbdouble_64 (unsigned long long insn,
1259
                         bool *invalid)
1260
994
{
1261
994
  int value1 = (insn >> 43) & 0x1F;
1262
994
  int value2 = (insn >> 48) & 0x1F;
1263
1264
994
  if (value1 != value2)
1265
534
    *invalid = true;
1266
1267
994
  return value1;
1268
994
}
1269
1270
static unsigned long long
1271
insert_nps_misc_imm_offset (unsigned long long  insn,
1272
          long long           value,
1273
          const char **       errmsg)
1274
0
{
1275
0
  if (value & 0x3)
1276
0
    {
1277
0
      *errmsg = _("invalid position, should be one of: 0,4,8,...124.");
1278
0
      value = 0;
1279
0
    }
1280
0
  insn |= (value << 6);
1281
0
  return insn;
1282
0
}
1283
1284
static long long int
1285
extract_nps_misc_imm_offset (unsigned long long insn,
1286
           bool *invalid ATTRIBUTE_UNUSED)
1287
474
{
1288
474
  return ((insn >> 8) & 0x1f) * 4;
1289
474
}
1290
1291
static long long int
1292
extract_uimm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
1293
       bool *invalid ATTRIBUTE_UNUSED)
1294
204
{
1295
204
  int value = 0;
1296
1297
204
  value |= ((insn >> 6) & 0x003f) << 0;
1298
204
  value |= ((insn >> 0) & 0x003f) << 6;
1299
1300
204
  return value;
1301
204
}
1302
1303
/* Include the generic extract/insert functions.  Order is important
1304
   as some of the functions present in the .h may be disabled via
1305
   defines.  */
1306
#include "arc-fxi.h"
1307
1308
/* The flag operands table.
1309
1310
   The format of the table is
1311
   NAME CODE BITS SHIFT FAVAIL.  */
1312
const struct arc_flag_operand arc_flag_operands[] =
1313
{
1314
#define F_NULL  0
1315
  { 0, 0, 0, 0, 0},
1316
#define F_ALWAYS    (F_NULL + 1)
1317
  { "al", 0, 0, 0, 0 },
1318
#define F_RA      (F_ALWAYS + 1)
1319
  { "ra", 0, 0, 0, 0 },
1320
#define F_EQUAL     (F_RA + 1)
1321
  { "eq", 1, 5, 0, 1 },
1322
#define F_ZERO      (F_EQUAL + 1)
1323
  { "z",  1, 5, 0, 0 },
1324
#define F_NOTEQUAL  (F_ZERO + 1)
1325
  { "ne", 2, 5, 0, 1 },
1326
#define F_NOTZERO   (F_NOTEQUAL + 1)
1327
  { "nz", 2, 5, 0, 0 },
1328
#define F_POZITIVE  (F_NOTZERO + 1)
1329
  { "p",  3, 5, 0, 1 },
1330
#define F_PL      (F_POZITIVE + 1)
1331
  { "pl", 3, 5, 0, 0 },
1332
#define F_NEGATIVE  (F_PL + 1)
1333
  { "n",  4, 5, 0, 1 },
1334
#define F_MINUS     (F_NEGATIVE + 1)
1335
  { "mi", 4, 5, 0, 0 },
1336
#define F_CARRY     (F_MINUS + 1)
1337
  { "c",  5, 5, 0, 1 },
1338
#define F_CARRYSET  (F_CARRY + 1)
1339
  { "cs", 5, 5, 0, 0 },
1340
#define F_LOWER     (F_CARRYSET + 1)
1341
  { "lo", 5, 5, 0, 0 },
1342
#define F_CARRYCLR  (F_LOWER + 1)
1343
  { "cc", 6, 5, 0, 0 },
1344
#define F_NOTCARRY (F_CARRYCLR + 1)
1345
  { "nc", 6, 5, 0, 1 },
1346
#define F_HIGHER   (F_NOTCARRY + 1)
1347
  { "hs", 6, 5, 0, 0 },
1348
#define F_OVERFLOWSET (F_HIGHER + 1)
1349
  { "vs", 7, 5, 0, 0 },
1350
#define F_OVERFLOW (F_OVERFLOWSET + 1)
1351
  { "v",  7, 5, 0, 1 },
1352
#define F_NOTOVERFLOW (F_OVERFLOW + 1)
1353
  { "nv", 8, 5, 0, 1 },
1354
#define F_OVERFLOWCLR (F_NOTOVERFLOW + 1)
1355
  { "vc", 8, 5, 0, 0 },
1356
#define F_GT     (F_OVERFLOWCLR + 1)
1357
  { "gt", 9, 5, 0, 1 },
1358
#define F_GE     (F_GT + 1)
1359
  { "ge", 10, 5, 0, 1 },
1360
#define F_LT     (F_GE + 1)
1361
  { "lt", 11, 5, 0, 1 },
1362
#define F_LE     (F_LT + 1)
1363
  { "le", 12, 5, 0, 1 },
1364
#define F_HI     (F_LE + 1)
1365
  { "hi", 13, 5, 0, 1 },
1366
#define F_LS     (F_HI + 1)
1367
  { "ls", 14, 5, 0, 1 },
1368
#define F_PNZ    (F_LS + 1)
1369
  { "pnz", 15, 5, 0, 1 },
1370
#define F_NJ     (F_PNZ + 1)
1371
  { "nj", 21, 5, 0, 1 },
1372
#define F_NM     (F_NJ + 1)
1373
  { "nm", 23, 5, 0, 1 },
1374
#define F_NO_T     (F_NM + 1)
1375
  { "nt", 24, 5, 0, 1 },
1376
1377
  /* FLAG.  */
1378
#define F_FLAG     (F_NO_T + 1)
1379
  { "f",  1, 1, 15, 1 },
1380
#define F_FFAKE     (F_FLAG + 1)
1381
  { "f",  0, 0, 0, 1 },
1382
1383
  /* Delay slot.  */
1384
#define F_ND     (F_FFAKE + 1)
1385
  { "nd", 0, 1, 5, 0 },
1386
#define F_D    (F_ND + 1)
1387
  { "d",  1, 1, 5, 1 },
1388
#define F_DFAKE    (F_D + 1)
1389
  { "d",  0, 0, 0, 1 },
1390
#define F_DNZ_ND   (F_DFAKE + 1)
1391
  { "nd", 0, 1, 16, 0 },
1392
#define F_DNZ_D    (F_DNZ_ND + 1)
1393
  { "d",  1, 1, 16, 1 },
1394
1395
  /* Data size.  */
1396
#define F_SIZEB1   (F_DNZ_D + 1)
1397
  { "b", 1, 2, 1, 1 },
1398
#define F_SIZEB7   (F_SIZEB1 + 1)
1399
  { "b", 1, 2, 7, 1 },
1400
#define F_SIZEB17  (F_SIZEB7 + 1)
1401
  { "b", 1, 2, 17, 1 },
1402
#define F_SIZEW1   (F_SIZEB17 + 1)
1403
  { "w", 2, 2, 1, 0 },
1404
#define F_SIZEW7   (F_SIZEW1 + 1)
1405
  { "w", 2, 2, 7, 0 },
1406
#define F_SIZEW17  (F_SIZEW7 + 1)
1407
  { "w", 2, 2, 17, 0 },
1408
1409
  /* Sign extension.  */
1410
#define F_SIGN6   (F_SIZEW17 + 1)
1411
  { "x", 1, 1, 6, 1 },
1412
#define F_SIGN16  (F_SIGN6 + 1)
1413
  { "x", 1, 1, 16, 1 },
1414
#define F_SIGNX   (F_SIGN16 + 1)
1415
  { "x", 0, 0, 0, 1 },
1416
1417
  /* Address write-back modes.  */
1418
#define F_A3       (F_SIGNX + 1)
1419
  { "a", 1, 2, 3, 0 },
1420
#define F_A9       (F_A3 + 1)
1421
  { "a", 1, 2, 9, 0 },
1422
#define F_A22      (F_A9 + 1)
1423
  { "a", 1, 2, 22, 0 },
1424
#define F_AW3      (F_A22 + 1)
1425
  { "aw", 1, 2, 3, 1 },
1426
#define F_AW9      (F_AW3 + 1)
1427
  { "aw", 1, 2, 9, 1 },
1428
#define F_AW22     (F_AW9 + 1)
1429
  { "aw", 1, 2, 22, 1 },
1430
#define F_AB3      (F_AW22 + 1)
1431
  { "ab", 2, 2, 3, 1 },
1432
#define F_AB9      (F_AB3 + 1)
1433
  { "ab", 2, 2, 9, 1 },
1434
#define F_AB22     (F_AB9 + 1)
1435
  { "ab", 2, 2, 22, 1 },
1436
#define F_AS3      (F_AB22 + 1)
1437
  { "as", 3, 2, 3, 1 },
1438
#define F_AS9      (F_AS3 + 1)
1439
  { "as", 3, 2, 9, 1 },
1440
#define F_AS22     (F_AS9 + 1)
1441
  { "as", 3, 2, 22, 1 },
1442
#define F_ASFAKE   (F_AS22 + 1)
1443
  { "as", 0, 0, 0, 1 },
1444
1445
  /* Cache bypass.  */
1446
#define F_DI5     (F_ASFAKE + 1)
1447
  { "di", 1, 1, 5, 1 },
1448
#define F_DI11    (F_DI5 + 1)
1449
  { "di", 1, 1, 11, 1 },
1450
#define F_DI14    (F_DI11 + 1)
1451
  { "di", 1, 1, 14, 1 },
1452
#define F_DI15    (F_DI14 + 1)
1453
  { "di", 1, 1, 15, 1 },
1454
1455
  /* ARCv2 specific.  */
1456
#define F_NT     (F_DI15 + 1)
1457
  { "nt", 0, 1, 3, 1},
1458
#define F_T      (F_NT + 1)
1459
  { "t", 1, 1, 3, 1},
1460
#define F_H1     (F_T + 1)
1461
  { "h", 2, 2, 1, 1 },
1462
#define F_H7     (F_H1 + 1)
1463
  { "h", 2, 2, 7, 1 },
1464
#define F_H17    (F_H7 + 1)
1465
  { "h", 2, 2, 17, 1 },
1466
#define F_SIZED  (F_H17 + 1)
1467
  { "dd", 8, 0, 0, 0 },  /* Fake.  */
1468
1469
  /* Fake Flags.  */
1470
#define F_NE   (F_SIZED + 1)
1471
  { "ne", 0, 0, 0, 1 },
1472
1473
  /* ARC NPS400 Support: See comment near head of file.  */
1474
#define F_NPS_CL (F_NE + 1)
1475
  { "cl", 0, 0, 0, 1 },
1476
1477
#define F_NPS_NA (F_NPS_CL + 1)
1478
  { "na", 1, 1, 9, 1 },
1479
1480
#define F_NPS_SR (F_NPS_NA + 1)
1481
  { "s", 1, 1, 13, 1 },
1482
1483
#define F_NPS_M (F_NPS_SR + 1)
1484
  { "m", 1, 1, 7, 1 },
1485
1486
#define F_NPS_FLAG (F_NPS_M + 1)
1487
  { "f", 1, 1, 20, 1 },
1488
1489
#define F_NPS_R     (F_NPS_FLAG + 1)
1490
  { "r",  1, 1, 15, 1 },
1491
1492
#define F_NPS_RW     (F_NPS_R + 1)
1493
  { "rw", 0, 1, 7, 1 },
1494
1495
#define F_NPS_RD     (F_NPS_RW + 1)
1496
  { "rd", 1, 1, 7, 1 },
1497
1498
#define F_NPS_WFT     (F_NPS_RD + 1)
1499
  { "wft", 0, 0, 0, 1 },
1500
1501
#define F_NPS_IE1     (F_NPS_WFT + 1)
1502
  { "ie1", 1, 2, 8, 1 },
1503
1504
#define F_NPS_IE2     (F_NPS_IE1 + 1)
1505
  { "ie2", 2, 2, 8, 1 },
1506
1507
#define F_NPS_IE12     (F_NPS_IE2 + 1)
1508
  { "ie12", 3, 2, 8, 1 },
1509
1510
#define F_NPS_SYNC_RD     (F_NPS_IE12 + 1)
1511
  { "rd", 0, 1, 6, 1 },
1512
1513
#define F_NPS_SYNC_WR     (F_NPS_SYNC_RD + 1)
1514
  { "wr", 1, 1, 6, 1 },
1515
1516
#define F_NPS_HWS_OFF     (F_NPS_SYNC_WR + 1)
1517
  { "off", 0, 0, 0, 1 },
1518
1519
#define F_NPS_HWS_RESTORE     (F_NPS_HWS_OFF + 1)
1520
  { "restore", 0, 0, 0, 1 },
1521
1522
#define F_NPS_SX     (F_NPS_HWS_RESTORE + 1)
1523
  { "sx",  1, 1, 14, 1 },
1524
1525
#define F_NPS_AR     (F_NPS_SX + 1)
1526
  { "ar",  0, 1, 0, 1 },
1527
1528
#define F_NPS_AL     (F_NPS_AR + 1)
1529
  { "al",  1, 1, 0, 1 },
1530
1531
#define F_NPS_S      (F_NPS_AL + 1)
1532
  { "s",   0, 0, 0, 1 },
1533
1534
#define F_NPS_ZNCV_RD      (F_NPS_S + 1)
1535
  { "rd",  0, 1, 15, 1 },
1536
1537
#define F_NPS_ZNCV_WR      (F_NPS_ZNCV_RD + 1)
1538
  { "wr",  1, 1, 15, 1 },
1539
1540
#define F_NPS_P0      (F_NPS_ZNCV_WR + 1)
1541
  { "p0", 0, 0, 0, 1 },
1542
1543
#define F_NPS_P1      (F_NPS_P0 + 1)
1544
  { "p1", 0, 0, 0, 1 },
1545
1546
#define F_NPS_P2      (F_NPS_P1 + 1)
1547
  { "p2", 0, 0, 0, 1 },
1548
1549
#define F_NPS_P3      (F_NPS_P2 + 1)
1550
  { "p3", 0, 0, 0, 1 },
1551
1552
#define F_NPS_LDBIT_DI      (F_NPS_P3 + 1)
1553
  { "di", 0, 0, 0, 1 },
1554
1555
#define F_NPS_LDBIT_CL1      (F_NPS_LDBIT_DI + 1)
1556
  { "cl", 1, 1, 6, 1 },
1557
1558
#define F_NPS_LDBIT_CL2      (F_NPS_LDBIT_CL1 + 1)
1559
  { "cl", 1, 1, 16, 1 },
1560
1561
#define F_NPS_LDBIT_X2_1      (F_NPS_LDBIT_CL2 + 1)
1562
  { "x2", 1, 2, 9, 1 },
1563
1564
#define F_NPS_LDBIT_X2_2      (F_NPS_LDBIT_X2_1 + 1)
1565
  { "x2", 1, 2, 22, 1 },
1566
1567
#define F_NPS_LDBIT_X4_1      (F_NPS_LDBIT_X2_2 + 1)
1568
  { "x4", 2, 2, 9, 1 },
1569
1570
#define F_NPS_LDBIT_X4_2      (F_NPS_LDBIT_X4_1 + 1)
1571
  { "x4", 2, 2, 22, 1 },
1572
1573
#define F_NPS_CORE     (F_NPS_LDBIT_X4_2 + 1)
1574
  { "core", 1, 3, 6, 1 },
1575
1576
#define F_NPS_CLSR     (F_NPS_CORE + 1)
1577
  { "clsr", 2, 3, 6, 1 },
1578
1579
#define F_NPS_ALL     (F_NPS_CLSR + 1)
1580
  { "all", 3, 3, 6, 1 },
1581
1582
#define F_NPS_GIC     (F_NPS_ALL + 1)
1583
  { "gic", 4, 3, 6, 1 },
1584
1585
#define F_NPS_RSPI_GIC     (F_NPS_GIC + 1)
1586
  { "gic", 5, 3, 6, 1 },
1587
};
1588
1589
const unsigned arc_num_flag_operands = ARRAY_SIZE (arc_flag_operands);
1590
1591
/* Table of the flag classes.
1592
1593
   The format of the table is
1594
   CLASS {FLAG_CODE}.  */
1595
const struct arc_flag_class arc_flag_classes[] =
1596
{
1597
#define C_EMPTY     0
1598
  { F_CLASS_NONE, { F_NULL } },
1599
1600
#define C_CC_EQ     (C_EMPTY + 1)
1601
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_EQUAL, F_NULL} },
1602
1603
#define C_CC_GE     (C_CC_EQ + 1)
1604
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_GE, F_NULL} },
1605
1606
#define C_CC_GT     (C_CC_GE + 1)
1607
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_GT, F_NULL} },
1608
1609
#define C_CC_HI     (C_CC_GT + 1)
1610
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_HI, F_NULL} },
1611
1612
#define C_CC_HS     (C_CC_HI + 1)
1613
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_NOTCARRY, F_NULL} },
1614
1615
#define C_CC_LE     (C_CC_HS + 1)
1616
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_LE, F_NULL} },
1617
1618
#define C_CC_LO     (C_CC_LE + 1)
1619
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_CARRY, F_NULL} },
1620
1621
#define C_CC_LS     (C_CC_LO + 1)
1622
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_LS, F_NULL} },
1623
1624
#define C_CC_LT     (C_CC_LS + 1)
1625
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_LT, F_NULL} },
1626
1627
#define C_CC_NE     (C_CC_LT + 1)
1628
  {F_CLASS_IMPLICIT | F_CLASS_COND, {F_NOTEQUAL, F_NULL} },
1629
1630
#define C_AA_AB     (C_CC_NE + 1)
1631
  {F_CLASS_IMPLICIT | F_CLASS_WB, {F_AB3, F_NULL} },
1632
1633
#define C_AA_AW     (C_AA_AB + 1)
1634
  {F_CLASS_IMPLICIT | F_CLASS_WB, {F_AW3, F_NULL} },
1635
1636
#define C_ZZ_D      (C_AA_AW + 1)
1637
  {F_CLASS_IMPLICIT | F_CLASS_ZZ, {F_SIZED, F_NULL} },
1638
1639
#define C_ZZ_H      (C_ZZ_D + 1)
1640
  {F_CLASS_IMPLICIT | F_CLASS_ZZ, {F_H1, F_NULL} },
1641
1642
#define C_ZZ_B      (C_ZZ_H + 1)
1643
  {F_CLASS_IMPLICIT | F_CLASS_ZZ, {F_SIZEB1, F_NULL} },
1644
1645
#define C_CC      (C_ZZ_B + 1)
1646
  { F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND,
1647
    { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL,
1648
      F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS,
1649
      F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1650
      F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW,
1651
      F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT,
1652
      F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T, F_NULL } },
1653
1654
#define C_AA_ADDR3  (C_CC + 1)
1655
#define C_AA27      (C_CC + 1)
1656
  { F_CLASS_OPTIONAL | F_CLASS_WB, { F_A3, F_AW3, F_AB3, F_AS3, F_NULL } },
1657
#define C_AA_ADDR9  (C_AA_ADDR3 + 1)
1658
#define C_AA21       (C_AA_ADDR3 + 1)
1659
  { F_CLASS_OPTIONAL | F_CLASS_WB, { F_A9, F_AW9, F_AB9, F_AS9, F_NULL } },
1660
#define C_AA_ADDR22 (C_AA_ADDR9 + 1)
1661
#define C_AA8    (C_AA_ADDR9 + 1)
1662
  { F_CLASS_OPTIONAL | F_CLASS_WB, { F_A22, F_AW22, F_AB22, F_AS22, F_NULL } },
1663
1664
#define C_F     (C_AA_ADDR22 + 1)
1665
  { F_CLASS_OPTIONAL, { F_FLAG, F_NULL } },
1666
#define C_FHARD     (C_F + 1)
1667
  { F_CLASS_OPTIONAL, { F_FFAKE, F_NULL } },
1668
1669
#define C_T     (C_FHARD + 1)
1670
  { F_CLASS_OPTIONAL, { F_NT, F_T, F_NULL } },
1671
#define C_D     (C_T + 1)
1672
  { F_CLASS_OPTIONAL, { F_ND, F_D, F_NULL } },
1673
#define C_DNZ_D     (C_D + 1)
1674
  { F_CLASS_OPTIONAL, { F_DNZ_ND, F_DNZ_D, F_NULL } },
1675
1676
#define C_DHARD     (C_DNZ_D + 1)
1677
  { F_CLASS_OPTIONAL, { F_DFAKE, F_NULL } },
1678
1679
#define C_DI20      (C_DHARD + 1)
1680
  { F_CLASS_OPTIONAL, { F_DI11, F_NULL }},
1681
#define C_DI14      (C_DI20 + 1)
1682
  { F_CLASS_OPTIONAL, { F_DI14, F_NULL }},
1683
#define C_DI16      (C_DI14 + 1)
1684
  { F_CLASS_OPTIONAL, { F_DI15, F_NULL }},
1685
#define C_DI26      (C_DI16 + 1)
1686
  { F_CLASS_OPTIONAL, { F_DI5, F_NULL }},
1687
1688
#define C_X25     (C_DI26 + 1)
1689
  { F_CLASS_OPTIONAL, { F_SIGN6, F_NULL }},
1690
#define C_X15    (C_X25 + 1)
1691
  { F_CLASS_OPTIONAL, { F_SIGN16, F_NULL }},
1692
#define C_XHARD    (C_X15 + 1)
1693
#define C_X    (C_X15 + 1)
1694
  { F_CLASS_OPTIONAL, { F_SIGNX, F_NULL }},
1695
1696
#define C_ZZ13        (C_X + 1)
1697
  { F_CLASS_OPTIONAL, { F_SIZEB17, F_SIZEW17, F_H17, F_NULL}},
1698
#define C_ZZ23        (C_ZZ13 + 1)
1699
  { F_CLASS_OPTIONAL, { F_SIZEB7, F_SIZEW7, F_H7, F_NULL}},
1700
#define C_ZZ29        (C_ZZ23 + 1)
1701
  { F_CLASS_OPTIONAL, { F_SIZEB1, F_SIZEW1, F_H1, F_NULL}},
1702
1703
#define C_AS      (C_ZZ29 + 1)
1704
  { F_CLASS_OPTIONAL, { F_ASFAKE, F_NULL}},
1705
1706
#define C_NE      (C_AS + 1)
1707
  { F_CLASS_REQUIRED, { F_NE, F_NULL}},
1708
1709
  /* ARC NPS400 Support: See comment near head of file.  */
1710
#define C_NPS_CL     (C_NE + 1)
1711
  { F_CLASS_REQUIRED, { F_NPS_CL, F_NULL}},
1712
1713
#define C_NPS_NA     (C_NPS_CL + 1)
1714
  { F_CLASS_OPTIONAL, { F_NPS_NA, F_NULL}},
1715
1716
#define C_NPS_SR     (C_NPS_NA + 1)
1717
  { F_CLASS_OPTIONAL, { F_NPS_SR, F_NULL}},
1718
1719
#define C_NPS_M     (C_NPS_SR + 1)
1720
  { F_CLASS_OPTIONAL, { F_NPS_M, F_NULL}},
1721
1722
#define C_NPS_F     (C_NPS_M + 1)
1723
  { F_CLASS_OPTIONAL, { F_NPS_FLAG, F_NULL}},
1724
1725
#define C_NPS_R     (C_NPS_F + 1)
1726
  { F_CLASS_OPTIONAL, { F_NPS_R, F_NULL}},
1727
1728
#define C_NPS_SCHD_RW     (C_NPS_R + 1)
1729
  { F_CLASS_REQUIRED, { F_NPS_RW, F_NPS_RD, F_NULL}},
1730
1731
#define C_NPS_SCHD_TRIG     (C_NPS_SCHD_RW + 1)
1732
  { F_CLASS_REQUIRED, { F_NPS_WFT, F_NULL}},
1733
1734
#define C_NPS_SCHD_IE     (C_NPS_SCHD_TRIG + 1)
1735
  { F_CLASS_OPTIONAL, { F_NPS_IE1, F_NPS_IE2, F_NPS_IE12, F_NULL}},
1736
1737
#define C_NPS_SYNC     (C_NPS_SCHD_IE + 1)
1738
  { F_CLASS_REQUIRED, { F_NPS_SYNC_RD, F_NPS_SYNC_WR, F_NULL}},
1739
1740
#define C_NPS_HWS_OFF     (C_NPS_SYNC + 1)
1741
  { F_CLASS_REQUIRED, { F_NPS_HWS_OFF, F_NULL}},
1742
1743
#define C_NPS_HWS_RESTORE     (C_NPS_HWS_OFF + 1)
1744
  { F_CLASS_REQUIRED, { F_NPS_HWS_RESTORE, F_NULL}},
1745
1746
#define C_NPS_SX     (C_NPS_HWS_RESTORE + 1)
1747
  { F_CLASS_OPTIONAL, { F_NPS_SX, F_NULL}},
1748
1749
#define C_NPS_AR_AL     (C_NPS_SX + 1)
1750
  { F_CLASS_REQUIRED, { F_NPS_AR, F_NPS_AL, F_NULL}},
1751
1752
#define C_NPS_S    (C_NPS_AR_AL + 1)
1753
  { F_CLASS_REQUIRED, { F_NPS_S, F_NULL}},
1754
1755
#define C_NPS_ZNCV    (C_NPS_S + 1)
1756
  { F_CLASS_REQUIRED, { F_NPS_ZNCV_RD, F_NPS_ZNCV_WR, F_NULL}},
1757
1758
#define C_NPS_P0    (C_NPS_ZNCV + 1)
1759
  { F_CLASS_REQUIRED, { F_NPS_P0, F_NULL }},
1760
1761
#define C_NPS_P1    (C_NPS_P0 + 1)
1762
  { F_CLASS_REQUIRED, { F_NPS_P1, F_NULL }},
1763
1764
#define C_NPS_P2    (C_NPS_P1 + 1)
1765
  { F_CLASS_REQUIRED, { F_NPS_P2, F_NULL }},
1766
1767
#define C_NPS_P3    (C_NPS_P2 + 1)
1768
  { F_CLASS_REQUIRED, { F_NPS_P3, F_NULL }},
1769
1770
#define C_NPS_LDBIT_DI    (C_NPS_P3 + 1)
1771
  { F_CLASS_REQUIRED, { F_NPS_LDBIT_DI, F_NULL }},
1772
1773
#define C_NPS_LDBIT_CL1    (C_NPS_LDBIT_DI + 1)
1774
  { F_CLASS_OPTIONAL, { F_NPS_LDBIT_CL1, F_NULL }},
1775
1776
#define C_NPS_LDBIT_CL2    (C_NPS_LDBIT_CL1 + 1)
1777
  { F_CLASS_OPTIONAL, { F_NPS_LDBIT_CL2, F_NULL }},
1778
1779
#define C_NPS_LDBIT_X_1    (C_NPS_LDBIT_CL2 + 1)
1780
  { F_CLASS_OPTIONAL, { F_NPS_LDBIT_X2_1, F_NPS_LDBIT_X4_1, F_NULL }},
1781
1782
#define C_NPS_LDBIT_X_2    (C_NPS_LDBIT_X_1 + 1)
1783
  { F_CLASS_OPTIONAL, { F_NPS_LDBIT_X2_2, F_NPS_LDBIT_X4_2, F_NULL }},
1784
1785
#define C_NPS_CORE     (C_NPS_LDBIT_X_2 + 1)
1786
  { F_CLASS_REQUIRED, { F_NPS_CORE, F_NULL}},
1787
1788
#define C_NPS_CLSR     (C_NPS_CORE + 1)
1789
  { F_CLASS_REQUIRED, { F_NPS_CLSR, F_NULL}},
1790
1791
#define C_NPS_ALL     (C_NPS_CLSR + 1)
1792
  { F_CLASS_REQUIRED, { F_NPS_ALL, F_NULL}},
1793
1794
#define C_NPS_GIC     (C_NPS_ALL + 1)
1795
  { F_CLASS_REQUIRED, { F_NPS_GIC, F_NULL}},
1796
1797
#define C_NPS_RSPI_GIC     (C_NPS_GIC + 1)
1798
  { F_CLASS_REQUIRED, { F_NPS_RSPI_GIC, F_NULL}},
1799
};
1800
1801
const unsigned char flags_none[] = { 0 };
1802
const unsigned char flags_f[]    = { C_F };
1803
const unsigned char flags_cc[]   = { C_CC };
1804
const unsigned char flags_ccf[]  = { C_CC, C_F };
1805
1806
/* The operands table.
1807
1808
   The format of the operands table is:
1809
1810
   BITS SHIFT DEFAULT_RELOC FLAGS INSERT_FUN EXTRACT_FUN.  */
1811
const struct arc_operand arc_operands[] =
1812
{
1813
  /* The fields are bits, shift, insert, extract, flags.  The zero
1814
     index is used to indicate end-of-list.  */
1815
#define UNUSED    0
1816
  { 0, 0, 0, 0, 0, 0 },
1817
1818
#define IGNORED   (UNUSED + 1)
1819
  { 0, 0, 0, ARC_OPERAND_IGNORE | ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK, 0, 0 },
1820
1821
  /* The plain integer register fields.  Used by 32 bit
1822
     instructions.  */
1823
#define RA    (IGNORED + 1)
1824
  { 6, 0, 0, ARC_OPERAND_IR, 0, 0 },
1825
#define RA_CHK    (RA + 1)
1826
  { 6, 0, 0, ARC_OPERAND_IR, insert_ra_chk, 0 },
1827
#define RB    (RA_CHK + 1)
1828
  { 6, 12, 0, ARC_OPERAND_IR, insert_rb, extract_rb },
1829
#define RB_CHK    (RB + 1)
1830
  { 6, 12, 0, ARC_OPERAND_IR, insert_rb_chk, extract_rb },
1831
#define RC    (RB_CHK + 1)
1832
  { 6, 6, 0, ARC_OPERAND_IR, 0, 0 },
1833
#define RBdup   (RC + 1)
1834
  { 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rb, extract_rb },
1835
1836
#define RAD   (RBdup + 1)
1837
  { 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0 },
1838
#define RAD_CHK   (RAD + 1)
1839
  { 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0 },
1840
#define RCD   (RAD_CHK + 1)
1841
  { 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rcd, 0 },
1842
#define RBD   (RCD + 1)
1843
  { 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rbd, extract_rb },
1844
#define RBDdup    (RBD + 1)
1845
  { 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_TRUNCATE,
1846
    insert_rbd, extract_rb },
1847
1848
  /* The plain integer register fields.  Used by short
1849
     instructions.  */
1850
#define RA16    (RBDdup + 1)
1851
#define RA_S    (RBDdup + 1)
1852
  { 4, 0, 0, ARC_OPERAND_IR, insert_ras, extract_ras },
1853
#define RB16    (RA16 + 1)
1854
#define RB_S    (RA16 + 1)
1855
  { 4, 8, 0, ARC_OPERAND_IR, insert_rbs, extract_rbs },
1856
#define RB16dup   (RB16 + 1)
1857
#define RB_Sdup   (RB16 + 1)
1858
  { 4, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rbs, extract_rbs },
1859
#define RC16    (RB16dup + 1)
1860
#define RC_S    (RB16dup + 1)
1861
  { 4, 5, 0, ARC_OPERAND_IR, insert_rcs, extract_rcs },
1862
#define R6H   (RC16 + 1)   /* 6bit register field 'h' used
1863
          by V1 cpus.  */
1864
  { 6, 5, 0, ARC_OPERAND_IR, insert_rhv1, extract_rhv1 },
1865
#define R5H   (R6H + 1)    /* 5bit register field 'h' used
1866
          by V2 cpus.  */
1867
#define RH_S    (R6H + 1)    /* 5bit register field 'h' used
1868
          by V2 cpus.  */
1869
  { 5, 5, 0, ARC_OPERAND_IR, insert_rhv2, extract_rhv2 },
1870
#define R5Hdup    (R5H + 1)
1871
#define RH_Sdup   (R5H + 1)
1872
  { 5, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE,
1873
    insert_rhv2, extract_rhv2 },
1874
1875
#define RG    (R5Hdup + 1)
1876
#define G_S   (R5Hdup + 1)
1877
  { 5, 5, 0, ARC_OPERAND_IR, insert_g_s, extract_g_s },
1878
1879
  /* Fix registers.  */
1880
#define R0    (RG + 1)
1881
#define R0_S    (RG + 1)
1882
  { 0, 0, 0, ARC_OPERAND_IR, insert_r0, extract_r0 },
1883
#define R1    (R0 + 1)
1884
#define R1_S    (R0 + 1)
1885
  { 1, 0, 0, ARC_OPERAND_IR, insert_r1, extract_r1 },
1886
#define R2    (R1 + 1)
1887
#define R2_S    (R1 + 1)
1888
  { 2, 0, 0, ARC_OPERAND_IR, insert_r2, extract_r2 },
1889
#define R3    (R2 + 1)
1890
#define R3_S    (R2 + 1)
1891
  { 2, 0, 0, ARC_OPERAND_IR, insert_r3, extract_r3 },
1892
#define RSP   (R3 + 1)
1893
#define SP_S    (R3 + 1)
1894
  { 5, 0, 0, ARC_OPERAND_IR, insert_sp, extract_sp },
1895
#define SPdup   (RSP + 1)
1896
#define SP_Sdup   (RSP + 1)
1897
  { 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_sp, extract_sp },
1898
#define GP    (SPdup + 1)
1899
#define GP_S    (SPdup + 1)
1900
  { 5, 0, 0, ARC_OPERAND_IR, insert_gp, extract_gp },
1901
1902
#define PCL_S   (GP + 1)
1903
  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_pcl, extract_pcl },
1904
1905
#define BLINK   (PCL_S + 1)
1906
#define BLINK_S   (PCL_S + 1)
1907
  { 5, 0, 0, ARC_OPERAND_IR, insert_blink, extract_blink },
1908
1909
#define ILINK1    (BLINK + 1)
1910
  { 5, 0, 0, ARC_OPERAND_IR, insert_ilink1, extract_ilink1 },
1911
#define ILINK2    (ILINK1 + 1)
1912
  { 5, 0, 0, ARC_OPERAND_IR, insert_ilink2, extract_ilink2 },
1913
1914
  /* Long immediate.  */
1915
#define LIMM    (ILINK2 + 1)
1916
#define LIMM_S    (ILINK2 + 1)
1917
  { 32, 0, BFD_RELOC_ARC_32_ME, ARC_OPERAND_LIMM, insert_limm, 0 },
1918
#define LIMMdup   (LIMM + 1)
1919
  { 32, 0, 0, ARC_OPERAND_LIMM | ARC_OPERAND_DUPLICATE, insert_limm, 0 },
1920
1921
  /* Special operands.  */
1922
#define ZA    (LIMMdup + 1)
1923
#define ZB    (LIMMdup + 1)
1924
#define ZA_S    (LIMMdup + 1)
1925
#define ZB_S    (LIMMdup + 1)
1926
#define ZC_S    (LIMMdup + 1)
1927
  { 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0 },
1928
1929
#define RRANGE_EL (ZA + 1)
1930
  { 4, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK | ARC_OPERAND_TRUNCATE,
1931
    insert_rrange, extract_rrange},
1932
#define R13_EL    (RRANGE_EL + 1)
1933
  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
1934
    insert_r13el, extract_rrange },
1935
#define FP_EL   (R13_EL + 1)
1936
  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
1937
    insert_fpel, extract_fpel },
1938
#define BLINK_EL  (FP_EL + 1)
1939
  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
1940
    insert_blinkel, extract_blinkel },
1941
#define PCL_EL    (BLINK_EL + 1)
1942
  { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
1943
    insert_pclel, extract_pclel },
1944
1945
  /* Fake operand to handle the T flag.  */
1946
#define BRAKET    (PCL_EL + 1)
1947
#define BRAKETdup (PCL_EL + 1)
1948
  { 0, 0, 0, ARC_OPERAND_FAKE | ARC_OPERAND_BRAKET, 0, 0 },
1949
1950
  /* Fake operand to handle the T flag.  */
1951
#define FKT_T   (BRAKET + 1)
1952
  { 1, 3, 0, ARC_OPERAND_FAKE, insert_Ybit, 0 },
1953
  /* Fake operand to handle the T flag.  */
1954
#define FKT_NT    (FKT_T + 1)
1955
  { 1, 3, 0, ARC_OPERAND_FAKE, insert_NYbit, 0 },
1956
1957
  /* UIMM6_20 mask = 00000000000000000000111111000000.  */
1958
#define UIMM6_20       (FKT_NT + 1)
1959
  {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_20, extract_uimm6_20},
1960
1961
  /* Exactly like the above but used by relaxation.  */
1962
#define UIMM6_20R      (UIMM6_20 + 1)
1963
  {6, 0, -UIMM6_20R, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL,
1964
   insert_uimm6_20, extract_uimm6_20},
1965
1966
  /* SIMM12_20 mask = 00000000000000000000111111222222.  */
1967
#define SIMM12_20 (UIMM6_20R + 1)
1968
  {12, 0, 0, ARC_OPERAND_SIGNED, insert_simm12_20, extract_simm12_20},
1969
1970
  /* Exactly like the above but used by relaxation.  */
1971
#define SIMM12_20R  (SIMM12_20 + 1)
1972
  {12, 0, -SIMM12_20R, ARC_OPERAND_SIGNED | ARC_OPERAND_PCREL,
1973
   insert_simm12_20, extract_simm12_20},
1974
1975
  /* UIMM12_20 mask = 00000000000000000000111111222222.  */
1976
#define UIMM12_20 (SIMM12_20R + 1)
1977
  {12, 0, 0, ARC_OPERAND_UNSIGNED, insert_simm12_20, extract_uimm12_20},
1978
1979
  /* SIMM3_5_S mask = 0000011100000000.  */
1980
#define SIMM3_5_S (UIMM12_20 + 1)
1981
  {3, 0, 0, ARC_OPERAND_SIGNED | ARC_OPERAND_NCHK,
1982
   insert_simm3s, extract_simm3s},
1983
1984
  /* UIMM7_A32_11_S mask = 0000000000011111.  */
1985
#define UIMM7_A32_11_S       (SIMM3_5_S + 1)
1986
  {7, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
1987
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm7_a32_11_s,
1988
   extract_uimm7_a32_11_s},
1989
1990
  /* The same as above but used by relaxation.  */
1991
#define UIMM7_A32_11R_S      (UIMM7_A32_11_S + 1)
1992
  {7, 0, -UIMM7_A32_11R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
1993
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE | ARC_OPERAND_PCREL,
1994
   insert_uimm7_a32_11_s, extract_uimm7_a32_11_s},
1995
1996
  /* UIMM7_9_S mask = 0000000001111111.  */
1997
#define UIMM7_9_S (UIMM7_A32_11R_S + 1)
1998
  {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_9_s, extract_uimm7_9_s},
1999
2000
  /* UIMM3_13_S mask = 0000000000000111.  */
2001
#define UIMM3_13_S   (UIMM7_9_S + 1)
2002
  {3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_13_s, extract_uimm3_13_s},
2003
2004
  /* Exactly like the above but used for relaxation.  */
2005
#define UIMM3_13R_S  (UIMM3_13_S + 1)
2006
  {3, 0, -UIMM3_13R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL,
2007
   insert_uimm3_13_s, extract_uimm3_13_s},
2008
2009
  /* SIMM11_A32_7_S mask = 0000000111111111.  */
2010
#define SIMM11_A32_7_S       (UIMM3_13R_S + 1)
2011
  {11, 0, BFD_RELOC_ARC_SDA16_LD2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
2012
   | ARC_OPERAND_TRUNCATE, insert_simm11_a32_7_s, extract_simm11_a32_7_s},
2013
2014
  /* UIMM6_13_S mask = 0000000002220111.  */
2015
#define UIMM6_13_S   (SIMM11_A32_7_S + 1)
2016
  {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_13_s, extract_uimm6_13_s},
2017
  /* UIMM5_11_S mask = 0000000000011111.  */
2018
#define UIMM5_11_S   (UIMM6_13_S + 1)
2019
  {5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_IGNORE, insert_uimm5_11_s,
2020
   extract_uimm5_11_s},
2021
2022
  /* SIMM9_A16_8 mask = 00000000111111102000000000000000.  */
2023
#define SIMM9_A16_8   (UIMM5_11_S + 1)
2024
  {9, 0, -SIMM9_A16_8, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2025
   | ARC_OPERAND_PCREL | ARC_OPERAND_TRUNCATE, insert_simm9_a16_8,
2026
   extract_simm9_a16_8},
2027
2028
  /* UIMM6_8 mask = 00000000000000000000111111000000.  */
2029
#define UIMM6_8       (SIMM9_A16_8 + 1)
2030
  {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_8, extract_uimm6_8},
2031
2032
  /* SIMM21_A16_5 mask = 00000111111111102222222222000000.  */
2033
#define SIMM21_A16_5     (UIMM6_8 + 1)
2034
  {21, 0, BFD_RELOC_ARC_S21H_PCREL, ARC_OPERAND_SIGNED
2035
   | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL,
2036
   insert_simm21_a16_5, extract_simm21_a16_5},
2037
2038
  /* SIMM25_A16_5 mask = 00000111111111102222222222003333.  */
2039
#define SIMM25_A16_5     (SIMM21_A16_5 + 1)
2040
  {25, 0, BFD_RELOC_ARC_S25H_PCREL, ARC_OPERAND_SIGNED
2041
   | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL,
2042
   insert_simm25_a16_5, extract_simm25_a16_5},
2043
2044
  /* SIMM10_A16_7_S mask = 0000000111111111.  */
2045
#define SIMM10_A16_7_S       (SIMM25_A16_5 + 1)
2046
  {10, 0, -SIMM10_A16_7_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2047
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm10_a16_7_s,
2048
   extract_simm10_a16_7_s},
2049
2050
#define SIMM10_A16_7_Sbis    (SIMM10_A16_7_S + 1)
2051
  {10, 0, -SIMM10_A16_7_Sbis, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2052
   | ARC_OPERAND_TRUNCATE, insert_simm10_a16_7_s, extract_simm10_a16_7_s},
2053
2054
  /* SIMM7_A16_10_S mask = 0000000000111111.  */
2055
#define SIMM7_A16_10_S       (SIMM10_A16_7_Sbis + 1)
2056
  {7, 0, -SIMM7_A16_10_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2057
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm7_a16_10_s,
2058
   extract_simm7_a16_10_s},
2059
2060
  /* SIMM21_A32_5 mask = 00000111111111002222222222000000.  */
2061
#define SIMM21_A32_5     (SIMM7_A16_10_S + 1)
2062
  {21, 0, BFD_RELOC_ARC_S21W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
2063
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm21_a32_5,
2064
   extract_simm21_a32_5},
2065
2066
  /* SIMM25_A32_5 mask = 00000111111111002222222222003333.  */
2067
#define SIMM25_A32_5     (SIMM21_A32_5 + 1)
2068
  {25, 0, BFD_RELOC_ARC_S25W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
2069
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm25_a32_5,
2070
   extract_simm25_a32_5},
2071
2072
  /* SIMM13_A32_5_S mask = 0000011111111111.  */
2073
#define SIMM13_A32_5_S       (SIMM25_A32_5 + 1)
2074
  {13, 0, BFD_RELOC_ARC_S13_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
2075
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a32_5_s,
2076
   extract_simm13_a32_5_s},
2077
2078
  /* SIMM8_A16_9_S mask = 0000000001111111.  */
2079
#define SIMM8_A16_9_S     (SIMM13_A32_5_S + 1)
2080
  {8, 0, -SIMM8_A16_9_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2081
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm8_a16_9_s,
2082
   extract_simm8_a16_9_s},
2083
2084
/* UIMM10_6_S_JLIOFF mask = 0000001111111111.  */
2085
#define UIMM10_6_S_JLIOFF     (SIMM8_A16_9_S + 1)
2086
  {12, 0, BFD_RELOC_ARC_JLI_SECTOFF, ARC_OPERAND_UNSIGNED
2087
   | ARC_OPERAND_ALIGNED32 | ARC_OPERAND_TRUNCATE, insert_uimm10_6_s,
2088
   extract_uimm10_6_s},
2089
2090
  /* UIMM3_23 mask = 00000000000000000000000111000000.  */
2091
#define UIMM3_23       (UIMM10_6_S_JLIOFF + 1)
2092
  {3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_23, extract_uimm3_23},
2093
2094
  /* UIMM10_6_S mask = 0000001111111111.  */
2095
#define UIMM10_6_S   (UIMM3_23 + 1)
2096
  {10, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm10_6_s, extract_uimm10_6_s},
2097
2098
  /* UIMM6_11_S mask = 0000002200011110.  */
2099
#define UIMM6_11_S   (UIMM10_6_S + 1)
2100
  {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_11_s, extract_uimm6_11_s},
2101
2102
  /* SIMM9_8 mask = 00000000111111112000000000000000.  */
2103
#define SIMM9_8       (UIMM6_11_S + 1)
2104
  {9, 0, BFD_RELOC_ARC_SDA_LDST, ARC_OPERAND_SIGNED | ARC_OPERAND_IGNORE,
2105
   insert_simm9_8, extract_simm9_8},
2106
2107
  /* The same as above but used by relaxation.  */
2108
#define SIMM9_8R      (SIMM9_8 + 1)
2109
  {9, 0, -SIMM9_8R, ARC_OPERAND_SIGNED | ARC_OPERAND_IGNORE
2110
   | ARC_OPERAND_PCREL, insert_simm9_8, extract_simm9_8},
2111
2112
  /* UIMM10_A32_8_S mask = 0000000011111111.  */
2113
#define UIMM10_A32_8_S       (SIMM9_8R + 1)
2114
  {10, 0, -UIMM10_A32_8_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
2115
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm10_a32_8_s,
2116
   extract_uimm10_a32_8_s},
2117
2118
  /* SIMM9_7_S mask = 0000000111111111.  */
2119
#define SIMM9_7_S (UIMM10_A32_8_S + 1)
2120
  {9, 0, BFD_RELOC_ARC_SDA16_LD, ARC_OPERAND_SIGNED, insert_simm9_7_s,
2121
   extract_simm9_7_s},
2122
2123
  /* UIMM6_A16_11_S mask = 0000000000011111.  */
2124
#define UIMM6_A16_11_S       (SIMM9_7_S + 1)
2125
  {6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
2126
   | ARC_OPERAND_TRUNCATE  | ARC_OPERAND_IGNORE, insert_uimm6_a16_11_s,
2127
   extract_uimm6_a16_11_s},
2128
2129
  /* UIMM5_A32_11_S mask = 0000020000011000.  */
2130
#define UIMM5_A32_11_S       (UIMM6_A16_11_S + 1)
2131
  {5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
2132
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm5_a32_11_s,
2133
   extract_uimm5_a32_11_s},
2134
2135
  /* SIMM11_A32_13_S mask = 0000022222200111.  */
2136
#define SIMM11_A32_13_S       (UIMM5_A32_11_S + 1)
2137
  {11, 0, BFD_RELOC_ARC_SDA16_ST2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
2138
   | ARC_OPERAND_TRUNCATE, insert_simm11_a32_13_s, extract_simm11_a32_13_s},
2139
2140
  /* UIMM7_13_S mask = 0000000022220111.  */
2141
#define UIMM7_13_S   (SIMM11_A32_13_S + 1)
2142
  {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_13_s, extract_uimm7_13_s},
2143
2144
  /* UIMM6_A16_21 mask = 00000000000000000000011111000000.  */
2145
#define UIMM6_A16_21     (UIMM7_13_S + 1)
2146
  {6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
2147
   | ARC_OPERAND_TRUNCATE, insert_uimm6_a16_21, extract_uimm6_a16_21},
2148
2149
  /* UIMM7_11_S mask = 0000022200011110.  */
2150
#define UIMM7_11_S   (UIMM6_A16_21 + 1)
2151
  {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_11_s, extract_uimm7_11_s},
2152
2153
  /* UIMM7_A16_20 mask = 00000000000000000000111111000000.  */
2154
#define UIMM7_A16_20     (UIMM7_11_S + 1)
2155
  {7, 0, -UIMM7_A16_20, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
2156
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm7_a16_20,
2157
   extract_uimm7_a16_20},
2158
2159
  /* SIMM13_A16_20 mask = 00000000000000000000111111222222.  */
2160
#define SIMM13_A16_20     (UIMM7_A16_20 + 1)
2161
  {13, 0, -SIMM13_A16_20, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
2162
   | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a16_20,
2163
   extract_simm13_a16_20},
2164
2165
  /* UIMM8_8_S mask = 0000000011111111.  */
2166
#define UIMM8_8_S (SIMM13_A16_20 + 1)
2167
  {8, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm8_8_s, extract_uimm8_8_s},
2168
2169
  /* The same as above but used for relaxation.  */
2170
#define UIMM8_8R_S  (UIMM8_8_S + 1)
2171
  {8, 0, -UIMM8_8R_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_PCREL,
2172
   insert_uimm8_8_s, extract_uimm8_8_s},
2173
2174
  /* W6 mask = 00000000000000000000111111000000.  */
2175
#define W6   (UIMM8_8R_S + 1)
2176
  {6, 0, 0, ARC_OPERAND_SIGNED, insert_w6, extract_w6},
2177
2178
  /* UIMM6_5_S mask = 0000011111100000.  */
2179
#define UIMM6_5_S (W6 + 1)
2180
  {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_5_s, extract_uimm6_5_s},
2181
2182
  /* ARC NPS400 Support: See comment near head of file.  */
2183
#define NPS_R_DST_3B  (UIMM6_5_S + 1)
2184
  { 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2185
    insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst },
2186
2187
#define NPS_R_SRC1_3B (NPS_R_DST_3B + 1)
2188
  { 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK,
2189
    insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst },
2190
2191
#define NPS_R_SRC2_3B (NPS_R_SRC1_3B + 1)
2192
  { 3, 21, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2193
    insert_nps_3bit_reg_at_21_src2, extract_nps_3bit_reg_at_21_src2 },
2194
2195
#define NPS_R_DST (NPS_R_SRC2_3B + 1)
2196
  { 6, 21, 0, ARC_OPERAND_IR, NULL, NULL },
2197
2198
#define NPS_R_SRC1  (NPS_R_DST + 1)
2199
  { 6, 21, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, NULL, NULL },
2200
2201
#define NPS_BITOP_DST_POS (NPS_R_SRC1 + 1)
2202
  { 5, 5, 0, ARC_OPERAND_UNSIGNED, 0, 0 },
2203
2204
#define NPS_BITOP_SRC_POS (NPS_BITOP_DST_POS + 1)
2205
  { 5, 0, 0, ARC_OPERAND_UNSIGNED, 0, 0 },
2206
2207
#define NPS_BITOP_SIZE    (NPS_BITOP_SRC_POS + 1)
2208
  { 5, 10, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2209
    insert_nps_bitop_size, extract_nps_bitop_size },
2210
2211
#define NPS_BITOP_DST_POS_SZ    (NPS_BITOP_SIZE + 1)
2212
  { 5, 0, 0, ARC_OPERAND_UNSIGNED,
2213
    insert_nps_dst_pos_and_size, extract_nps_dst_pos_and_size },
2214
2215
#define NPS_BITOP_SIZE_2B (NPS_BITOP_DST_POS_SZ + 1)
2216
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2217
    insert_nps_bitop_size_2b, extract_nps_bitop_size_2b },
2218
2219
#define NPS_BITOP_UIMM8   (NPS_BITOP_SIZE_2B + 1)
2220
  { 8, 0, 0, ARC_OPERAND_UNSIGNED,
2221
    insert_nps_bitop_uimm8, extract_nps_bitop_uimm8 },
2222
2223
#define NPS_UIMM16    (NPS_BITOP_UIMM8 + 1)
2224
  { 16, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2225
2226
#define NPS_SIMM16              (NPS_UIMM16 + 1)
2227
  { 16, 0, 0, ARC_OPERAND_SIGNED, NULL, NULL },
2228
2229
#define NPS_RFLT_UIMM6    (NPS_SIMM16 + 1)
2230
  { 6, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2231
    insert_nps_rflt_uimm6, extract_nps_rflt_uimm6 },
2232
2233
#define NPS_XLDST_UIMM16  (NPS_RFLT_UIMM6 + 1)
2234
  { 16, 0, BFD_RELOC_ARC_NPS_CMEM16, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2235
    insert_nps_cmem_uimm16, extract_nps_cmem_uimm16 },
2236
2237
#define NPS_SRC2_POS           (NPS_XLDST_UIMM16 + 1)
2238
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2239
    insert_nps_src2_pos, extract_nps_src2_pos },
2240
2241
#define NPS_SRC1_POS           (NPS_SRC2_POS + 1)
2242
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2243
    insert_nps_src1_pos, extract_nps_src1_pos },
2244
2245
#define NPS_ADDB_SIZE          (NPS_SRC1_POS + 1)
2246
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2247
    insert_nps_addb_size, extract_nps_addb_size },
2248
2249
#define NPS_ANDB_SIZE          (NPS_ADDB_SIZE + 1)
2250
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2251
    insert_nps_andb_size, extract_nps_andb_size },
2252
2253
#define NPS_FXORB_SIZE         (NPS_ANDB_SIZE + 1)
2254
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2255
    insert_nps_fxorb_size, extract_nps_fxorb_size },
2256
2257
#define NPS_WXORB_SIZE         (NPS_FXORB_SIZE + 1)
2258
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2259
    insert_nps_wxorb_size, extract_nps_wxorb_size },
2260
2261
#define NPS_R_XLDST    (NPS_WXORB_SIZE + 1)
2262
  { 6, 5, 0, ARC_OPERAND_IR, NULL, NULL },
2263
2264
#define NPS_DIV_UIMM4    (NPS_R_XLDST + 1)
2265
  { 4, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2266
2267
#define NPS_QCMP_SIZE         (NPS_DIV_UIMM4 + 1)
2268
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2269
    insert_nps_qcmp_size, extract_nps_qcmp_size },
2270
2271
#define NPS_QCMP_M1         (NPS_QCMP_SIZE + 1)
2272
  { 1, 14, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m1 },
2273
2274
#define NPS_QCMP_M2         (NPS_QCMP_M1 + 1)
2275
  { 1, 15, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m2 },
2276
2277
#define NPS_QCMP_M3         (NPS_QCMP_M2 + 1)
2278
  { 4, 5, 0, ARC_OPERAND_UNSIGNED, NULL, extract_nps_qcmp_m3 },
2279
2280
#define NPS_CALC_ENTRY_SIZE (NPS_QCMP_M3 + 1)
2281
  { 0, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2282
    insert_nps_calc_entry_size, extract_nps_calc_entry_size },
2283
2284
#define NPS_R_DST_3B_SHORT  (NPS_CALC_ENTRY_SIZE + 1)
2285
  { 3, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2286
    insert_nps_3bit_reg_at_8_dst, extract_nps_3bit_reg_at_8_dst },
2287
2288
#define NPS_R_SRC1_3B_SHORT (NPS_R_DST_3B_SHORT + 1)
2289
  { 3, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK,
2290
    insert_nps_3bit_reg_at_8_dst, extract_nps_3bit_reg_at_8_dst },
2291
2292
#define NPS_R_SRC2_3B_SHORT (NPS_R_SRC1_3B_SHORT + 1)
2293
  { 3, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2294
    insert_nps_3bit_reg_at_5_src2, extract_nps_3bit_reg_at_5_src2 },
2295
2296
#define NPS_BITOP_SIZE2   (NPS_R_SRC2_3B_SHORT + 1)
2297
  { 5, 25, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2298
    insert_nps_bitop2_size, extract_nps_bitop2_size },
2299
2300
#define NPS_BITOP_SIZE1   (NPS_BITOP_SIZE2 + 1)
2301
  { 5, 20, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2302
    insert_nps_bitop1_size, extract_nps_bitop1_size },
2303
2304
#define NPS_BITOP_DST_POS3_POS4   (NPS_BITOP_SIZE1 + 1)
2305
  { 5, 0, 0, ARC_OPERAND_UNSIGNED,
2306
    insert_nps_bitop_dst_pos3_pos4, extract_nps_bitop_dst_pos3_pos4 },
2307
2308
#define NPS_BITOP_DST_POS4    (NPS_BITOP_DST_POS3_POS4 + 1)
2309
  { 5, 42, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2310
2311
#define NPS_BITOP_DST_POS3    (NPS_BITOP_DST_POS4 + 1)
2312
  { 5, 37, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2313
2314
#define NPS_BITOP_DST_POS2    (NPS_BITOP_DST_POS3 + 1)
2315
  { 5, 15, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2316
2317
#define NPS_BITOP_DST_POS1    (NPS_BITOP_DST_POS2 + 1)
2318
  { 5, 10, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2319
2320
#define NPS_BITOP_SRC_POS4    (NPS_BITOP_DST_POS1 + 1)
2321
  { 5, 32, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2322
2323
#define NPS_BITOP_SRC_POS3    (NPS_BITOP_SRC_POS4 + 1)
2324
  { 5, 20, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2325
2326
#define NPS_BITOP_SRC_POS2    (NPS_BITOP_SRC_POS3 + 1)
2327
  { 5, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2328
2329
#define NPS_BITOP_SRC_POS1    (NPS_BITOP_SRC_POS2 + 1)
2330
  { 5, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2331
2332
#define NPS_BITOP_MOD4      (NPS_BITOP_SRC_POS1 + 1)
2333
  { 2, 0, 0, ARC_OPERAND_UNSIGNED,
2334
    insert_nps_bitop_mod4, extract_nps_bitop_mod4 },
2335
2336
#define NPS_BITOP_MOD3    (NPS_BITOP_MOD4 + 1)
2337
  { 2, 29, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2338
2339
#define NPS_BITOP_MOD2    (NPS_BITOP_MOD3 + 1)
2340
  { 2, 27, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2341
2342
#define NPS_BITOP_MOD1    (NPS_BITOP_MOD2 + 1)
2343
  { 2, 25, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2344
2345
#define NPS_BITOP_INS_EXT (NPS_BITOP_MOD1 + 1)
2346
  { 5, 20, 0, ARC_OPERAND_UNSIGNED,
2347
    insert_nps_bitop_ins_ext, extract_nps_bitop_ins_ext },
2348
2349
#define NPS_FIELD_START_POS     (NPS_BITOP_INS_EXT + 1)
2350
  { 3, 3, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2351
2352
#define NPS_FIELD_SIZE          (NPS_FIELD_START_POS + 1)
2353
  { 3, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2354
    insert_nps_field_size, extract_nps_field_size },
2355
2356
#define NPS_SHIFT_FACTOR        (NPS_FIELD_SIZE + 1)
2357
  { 3, 9, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2358
    insert_nps_shift_factor, extract_nps_shift_factor },
2359
2360
#define NPS_BITS_TO_SCRAMBLE    (NPS_SHIFT_FACTOR + 1)
2361
  { 3, 12, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2362
    insert_nps_bits_to_scramble, extract_nps_bits_to_scramble },
2363
2364
#define NPS_SRC2_POS_5B         (NPS_BITS_TO_SCRAMBLE + 1)
2365
  { 5, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2366
2367
#define NPS_BDLEN_MAX_LEN       (NPS_SRC2_POS_5B + 1)
2368
  { 8, 5, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2369
    insert_nps_bdlen_max_len, extract_nps_bdlen_max_len },
2370
2371
#define NPS_MIN_HOFS       (NPS_BDLEN_MAX_LEN + 1)
2372
  { 4, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2373
    insert_nps_min_hofs, extract_nps_min_hofs },
2374
2375
#define NPS_PSBC       (NPS_MIN_HOFS + 1)
2376
  { 1, 11, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2377
2378
#define NPS_DPI_DST       (NPS_PSBC + 1)
2379
  { 5, 11, 0, ARC_OPERAND_IR, NULL, NULL },
2380
2381
  /* NPS_DPI_SRC1_3B is similar to NPS_R_SRC1_3B
2382
     but doesn't duplicate an operand.  */
2383
#define NPS_DPI_SRC1_3B    (NPS_DPI_DST + 1)
2384
  { 3, 24, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2385
    insert_nps_3bit_reg_at_24_dst, extract_nps_3bit_reg_at_24_dst },
2386
2387
#define NPS_HASH_WIDTH       (NPS_DPI_SRC1_3B + 1)
2388
  { 5, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2389
    insert_nps_hash_width, extract_nps_hash_width },
2390
2391
#define NPS_HASH_PERM       (NPS_HASH_WIDTH + 1)
2392
  { 3, 2, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2393
2394
#define NPS_HASH_NONLINEAR       (NPS_HASH_PERM + 1)
2395
  { 1, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2396
2397
#define NPS_HASH_BASEMAT       (NPS_HASH_NONLINEAR + 1)
2398
  { 2, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2399
2400
#define NPS_HASH_LEN       (NPS_HASH_BASEMAT + 1)
2401
  { 3, 2, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2402
    insert_nps_hash_len, extract_nps_hash_len },
2403
2404
#define NPS_HASH_OFS       (NPS_HASH_LEN + 1)
2405
  { 2, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2406
2407
#define NPS_HASH_BASEMAT2       (NPS_HASH_OFS + 1)
2408
  { 1, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2409
2410
#define NPS_E4BY_INDEX0       (NPS_HASH_BASEMAT2 + 1)
2411
  { 3, 8, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2412
2413
#define NPS_E4BY_INDEX1       (NPS_E4BY_INDEX0 + 1)
2414
  { 3, 5, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2415
2416
#define NPS_E4BY_INDEX2       (NPS_E4BY_INDEX1 + 1)
2417
  { 3, 2, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2418
2419
#define NPS_E4BY_INDEX3       (NPS_E4BY_INDEX2 + 1)
2420
  { 2, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2421
    insert_nps_index3, extract_nps_index3 },
2422
2423
#define COLON      (NPS_E4BY_INDEX3 + 1)
2424
  { 0, 0, 0, ARC_OPERAND_COLON | ARC_OPERAND_FAKE, NULL, NULL },
2425
2426
#define NPS_BD      (COLON + 1)
2427
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2428
    insert_nps_bd, extract_nps_bd },
2429
2430
#define NPS_JID      (NPS_BD + 1)
2431
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2432
    insert_nps_jid, extract_nps_jid },
2433
2434
#define NPS_LBD      (NPS_JID + 1)
2435
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2436
    insert_nps_lbd, extract_nps_lbd },
2437
2438
#define NPS_MBD      (NPS_LBD + 1)
2439
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2440
    insert_nps_mbd, extract_nps_mbd },
2441
2442
#define NPS_SD      (NPS_MBD + 1)
2443
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2444
    insert_nps_sd, extract_nps_sd },
2445
2446
#define NPS_SM      (NPS_SD + 1)
2447
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2448
    insert_nps_sm, extract_nps_sm },
2449
2450
#define NPS_XA      (NPS_SM + 1)
2451
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2452
    insert_nps_xa, extract_nps_xa },
2453
2454
#define NPS_XD      (NPS_XA + 1)
2455
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2456
    insert_nps_xd, extract_nps_xd },
2457
2458
#define NPS_CD      (NPS_XD + 1)
2459
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2460
    insert_nps_cd, extract_nps_cd },
2461
2462
#define NPS_CBD      (NPS_CD + 1)
2463
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2464
    insert_nps_cbd, extract_nps_cbd },
2465
2466
#define NPS_CJID      (NPS_CBD + 1)
2467
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2468
    insert_nps_cjid, extract_nps_cjid },
2469
2470
#define NPS_CLBD      (NPS_CJID + 1)
2471
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2472
    insert_nps_clbd, extract_nps_clbd },
2473
2474
#define NPS_CM      (NPS_CLBD + 1)
2475
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2476
    insert_nps_cm, extract_nps_cm },
2477
2478
#define NPS_CSD      (NPS_CM + 1)
2479
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2480
    insert_nps_csd, extract_nps_csd },
2481
2482
#define NPS_CXA      (NPS_CSD + 1)
2483
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2484
    insert_nps_cxa, extract_nps_cxa },
2485
2486
#define NPS_CXD      (NPS_CXA + 1)
2487
  { 0, 0, 0, ARC_OPERAND_ADDRTYPE | ARC_OPERAND_NCHK,
2488
    insert_nps_cxd, extract_nps_cxd },
2489
2490
#define NPS_BD_TYPE     (NPS_CXD + 1)
2491
  { 1, 10, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2492
2493
#define NPS_BMU_NUM     (NPS_BD_TYPE + 1)
2494
  { 3, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2495
    insert_nps_bd_num_buff, extract_nps_bd_num_buff },
2496
2497
#define NPS_PMU_NXT_DST     (NPS_BMU_NUM + 1)
2498
  { 4, 6, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2499
2500
#define NPS_WHASH_SIZE     (NPS_PMU_NXT_DST + 1)
2501
  { 6, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2502
    insert_nps_size_16bit, extract_nps_size_16bit },
2503
2504
#define NPS_PMU_NUM_JOB     (NPS_WHASH_SIZE + 1)
2505
  { 2, 6, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2506
    insert_nps_pmu_num_job, extract_nps_pmu_num_job },
2507
2508
#define NPS_DMA_IMM_ENTRY  (NPS_PMU_NUM_JOB + 1)
2509
  { 3, 2, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2510
    insert_nps_imm_entry, extract_nps_imm_entry },
2511
2512
#define NPS_DMA_IMM_OFFSET  (NPS_DMA_IMM_ENTRY + 1)
2513
  { 4, 10, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2514
    insert_nps_imm_offset, extract_nps_imm_offset },
2515
2516
#define NPS_MISC_IMM_SIZE  (NPS_DMA_IMM_OFFSET + 1)
2517
  { 7, 0, 0, ARC_OPERAND_UNSIGNED , NULL, NULL },
2518
2519
#define NPS_MISC_IMM_OFFSET  (NPS_MISC_IMM_SIZE + 1)
2520
  { 5, 8, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2521
    insert_nps_misc_imm_offset, extract_nps_misc_imm_offset },
2522
2523
#define NPS_R_DST_3B_48 (NPS_MISC_IMM_OFFSET + 1)
2524
  { 3, 40, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2525
    insert_nps_3bit_reg_at_40_dst, extract_nps_3bit_reg_at_40_dst },
2526
2527
#define NPS_R_SRC1_3B_48  (NPS_R_DST_3B_48 + 1)
2528
  { 3, 40, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK,
2529
    insert_nps_3bit_reg_at_40_dst, extract_nps_3bit_reg_at_40_dst },
2530
2531
#define NPS_R_SRC2_3B_48  (NPS_R_SRC1_3B_48 + 1)
2532
  { 3, 37, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2533
    insert_nps_3bit_reg_at_37_src2, extract_nps_3bit_reg_at_37_src2 },
2534
2535
#define NPS_R_DST_3B_64   (NPS_R_SRC2_3B_48 + 1)
2536
  { 3, 56, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2537
    insert_nps_3bit_reg_at_56_dst, extract_nps_3bit_reg_at_56_dst },
2538
2539
#define NPS_R_SRC1_3B_64  (NPS_R_DST_3B_64 + 1)
2540
  { 3, 56, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_NCHK,
2541
    insert_nps_3bit_reg_at_56_dst, extract_nps_3bit_reg_at_56_dst },
2542
2543
#define NPS_R_SRC2_3B_64  (NPS_R_SRC1_3B_64 + 1)
2544
  { 3, 53, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2545
    insert_nps_3bit_reg_at_53_src2, extract_nps_3bit_reg_at_53_src2 },
2546
2547
#define NPS_RA_64               (NPS_R_SRC2_3B_64 + 1)
2548
  { 6, 53, 0, ARC_OPERAND_IR, NULL, NULL },
2549
2550
#define NPS_RB_64               (NPS_RA_64 + 1)
2551
  { 5, 48, 0, ARC_OPERAND_IR, NULL, NULL },
2552
2553
#define NPS_RBdup_64            (NPS_RB_64 + 1)
2554
  { 5, 43, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, NULL, NULL },
2555
2556
#define NPS_RBdouble_64         (NPS_RBdup_64 + 1)
2557
  { 10, 43, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK,
2558
    insert_nps_rbdouble_64, extract_nps_rbdouble_64 },
2559
2560
#define NPS_RC_64               (NPS_RBdouble_64 + 1)
2561
  { 5, 43, 0, ARC_OPERAND_IR, NULL, NULL },
2562
2563
#define NPS_UIMM16_0_64         (NPS_RC_64 + 1)
2564
  { 16, 0, 0, ARC_OPERAND_UNSIGNED, NULL, NULL },
2565
2566
#define NPS_PROTO_SIZE         (NPS_UIMM16_0_64 + 1)
2567
  { 6, 16, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK,
2568
    insert_nps_proto_size, extract_nps_proto_size }
2569
};
2570
const unsigned arc_num_operands = ARRAY_SIZE (arc_operands);
2571
2572
const unsigned arc_Toperand = FKT_T;
2573
const unsigned arc_NToperand = FKT_NT;
2574
2575
const unsigned char arg_none[]     = { 0 };
2576
const unsigned char arg_32bit_rarbrc[]   = { RA, RB, RC };
2577
const unsigned char arg_32bit_zarbrc[]   = { ZA, RB, RC };
2578
const unsigned char arg_32bit_rbrbrc[]   = { RB, RBdup, RC };
2579
const unsigned char arg_32bit_rarbu6[]   = { RA, RB, UIMM6_20 };
2580
const unsigned char arg_32bit_zarbu6[]   = { ZA, RB, UIMM6_20 };
2581
const unsigned char arg_32bit_rbrbu6[]   = { RB, RBdup, UIMM6_20 };
2582
const unsigned char arg_32bit_rbrbs12[]  = { RB, RBdup, SIMM12_20 };
2583
const unsigned char arg_32bit_ralimmrc[] = { RA, LIMM, RC };
2584
const unsigned char arg_32bit_rarblimm[] = { RA, RB, LIMM };
2585
const unsigned char arg_32bit_zalimmrc[] = { ZA, LIMM, RC };
2586
const unsigned char arg_32bit_zarblimm[] = { ZA, RB, LIMM };
2587
2588
const unsigned char arg_32bit_rbrblimm[] = { RB, RBdup, LIMM };
2589
const unsigned char arg_32bit_ralimmu6[] = { RA, LIMM, UIMM6_20 };
2590
const unsigned char arg_32bit_zalimmu6[] = { ZA, LIMM, UIMM6_20 };
2591
2592
const unsigned char arg_32bit_zalimms12[]  = { ZA, LIMM, SIMM12_20 };
2593
const unsigned char arg_32bit_ralimmlimm[] = { RA, LIMM, LIMMdup };
2594
const unsigned char arg_32bit_zalimmlimm[] = { ZA, LIMM, LIMMdup };
2595
2596
const unsigned char arg_32bit_rbrc[]   = { RB, RC };
2597
const unsigned char arg_32bit_zarc[]   = { ZA, RC };
2598
const unsigned char arg_32bit_rbu6[]   = { RB, UIMM6_20 };
2599
const unsigned char arg_32bit_zau6[]   = { ZA, UIMM6_20 };
2600
const unsigned char arg_32bit_rblimm[] = { RB, LIMM };
2601
const unsigned char arg_32bit_zalimm[] = { ZA, LIMM };
2602
2603
const unsigned char arg_32bit_limmrc[]   = { LIMM, RC };
2604
const unsigned char arg_32bit_limmu6[]   = { LIMM, UIMM6_20 };
2605
const unsigned char arg_32bit_limms12[]  = { LIMM, SIMM12_20 };
2606
const unsigned char arg_32bit_limmlimm[] = { LIMM, LIMMdup };
2607
2608
const unsigned char arg_32bit_rc[]   = { RC };
2609
const unsigned char arg_32bit_u6[]   = { UIMM6_20 };
2610
const unsigned char arg_32bit_limm[] = { LIMM };
2611
2612
/* The opcode table.
2613
2614
   The format of the opcode table is:
2615
2616
   NAME OPCODE MASK CPU CLASS SUBCLASS { OPERANDS } { FLAGS }.
2617
2618
   The table is organised such that, where possible, all instructions with
2619
   the same mnemonic are together in a block.  When the assembler searches
2620
   for a suitable instruction the entries are checked in table order, so
2621
   more specific, or specialised cases should appear earlier in the table.
2622
2623
   As an example, consider two instructions 'add a,b,u6' and 'add
2624
   a,b,limm'.  The first takes a 6-bit immediate that is encoded within the
2625
   32-bit instruction, while the second takes a 32-bit immediate that is
2626
   encoded in a follow-on 32-bit, making the total instruction length
2627
   64-bits.  In this case the u6 variant must appear first in the table, as
2628
   all u6 immediates could also be encoded using the 'limm' extension,
2629
   however, we want to use the shorter instruction wherever possible.
2630
2631
   It is possible though to split instructions with the same mnemonic into
2632
   multiple groups.  However, the instructions are still checked in table
2633
   order, even across groups.  The only time that instructions with the
2634
   same mnemonic should be split into different groups is when different
2635
   variants of the instruction appear in different architectures, in which
2636
   case, grouping all instructions from a particular architecture together
2637
   might be preferable to merging the instruction into the main instruction
2638
   table.
2639
2640
   An example of this split instruction groups can be found with the 'sync'
2641
   instruction.  The core arc architecture provides a 'sync' instruction,
2642
   while the nps instruction set extension provides 'sync.rd' and
2643
   'sync.wr'.  The rd/wr flags are instruction flags, not part of the
2644
   mnemonic, so we end up with two groups for the sync instruction, the
2645
   first within the core arc instruction table, and the second within the
2646
   nps extension instructions.  */
2647
const struct arc_opcode arc_opcodes[] =
2648
{
2649
#include "arc-tbl.h"
2650
#include "arc-nps400-tbl.h"
2651
#include "arc-ext-tbl.h"
2652
2653
  { NULL, 0, 0, 0, 0, 0, { 0 }, { 0 } }
2654
};
2655
2656
/* List with special cases instructions and the applicable flags.  */
2657
const struct arc_flag_special arc_flag_special_cases[] =
2658
{
2659
  { "b", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2660
     F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2661
     F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2662
     F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM,
2663
     F_NO_T, F_NULL } },
2664
  { "bl", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2665
      F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2666
      F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2667
      F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2668
  { "br", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2669
      F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2670
      F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2671
      F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2672
  { "j", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2673
     F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2674
     F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2675
     F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2676
  { "jl", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2677
      F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2678
      F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2679
      F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2680
  { "lp", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2681
      F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2682
      F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2683
      F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2684
  { "set", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
2685
       F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
2686
       F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
2687
       F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
2688
  { "ld", { F_SIZEB17, F_SIZEW17, F_H17, F_NULL } },
2689
  { "st", { F_SIZEB1, F_SIZEW1, F_H1, F_NULL } }
2690
};
2691
2692
const unsigned arc_num_flag_special = ARRAY_SIZE (arc_flag_special_cases);
2693
2694
/* Relocations.  */
2695
const struct arc_reloc_equiv_tab arc_reloc_equiv[] =
2696
{
2697
  { "sda", "ld", { F_ASFAKE, F_H1, F_NULL },
2698
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
2699
  { "sda", "st", { F_ASFAKE, F_H1, F_NULL },
2700
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
2701
  { "sda", "ld", { F_ASFAKE, F_SIZEW7, F_NULL },
2702
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
2703
  { "sda", "st", { F_ASFAKE, F_SIZEW7, F_NULL },
2704
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
2705
2706
  /* Next two entries will cover the undefined behavior ldb/stb with
2707
     address scaling.  */
2708
  { "sda", "ld", { F_ASFAKE, F_SIZEB7, F_NULL },
2709
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST },
2710
  { "sda", "st", { F_ASFAKE, F_SIZEB7, F_NULL },
2711
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST},
2712
2713
  { "sda", "ld", { F_ASFAKE, F_NULL },
2714
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2 },
2715
  { "sda", "st", { F_ASFAKE, F_NULL },
2716
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2},
2717
  { "sda", "ldd", { F_ASFAKE, F_NULL },
2718
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2 },
2719
  { "sda", "std", { F_ASFAKE, F_NULL },
2720
    BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2},
2721
2722
  /* Short instructions.  */
2723
  { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_LD, BFD_RELOC_ARC_SDA16_LD },
2724
  { "sda", 0, { F_NULL }, -SIMM10_A16_7_Sbis, BFD_RELOC_ARC_SDA16_LD1 },
2725
  { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_LD2, BFD_RELOC_ARC_SDA16_LD2 },
2726
  { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_ST2, BFD_RELOC_ARC_SDA16_ST2 },
2727
2728
  { "sda", 0, { F_NULL }, BFD_RELOC_ARC_32_ME, BFD_RELOC_ARC_SDA32_ME },
2729
  { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST },
2730
2731
  { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S25H_PCREL,
2732
    BFD_RELOC_ARC_S25H_PCREL_PLT },
2733
  { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S21H_PCREL,
2734
    BFD_RELOC_ARC_S21H_PCREL_PLT },
2735
  { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S25W_PCREL,
2736
    BFD_RELOC_ARC_S25W_PCREL_PLT },
2737
  { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S21W_PCREL,
2738
    BFD_RELOC_ARC_S21W_PCREL_PLT },
2739
2740
  { "plt", 0, { F_NULL }, BFD_RELOC_ARC_32_ME, BFD_RELOC_ARC_PLT32 }
2741
};
2742
2743
const unsigned arc_num_equiv_tab = ARRAY_SIZE (arc_reloc_equiv);
2744
2745
const struct arc_pseudo_insn arc_pseudo_insns[] =
2746
{
2747
  { "push", "st", ".aw", 5, { { RC, 0, 0, 0 }, { BRAKET, 1, 0, 1 },
2748
            { RB, 1, 28, 2 }, { SIMM9_8, 1, -4, 3 },
2749
            { BRAKETdup, 1, 0, 4} } },
2750
  { "pop", "ld", ".ab", 5, { { RA, 0, 0, 0 }, { BRAKET, 1, 0, 1 },
2751
           { RB, 1, 28, 2 }, { SIMM9_8, 1, 4, 3 },
2752
           { BRAKETdup, 1, 0, 4} } },
2753
2754
  { "brgt", "brlt", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
2755
             { SIMM9_A16_8, 0, 0, 2 } } },
2756
  { "brgt", "brge", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2757
             { SIMM9_A16_8, 0, 0, 2 } } },
2758
  { "brgt", "brlt", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
2759
             { SIMM9_A16_8, 0, 0, 2 } } },
2760
  { "brgt", "brlt", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
2761
             { SIMM9_A16_8, 0, 0, 2 } } },
2762
  { "brgt", "brge", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2763
             { SIMM9_A16_8, 0, 0, 2 } } },
2764
2765
  { "brhi", "brlo", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
2766
             { SIMM9_A16_8, 0, 0, 2 } } },
2767
  { "brhi", "brhs", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2768
             { SIMM9_A16_8, 0, 0, 2 } } },
2769
  { "brhi", "brlo", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
2770
             { SIMM9_A16_8, 0, 0, 2 } } },
2771
  { "brhi", "brlo", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
2772
             { SIMM9_A16_8, 0, 0, 2 } } },
2773
  { "brhi", "brhs", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2774
             { SIMM9_A16_8, 0, 0, 2 } } },
2775
2776
  { "brle", "brge", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
2777
             { SIMM9_A16_8, 0, 0, 2 } } },
2778
  { "brle", "brlt", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2779
             { SIMM9_A16_8, 0, 0, 2 } } },
2780
  { "brle", "brge", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
2781
             { SIMM9_A16_8, 0, 0, 2 } } },
2782
  { "brle", "brge", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
2783
             { SIMM9_A16_8, 0, 0, 2 } } },
2784
  { "brle", "brlt", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2785
             { SIMM9_A16_8, 0, 0, 2 } } },
2786
2787
  { "brls", "brhs", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
2788
             { SIMM9_A16_8, 0, 0, 2 } } },
2789
  { "brls", "brlo", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2790
             { SIMM9_A16_8, 0, 0, 2 } } },
2791
  { "brls", "brhs", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
2792
             { SIMM9_A16_8, 0, 0, 2 } } },
2793
  { "brls", "brhs", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
2794
             { SIMM9_A16_8, 0, 0, 2 } } },
2795
  { "brls", "brlo", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
2796
             { SIMM9_A16_8, 0, 0, 2 } } },
2797
};
2798
2799
const unsigned arc_num_pseudo_insn =
2800
  sizeof (arc_pseudo_insns) / sizeof (*arc_pseudo_insns);
2801
2802
const struct arc_aux_reg arc_aux_regs[] =
2803
{
2804
#undef DEF
2805
#define DEF(ADDR, CPU, SUBCLASS, NAME)    \
2806
  { ADDR, CPU, SUBCLASS, #NAME, sizeof (#NAME)-1 },
2807
2808
#include "arc-regs.h"
2809
2810
#undef DEF
2811
};
2812
2813
const unsigned arc_num_aux_regs = ARRAY_SIZE (arc_aux_regs);
2814
2815
/* NOTE: The order of this array MUST be consistent with 'enum
2816
   arc_rlx_types' located in tc-arc.h!  */
2817
const struct arc_opcode arc_relax_opcodes[] =
2818
{
2819
  { NULL, 0x0, 0x0, 0x0, ARITH, NONE, { UNUSED }, { 0 } },
2820
2821
  /* bl_s s13 11111sssssssssss.  */
2822
  { "bl_s", 0x0000F800, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2823
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
2824
    { SIMM13_A32_5_S }, { 0 }},
2825
2826
  /* bl<.d> s25 00001sssssssss10SSSSSSSSSSNRtttt.  */
2827
  { "bl", 0x08020000, 0xF8030000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2828
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
2829
    { SIMM25_A32_5 }, { C_D }},
2830
2831
  /* b_s s10 1111000sssssssss.  */
2832
  { "b_s", 0x0000F000, 0x0000FE00, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2833
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
2834
    { SIMM10_A16_7_S }, { 0 }},
2835
2836
  /* b<.d> s25 00000ssssssssss1SSSSSSSSSSNRtttt.  */
2837
  { "b", 0x00010000, 0xF8010000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2838
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
2839
    { SIMM25_A16_5 }, { C_D }},
2840
2841
  /* add_s c,b,u3 01101bbbccc00uuu.  */
2842
  { "add_s", 0x00006800, 0x0000F818, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2843
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2844
    { RC_S, RB_S, UIMM3_13R_S }, { 0 }},
2845
2846
  /* add<.f> a,b,u6 00100bbb01000000FBBBuuuuuuAAAAAA.  */
2847
  { "add", 0x20400000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2848
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2849
    { RA, RB, UIMM6_20R }, { C_F }},
2850
2851
  /* add<.f> a,b,limm 00100bbb00000000FBBB111110AAAAAA.  */
2852
  { "add", 0x20000F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2853
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2854
    { RA, RB, LIMM }, { C_F }},
2855
2856
  /* ld_s c,b,u7 10000bbbcccuuuuu.  */
2857
  { "ld_s", 0x00008000, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2858
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2859
    { RC_S, BRAKET, RB_S, UIMM7_A32_11R_S, BRAKETdup }, { 0 }},
2860
2861
  /* ld<.di><.aa><.x><zz> a,b,s9
2862
     00010bbbssssssssSBBBDaaZZXAAAAAA.  */
2863
  { "ld", 0x10000000, 0xF8000000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2864
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2865
    { RA, BRAKET, RB, SIMM9_8R, BRAKETdup },
2866
    { C_ZZ23, C_DI20, C_AA21, C_X25 }},
2867
2868
  /* ld<.di><.aa><.x><zz> a,b,limm 00100bbbaa110ZZXDBBB111110AAAAAA.  */
2869
  { "ld", 0x20300F80, 0xF8380FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2870
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2871
    { RA, BRAKET, RB, LIMM, BRAKETdup },
2872
    { C_ZZ13, C_DI16, C_AA8, C_X15 }},
2873
2874
  /* mov_s b,u8 11011bbbuuuuuuuu.  */
2875
  { "mov_s", 0x0000D800, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2876
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2877
    { RB_S, UIMM8_8R_S }, { 0 }},
2878
2879
  /* mov<.f> b,s12 00100bbb10001010FBBBssssssSSSSSS.  */
2880
  { "mov", 0x208A0000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2881
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2882
    { RB, SIMM12_20R }, { C_F }},
2883
2884
  /* mov<.f> b,limm 00100bbb00001010FBBB111110RRRRRR.  */
2885
  { "mov", 0x200A0F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2886
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2887
    { RB, LIMM }, { C_F }},
2888
2889
  /* sub_s c,b,u3 01101bbbccc01uuu.  */
2890
  { "sub_s", 0x00006808, 0x0000F818, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2891
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2892
    { RC_S, RB_S, UIMM3_13R_S }, { 0 }},
2893
2894
  /* sub<.f> a,b,u6 00100bbb01000010FBBBuuuuuuAAAAAA.  */
2895
  { "sub", 0x20420000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2896
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2897
    { RA, RB, UIMM6_20R }, { C_F }},
2898
2899
  /* sub<.f> a,b,limm 00100bbb00000010FBBB111110AAAAAA.  */
2900
  { "sub", 0x20020F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2901
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2902
    { RA, RB, LIMM }, { C_F }},
2903
2904
  /* mpy<.f> a,b,u6 00100bbb01011010FBBBuuuuuuAAAAAA.  */
2905
  { "mpy", 0x205A0000, 0xF8FF0000, ARC_OPCODE_ARC700 | ARC_OPCODE_ARCv2EM
2906
    | ARC_OPCODE_ARCv2HS, ARITH, MPY6E, { RA, RB, UIMM6_20R }, { C_F }},
2907
2908
  /* mpy<.f> a,b,limm 00100bbb00011010FBBB111110AAAAAA.  */
2909
  { "mpy", 0x201A0F80, 0xF8FF0FC0, ARC_OPCODE_ARC700 | ARC_OPCODE_ARCv2EM
2910
    | ARC_OPCODE_ARCv2HS, ARITH, MPY6E, { RA, RB, LIMM }, { C_F }},
2911
2912
  /* mov<.f><.cc> b,u6 00100bbb11001010FBBBuuuuuu1QQQQQ.  */
2913
  { "mov", 0x20CA0020, 0xF8FF0020, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2914
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2915
    { RB, UIMM6_20R }, { C_F, C_CC }},
2916
2917
  /* mov<.f><.cc> b,limm 00100bbb11001010FBBB1111100QQQQQ.  */
2918
  { "mov", 0x20CA0F80, 0xF8FF0FE0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2919
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
2920
    { RB, LIMM }, { C_F, C_CC }},
2921
2922
  /* add<.f><.cc> b,b,u6 00100bbb11000000FBBBuuuuuu1QQQQQ.  */
2923
  { "add", 0x20C00020, 0xF8FF0020, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2924
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2925
    { RB, RBdup, UIMM6_20R }, { C_F, C_CC }},
2926
2927
  /* add<.f><.cc> b,b,limm 00100bbb11000000FBBB1111100QQQQQ.  */
2928
  { "add", 0x20C00F80, 0xF8FF0FE0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
2929
    | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
2930
    { RB, RBdup, LIMM }, { C_F, C_CC }}
2931
};
2932
2933
const unsigned arc_num_relax_opcodes = ARRAY_SIZE (arc_relax_opcodes);
2934
2935
/* Return length of an opcode in bytes.  */
2936
2937
int
2938
arc_opcode_len (const struct arc_opcode *opcode)
2939
908M
{
2940
908M
  if (opcode->mask < 0x10000ull)
2941
36.8M
    return 2;
2942
2943
871M
  if (opcode->mask < 0x100000000ull)
2944
870M
    return 4;
2945
2946
1.49M
  if (opcode->mask < 0x1000000000000ull)
2947
535k
    return 6;
2948
2949
960k
  return 8;
2950
1.49M
}