1 /* Opcode table for the ARC.
2 Copyright (C) 1994-2020 Free Software Foundation, Inc.
4 Contributed by Claudiu Zissulescu (claziss@synopsys.com)
6 This file is part of libopcodes.
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)
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.
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. */
25 #include "opcode/arc.h"
27 #include "libiberty.h"
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. */
33 /* Insert RA register into a 32-bit opcode, with checks. */
35 static unsigned long long
36 insert_ra_chk (unsigned long long insn
,
41 *errmsg
= _("LP_COUNT register cannot be used as destination register");
43 return insn
| (value
& 0x3F);
46 /* Insert RB register into a 32-bit opcode. */
48 static unsigned long long
49 insert_rb (unsigned long long insn
,
51 const char ** errmsg ATTRIBUTE_UNUSED
)
53 return insn
| ((value
& 0x07) << 24) | (((value
>> 3) & 0x07) << 12);
56 /* Insert RB register with checks. */
58 static unsigned long long
59 insert_rb_chk (unsigned long long insn
,
64 *errmsg
= _("LP_COUNT register cannot be used as destination register");
66 return insn
| ((value
& 0x07) << 24) | (((value
>> 3) & 0x07) << 12);
70 extract_rb (unsigned long long insn
,
71 bfd_boolean
* invalid
)
73 int value
= (((insn
>> 12) & 0x07) << 3) | ((insn
>> 24) & 0x07);
75 if (value
== 0x3e && invalid
)
76 *invalid
= TRUE
; /* A limm operand, it should be extracted in a
82 static unsigned long long
83 insert_rad (unsigned long long insn
,
88 *errmsg
= _("cannot use odd number destination register");
90 *errmsg
= _("LP_COUNT register cannot be used as destination register");
92 return insn
| (value
& 0x3F);
95 static unsigned long long
96 insert_rcd (unsigned long long insn
,
101 *errmsg
= _("cannot use odd number source register");
103 return insn
| ((value
& 0x3F) << 6);
106 static unsigned long long
107 insert_rbd (unsigned long long insn
,
109 const char ** errmsg
)
112 *errmsg
= _("cannot use odd number source register");
114 *errmsg
= _("LP_COUNT register cannot be used as destination register");
116 return insn
| ((value
& 0x07) << 24) | (((value
>> 3) & 0x07) << 12);
119 /* Dummy insert ZERO operand function. */
121 static unsigned long long
122 insert_za (unsigned long long insn
,
124 const char ** errmsg
)
127 *errmsg
= _("operand is not zero");
131 /* Insert Y-bit in bbit/br instructions. This function is called only
132 when solving fixups. */
134 static unsigned long long
135 insert_Ybit (unsigned long long insn
,
137 const char ** errmsg ATTRIBUTE_UNUSED
)
145 /* Insert Y-bit in bbit/br instructions. This function is called only
146 when solving fixups. */
148 static unsigned long long
149 insert_NYbit (unsigned long long insn
,
151 const char ** errmsg ATTRIBUTE_UNUSED
)
159 /* Insert H register into a 16-bit opcode. */
161 static unsigned long long
162 insert_rhv1 (unsigned long long insn
,
164 const char ** errmsg ATTRIBUTE_UNUSED
)
166 return insn
|= ((value
& 0x07) << 5) | ((value
>> 3) & 0x07);
170 extract_rhv1 (unsigned long long insn
,
171 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
173 int value
= ((insn
& 0x7) << 3) | ((insn
>> 5) & 0x7);
178 /* Insert H register into a 16-bit opcode. */
180 static unsigned long long
181 insert_rhv2 (unsigned long long insn
,
183 const char ** errmsg
)
186 *errmsg
= _("register R30 is a limm indicator");
187 else if (value
< 0 || value
> 31)
188 *errmsg
= _("register out of range");
189 return insn
|= ((value
& 0x07) << 5) | ((value
>> 3) & 0x03);
193 extract_rhv2 (unsigned long long insn
,
194 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
196 int value
= ((insn
>> 5) & 0x07) | ((insn
& 0x03) << 3);
201 static unsigned long long
202 insert_r0 (unsigned long long insn
,
204 const char ** errmsg
)
207 *errmsg
= _("register must be R0");
212 extract_r0 (unsigned long long insn ATTRIBUTE_UNUSED
,
213 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
219 static unsigned long long
220 insert_r1 (unsigned long long insn
,
222 const char ** errmsg
)
225 *errmsg
= _("register must be R1");
230 extract_r1 (unsigned long long insn ATTRIBUTE_UNUSED
,
231 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
236 static unsigned long long
237 insert_r2 (unsigned long long insn
,
239 const char ** errmsg
)
242 *errmsg
= _("register must be R2");
247 extract_r2 (unsigned long long insn ATTRIBUTE_UNUSED
,
248 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
253 static unsigned long long
254 insert_r3 (unsigned long long insn
,
256 const char ** errmsg
)
259 *errmsg
= _("register must be R3");
264 extract_r3 (unsigned long long insn ATTRIBUTE_UNUSED
,
265 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
270 static unsigned long long
271 insert_sp (unsigned long long insn
,
273 const char ** errmsg
)
276 *errmsg
= _("register must be SP");
281 extract_sp (unsigned long long insn ATTRIBUTE_UNUSED
,
282 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
287 static unsigned long long
288 insert_gp (unsigned long long insn
,
290 const char ** errmsg
)
293 *errmsg
= _("register must be GP");
298 extract_gp (unsigned long long insn ATTRIBUTE_UNUSED
,
299 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
304 static unsigned long long
305 insert_pcl (unsigned long long insn
,
307 const char ** errmsg
)
310 *errmsg
= _("register must be PCL");
315 extract_pcl (unsigned long long insn ATTRIBUTE_UNUSED
,
316 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
321 static unsigned long long
322 insert_blink (unsigned long long insn
,
324 const char ** errmsg
)
327 *errmsg
= _("register must be BLINK");
332 extract_blink (unsigned long long insn ATTRIBUTE_UNUSED
,
333 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
338 static unsigned long long
339 insert_ilink1 (unsigned long long insn
,
341 const char ** errmsg
)
344 *errmsg
= _("register must be ILINK1");
349 extract_ilink1 (unsigned long long insn ATTRIBUTE_UNUSED
,
350 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
355 static unsigned long long
356 insert_ilink2 (unsigned long long insn
,
358 const char ** errmsg
)
361 *errmsg
= _("register must be ILINK2");
366 extract_ilink2 (unsigned long long insn ATTRIBUTE_UNUSED
,
367 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
372 static unsigned long long
373 insert_ras (unsigned long long insn
,
375 const char ** errmsg
)
392 *errmsg
= _("register must be either r0-r3 or r12-r15");
399 extract_ras (unsigned long long insn
,
400 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
402 int value
= insn
& 0x07;
410 static unsigned long long
411 insert_rbs (unsigned long long insn
,
413 const char ** errmsg
)
427 insn
|= ((value
- 8)) << 8;
430 *errmsg
= _("register must be either r0-r3 or r12-r15");
437 extract_rbs (unsigned long long insn
,
438 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
440 int value
= (insn
>> 8) & 0x07;
448 static unsigned long long
449 insert_rcs (unsigned long long insn
,
451 const char ** errmsg
)
465 insn
|= ((value
- 8)) << 5;
468 *errmsg
= _("register must be either r0-r3 or r12-r15");
475 extract_rcs (unsigned long long insn
,
476 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
478 int value
= (insn
>> 5) & 0x07;
486 static unsigned long long
487 insert_simm3s (unsigned long long insn
,
489 const char ** errmsg
)
519 *errmsg
= _("accepted values are from -1 to 6");
528 extract_simm3s (unsigned long long insn
,
529 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
531 int value
= (insn
>> 8) & 0x07;
539 static unsigned long long
540 insert_rrange (unsigned long long insn
,
542 const char ** errmsg
)
544 int reg1
= (value
>> 16) & 0xFFFF;
545 int reg2
= value
& 0xFFFF;
548 *errmsg
= _("first register of the range should be r13");
549 else if (reg2
< 13 || reg2
> 26)
550 *errmsg
= _("last register of the range doesn't fit");
552 insn
|= ((reg2
- 12) & 0x0F) << 1;
557 extract_rrange (unsigned long long insn
,
558 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
560 return (insn
>> 1) & 0x0F;
563 static unsigned long long
564 insert_r13el (unsigned long long insn
,
570 *errmsg
= _("invalid register number, should be fp");
578 static unsigned long long
579 insert_fpel (unsigned long long insn
,
581 const char ** errmsg
)
585 *errmsg
= _("invalid register number, should be fp");
594 extract_fpel (unsigned long long insn
,
595 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
597 return (insn
& 0x0100) ? 27 : -1;
600 static unsigned long long
601 insert_blinkel (unsigned long long insn
,
603 const char ** errmsg
)
607 *errmsg
= _("invalid register number, should be blink");
616 extract_blinkel (unsigned long long insn
,
617 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
619 return (insn
& 0x0200) ? 31 : -1;
622 static unsigned long long
623 insert_pclel (unsigned long long insn
,
625 const char ** errmsg
)
629 *errmsg
= _("invalid register number, should be pcl");
638 extract_pclel (unsigned long long insn
,
639 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
641 return (insn
& 0x0400) ? 63 : -1;
646 /* mask = 00000000000000000000111111000000
647 insn = 00011bbb000000000BBBwwwwwwDaaZZ1. */
649 static unsigned long long
650 insert_w6 (unsigned long long insn
,
652 const char ** errmsg ATTRIBUTE_UNUSED
)
654 insn
|= ((value
>> 0) & 0x003f) << 6;
661 /* mask = 00000000000000000000111111000000. */
664 extract_w6 (unsigned long long insn
,
665 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
669 value
|= ((insn
>> 6) & 0x003f) << 0;
671 /* Extend the sign. */
672 int signbit
= 1 << 5;
673 value
= (value
^ signbit
) - signbit
;
680 /* mask = 0000011100022000
681 insn = 01000ggghhhGG0HH. */
683 static unsigned long long
684 insert_g_s (unsigned long long insn
,
686 const char ** errmsg ATTRIBUTE_UNUSED
)
688 insn
|= ((value
>> 0) & 0x0007) << 8;
689 insn
|= ((value
>> 3) & 0x0003) << 3;
696 /* mask = 0000011100022000. */
699 extract_g_s (unsigned long long insn
,
700 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
703 int signbit
= 1 << (6 - 1);
705 value
|= ((insn
>> 8) & 0x0007) << 0;
706 value
|= ((insn
>> 3) & 0x0003) << 3;
708 /* Extend the sign. */
709 value
= (value
^ signbit
) - signbit
;
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, \
720 const char ** errmsg) \
728 insn |= value << (OFFSET); \
734 insn |= (value - 8) << (OFFSET); \
737 *errmsg = _("register must be either r0-r3 or r12-r15"); \
744 extract_nps_3bit_reg_at_##OFFSET##_##NAME \
745 (unsigned long long insn, \
746 bfd_boolean * invalid ATTRIBUTE_UNUSED) \
748 int value = (insn >> (OFFSET)) & 0x07; \
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)
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)
764 static unsigned long long
765 insert_nps_bitop_size_2b (unsigned long long insn
,
767 const char ** errmsg
)
785 *errmsg
= _("invalid size, should be 1, 2, 4, or 8");
794 extract_nps_bitop_size_2b (unsigned long long insn
,
795 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
797 return 1 << ((insn
>> 10) & 0x3);
800 static unsigned long long
801 insert_nps_bitop_uimm8 (unsigned long long insn
,
803 const char ** errmsg ATTRIBUTE_UNUSED
)
805 insn
|= ((value
>> 5) & 7) << 12;
806 insn
|= (value
& 0x1f);
811 extract_nps_bitop_uimm8 (unsigned long long insn
,
812 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
814 return (((insn
>> 12) & 0x7) << 5) | (insn
& 0x1f);
817 static unsigned long long
818 insert_nps_rflt_uimm6 (unsigned long long insn
,
820 const char ** errmsg
)
830 *errmsg
= _("invalid immediate, must be 1, 2, or 4");
834 insn
|= (value
<< 6);
839 extract_nps_rflt_uimm6 (unsigned long long insn
,
840 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
842 return (insn
>> 6) & 0x3f;
845 static unsigned long long
846 insert_nps_dst_pos_and_size (unsigned long long insn
,
848 const char ** errmsg ATTRIBUTE_UNUSED
)
850 insn
|= ((value
& 0x1f) | (((32 - value
- 1) & 0x1f) << 10));
855 extract_nps_dst_pos_and_size (unsigned long long insn
,
856 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
858 return (insn
& 0x1f);
861 static unsigned long long
862 insert_nps_cmem_uimm16 (unsigned long long insn
,
864 const char ** errmsg
)
866 int top
= (value
>> 16) & 0xffff;
868 if (top
!= 0x0 && top
!= NPS_CMEM_HIGH_VALUE
)
869 *errmsg
= _("invalid value for CMEM ld/st immediate");
870 insn
|= (value
& 0xffff);
875 extract_nps_cmem_uimm16 (unsigned long long insn
,
876 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
878 return (NPS_CMEM_HIGH_VALUE
<< 16) | (insn
& 0xffff);
881 static unsigned long long
882 insert_nps_imm_offset (unsigned long long insn
,
884 const char ** errmsg
)
896 *errmsg
= _("invalid position, should be 0, 16, 32, 48 or 64.");
899 insn
|= (value
<< 10);
904 extract_nps_imm_offset (unsigned long long insn
,
905 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
907 return ((insn
>> 10) & 0x7) * 16;
910 static unsigned long long
911 insert_nps_imm_entry (unsigned long long insn
,
913 const char ** errmsg
)
930 *errmsg
= _("invalid position, should be 16, 32, 64 or 128.");
933 insn
|= (value
<< 2);
938 extract_nps_imm_entry (unsigned long long insn
,
939 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
941 int imm_entry
= ((insn
>> 2) & 0x7);
942 return (1 << (imm_entry
+ 4));
945 static unsigned long long
946 insert_nps_size_16bit (unsigned long long insn
,
948 const char ** errmsg
)
950 if ((value
< 1) || (value
> 64))
952 *errmsg
= _("invalid size value must be on range 1-64.");
955 value
= value
& 0x3f;
956 insn
|= (value
<< 6);
961 extract_nps_size_16bit (unsigned long long insn
,
962 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
964 return ((insn
& 0xfc0) >> 6) ? ((insn
& 0xfc0) >> 6) : 64;
968 #define MAKE_SRC_POS_INSERT_EXTRACT_FUNCS(NAME,SHIFT) \
969 static unsigned long long \
970 insert_nps_##NAME##_pos (unsigned long long insn, \
972 const char ** errmsg) \
983 *errmsg = _("invalid position, should be 0, 8, 16, or 24"); \
986 insn |= (value << SHIFT); \
991 extract_nps_##NAME##_pos (unsigned long long insn, \
992 bfd_boolean * invalid ATTRIBUTE_UNUSED) \
994 return ((insn >> SHIFT) & 0x3) * 8; \
997 MAKE_SRC_POS_INSERT_EXTRACT_FUNCS (src2
, 12)
998 MAKE_SRC_POS_INSERT_EXTRACT_FUNCS (src1
, 10)
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, \
1004 const char ** errmsg) \
1006 if (value < LOWER || value > UPPER) \
1008 *errmsg = _("invalid size, value must be " \
1009 #LOWER " to " #UPPER "."); \
1013 insn |= (value << SHIFT); \
1018 extract_nps_##NAME (unsigned long long insn, \
1019 bfd_boolean * invalid ATTRIBUTE_UNUSED) \
1021 return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS; \
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)
1037 extract_nps_qcmp_m3 (unsigned long long insn
,
1038 bfd_boolean
* invalid
)
1040 int m3
= (insn
>> 5) & 0xf;
1047 extract_nps_qcmp_m2 (unsigned long long insn
,
1048 bfd_boolean
* invalid
)
1050 bfd_boolean tmp_invalid
= FALSE
;
1051 int m2
= (insn
>> 15) & 0x1;
1052 int m3
= extract_nps_qcmp_m3 (insn
, &tmp_invalid
);
1054 if (m2
== 0 && m3
== 0xf)
1060 extract_nps_qcmp_m1 (unsigned long long insn
,
1061 bfd_boolean
* invalid
)
1063 bfd_boolean tmp_invalid
= FALSE
;
1064 int m1
= (insn
>> 14) & 0x1;
1065 int m2
= extract_nps_qcmp_m2 (insn
, &tmp_invalid
);
1066 int m3
= extract_nps_qcmp_m3 (insn
, &tmp_invalid
);
1068 if (m1
== 0 && m2
== 0 && m3
== 0xf)
1073 static unsigned long long
1074 insert_nps_calc_entry_size (unsigned long long insn
,
1076 const char ** errmsg
)
1080 if (value
< 1 || value
> 256)
1082 *errmsg
= _("value out of range 1 - 256");
1086 for (pwr
= 0; (value
& 1) == 0; value
>>= 1)
1091 *errmsg
= _("value must be power of 2");
1095 return insn
| (pwr
<< 8);
1099 extract_nps_calc_entry_size (unsigned long long insn
,
1100 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
1102 unsigned entry_size
= (insn
>> 8) & 0xf;
1103 return 1 << entry_size
;
1106 static unsigned long long
1107 insert_nps_bitop_mod4 (unsigned long long insn
,
1109 const char ** errmsg ATTRIBUTE_UNUSED
)
1111 return insn
| ((value
& 0x2) << 30) | ((value
& 0x1) << 47);
1115 extract_nps_bitop_mod4 (unsigned long long insn
,
1116 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
1118 return ((insn
>> 30) & 0x2) | ((insn
>> 47) & 0x1);
1121 static unsigned long long
1122 insert_nps_bitop_dst_pos3_pos4 (unsigned long long insn
,
1124 const char ** errmsg ATTRIBUTE_UNUSED
)
1126 return insn
| (value
<< 42) | (value
<< 37);
1130 extract_nps_bitop_dst_pos3_pos4 (unsigned long long insn
,
1131 bfd_boolean
* invalid
)
1133 if (((insn
>> 42) & 0x1f) != ((insn
>> 37) & 0x1f))
1135 return ((insn
>> 37) & 0x1f);
1138 static unsigned long long
1139 insert_nps_bitop_ins_ext (unsigned long long insn
,
1141 const char ** errmsg
)
1143 if (value
< 0 || value
> 28)
1144 *errmsg
= _("value must be in the range 0 to 28");
1145 return insn
| (value
<< 20);
1149 extract_nps_bitop_ins_ext (unsigned long long insn
,
1150 bfd_boolean
* invalid
)
1152 int value
= (insn
>> 20) & 0x1f;
1159 #define MAKE_1BASED_INSERT_EXTRACT_FUNCS(NAME,SHIFT,UPPER,BITS) \
1160 static unsigned long long \
1161 insert_nps_##NAME (unsigned long long insn, \
1163 const char ** errmsg) \
1165 if (value < 1 || value > UPPER) \
1166 *errmsg = _("value must be in the range 1 to " #UPPER); \
1167 if (value == UPPER) \
1169 return insn | (value << SHIFT); \
1173 extract_nps_##NAME (unsigned long long insn, \
1174 bfd_boolean * invalid ATTRIBUTE_UNUSED) \
1176 int value = (insn >> SHIFT) & ((1 << BITS) - 1); \
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)
1190 static unsigned long long
1191 insert_nps_min_hofs (unsigned long long insn
,
1193 const char ** errmsg
)
1195 if (value
< 0 || value
> 240)
1196 *errmsg
= _("value must be in the range 0 to 240");
1197 if ((value
% 16) != 0)
1198 *errmsg
= _("value must be a multiple of 16");
1200 return insn
| (value
<< 6);
1204 extract_nps_min_hofs (unsigned long long insn
,
1205 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
1207 int value
= (insn
>> 6) & 0xF;
1211 #define MAKE_INSERT_NPS_ADDRTYPE(NAME, VALUE) \
1212 static unsigned long long \
1213 insert_nps_##NAME (unsigned long long insn, \
1215 const char ** errmsg) \
1217 if (value != ARC_NPS400_ADDRTYPE_##VALUE) \
1218 *errmsg = _("invalid address type for operand"); \
1223 extract_nps_##NAME (unsigned long long insn ATTRIBUTE_UNUSED, \
1224 bfd_boolean * invalid ATTRIBUTE_UNUSED) \
1226 return ARC_NPS400_ADDRTYPE_##VALUE; \
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
)
1246 static unsigned long long
1247 insert_nps_rbdouble_64 (unsigned long long insn
,
1249 const char ** errmsg
)
1251 if (value
< 0 || value
> 31)
1252 *errmsg
= _("value must be in the range 0 to 31");
1253 return insn
| (value
<< 43) | (value
<< 48);
1258 extract_nps_rbdouble_64 (unsigned long long insn
,
1259 bfd_boolean
* invalid
)
1261 int value1
= (insn
>> 43) & 0x1F;
1262 int value2
= (insn
>> 48) & 0x1F;
1264 if (value1
!= value2
)
1270 static unsigned long long
1271 insert_nps_misc_imm_offset (unsigned long long insn
,
1273 const char ** errmsg
)
1277 *errmsg
= _("invalid position, should be one of: 0,4,8,...124.");
1280 insn
|= (value
<< 6);
1284 static long long int
1285 extract_nps_misc_imm_offset (unsigned long long insn
,
1286 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
1288 return ((insn
>> 8) & 0x1f) * 4;
1291 static long long int
1292 extract_uimm12_20 (unsigned long long insn ATTRIBUTE_UNUSED
,
1293 bfd_boolean
* invalid ATTRIBUTE_UNUSED
)
1297 value
|= ((insn
>> 6) & 0x003f) << 0;
1298 value
|= ((insn
>> 0) & 0x003f) << 6;
1303 /* Include the generic extract/insert functions. Order is important
1304 as some of the functions present in the .h may be disabled via
1306 #include "arc-fxi.h"
1308 /* The flag operands table.
1310 The format of the table is
1311 NAME CODE BITS SHIFT FAVAIL. */
1312 const struct arc_flag_operand arc_flag_operands
[] =
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 },
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 },
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 },
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 },
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 },
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 },
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 },
1455 /* ARCv2 specific. */
1456 #define F_NT (F_DI15 + 1)
1457 { "nt", 0, 1, 3, 1},
1458 #define F_T (F_NT + 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. */
1470 #define F_NE (F_SIZED + 1)
1471 { "ne", 0, 0, 0, 1 },
1473 /* ARC NPS400 Support: See comment near head of file. */
1474 #define F_NPS_CL (F_NE + 1)
1475 { "cl", 0, 0, 0, 1 },
1477 #define F_NPS_NA (F_NPS_CL + 1)
1478 { "na", 1, 1, 9, 1 },
1480 #define F_NPS_SR (F_NPS_NA + 1)
1481 { "s", 1, 1, 13, 1 },
1483 #define F_NPS_M (F_NPS_SR + 1)
1484 { "m", 1, 1, 7, 1 },
1486 #define F_NPS_FLAG (F_NPS_M + 1)
1487 { "f", 1, 1, 20, 1 },
1489 #define F_NPS_R (F_NPS_FLAG + 1)
1490 { "r", 1, 1, 15, 1 },
1492 #define F_NPS_RW (F_NPS_R + 1)
1493 { "rw", 0, 1, 7, 1 },
1495 #define F_NPS_RD (F_NPS_RW + 1)
1496 { "rd", 1, 1, 7, 1 },
1498 #define F_NPS_WFT (F_NPS_RD + 1)
1499 { "wft", 0, 0, 0, 1 },
1501 #define F_NPS_IE1 (F_NPS_WFT + 1)
1502 { "ie1", 1, 2, 8, 1 },
1504 #define F_NPS_IE2 (F_NPS_IE1 + 1)
1505 { "ie2", 2, 2, 8, 1 },
1507 #define F_NPS_IE12 (F_NPS_IE2 + 1)
1508 { "ie12", 3, 2, 8, 1 },
1510 #define F_NPS_SYNC_RD (F_NPS_IE12 + 1)
1511 { "rd", 0, 1, 6, 1 },
1513 #define F_NPS_SYNC_WR (F_NPS_SYNC_RD + 1)
1514 { "wr", 1, 1, 6, 1 },
1516 #define F_NPS_HWS_OFF (F_NPS_SYNC_WR + 1)
1517 { "off", 0, 0, 0, 1 },
1519 #define F_NPS_HWS_RESTORE (F_NPS_HWS_OFF + 1)
1520 { "restore", 0, 0, 0, 1 },
1522 #define F_NPS_SX (F_NPS_HWS_RESTORE + 1)
1523 { "sx", 1, 1, 14, 1 },
1525 #define F_NPS_AR (F_NPS_SX + 1)
1526 { "ar", 0, 1, 0, 1 },
1528 #define F_NPS_AL (F_NPS_AR + 1)
1529 { "al", 1, 1, 0, 1 },
1531 #define F_NPS_S (F_NPS_AL + 1)
1532 { "s", 0, 0, 0, 1 },
1534 #define F_NPS_ZNCV_RD (F_NPS_S + 1)
1535 { "rd", 0, 1, 15, 1 },
1537 #define F_NPS_ZNCV_WR (F_NPS_ZNCV_RD + 1)
1538 { "wr", 1, 1, 15, 1 },
1540 #define F_NPS_P0 (F_NPS_ZNCV_WR + 1)
1541 { "p0", 0, 0, 0, 1 },
1543 #define F_NPS_P1 (F_NPS_P0 + 1)
1544 { "p1", 0, 0, 0, 1 },
1546 #define F_NPS_P2 (F_NPS_P1 + 1)
1547 { "p2", 0, 0, 0, 1 },
1549 #define F_NPS_P3 (F_NPS_P2 + 1)
1550 { "p3", 0, 0, 0, 1 },
1552 #define F_NPS_LDBIT_DI (F_NPS_P3 + 1)
1553 { "di", 0, 0, 0, 1 },
1555 #define F_NPS_LDBIT_CL1 (F_NPS_LDBIT_DI + 1)
1556 { "cl", 1, 1, 6, 1 },
1558 #define F_NPS_LDBIT_CL2 (F_NPS_LDBIT_CL1 + 1)
1559 { "cl", 1, 1, 16, 1 },
1561 #define F_NPS_LDBIT_X2_1 (F_NPS_LDBIT_CL2 + 1)
1562 { "x2", 1, 2, 9, 1 },
1564 #define F_NPS_LDBIT_X2_2 (F_NPS_LDBIT_X2_1 + 1)
1565 { "x2", 1, 2, 22, 1 },
1567 #define F_NPS_LDBIT_X4_1 (F_NPS_LDBIT_X2_2 + 1)
1568 { "x4", 2, 2, 9, 1 },
1570 #define F_NPS_LDBIT_X4_2 (F_NPS_LDBIT_X4_1 + 1)
1571 { "x4", 2, 2, 22, 1 },
1573 #define F_NPS_CORE (F_NPS_LDBIT_X4_2 + 1)
1574 { "core", 1, 3, 6, 1 },
1576 #define F_NPS_CLSR (F_NPS_CORE + 1)
1577 { "clsr", 2, 3, 6, 1 },
1579 #define F_NPS_ALL (F_NPS_CLSR + 1)
1580 { "all", 3, 3, 6, 1 },
1582 #define F_NPS_GIC (F_NPS_ALL + 1)
1583 { "gic", 4, 3, 6, 1 },
1585 #define F_NPS_RSPI_GIC (F_NPS_GIC + 1)
1586 { "gic", 5, 3, 6, 1 },
1589 const unsigned arc_num_flag_operands
= ARRAY_SIZE (arc_flag_operands
);
1591 /* Table of the flag classes.
1593 The format of the table is
1594 CLASS {FLAG_CODE}. */
1595 const struct arc_flag_class arc_flag_classes
[] =
1598 { F_CLASS_NONE
, { F_NULL
} },
1600 #define C_CC_EQ (C_EMPTY + 1)
1601 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_EQUAL
, F_NULL
} },
1603 #define C_CC_GE (C_CC_EQ + 1)
1604 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_GE
, F_NULL
} },
1606 #define C_CC_GT (C_CC_GE + 1)
1607 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_GT
, F_NULL
} },
1609 #define C_CC_HI (C_CC_GT + 1)
1610 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_HI
, F_NULL
} },
1612 #define C_CC_HS (C_CC_HI + 1)
1613 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_NOTCARRY
, F_NULL
} },
1615 #define C_CC_LE (C_CC_HS + 1)
1616 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_LE
, F_NULL
} },
1618 #define C_CC_LO (C_CC_LE + 1)
1619 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_CARRY
, F_NULL
} },
1621 #define C_CC_LS (C_CC_LO + 1)
1622 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_LS
, F_NULL
} },
1624 #define C_CC_LT (C_CC_LS + 1)
1625 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_LT
, F_NULL
} },
1627 #define C_CC_NE (C_CC_LT + 1)
1628 {F_CLASS_IMPLICIT
| F_CLASS_COND
, {F_NOTEQUAL
, F_NULL
} },
1630 #define C_AA_AB (C_CC_NE + 1)
1631 {F_CLASS_IMPLICIT
| F_CLASS_WB
, {F_AB3
, F_NULL
} },
1633 #define C_AA_AW (C_AA_AB + 1)
1634 {F_CLASS_IMPLICIT
| F_CLASS_WB
, {F_AW3
, F_NULL
} },
1636 #define C_ZZ_D (C_AA_AW + 1)
1637 {F_CLASS_IMPLICIT
| F_CLASS_ZZ
, {F_SIZED
, F_NULL
} },
1639 #define C_ZZ_H (C_ZZ_D + 1)
1640 {F_CLASS_IMPLICIT
| F_CLASS_ZZ
, {F_H1
, F_NULL
} },
1642 #define C_ZZ_B (C_ZZ_H + 1)
1643 {F_CLASS_IMPLICIT
| F_CLASS_ZZ
, {F_SIZEB1
, F_NULL
} },
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
} },
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
} },
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
} },
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
} },
1676 #define C_DHARD (C_DNZ_D + 1)
1677 { F_CLASS_OPTIONAL
, { F_DFAKE
, F_NULL
} },
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
}},
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
}},
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
}},
1703 #define C_AS (C_ZZ29 + 1)
1704 { F_CLASS_OPTIONAL
, { F_ASFAKE
, F_NULL
}},
1706 #define C_NE (C_AS + 1)
1707 { F_CLASS_REQUIRED
, { F_NE
, F_NULL
}},
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
}},
1713 #define C_NPS_NA (C_NPS_CL + 1)
1714 { F_CLASS_OPTIONAL
, { F_NPS_NA
, F_NULL
}},
1716 #define C_NPS_SR (C_NPS_NA + 1)
1717 { F_CLASS_OPTIONAL
, { F_NPS_SR
, F_NULL
}},
1719 #define C_NPS_M (C_NPS_SR + 1)
1720 { F_CLASS_OPTIONAL
, { F_NPS_M
, F_NULL
}},
1722 #define C_NPS_F (C_NPS_M + 1)
1723 { F_CLASS_OPTIONAL
, { F_NPS_FLAG
, F_NULL
}},
1725 #define C_NPS_R (C_NPS_F + 1)
1726 { F_CLASS_OPTIONAL
, { F_NPS_R
, F_NULL
}},
1728 #define C_NPS_SCHD_RW (C_NPS_R + 1)
1729 { F_CLASS_REQUIRED
, { F_NPS_RW
, F_NPS_RD
, F_NULL
}},
1731 #define C_NPS_SCHD_TRIG (C_NPS_SCHD_RW + 1)
1732 { F_CLASS_REQUIRED
, { F_NPS_WFT
, F_NULL
}},
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
}},
1737 #define C_NPS_SYNC (C_NPS_SCHD_IE + 1)
1738 { F_CLASS_REQUIRED
, { F_NPS_SYNC_RD
, F_NPS_SYNC_WR
, F_NULL
}},
1740 #define C_NPS_HWS_OFF (C_NPS_SYNC + 1)
1741 { F_CLASS_REQUIRED
, { F_NPS_HWS_OFF
, F_NULL
}},
1743 #define C_NPS_HWS_RESTORE (C_NPS_HWS_OFF + 1)
1744 { F_CLASS_REQUIRED
, { F_NPS_HWS_RESTORE
, F_NULL
}},
1746 #define C_NPS_SX (C_NPS_HWS_RESTORE + 1)
1747 { F_CLASS_OPTIONAL
, { F_NPS_SX
, F_NULL
}},
1749 #define C_NPS_AR_AL (C_NPS_SX + 1)
1750 { F_CLASS_REQUIRED
, { F_NPS_AR
, F_NPS_AL
, F_NULL
}},
1752 #define C_NPS_S (C_NPS_AR_AL + 1)
1753 { F_CLASS_REQUIRED
, { F_NPS_S
, F_NULL
}},
1755 #define C_NPS_ZNCV (C_NPS_S + 1)
1756 { F_CLASS_REQUIRED
, { F_NPS_ZNCV_RD
, F_NPS_ZNCV_WR
, F_NULL
}},
1758 #define C_NPS_P0 (C_NPS_ZNCV + 1)
1759 { F_CLASS_REQUIRED
, { F_NPS_P0
, F_NULL
}},
1761 #define C_NPS_P1 (C_NPS_P0 + 1)
1762 { F_CLASS_REQUIRED
, { F_NPS_P1
, F_NULL
}},
1764 #define C_NPS_P2 (C_NPS_P1 + 1)
1765 { F_CLASS_REQUIRED
, { F_NPS_P2
, F_NULL
}},
1767 #define C_NPS_P3 (C_NPS_P2 + 1)
1768 { F_CLASS_REQUIRED
, { F_NPS_P3
, F_NULL
}},
1770 #define C_NPS_LDBIT_DI (C_NPS_P3 + 1)
1771 { F_CLASS_REQUIRED
, { F_NPS_LDBIT_DI
, F_NULL
}},
1773 #define C_NPS_LDBIT_CL1 (C_NPS_LDBIT_DI + 1)
1774 { F_CLASS_OPTIONAL
, { F_NPS_LDBIT_CL1
, F_NULL
}},
1776 #define C_NPS_LDBIT_CL2 (C_NPS_LDBIT_CL1 + 1)
1777 { F_CLASS_OPTIONAL
, { F_NPS_LDBIT_CL2
, F_NULL
}},
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
}},
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
}},
1785 #define C_NPS_CORE (C_NPS_LDBIT_X_2 + 1)
1786 { F_CLASS_REQUIRED
, { F_NPS_CORE
, F_NULL
}},
1788 #define C_NPS_CLSR (C_NPS_CORE + 1)
1789 { F_CLASS_REQUIRED
, { F_NPS_CLSR
, F_NULL
}},
1791 #define C_NPS_ALL (C_NPS_CLSR + 1)
1792 { F_CLASS_REQUIRED
, { F_NPS_ALL
, F_NULL
}},
1794 #define C_NPS_GIC (C_NPS_ALL + 1)
1795 { F_CLASS_REQUIRED
, { F_NPS_GIC
, F_NULL
}},
1797 #define C_NPS_RSPI_GIC (C_NPS_GIC + 1)
1798 { F_CLASS_REQUIRED
, { F_NPS_RSPI_GIC
, F_NULL
}},
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
};
1806 /* The operands table.
1808 The format of the operands table is:
1810 BITS SHIFT DEFAULT_RELOC FLAGS INSERT_FUN EXTRACT_FUN. */
1811 const struct arc_operand arc_operands
[] =
1813 /* The fields are bits, shift, insert, extract, flags. The zero
1814 index is used to indicate end-of-list. */
1816 { 0, 0, 0, 0, 0, 0 },
1818 #define IGNORED (UNUSED + 1)
1819 { 0, 0, 0, ARC_OPERAND_IGNORE
| ARC_OPERAND_UNSIGNED
| ARC_OPERAND_NCHK
, 0, 0 },
1821 /* The plain integer register fields. Used by 32 bit
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
},
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
},
1848 /* The plain integer register fields. Used by short
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
1864 { 6, 5, 0, ARC_OPERAND_IR
, insert_rhv1
, extract_rhv1
},
1865 #define R5H (R6H + 1) /* 5bit register field 'h' used
1867 #define RH_S (R6H + 1) /* 5bit register field 'h' used
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
},
1875 #define RG (R5Hdup + 1)
1876 #define G_S (R5Hdup + 1)
1877 { 5, 5, 0, ARC_OPERAND_IR
, insert_g_s
, extract_g_s
},
1879 /* Fix registers. */
1881 #define R0_S (RG + 1)
1882 { 0, 0, 0, ARC_OPERAND_IR
, insert_r0
, extract_r0
},
1884 #define R1_S (R0 + 1)
1885 { 1, 0, 0, ARC_OPERAND_IR
, insert_r1
, extract_r1
},
1887 #define R2_S (R1 + 1)
1888 { 2, 0, 0, ARC_OPERAND_IR
, insert_r2
, extract_r2
},
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
},
1902 #define PCL_S (GP + 1)
1903 { 1, 0, 0, ARC_OPERAND_IR
| ARC_OPERAND_NCHK
, insert_pcl
, extract_pcl
},
1905 #define BLINK (PCL_S + 1)
1906 #define BLINK_S (PCL_S + 1)
1907 { 5, 0, 0, ARC_OPERAND_IR
, insert_blink
, extract_blink
},
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
},
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 },
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 },
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
},
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 },
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 },
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
,
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
2174 /* W6 mask = 00000000000000000000111111000000. */
2175 #define W6 (UIMM8_8R_S + 1)
2176 {6, 0, 0, ARC_OPERAND_SIGNED
, insert_w6
, extract_w6
},
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
},
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
},
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
},
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
},
2195 #define NPS_R_DST (NPS_R_SRC2_3B + 1)
2196 { 6, 21, 0, ARC_OPERAND_IR
, NULL
, NULL
},
2198 #define NPS_R_SRC1 (NPS_R_DST + 1)
2199 { 6, 21, 0, ARC_OPERAND_IR
| ARC_OPERAND_DUPLICATE
, NULL
, NULL
},
2201 #define NPS_BITOP_DST_POS (NPS_R_SRC1 + 1)
2202 { 5, 5, 0, ARC_OPERAND_UNSIGNED
, 0, 0 },
2204 #define NPS_BITOP_SRC_POS (NPS_BITOP_DST_POS + 1)
2205 { 5, 0, 0, ARC_OPERAND_UNSIGNED
, 0, 0 },
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
},
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
},
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
},
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
},
2223 #define NPS_UIMM16 (NPS_BITOP_UIMM8 + 1)
2224 { 16, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2226 #define NPS_SIMM16 (NPS_UIMM16 + 1)
2227 { 16, 0, 0, ARC_OPERAND_SIGNED
, NULL
, NULL
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
2261 #define NPS_R_XLDST (NPS_WXORB_SIZE + 1)
2262 { 6, 5, 0, ARC_OPERAND_IR
, NULL
, NULL
},
2264 #define NPS_DIV_UIMM4 (NPS_R_XLDST + 1)
2265 { 4, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2271 #define NPS_QCMP_M1 (NPS_QCMP_SIZE + 1)
2272 { 1, 14, 0, ARC_OPERAND_UNSIGNED
, NULL
, extract_nps_qcmp_m1
},
2274 #define NPS_QCMP_M2 (NPS_QCMP_M1 + 1)
2275 { 1, 15, 0, ARC_OPERAND_UNSIGNED
, NULL
, extract_nps_qcmp_m2
},
2277 #define NPS_QCMP_M3 (NPS_QCMP_M2 + 1)
2278 { 4, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, extract_nps_qcmp_m3
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
2308 #define NPS_BITOP_DST_POS4 (NPS_BITOP_DST_POS3_POS4 + 1)
2309 { 5, 42, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2311 #define NPS_BITOP_DST_POS3 (NPS_BITOP_DST_POS4 + 1)
2312 { 5, 37, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2314 #define NPS_BITOP_DST_POS2 (NPS_BITOP_DST_POS3 + 1)
2315 { 5, 15, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2317 #define NPS_BITOP_DST_POS1 (NPS_BITOP_DST_POS2 + 1)
2318 { 5, 10, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2320 #define NPS_BITOP_SRC_POS4 (NPS_BITOP_DST_POS1 + 1)
2321 { 5, 32, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2323 #define NPS_BITOP_SRC_POS3 (NPS_BITOP_SRC_POS4 + 1)
2324 { 5, 20, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2326 #define NPS_BITOP_SRC_POS2 (NPS_BITOP_SRC_POS3 + 1)
2327 { 5, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2329 #define NPS_BITOP_SRC_POS1 (NPS_BITOP_SRC_POS2 + 1)
2330 { 5, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2336 #define NPS_BITOP_MOD3 (NPS_BITOP_MOD4 + 1)
2337 { 2, 29, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2339 #define NPS_BITOP_MOD2 (NPS_BITOP_MOD3 + 1)
2340 { 2, 27, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2342 #define NPS_BITOP_MOD1 (NPS_BITOP_MOD2 + 1)
2343 { 2, 25, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2349 #define NPS_FIELD_START_POS (NPS_BITOP_INS_EXT + 1)
2350 { 3, 3, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
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
},
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
},
2364 #define NPS_SRC2_POS_5B (NPS_BITS_TO_SCRAMBLE + 1)
2365 { 5, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
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
},
2375 #define NPS_PSBC (NPS_MIN_HOFS + 1)
2376 { 1, 11, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2378 #define NPS_DPI_DST (NPS_PSBC + 1)
2379 { 5, 11, 0, ARC_OPERAND_IR
, NULL
, NULL
},
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
},
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
},
2391 #define NPS_HASH_PERM (NPS_HASH_WIDTH + 1)
2392 { 3, 2, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2394 #define NPS_HASH_NONLINEAR (NPS_HASH_PERM + 1)
2395 { 1, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2397 #define NPS_HASH_BASEMAT (NPS_HASH_NONLINEAR + 1)
2398 { 2, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2404 #define NPS_HASH_OFS (NPS_HASH_LEN + 1)
2405 { 2, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2407 #define NPS_HASH_BASEMAT2 (NPS_HASH_OFS + 1)
2408 { 1, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2410 #define NPS_E4BY_INDEX0 (NPS_HASH_BASEMAT2 + 1)
2411 { 3, 8, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2413 #define NPS_E4BY_INDEX1 (NPS_E4BY_INDEX0 + 1)
2414 { 3, 5, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
2416 #define NPS_E4BY_INDEX2 (NPS_E4BY_INDEX1 + 1)
2417 { 3, 2, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2423 #define COLON (NPS_E4BY_INDEX3 + 1)
2424 { 0, 0, 0, ARC_OPERAND_COLON
| ARC_OPERAND_FAKE
, NULL
, NULL
},
2426 #define NPS_BD (COLON + 1)
2427 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2428 insert_nps_bd
, extract_nps_bd
},
2430 #define NPS_JID (NPS_BD + 1)
2431 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2432 insert_nps_jid
, extract_nps_jid
},
2434 #define NPS_LBD (NPS_JID + 1)
2435 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2436 insert_nps_lbd
, extract_nps_lbd
},
2438 #define NPS_MBD (NPS_LBD + 1)
2439 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2440 insert_nps_mbd
, extract_nps_mbd
},
2442 #define NPS_SD (NPS_MBD + 1)
2443 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2444 insert_nps_sd
, extract_nps_sd
},
2446 #define NPS_SM (NPS_SD + 1)
2447 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2448 insert_nps_sm
, extract_nps_sm
},
2450 #define NPS_XA (NPS_SM + 1)
2451 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2452 insert_nps_xa
, extract_nps_xa
},
2454 #define NPS_XD (NPS_XA + 1)
2455 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2456 insert_nps_xd
, extract_nps_xd
},
2458 #define NPS_CD (NPS_XD + 1)
2459 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2460 insert_nps_cd
, extract_nps_cd
},
2462 #define NPS_CBD (NPS_CD + 1)
2463 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2464 insert_nps_cbd
, extract_nps_cbd
},
2466 #define NPS_CJID (NPS_CBD + 1)
2467 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2468 insert_nps_cjid
, extract_nps_cjid
},
2470 #define NPS_CLBD (NPS_CJID + 1)
2471 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2472 insert_nps_clbd
, extract_nps_clbd
},
2474 #define NPS_CM (NPS_CLBD + 1)
2475 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2476 insert_nps_cm
, extract_nps_cm
},
2478 #define NPS_CSD (NPS_CM + 1)
2479 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2480 insert_nps_csd
, extract_nps_csd
},
2482 #define NPS_CXA (NPS_CSD + 1)
2483 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2484 insert_nps_cxa
, extract_nps_cxa
},
2486 #define NPS_CXD (NPS_CXA + 1)
2487 { 0, 0, 0, ARC_OPERAND_ADDRTYPE
| ARC_OPERAND_NCHK
,
2488 insert_nps_cxd
, extract_nps_cxd
},
2490 #define NPS_BD_TYPE (NPS_CXD + 1)
2491 { 1, 10, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
2497 #define NPS_PMU_NXT_DST (NPS_BMU_NUM + 1)
2498 { 4, 6, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
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
},
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
},
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
},
2516 #define NPS_MISC_IMM_SIZE (NPS_DMA_IMM_OFFSET + 1)
2517 { 7, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
2547 #define NPS_RA_64 (NPS_R_SRC2_3B_64 + 1)
2548 { 6, 53, 0, ARC_OPERAND_IR
, NULL
, NULL
},
2550 #define NPS_RB_64 (NPS_RA_64 + 1)
2551 { 5, 48, 0, ARC_OPERAND_IR
, NULL
, NULL
},
2553 #define NPS_RBdup_64 (NPS_RB_64 + 1)
2554 { 5, 43, 0, ARC_OPERAND_IR
| ARC_OPERAND_DUPLICATE
, NULL
, NULL
},
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
},
2560 #define NPS_RC_64 (NPS_RBdouble_64 + 1)
2561 { 5, 43, 0, ARC_OPERAND_IR
, NULL
, NULL
},
2563 #define NPS_UIMM16_0_64 (NPS_RC_64 + 1)
2564 { 16, 0, 0, ARC_OPERAND_UNSIGNED
, NULL
, NULL
},
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
}
2570 const unsigned arc_num_operands
= ARRAY_SIZE (arc_operands
);
2572 const unsigned arc_Toperand
= FKT_T
;
2573 const unsigned arc_NToperand
= FKT_NT
;
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
};
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
};
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
};
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
};
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
};
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
};
2612 /* The opcode table.
2614 The format of the opcode table is:
2616 NAME OPCODE MASK CPU CLASS SUBCLASS { OPERANDS } { FLAGS }.
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.
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.
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
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
[] =
2649 #include "arc-tbl.h"
2650 #include "arc-nps400-tbl.h"
2651 #include "arc-ext-tbl.h"
2653 { NULL
, 0, 0, 0, 0, 0, { 0 }, { 0 } }
2656 /* List with special cases instructions and the applicable flags. */
2657 const struct arc_flag_special arc_flag_special_cases
[] =
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
,
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
} }
2692 const unsigned arc_num_flag_special
= ARRAY_SIZE (arc_flag_special_cases
);
2695 const struct arc_reloc_equiv_tab arc_reloc_equiv
[] =
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
},
2706 /* Next two entries will cover the undefined behavior ldb/stb with
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
},
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
},
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
},
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
},
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
},
2740 { "plt", 0, { F_NULL
}, BFD_RELOC_ARC_32_ME
, BFD_RELOC_ARC_PLT32
}
2743 const unsigned arc_num_equiv_tab
= ARRAY_SIZE (arc_reloc_equiv
);
2745 const struct arc_pseudo_insn arc_pseudo_insns
[] =
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} } },
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 } } },
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 } } },
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 } } },
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 } } },
2799 const unsigned arc_num_pseudo_insn
=
2800 sizeof (arc_pseudo_insns
) / sizeof (*arc_pseudo_insns
);
2802 const struct arc_aux_reg arc_aux_regs
[] =
2805 #define DEF(ADDR, CPU, SUBCLASS, NAME) \
2806 { ADDR, CPU, SUBCLASS, #NAME, sizeof (#NAME)-1 },
2808 #include "arc-regs.h"
2813 const unsigned arc_num_aux_regs
= ARRAY_SIZE (arc_aux_regs
);
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
[] =
2819 { NULL
, 0x0, 0x0, 0x0, ARITH
, NONE
, { UNUSED
}, { 0 } },
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 }},
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
}},
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 }},
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
}},
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 }},
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
}},
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
}},
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 }},
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
}},
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
}},
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 }},
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
}},
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
}},
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 }},
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
}},
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
}},
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
}},
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
}},
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
}},
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
}},
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
}},
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
}}
2933 const unsigned arc_num_relax_opcodes
= ARRAY_SIZE (arc_relax_opcodes
);
2935 /* Return length of an opcode in bytes. */
2938 arc_opcode_len (const struct arc_opcode
*opcode
)
2940 if (opcode
->mask
< 0x10000ull
)
2943 if (opcode
->mask
< 0x100000000ull
)
2946 if (opcode
->mask
< 0x1000000000000ull
)