arc/opcodes: Use flag operand class to handle multiple flag matches
[deliverable/binutils-gdb.git] / opcodes / arc-opc.c
CommitLineData
252b5132 1/* Opcode table for the ARC.
6f2750fe 2 Copyright (C) 1994-2016 Free Software Foundation, Inc.
886a2506
NC
3
4 Contributed by Claudiu Zissulescu (claziss@synopsys.com)
bcee8eb8 5
9b201bb5
NC
6 This file is part of libopcodes.
7
8 This library is free software; you can redistribute it and/or modify
252b5132 9 it under the terms of the GNU General Public License as published by
9b201bb5 10 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
11 any later version.
12
9b201bb5
NC
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.
252b5132
RH
17
18 You should have received a copy of the GNU General Public License
0d2bcfaf 19 along with this program; if not, write to the Free Software Foundation,
f4321104 20 Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132 21
5bd67f35 22#include "sysdep.h"
252b5132 23#include <stdio.h>
d943fe33 24#include "bfd.h"
252b5132 25#include "opcode/arc.h"
47b0e7ad 26#include "opintl.h"
886a2506 27#include "libiberty.h"
252b5132 28
886a2506
NC
29/* Insert RB register into a 32-bit opcode. */
30static unsigned
31insert_rb (unsigned insn,
32 int value,
33 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 34{
886a2506
NC
35 return insn | ((value & 0x07) << 24) | (((value >> 3) & 0x07) << 12);
36}
0d2bcfaf 37
886a2506
NC
38static int
39extract_rb (unsigned insn ATTRIBUTE_UNUSED,
40 bfd_boolean * invalid ATTRIBUTE_UNUSED)
41{
42 int value = (((insn >> 12) & 0x07) << 3) | ((insn >> 24) & 0x07);
0d2bcfaf 43
886a2506
NC
44 if (value == 0x3e && invalid)
45 *invalid = TRUE; /* A limm operand, it should be extracted in a
46 different way. */
252b5132 47
886a2506
NC
48 return value;
49}
252b5132 50
886a2506
NC
51static unsigned
52insert_rad (unsigned insn,
53 int value,
54 const char **errmsg ATTRIBUTE_UNUSED)
55{
56 if (value & 0x01)
57 *errmsg = _("Improper register value.");
0d2bcfaf 58
886a2506
NC
59 return insn | (value & 0x3F);
60}
0d2bcfaf 61
886a2506
NC
62static unsigned
63insert_rcd (unsigned insn,
64 int value,
65 const char **errmsg ATTRIBUTE_UNUSED)
66{
67 if (value & 0x01)
68 *errmsg = _("Improper register value.");
0d2bcfaf 69
886a2506
NC
70 return insn | ((value & 0x3F) << 6);
71}
252b5132 72
886a2506 73/* Dummy insert ZERO operand function. */
252b5132 74
886a2506
NC
75static unsigned
76insert_za (unsigned insn,
77 int value,
78 const char **errmsg)
79{
80 if (value)
81 *errmsg = _("operand is not zero");
82 return insn;
83}
252b5132 84
886a2506
NC
85/* Insert Y-bit in bbit/br instructions. This function is called only
86 when solving fixups. */
252b5132 87
886a2506
NC
88static unsigned
89insert_Ybit (unsigned insn,
90 int value,
91 const char **errmsg ATTRIBUTE_UNUSED)
92{
93 if (value > 0)
94 insn |= 0x08;
252b5132 95
886a2506
NC
96 return insn;
97}
252b5132 98
886a2506
NC
99/* Insert Y-bit in bbit/br instructions. This function is called only
100 when solving fixups. */
252b5132 101
886a2506
NC
102static unsigned
103insert_NYbit (unsigned insn,
104 int value,
105 const char **errmsg ATTRIBUTE_UNUSED)
106{
107 if (value < 0)
108 insn |= 0x08;
0d2bcfaf 109
886a2506
NC
110 return insn;
111}
252b5132 112
886a2506 113/* Insert H register into a 16-bit opcode. */
252b5132 114
886a2506
NC
115static unsigned
116insert_rhv1 (unsigned insn,
117 int value,
118 const char **errmsg ATTRIBUTE_UNUSED)
119{
120 return insn |= ((value & 0x07) << 5) | ((value >> 3) & 0x07);
121}
252b5132 122
886a2506
NC
123static int
124extract_rhv1 (unsigned insn ATTRIBUTE_UNUSED,
125 bfd_boolean * invalid ATTRIBUTE_UNUSED)
126{
127 int value = 0;
252b5132 128
886a2506
NC
129 return value;
130}
252b5132 131
886a2506 132/* Insert H register into a 16-bit opcode. */
252b5132 133
886a2506
NC
134static unsigned
135insert_rhv2 (unsigned insn,
136 int value,
137 const char **errmsg)
0d2bcfaf 138{
886a2506
NC
139 if (value == 0x1E)
140 *errmsg =
141 _("Register R30 is a limm indicator for this type of instruction.");
142 return insn |= ((value & 0x07) << 5) | ((value >> 3) & 0x03);
143}
252b5132 144
886a2506
NC
145static int
146extract_rhv2 (unsigned insn ATTRIBUTE_UNUSED,
147 bfd_boolean * invalid ATTRIBUTE_UNUSED)
148{
149 int value = ((insn >> 5) & 0x07) | ((insn & 0x03) << 3);
0d2bcfaf 150
886a2506
NC
151 return value;
152}
0d2bcfaf 153
886a2506
NC
154static unsigned
155insert_r0 (unsigned insn,
156 int value,
157 const char **errmsg ATTRIBUTE_UNUSED)
158{
159 if (value != 0)
160 *errmsg = _("Register must be R0.");
47b0e7ad
NC
161 return insn;
162}
252b5132 163
886a2506
NC
164static int
165extract_r0 (unsigned insn ATTRIBUTE_UNUSED,
166 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 167{
886a2506 168 return 0;
47b0e7ad 169}
252b5132 170
252b5132 171
886a2506
NC
172static unsigned
173insert_r1 (unsigned insn,
174 int value,
175 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 176{
886a2506
NC
177 if (value != 1)
178 *errmsg = _("Register must be R1.");
47b0e7ad 179 return insn;
252b5132
RH
180}
181
886a2506
NC
182static int
183extract_r1 (unsigned insn ATTRIBUTE_UNUSED,
184 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 185{
886a2506 186 return 1;
252b5132
RH
187}
188
886a2506
NC
189static unsigned
190insert_r2 (unsigned insn,
191 int value,
192 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 193{
886a2506
NC
194 if (value != 2)
195 *errmsg = _("Register must be R2.");
47b0e7ad 196 return insn;
252b5132
RH
197}
198
886a2506
NC
199static int
200extract_r2 (unsigned insn ATTRIBUTE_UNUSED,
201 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 202{
886a2506 203 return 2;
252b5132
RH
204}
205
886a2506
NC
206static unsigned
207insert_r3 (unsigned insn,
208 int value,
209 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 210{
886a2506
NC
211 if (value != 3)
212 *errmsg = _("Register must be R3.");
47b0e7ad 213 return insn;
0d2bcfaf
NC
214}
215
886a2506
NC
216static int
217extract_r3 (unsigned insn ATTRIBUTE_UNUSED,
218 bfd_boolean * invalid ATTRIBUTE_UNUSED)
0d2bcfaf 219{
886a2506 220 return 3;
0d2bcfaf
NC
221}
222
886a2506
NC
223static unsigned
224insert_sp (unsigned insn,
225 int value,
226 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 227{
886a2506
NC
228 if (value != 28)
229 *errmsg = _("Register must be SP.");
252b5132
RH
230 return insn;
231}
232
886a2506
NC
233static int
234extract_sp (unsigned insn ATTRIBUTE_UNUSED,
235 bfd_boolean * invalid ATTRIBUTE_UNUSED)
0d2bcfaf 236{
886a2506 237 return 28;
0d2bcfaf
NC
238}
239
886a2506
NC
240static unsigned
241insert_gp (unsigned insn,
242 int value,
243 const char **errmsg ATTRIBUTE_UNUSED)
0d2bcfaf 244{
886a2506
NC
245 if (value != 26)
246 *errmsg = _("Register must be GP.");
247 return insn;
0d2bcfaf
NC
248}
249
886a2506
NC
250static int
251extract_gp (unsigned insn ATTRIBUTE_UNUSED,
252 bfd_boolean * invalid ATTRIBUTE_UNUSED)
0d2bcfaf 253{
886a2506 254 return 26;
0d2bcfaf
NC
255}
256
886a2506
NC
257static unsigned
258insert_pcl (unsigned insn,
259 int value,
260 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 261{
886a2506
NC
262 if (value != 63)
263 *errmsg = _("Register must be PCL.");
252b5132
RH
264 return insn;
265}
266
886a2506
NC
267static int
268extract_pcl (unsigned insn ATTRIBUTE_UNUSED,
269 bfd_boolean * invalid ATTRIBUTE_UNUSED)
0d2bcfaf 270{
886a2506 271 return 63;
0d2bcfaf
NC
272}
273
886a2506
NC
274static unsigned
275insert_blink (unsigned insn,
276 int value,
277 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 278{
886a2506
NC
279 if (value != 31)
280 *errmsg = _("Register must be BLINK.");
252b5132
RH
281 return insn;
282}
283
886a2506
NC
284static int
285extract_blink (unsigned insn ATTRIBUTE_UNUSED,
286 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 287{
886a2506 288 return 31;
0d2bcfaf
NC
289}
290
886a2506
NC
291static unsigned
292insert_ilink1 (unsigned insn,
293 int value,
294 const char **errmsg ATTRIBUTE_UNUSED)
0d2bcfaf 295{
886a2506
NC
296 if (value != 29)
297 *errmsg = _("Register must be ILINK1.");
252b5132
RH
298 return insn;
299}
300
886a2506
NC
301static int
302extract_ilink1 (unsigned insn ATTRIBUTE_UNUSED,
303 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 304{
886a2506 305 return 29;
252b5132
RH
306}
307
886a2506
NC
308static unsigned
309insert_ilink2 (unsigned insn,
310 int value,
311 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 312{
886a2506
NC
313 if (value != 30)
314 *errmsg = _("Register must be ILINK2.");
252b5132
RH
315 return insn;
316}
317
886a2506
NC
318static int
319extract_ilink2 (unsigned insn ATTRIBUTE_UNUSED,
320 bfd_boolean * invalid ATTRIBUTE_UNUSED)
321{
322 return 30;
323}
252b5132 324
886a2506
NC
325static unsigned
326insert_ras (unsigned insn,
327 int value,
328 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 329{
886a2506 330 switch (value)
0d2bcfaf 331 {
886a2506
NC
332 case 0:
333 case 1:
334 case 2:
335 case 3:
336 insn |= value;
337 break;
338 case 12:
339 case 13:
340 case 14:
341 case 15:
342 insn |= (value - 8);
343 break;
344 default:
345 *errmsg = _("Register must be either r0-r3 or r12-r15.");
346 break;
0d2bcfaf 347 }
252b5132
RH
348 return insn;
349}
252b5132 350
886a2506
NC
351static int
352extract_ras (unsigned insn ATTRIBUTE_UNUSED,
353 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 354{
886a2506
NC
355 int value = insn & 0x07;
356 if (value > 3)
357 return (value + 8);
358 else
359 return value;
47b0e7ad
NC
360}
361
886a2506
NC
362static unsigned
363insert_rbs (unsigned insn,
364 int value,
365 const char **errmsg ATTRIBUTE_UNUSED)
252b5132 366{
886a2506 367 switch (value)
47b0e7ad 368 {
886a2506
NC
369 case 0:
370 case 1:
371 case 2:
372 case 3:
373 insn |= value << 8;
374 break;
375 case 12:
376 case 13:
377 case 14:
378 case 15:
379 insn |= ((value - 8)) << 8;
380 break;
381 default:
382 *errmsg = _("Register must be either r0-r3 or r12-r15.");
383 break;
47b0e7ad 384 }
886a2506 385 return insn;
252b5132
RH
386}
387
886a2506
NC
388static int
389extract_rbs (unsigned insn ATTRIBUTE_UNUSED,
390 bfd_boolean * invalid ATTRIBUTE_UNUSED)
252b5132 391{
886a2506
NC
392 int value = (insn >> 8) & 0x07;
393 if (value > 3)
394 return (value + 8);
395 else
396 return value;
397}
252b5132 398
886a2506
NC
399static unsigned
400insert_rcs (unsigned insn,
401 int value,
402 const char **errmsg ATTRIBUTE_UNUSED)
403{
404 switch (value)
252b5132 405 {
886a2506
NC
406 case 0:
407 case 1:
408 case 2:
409 case 3:
410 insn |= value << 5;
411 break;
412 case 12:
413 case 13:
414 case 14:
415 case 15:
416 insn |= ((value - 8)) << 5;
417 break;
418 default:
419 *errmsg = _("Register must be either r0-r3 or r12-r15.");
420 break;
252b5132 421 }
886a2506
NC
422 return insn;
423}
47b0e7ad 424
886a2506
NC
425static int
426extract_rcs (unsigned insn ATTRIBUTE_UNUSED,
427 bfd_boolean * invalid ATTRIBUTE_UNUSED)
428{
429 int value = (insn >> 5) & 0x07;
430 if (value > 3)
431 return (value + 8);
252b5132 432 else
886a2506
NC
433 return value;
434}
47b0e7ad 435
886a2506
NC
436static unsigned
437insert_simm3s (unsigned insn,
438 int value,
439 const char **errmsg ATTRIBUTE_UNUSED)
440{
441 int tmp = 0;
442 switch (value)
47b0e7ad 443 {
886a2506
NC
444 case -1:
445 tmp = 0x07;
47b0e7ad 446 break;
886a2506
NC
447 case 0:
448 tmp = 0x00;
449 break;
450 case 1:
451 tmp = 0x01;
47b0e7ad 452 break;
886a2506
NC
453 case 2:
454 tmp = 0x02;
47b0e7ad 455 break;
886a2506
NC
456 case 3:
457 tmp = 0x03;
458 break;
459 case 4:
460 tmp = 0x04;
461 break;
462 case 5:
463 tmp = 0x05;
464 break;
465 case 6:
466 tmp = 0x06;
467 break;
468 default:
469 *errmsg = _("Accepted values are from -1 to 6.");
47b0e7ad
NC
470 break;
471 }
472
886a2506
NC
473 insn |= tmp << 8;
474 return insn;
47b0e7ad
NC
475}
476
886a2506
NC
477static int
478extract_simm3s (unsigned insn ATTRIBUTE_UNUSED,
479 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 480{
886a2506
NC
481 int value = (insn >> 8) & 0x07;
482 if (value == 7)
483 return -1;
47b0e7ad 484 else
886a2506 485 return value;
47b0e7ad
NC
486}
487
886a2506
NC
488static unsigned
489insert_rrange (unsigned insn,
490 int value,
491 const char **errmsg ATTRIBUTE_UNUSED)
47b0e7ad 492{
886a2506
NC
493 int reg1 = (value >> 16) & 0xFFFF;
494 int reg2 = value & 0xFFFF;
495 if (reg1 != 13)
496 {
497 *errmsg = _("First register of the range should be r13.");
498 return insn;
499 }
500 if (reg2 < 13 || reg2 > 26)
501 {
502 *errmsg = _("Last register of the range doesn't fit.");
503 return insn;
504 }
505 insn |= ((reg2 - 12) & 0x0F) << 1;
506 return insn;
47b0e7ad
NC
507}
508
886a2506
NC
509static int
510extract_rrange (unsigned insn ATTRIBUTE_UNUSED,
511 bfd_boolean * invalid ATTRIBUTE_UNUSED)
512{
513 return (insn >> 1) & 0x0F;
514}
47b0e7ad 515
886a2506
NC
516static unsigned
517insert_fpel (unsigned insn,
518 int value,
519 const char **errmsg ATTRIBUTE_UNUSED)
47b0e7ad 520{
886a2506
NC
521 if (value != 27)
522 {
523 *errmsg = _("Invalid register number, should be fp.");
524 return insn;
525 }
47b0e7ad 526
886a2506
NC
527 insn |= 0x0100;
528 return insn;
47b0e7ad
NC
529}
530
886a2506
NC
531static int
532extract_fpel (unsigned insn ATTRIBUTE_UNUSED,
533 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 534{
886a2506 535 return (insn & 0x0100) ? 27 : -1;
47b0e7ad
NC
536}
537
886a2506
NC
538static unsigned
539insert_blinkel (unsigned insn,
540 int value,
541 const char **errmsg ATTRIBUTE_UNUSED)
47b0e7ad 542{
886a2506 543 if (value != 31)
47b0e7ad 544 {
886a2506
NC
545 *errmsg = _("Invalid register number, should be blink.");
546 return insn;
47b0e7ad 547 }
47b0e7ad 548
886a2506
NC
549 insn |= 0x0200;
550 return insn;
47b0e7ad
NC
551}
552
886a2506
NC
553static int
554extract_blinkel (unsigned insn ATTRIBUTE_UNUSED,
555 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 556{
886a2506
NC
557 return (insn & 0x0200) ? 31 : -1;
558}
47b0e7ad 559
886a2506
NC
560static unsigned
561insert_pclel (unsigned insn,
562 int value,
563 const char **errmsg ATTRIBUTE_UNUSED)
564{
565 if (value != 63)
47b0e7ad 566 {
886a2506
NC
567 *errmsg = _("Invalid register number, should be pcl.");
568 return insn;
47b0e7ad 569 }
47b0e7ad 570
886a2506
NC
571 insn |= 0x0400;
572 return insn;
573}
47b0e7ad 574
886a2506
NC
575static int
576extract_pclel (unsigned insn ATTRIBUTE_UNUSED,
577 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 578{
886a2506 579 return (insn & 0x0400) ? 63 : -1;
47b0e7ad 580}
47b0e7ad 581
886a2506
NC
582#define INSERT_W6
583/* mask = 00000000000000000000111111000000
584 insn = 00011bbb000000000BBBwwwwwwDaaZZ1. */
585static unsigned
586insert_w6 (unsigned insn ATTRIBUTE_UNUSED,
587 int value ATTRIBUTE_UNUSED,
588 const char **errmsg ATTRIBUTE_UNUSED)
47b0e7ad 589{
886a2506 590 insn |= ((value >> 0) & 0x003f) << 6;
47b0e7ad 591
886a2506
NC
592 return insn;
593}
47b0e7ad 594
886a2506
NC
595#define EXTRACT_W6
596/* mask = 00000000000000000000111111000000. */
597static int
598extract_w6 (unsigned insn ATTRIBUTE_UNUSED,
599 bfd_boolean * invalid ATTRIBUTE_UNUSED)
47b0e7ad 600{
886a2506 601 unsigned value = 0;
47b0e7ad 602
886a2506 603 value |= ((insn >> 6) & 0x003f) << 0;
47b0e7ad 604
886a2506
NC
605 return value;
606}
47b0e7ad 607
886a2506
NC
608#define INSERT_G_S
609/* mask = 0000011100022000
610 insn = 01000ggghhhGG0HH. */
611static unsigned
612insert_g_s (unsigned insn ATTRIBUTE_UNUSED,
613 int value ATTRIBUTE_UNUSED,
614 const char **errmsg ATTRIBUTE_UNUSED)
47b0e7ad 615{
886a2506
NC
616 insn |= ((value >> 0) & 0x0007) << 8;
617 insn |= ((value >> 3) & 0x0003) << 3;
252b5132 618
886a2506
NC
619 return insn;
620}
252b5132 621
886a2506
NC
622#define EXTRACT_G_S
623/* mask = 0000011100022000. */
624static int
625extract_g_s (unsigned insn ATTRIBUTE_UNUSED,
626 bfd_boolean * invalid ATTRIBUTE_UNUSED)
627{
628 int value = 0;
252b5132 629
886a2506
NC
630 value |= ((insn >> 8) & 0x0007) << 0;
631 value |= ((insn >> 3) & 0x0003) << 3;
252b5132 632
886a2506
NC
633 /* Extend the sign. */
634 int signbit = 1 << (6 - 1);
635 value = (value ^ signbit) - signbit;
252b5132 636
886a2506 637 return value;
252b5132
RH
638}
639
886a2506
NC
640/* Include the generic extract/insert functions. Order is important
641 as some of the functions present in the .h may be disabled via
642 defines. */
643#include "arc-fxi.h"
252b5132 644
886a2506 645/* The flag operands table.
252b5132 646
886a2506
NC
647 The format of the table is
648 NAME CODE BITS SHIFT FAVAIL. */
649const struct arc_flag_operand arc_flag_operands[] =
650{
651#define F_NULL 0
652 { 0, 0, 0, 0, 0},
653#define F_ALWAYS (F_NULL + 1)
654 { "al", 0, 0, 0, 0 },
655#define F_RA (F_ALWAYS + 1)
656 { "ra", 0, 0, 0, 0 },
657#define F_EQUAL (F_RA + 1)
658 { "eq", 1, 5, 0, 1 },
659#define F_ZERO (F_EQUAL + 1)
660 { "z", 1, 5, 0, 0 },
661#define F_NOTEQUAL (F_ZERO + 1)
662 { "ne", 2, 5, 0, 1 },
663#define F_NOTZERO (F_NOTEQUAL + 1)
664 { "nz", 2, 5, 0, 0 },
665#define F_POZITIVE (F_NOTZERO + 1)
666 { "p", 3, 5, 0, 1 },
667#define F_PL (F_POZITIVE + 1)
668 { "pl", 3, 5, 0, 0 },
669#define F_NEGATIVE (F_PL + 1)
670 { "n", 4, 5, 0, 1 },
671#define F_MINUS (F_NEGATIVE + 1)
672 { "mi", 4, 5, 0, 0 },
673#define F_CARRY (F_MINUS + 1)
674 { "c", 5, 5, 0, 1 },
675#define F_CARRYSET (F_CARRY + 1)
676 { "cs", 5, 5, 0, 0 },
677#define F_LOWER (F_CARRYSET + 1)
678 { "lo", 5, 5, 0, 0 },
679#define F_CARRYCLR (F_LOWER + 1)
680 { "cc", 6, 5, 0, 0 },
681#define F_NOTCARRY (F_CARRYCLR + 1)
682 { "nc", 6, 5, 0, 1 },
683#define F_HIGHER (F_NOTCARRY + 1)
684 { "hs", 6, 5, 0, 0 },
685#define F_OVERFLOWSET (F_HIGHER + 1)
686 { "vs", 7, 5, 0, 0 },
687#define F_OVERFLOW (F_OVERFLOWSET + 1)
688 { "v", 7, 5, 0, 1 },
689#define F_NOTOVERFLOW (F_OVERFLOW + 1)
690 { "nv", 8, 5, 0, 1 },
691#define F_OVERFLOWCLR (F_NOTOVERFLOW + 1)
692 { "vc", 8, 5, 0, 0 },
693#define F_GT (F_OVERFLOWCLR + 1)
694 { "gt", 9, 5, 0, 1 },
695#define F_GE (F_GT + 1)
696 { "ge", 10, 5, 0, 1 },
697#define F_LT (F_GE + 1)
698 { "lt", 11, 5, 0, 1 },
699#define F_LE (F_LT + 1)
700 { "le", 12, 5, 0, 1 },
701#define F_HI (F_LE + 1)
702 { "hi", 13, 5, 0, 1 },
703#define F_LS (F_HI + 1)
704 { "ls", 14, 5, 0, 1 },
705#define F_PNZ (F_LS + 1)
706 { "pnz", 15, 5, 0, 1 },
707
708 /* FLAG. */
709#define F_FLAG (F_PNZ + 1)
710 { "f", 1, 1, 15, 1 },
711#define F_FFAKE (F_FLAG + 1)
712 { "f", 0, 0, 0, 1 },
713
714 /* Delay slot. */
715#define F_ND (F_FFAKE + 1)
716 { "nd", 0, 1, 5, 0 },
717#define F_D (F_ND + 1)
718 { "d", 1, 1, 5, 1 },
719#define F_DFAKE (F_D + 1)
720 { "d", 0, 0, 0, 1 },
721
722 /* Data size. */
723#define F_SIZEB1 (F_DFAKE + 1)
724 { "b", 1, 2, 1, 1 },
725#define F_SIZEB7 (F_SIZEB1 + 1)
726 { "b", 1, 2, 7, 1 },
727#define F_SIZEB17 (F_SIZEB7 + 1)
728 { "b", 1, 2, 17, 1 },
729#define F_SIZEW1 (F_SIZEB17 + 1)
730 { "w", 2, 2, 1, 0 },
731#define F_SIZEW7 (F_SIZEW1 + 1)
732 { "w", 2, 2, 7, 0 },
733#define F_SIZEW17 (F_SIZEW7 + 1)
734 { "w", 2, 2, 17, 0 },
735
736 /* Sign extension. */
737#define F_SIGN6 (F_SIZEW17 + 1)
738 { "x", 1, 1, 6, 1 },
739#define F_SIGN16 (F_SIGN6 + 1)
740 { "x", 1, 1, 16, 1 },
741#define F_SIGNX (F_SIGN16 + 1)
742 { "x", 0, 0, 0, 1 },
743
744 /* Address write-back modes. */
745#define F_A3 (F_SIGNX + 1)
746 { "a", 1, 2, 3, 0 },
747#define F_A9 (F_A3 + 1)
748 { "a", 1, 2, 9, 0 },
749#define F_A22 (F_A9 + 1)
750 { "a", 1, 2, 22, 0 },
751#define F_AW3 (F_A22 + 1)
752 { "aw", 1, 2, 3, 1 },
753#define F_AW9 (F_AW3 + 1)
754 { "aw", 1, 2, 9, 1 },
755#define F_AW22 (F_AW9 + 1)
756 { "aw", 1, 2, 22, 1 },
757#define F_AB3 (F_AW22 + 1)
758 { "ab", 2, 2, 3, 1 },
759#define F_AB9 (F_AB3 + 1)
760 { "ab", 2, 2, 9, 1 },
761#define F_AB22 (F_AB9 + 1)
762 { "ab", 2, 2, 22, 1 },
763#define F_AS3 (F_AB22 + 1)
764 { "as", 3, 2, 3, 1 },
765#define F_AS9 (F_AS3 + 1)
766 { "as", 3, 2, 9, 1 },
767#define F_AS22 (F_AS9 + 1)
768 { "as", 3, 2, 22, 1 },
769#define F_ASFAKE (F_AS22 + 1)
770 { "as", 0, 0, 0, 1 },
771
772 /* Cache bypass. */
773#define F_DI5 (F_ASFAKE + 1)
774 { "di", 1, 1, 5, 1 },
775#define F_DI11 (F_DI5 + 1)
776 { "di", 1, 1, 11, 1 },
777#define F_DI15 (F_DI11 + 1)
778 { "di", 1, 1, 15, 1 },
779
780 /* ARCv2 specific. */
781#define F_NT (F_DI15 + 1)
782 { "nt", 0, 1, 3, 1},
783#define F_T (F_NT + 1)
784 { "t", 1, 1, 3, 1},
785#define F_H1 (F_T + 1)
786 { "h", 2, 2, 1, 1 },
787#define F_H7 (F_H1 + 1)
788 { "h", 2, 2, 7, 1 },
789#define F_H17 (F_H7 + 1)
790 { "h", 2, 2, 17, 1 },
791
792 /* Fake Flags. */
793#define F_NE (F_H17 + 1)
794 { "ne", 0, 0, 0, 1 },
795};
252b5132 796
886a2506 797const unsigned arc_num_flag_operands = ARRAY_SIZE (arc_flag_operands);
252b5132 798
886a2506 799/* Table of the flag classes.
252b5132 800
886a2506
NC
801 The format of the table is
802 CLASS {FLAG_CODE}. */
803const struct arc_flag_class arc_flag_classes[] =
804{
805#define C_EMPTY 0
1ae8ab47 806 { F_CLASS_NONE, { F_NULL } },
886a2506
NC
807
808#define C_CC (C_EMPTY + 1)
1ae8ab47
AB
809 { F_CLASS_OPTIONAL, { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL,
810 F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS,
811 F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
812 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW,
813 F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT,
814 F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
886a2506
NC
815
816#define C_AA_ADDR3 (C_CC + 1)
817#define C_AA27 (C_CC + 1)
1ae8ab47 818 { F_CLASS_OPTIONAL, { F_A3, F_AW3, F_AB3, F_AS3, F_NULL } },
886a2506
NC
819#define C_AA_ADDR9 (C_AA_ADDR3 + 1)
820#define C_AA21 (C_AA_ADDR3 + 1)
1ae8ab47 821 { F_CLASS_OPTIONAL, { F_A9, F_AW9, F_AB9, F_AS9, F_NULL } },
886a2506
NC
822#define C_AA_ADDR22 (C_AA_ADDR9 + 1)
823#define C_AA8 (C_AA_ADDR9 + 1)
1ae8ab47 824 { F_CLASS_OPTIONAL, { F_A22, F_AW22, F_AB22, F_AS22, F_NULL } },
886a2506
NC
825
826#define C_F (C_AA_ADDR22 + 1)
1ae8ab47 827 { F_CLASS_OPTIONAL, { F_FLAG, F_NULL } },
886a2506 828#define C_FHARD (C_F + 1)
1ae8ab47 829 { F_CLASS_OPTIONAL, { F_FFAKE, F_NULL } },
886a2506
NC
830
831#define C_T (C_FHARD + 1)
1ae8ab47 832 { F_CLASS_OPTIONAL, { F_NT, F_T, F_NULL } },
886a2506 833#define C_D (C_T + 1)
1ae8ab47 834 { F_CLASS_OPTIONAL, { F_ND, F_D, F_NULL } },
886a2506
NC
835
836#define C_DHARD (C_D + 1)
1ae8ab47 837 { F_CLASS_OPTIONAL, { F_DFAKE, F_NULL } },
886a2506
NC
838
839#define C_DI20 (C_DHARD + 1)
1ae8ab47 840 { F_CLASS_OPTIONAL, { F_DI11, F_NULL }},
886a2506 841#define C_DI16 (C_DI20 + 1)
1ae8ab47 842 { F_CLASS_OPTIONAL, { F_DI15, F_NULL }},
886a2506 843#define C_DI26 (C_DI16 + 1)
1ae8ab47 844 { F_CLASS_OPTIONAL, { F_DI5, F_NULL }},
886a2506
NC
845
846#define C_X25 (C_DI26 + 1)
1ae8ab47 847 { F_CLASS_OPTIONAL, { F_SIGN6, F_NULL }},
886a2506 848#define C_X15 (C_X25 + 1)
1ae8ab47 849 { F_CLASS_OPTIONAL, { F_SIGN16, F_NULL }},
886a2506
NC
850#define C_XHARD (C_X15 + 1)
851#define C_X (C_X15 + 1)
1ae8ab47 852 { F_CLASS_OPTIONAL, { F_SIGNX, F_NULL }},
886a2506
NC
853
854#define C_ZZ13 (C_X + 1)
1ae8ab47 855 { F_CLASS_OPTIONAL, { F_SIZEB17, F_SIZEW17, F_H17, F_NULL}},
886a2506 856#define C_ZZ23 (C_ZZ13 + 1)
1ae8ab47 857 { F_CLASS_OPTIONAL, { F_SIZEB7, F_SIZEW7, F_H7, F_NULL}},
886a2506 858#define C_ZZ29 (C_ZZ23 + 1)
1ae8ab47 859 { F_CLASS_OPTIONAL, { F_SIZEB1, F_SIZEW1, F_H1, F_NULL}},
886a2506
NC
860
861#define C_AS (C_ZZ29 + 1)
1ae8ab47 862 { F_CLASS_OPTIONAL, { F_ASFAKE, F_NULL}},
886a2506
NC
863
864#define C_NE (C_AS + 1)
1ae8ab47 865 { F_CLASS_OPTIONAL, { F_NE, F_NULL}},
886a2506 866};
252b5132 867
886a2506 868/* The operands table.
252b5132 869
886a2506 870 The format of the operands table is:
47b0e7ad 871
886a2506
NC
872 BITS SHIFT DEFAULT_RELOC FLAGS INSERT_FUN EXTRACT_FUN. */
873const struct arc_operand arc_operands[] =
0d2bcfaf 874{
886a2506
NC
875 /* The fields are bits, shift, insert, extract, flags. The zero
876 index is used to indicate end-of-list. */
877#define UNUSED 0
878 { 0, 0, 0, 0, 0, 0 },
879 /* The plain integer register fields. Used by 32 bit
880 instructions. */
881#define RA (UNUSED + 1)
882 { 6, 0, 0, ARC_OPERAND_IR, 0, 0 },
883#define RB (RA + 1)
884 { 6, 12, 0, ARC_OPERAND_IR, insert_rb, extract_rb },
885#define RC (RB + 1)
886 { 6, 6, 0, ARC_OPERAND_IR, 0, 0 },
887#define RBdup (RC + 1)
888 { 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rb, extract_rb },
889
890#define RAD (RBdup + 1)
891 { 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0 },
892#define RCD (RAD + 1)
893 { 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rcd, 0 },
894
895 /* The plain integer register fields. Used by short
896 instructions. */
897#define RA16 (RCD + 1)
898#define RA_S (RCD + 1)
899 { 4, 0, 0, ARC_OPERAND_IR, insert_ras, extract_ras },
900#define RB16 (RA16 + 1)
901#define RB_S (RA16 + 1)
902 { 4, 8, 0, ARC_OPERAND_IR, insert_rbs, extract_rbs },
903#define RB16dup (RB16 + 1)
904#define RB_Sdup (RB16 + 1)
905 { 4, 8, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_rbs, extract_rbs },
906#define RC16 (RB16dup + 1)
907#define RC_S (RB16dup + 1)
908 { 4, 5, 0, ARC_OPERAND_IR, insert_rcs, extract_rcs },
909#define R6H (RC16 + 1) /* 6bit register field 'h' used
910 by V1 cpus. */
911 { 6, 5, 0, ARC_OPERAND_IR, insert_rhv1, extract_rhv1 },
912#define R5H (R6H + 1) /* 5bit register field 'h' used
913 by V2 cpus. */
914#define RH_S (R6H + 1) /* 5bit register field 'h' used
915 by V2 cpus. */
916 { 5, 5, 0, ARC_OPERAND_IR, insert_rhv2, extract_rhv2 },
917#define R5Hdup (R5H + 1)
918#define RH_Sdup (R5H + 1)
919 { 5, 5, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE,
920 insert_rhv2, extract_rhv2 },
921
922#define RG (R5Hdup + 1)
923#define G_S (R5Hdup + 1)
924 { 5, 5, 0, ARC_OPERAND_IR, insert_g_s, extract_g_s },
925
926 /* Fix registers. */
927#define R0 (RG + 1)
928#define R0_S (RG + 1)
929 { 0, 0, 0, ARC_OPERAND_IR, insert_r0, extract_r0 },
930#define R1 (R0 + 1)
931#define R1_S (R0 + 1)
932 { 1, 0, 0, ARC_OPERAND_IR, insert_r1, extract_r1 },
933#define R2 (R1 + 1)
934#define R2_S (R1 + 1)
935 { 2, 0, 0, ARC_OPERAND_IR, insert_r2, extract_r2 },
936#define R3 (R2 + 1)
937#define R3_S (R2 + 1)
938 { 2, 0, 0, ARC_OPERAND_IR, insert_r3, extract_r3 },
939#define SP (R3 + 1)
940#define SP_S (R3 + 1)
941 { 5, 0, 0, ARC_OPERAND_IR, insert_sp, extract_sp },
942#define SPdup (SP + 1)
943#define SP_Sdup (SP + 1)
944 { 5, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE, insert_sp, extract_sp },
945#define GP (SPdup + 1)
946#define GP_S (SPdup + 1)
947 { 5, 0, 0, ARC_OPERAND_IR, insert_gp, extract_gp },
948
949#define PCL_S (GP + 1)
950 { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_NCHK, insert_pcl, extract_pcl },
951
952#define BLINK (PCL_S + 1)
953#define BLINK_S (PCL_S + 1)
954 { 5, 0, 0, ARC_OPERAND_IR, insert_blink, extract_blink },
955
956#define ILINK1 (BLINK + 1)
957 { 5, 0, 0, ARC_OPERAND_IR, insert_ilink1, extract_ilink1 },
958#define ILINK2 (ILINK1 + 1)
959 { 5, 0, 0, ARC_OPERAND_IR, insert_ilink2, extract_ilink2 },
960
961 /* Long immediate. */
962#define LIMM (ILINK2 + 1)
963#define LIMM_S (ILINK2 + 1)
964 { 32, 0, BFD_RELOC_ARC_32_ME, ARC_OPERAND_LIMM, insert_limm, 0 },
965#define LIMMdup (LIMM + 1)
966 { 32, 0, 0, ARC_OPERAND_LIMM | ARC_OPERAND_DUPLICATE, insert_limm, 0 },
967
968 /* Special operands. */
969#define ZA (LIMMdup + 1)
970#define ZB (LIMMdup + 1)
971#define ZA_S (LIMMdup + 1)
972#define ZB_S (LIMMdup + 1)
973#define ZC_S (LIMMdup + 1)
974 { 0, 0, 0, ARC_OPERAND_UNSIGNED, insert_za, 0 },
975
976#define RRANGE_EL (ZA + 1)
977 { 4, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_NCHK | ARC_OPERAND_TRUNCATE,
978 insert_rrange, extract_rrange},
979#define FP_EL (RRANGE_EL + 1)
980 { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
981 insert_fpel, extract_fpel },
982#define BLINK_EL (FP_EL + 1)
983 { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
984 insert_blinkel, extract_blinkel },
985#define PCL_EL (BLINK_EL + 1)
986 { 1, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_IGNORE | ARC_OPERAND_NCHK,
987 insert_pclel, extract_pclel },
988
989 /* Fake operand to handle the T flag. */
990#define BRAKET (PCL_EL + 1)
991#define BRAKETdup (PCL_EL + 1)
992 { 0, 0, 0, ARC_OPERAND_FAKE | ARC_OPERAND_BRAKET, 0, 0 },
993
994 /* Fake operand to handle the T flag. */
995#define FKT_T (BRAKET + 1)
996 { 1, 3, 0, ARC_OPERAND_FAKE, insert_Ybit, 0 },
997 /* Fake operand to handle the T flag. */
998#define FKT_NT (FKT_T + 1)
999 { 1, 3, 0, ARC_OPERAND_FAKE, insert_NYbit, 0 },
1000
1001 /* UIMM6_20 mask = 00000000000000000000111111000000. */
1002#define UIMM6_20 (FKT_NT + 1)
1003 {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_20, extract_uimm6_20},
1004
1005 /* SIMM12_20 mask = 00000000000000000000111111222222. */
1006#define SIMM12_20 (UIMM6_20 + 1)
1007 {12, 0, 0, ARC_OPERAND_SIGNED, insert_simm12_20, extract_simm12_20},
1008
1009 /* SIMM3_5_S mask = 0000011100000000. */
1010#define SIMM3_5_S (SIMM12_20 + 1)
1011 {3, 0, 0, ARC_OPERAND_SIGNED | ARC_OPERAND_NCHK,
1012 insert_simm3s, extract_simm3s},
1013
1014 /* UIMM7_A32_11_S mask = 0000000000011111. */
1015#define UIMM7_A32_11_S (SIMM3_5_S + 1)
1016 {7, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
1017 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm7_a32_11_s,
1018 extract_uimm7_a32_11_s},
1019
1020 /* UIMM7_9_S mask = 0000000001111111. */
1021#define UIMM7_9_S (UIMM7_A32_11_S + 1)
1022 {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_9_s, extract_uimm7_9_s},
1023
1024 /* UIMM3_13_S mask = 0000000000000111. */
1025#define UIMM3_13_S (UIMM7_9_S + 1)
1026 {3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_13_s, extract_uimm3_13_s},
1027
1028 /* SIMM11_A32_7_S mask = 0000000111111111. */
1029#define SIMM11_A32_7_S (UIMM3_13_S + 1)
1030 {11, 0, BFD_RELOC_ARC_SDA16_LD2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
1031 | ARC_OPERAND_TRUNCATE, insert_simm11_a32_7_s, extract_simm11_a32_7_s},
1032
1033 /* UIMM6_13_S mask = 0000000002220111. */
1034#define UIMM6_13_S (SIMM11_A32_7_S + 1)
1035 {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_13_s, extract_uimm6_13_s},
1036 /* UIMM5_11_S mask = 0000000000011111. */
1037#define UIMM5_11_S (UIMM6_13_S + 1)
1038 {5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_IGNORE, insert_uimm5_11_s,
1039 extract_uimm5_11_s},
1040
1041 /* SIMM9_A16_8 mask = 00000000111111102000000000000000. */
1042#define SIMM9_A16_8 (UIMM5_11_S + 1)
1043 {9, 0, -SIMM9_A16_8, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1044 | ARC_OPERAND_PCREL | ARC_OPERAND_TRUNCATE, insert_simm9_a16_8,
1045 extract_simm9_a16_8},
1046
1047 /* UIMM6_8 mask = 00000000000000000000111111000000. */
1048#define UIMM6_8 (SIMM9_A16_8 + 1)
1049 {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_8, extract_uimm6_8},
1050
1051 /* SIMM21_A16_5 mask = 00000111111111102222222222000000. */
1052#define SIMM21_A16_5 (UIMM6_8 + 1)
1053 {21, 0, BFD_RELOC_ARC_S21H_PCREL, ARC_OPERAND_SIGNED
1054 | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE,
1055 insert_simm21_a16_5, extract_simm21_a16_5},
1056
1057 /* SIMM25_A16_5 mask = 00000111111111102222222222003333. */
1058#define SIMM25_A16_5 (SIMM21_A16_5 + 1)
1059 {25, 0, BFD_RELOC_ARC_S25H_PCREL, ARC_OPERAND_SIGNED
1060 | ARC_OPERAND_ALIGNED16 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL,
1061 insert_simm25_a16_5, extract_simm25_a16_5},
1062
1063 /* SIMM10_A16_7_S mask = 0000000111111111. */
1064#define SIMM10_A16_7_S (SIMM25_A16_5 + 1)
1065 {10, 0, -SIMM10_A16_7_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1066 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm10_a16_7_s,
1067 extract_simm10_a16_7_s},
1068
1069#define SIMM10_A16_7_Sbis (SIMM10_A16_7_S + 1)
1070 {10, 0, -SIMM10_A16_7_Sbis, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1071 | ARC_OPERAND_TRUNCATE, insert_simm10_a16_7_s, extract_simm10_a16_7_s},
1072
1073 /* SIMM7_A16_10_S mask = 0000000000111111. */
1074#define SIMM7_A16_10_S (SIMM10_A16_7_Sbis + 1)
1075 {7, 0, -SIMM7_A16_10_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1076 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm7_a16_10_s,
1077 extract_simm7_a16_10_s},
1078
1079 /* SIMM21_A32_5 mask = 00000111111111002222222222000000. */
1080#define SIMM21_A32_5 (SIMM7_A16_10_S + 1)
1081 {21, 0, BFD_RELOC_ARC_S21W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
1082 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm21_a32_5,
1083 extract_simm21_a32_5},
1084
1085 /* SIMM25_A32_5 mask = 00000111111111002222222222003333. */
1086#define SIMM25_A32_5 (SIMM21_A32_5 + 1)
1087 {25, 0, BFD_RELOC_ARC_S25W_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
1088 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm25_a32_5,
1089 extract_simm25_a32_5},
1090
1091 /* SIMM13_A32_5_S mask = 0000011111111111. */
1092#define SIMM13_A32_5_S (SIMM25_A32_5 + 1)
1093 {13, 0, BFD_RELOC_ARC_S13_PCREL, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
1094 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a32_5_s,
1095 extract_simm13_a32_5_s},
1096
1097 /* SIMM8_A16_9_S mask = 0000000001111111. */
1098#define SIMM8_A16_9_S (SIMM13_A32_5_S + 1)
1099 {8, 0, -SIMM8_A16_9_S, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1100 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm8_a16_9_s,
1101 extract_simm8_a16_9_s},
1102
1103 /* UIMM3_23 mask = 00000000000000000000000111000000. */
1104#define UIMM3_23 (SIMM8_A16_9_S + 1)
1105 {3, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm3_23, extract_uimm3_23},
1106
1107 /* UIMM10_6_S mask = 0000001111111111. */
1108#define UIMM10_6_S (UIMM3_23 + 1)
1109 {10, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm10_6_s, extract_uimm10_6_s},
1110
1111 /* UIMM6_11_S mask = 0000002200011110. */
1112#define UIMM6_11_S (UIMM10_6_S + 1)
1113 {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_11_s, extract_uimm6_11_s},
1114
1115 /* SIMM9_8 mask = 00000000111111112000000000000000. */
1116#define SIMM9_8 (UIMM6_11_S + 1)
1117 {9, 0, BFD_RELOC_ARC_SDA_LDST, ARC_OPERAND_SIGNED | ARC_OPERAND_IGNORE,
1118 insert_simm9_8, extract_simm9_8},
1119
1120 /* UIMM10_A32_8_S mask = 0000000011111111. */
1121#define UIMM10_A32_8_S (SIMM9_8 + 1)
1122 {10, 0, -UIMM10_A32_8_S, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
1123 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm10_a32_8_s,
1124 extract_uimm10_a32_8_s},
1125
1126 /* SIMM9_7_S mask = 0000000111111111. */
1127#define SIMM9_7_S (UIMM10_A32_8_S + 1)
1128 {9, 0, BFD_RELOC_ARC_SDA16_LD, ARC_OPERAND_SIGNED, insert_simm9_7_s,
1129 extract_simm9_7_s},
1130
1131 /* UIMM6_A16_11_S mask = 0000000000011111. */
1132#define UIMM6_A16_11_S (SIMM9_7_S + 1)
1133 {6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
1134 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm6_a16_11_s,
1135 extract_uimm6_a16_11_s},
1136
1137 /* UIMM5_A32_11_S mask = 0000020000011000. */
1138#define UIMM5_A32_11_S (UIMM6_A16_11_S + 1)
1139 {5, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED32
1140 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_IGNORE, insert_uimm5_a32_11_s,
1141 extract_uimm5_a32_11_s},
1142
1143 /* SIMM11_A32_13_S mask = 0000022222200111. */
1144#define SIMM11_A32_13_S (UIMM5_A32_11_S + 1)
1145 {11, 0, BFD_RELOC_ARC_SDA16_ST2, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED32
1146 | ARC_OPERAND_TRUNCATE, insert_simm11_a32_13_s, extract_simm11_a32_13_s},
1147
1148 /* UIMM7_13_S mask = 0000000022220111. */
1149#define UIMM7_13_S (SIMM11_A32_13_S + 1)
1150 {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_13_s, extract_uimm7_13_s},
1151
1152 /* UIMM6_A16_21 mask = 00000000000000000000011111000000. */
1153#define UIMM6_A16_21 (UIMM7_13_S + 1)
1154 {6, 0, 0, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
1155 | ARC_OPERAND_TRUNCATE, insert_uimm6_a16_21, extract_uimm6_a16_21},
1156
1157 /* UIMM7_11_S mask = 0000022200011110. */
1158#define UIMM7_11_S (UIMM6_A16_21 + 1)
1159 {7, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm7_11_s, extract_uimm7_11_s},
1160
1161 /* UIMM7_A16_20 mask = 00000000000000000000111111000000. */
1162#define UIMM7_A16_20 (UIMM7_11_S + 1)
1163 {7, 0, -UIMM7_A16_20, ARC_OPERAND_UNSIGNED | ARC_OPERAND_ALIGNED16
1164 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_uimm7_a16_20,
1165 extract_uimm7_a16_20},
1166
1167 /* SIMM13_A16_20 mask = 00000000000000000000111111222222. */
1168#define SIMM13_A16_20 (UIMM7_A16_20 + 1)
1169 {13, 0, -SIMM13_A16_20, ARC_OPERAND_SIGNED | ARC_OPERAND_ALIGNED16
1170 | ARC_OPERAND_TRUNCATE | ARC_OPERAND_PCREL, insert_simm13_a16_20,
1171 extract_simm13_a16_20},
1172
1173 /* UIMM8_8_S mask = 0000000011111111. */
1174#define UIMM8_8_S (SIMM13_A16_20 + 1)
1175 {8, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm8_8_s, extract_uimm8_8_s},
1176
1177 /* W6 mask = 00000000000000000000111111000000. */
1178#define W6 (UIMM8_8_S + 1)
1179 {6, 0, 0, ARC_OPERAND_SIGNED, insert_w6, extract_w6},
1180
1181 /* UIMM6_5_S mask = 0000011111100000. */
1182#define UIMM6_5_S (W6 + 1)
1183 {6, 0, 0, ARC_OPERAND_UNSIGNED, insert_uimm6_5_s, extract_uimm6_5_s},
1184};
0d2bcfaf 1185
886a2506 1186const unsigned arc_num_operands = ARRAY_SIZE (arc_operands);
0d2bcfaf 1187
886a2506
NC
1188const unsigned arc_Toperand = FKT_T;
1189const unsigned arc_NToperand = FKT_NT;
47b0e7ad 1190
886a2506 1191/* The opcode table.
0d2bcfaf 1192
886a2506 1193 The format of the opcode table is:
0d2bcfaf 1194
886a2506
NC
1195 NAME OPCODE MASK CPU CLASS SUBCLASS { OPERANDS } { FLAGS }. */
1196const struct arc_opcode arc_opcodes[] =
0d2bcfaf 1197{
886a2506
NC
1198#include "arc-tbl.h"
1199};
0d2bcfaf 1200
886a2506 1201const unsigned arc_num_opcodes = ARRAY_SIZE (arc_opcodes);
252b5132 1202
886a2506
NC
1203/* List with special cases instructions and the applicable flags. */
1204const struct arc_flag_special arc_flag_special_cases[] =
252b5132 1205{
886a2506
NC
1206 { "b", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1207 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1208 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1209 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1210 { "bl", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1211 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1212 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1213 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1214 { "br", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1215 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1216 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1217 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1218 { "j", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1219 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1220 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1221 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1222 { "jl", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1223 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1224 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1225 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1226 { "lp", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1227 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1228 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1229 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1230 { "set", { F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE,
1231 F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR,
1232 F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW,
1233 F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NULL } },
1234 { "ld", { F_SIZEB17, F_SIZEW17, F_H17, F_NULL } },
1235 { "st", { F_SIZEB1, F_SIZEW1, F_H1, F_NULL } }
1236};
252b5132 1237
886a2506 1238const unsigned arc_num_flag_special = ARRAY_SIZE (arc_flag_special_cases);
252b5132 1239
886a2506 1240/* Relocations. */
886a2506
NC
1241const struct arc_reloc_equiv_tab arc_reloc_equiv[] =
1242{
24b368f8
CZ
1243 { "sda", "ld", { F_ASFAKE, F_H1, F_NULL },
1244 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
1245 { "sda", "st", { F_ASFAKE, F_H1, F_NULL },
1246 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
1247 { "sda", "ld", { F_ASFAKE, F_SIZEW7, F_NULL },
1248 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
1249 { "sda", "st", { F_ASFAKE, F_SIZEW7, F_NULL },
1250 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST1 },
1251
1252 /* Next two entries will cover the undefined behavior ldb/stb with
1253 address scaling. */
1254 { "sda", "ld", { F_ASFAKE, F_SIZEB7, F_NULL },
1255 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST },
1256 { "sda", "st", { F_ASFAKE, F_SIZEB7, F_NULL },
1257 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST},
1258
1259 { "sda", "ld", { F_ASFAKE, F_NULL },
1260 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2 },
1261 { "sda", "st", { F_ASFAKE, F_NULL },
1262 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2},
1263 { "sda", "ldd", { F_ASFAKE, F_NULL },
1264 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2 },
1265 { "sda", "std", { F_ASFAKE, F_NULL },
1266 BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST2},
886a2506
NC
1267
1268 /* Short instructions. */
24b368f8
CZ
1269 { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_LD, BFD_RELOC_ARC_SDA16_LD },
1270 { "sda", 0, { F_NULL }, -SIMM10_A16_7_Sbis, BFD_RELOC_ARC_SDA16_LD1 },
1271 { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_LD2, BFD_RELOC_ARC_SDA16_LD2 },
1272 { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA16_ST2, BFD_RELOC_ARC_SDA16_ST2 },
1273
1274 { "sda", 0, { F_NULL }, BFD_RELOC_ARC_32_ME, BFD_RELOC_ARC_SDA32_ME },
1275 { "sda", 0, { F_NULL }, BFD_RELOC_ARC_SDA_LDST, BFD_RELOC_ARC_SDA_LDST },
1276
1277 { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S25H_PCREL,
1278 BFD_RELOC_ARC_S25H_PCREL_PLT },
1279 { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S21H_PCREL,
1280 BFD_RELOC_ARC_S21H_PCREL_PLT },
1281 { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S25W_PCREL,
1282 BFD_RELOC_ARC_S25W_PCREL_PLT },
1283 { "plt", 0, { F_NULL }, BFD_RELOC_ARC_S21W_PCREL,
1284 BFD_RELOC_ARC_S21W_PCREL_PLT },
1285
1286 { "plt", 0, { F_NULL }, BFD_RELOC_ARC_32_ME, BFD_RELOC_ARC_PLT32 }
886a2506 1287};
252b5132 1288
886a2506 1289const unsigned arc_num_equiv_tab = ARRAY_SIZE (arc_reloc_equiv);
252b5132 1290
886a2506 1291const struct arc_pseudo_insn arc_pseudo_insns[] =
0d2bcfaf 1292{
886a2506
NC
1293 { "push", "st", ".aw", 5, { { RC, 0, 0, 0 }, { BRAKET, 1, 0, 1 },
1294 { RB, 1, 28, 2 }, { SIMM9_8, 1, -4, 3 },
1295 { BRAKETdup, 1, 0, 4} } },
1296 { "pop", "ld", ".ab", 5, { { RA, 0, 0, 0 }, { BRAKET, 1, 0, 1 },
1297 { RB, 1, 28, 2 }, { SIMM9_8, 1, 4, 3 },
1298 { BRAKETdup, 1, 0, 4} } },
1299
1300 { "brgt", "brlt", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
1301 { SIMM9_A16_8, 0, 0, 2 } } },
1302 { "brgt", "brge", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1303 { SIMM9_A16_8, 0, 0, 2 } } },
1304 { "brgt", "brlt", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
1305 { SIMM9_A16_8, 0, 0, 2 } } },
1306 { "brgt", "brlt", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
1307 { SIMM9_A16_8, 0, 0, 2 } } },
1308 { "brgt", "brge", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1309 { SIMM9_A16_8, 0, 0, 2 } } },
1310
1311 { "brhi", "brlo", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
1312 { SIMM9_A16_8, 0, 0, 2 } } },
1313 { "brhi", "brhs", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1314 { SIMM9_A16_8, 0, 0, 2 } } },
1315 { "brhi", "brlo", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
1316 { SIMM9_A16_8, 0, 0, 2 } } },
1317 { "brhi", "brlo", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
1318 { SIMM9_A16_8, 0, 0, 2 } } },
1319 { "brhi", "brhs", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1320 { SIMM9_A16_8, 0, 0, 2 } } },
1321
1322 { "brle", "brge", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
1323 { SIMM9_A16_8, 0, 0, 2 } } },
1324 { "brle", "brlt", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1325 { SIMM9_A16_8, 0, 0, 2 } } },
1326 { "brle", "brge", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
1327 { SIMM9_A16_8, 0, 0, 2 } } },
1328 { "brle", "brge", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
1329 { SIMM9_A16_8, 0, 0, 2 } } },
1330 { "brle", "brlt", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1331 { SIMM9_A16_8, 0, 0, 2 } } },
1332
1333 { "brls", "brhs", NULL, 3, { { RB, 0, 0, 1 }, { RC, 0, 0, 0 },
1334 { SIMM9_A16_8, 0, 0, 2 } } },
1335 { "brls", "brlo", NULL, 3, { { RB, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1336 { SIMM9_A16_8, 0, 0, 2 } } },
1337 { "brls", "brhs", NULL, 3, { { RB, 0, 0, 1 }, { LIMM, 0, 0, 0 },
1338 { SIMM9_A16_8, 0, 0, 2 } } },
1339 { "brls", "brhs", NULL, 3, { { LIMM, 0, 0, 1 }, { RC, 0, 0, 0 },
1340 { SIMM9_A16_8, 0, 0, 2 } } },
1341 { "brls", "brlo", NULL, 3, { { LIMM, 0, 0, 0 }, { UIMM6_8, 0, 1, 1 },
1342 { SIMM9_A16_8, 0, 0, 2 } } },
1343};
0d2bcfaf 1344
886a2506
NC
1345const unsigned arc_num_pseudo_insn =
1346 sizeof (arc_pseudo_insns) / sizeof (*arc_pseudo_insns);
0d2bcfaf 1347
886a2506 1348const struct arc_aux_reg arc_aux_regs[] =
0d2bcfaf 1349{
886a2506
NC
1350#undef DEF
1351#define DEF(ADDR, NAME) \
1352 { ADDR, #NAME, sizeof (#NAME)-1 },
0d2bcfaf 1353
886a2506 1354#include "arc-regs.h"
0d2bcfaf 1355
886a2506
NC
1356#undef DEF
1357};
0d2bcfaf 1358
886a2506 1359const unsigned arc_num_aux_regs = ARRAY_SIZE (arc_aux_regs);
4670103e
CZ
1360
1361/* NOTE: The order of this array MUST be consistent with 'enum
1362 arc_rlx_types' located in tc-arc.h! */
1363const struct arc_opcode arc_relax_opcodes[] =
1364{
1365 { NULL, 0x0, 0x0, 0x0, ARITH, NONE, { UNUSED }, { 0 } },
1366
1367 /* bl_s s13 11111sssssssssss. */
1368 { "bl_s", 0x0000F800, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1369 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
1370 { SIMM13_A32_5_S }, { 0 }},
1371
1372 /* bl<.d> s25 00001sssssssss10SSSSSSSSSSNRtttt. */
1373 { "bl", 0x08020000, 0xF8030000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1374 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
1375 { SIMM25_A32_5 }, { C_D }},
1376
1377 /* b_s s10 1111000sssssssss. */
1378 { "b_s", 0x0000F000, 0x0000FE00, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1379 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
1380 { SIMM10_A16_7_S }, { 0 }},
1381
1382 /* b<.d> s25 00000ssssssssss1SSSSSSSSSSNRtttt. */
1383 { "b", 0x00010000, 0xF8010000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1384 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, BRANCH, NONE,
1385 { SIMM25_A16_5 }, { C_D }},
1386
1387 /* add_s c,b,u3 01101bbbccc00uuu. Wants UIMM3_13_S_PCREL. */
1388 { "add_s", 0x00006800, 0x0000F818, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1389 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1390 { RC_S, RB_S, UIMM3_13_S }, { 0 }},
1391
1392 /* add<.f> a,b,u6 00100bbb01000000FBBBuuuuuuAAAAAA. Wants
1393 UIMM6_20_PCREL. */
1394 { "add", 0x20400000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1395 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1396 { RA, RB, UIMM6_20 }, { C_F }},
1397
1398 /* add<.f> a,b,limm 00100bbb00000000FBBB111110AAAAAA. */
1399 { "add", 0x20000F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1400 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1401 { RA, RB, LIMM }, { C_F }},
1402
1403 /* ld_s c,b,u7 10000bbbcccuuuuu. Wants UIMM7_A32_11_S_PCREL. */
1404 { "ld_s", 0x00008000, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1405 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1406 { RC_S, BRAKET, RB_S, UIMM7_A32_11_S, BRAKETdup }, { 0 }},
1407
1408 /* ld<.di><.aa><.x><zz> a,b,s9
1409 00010bbbssssssssSBBBDaaZZXAAAAAA. Wants SIMM9_8_PCREL. */
1410 { "ld", 0x10000000, 0xF8000000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1411 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1412 { RA, BRAKET, RB, SIMM9_8, BRAKETdup },
1413 { C_ZZ23, C_DI20, C_AA21, C_X25 }},
1414
1415 /* ld<.di><.aa><.x><zz> a,b,limm 00100bbbaa110ZZXDBBB111110AAAAAA. */
1416 { "ld", 0x20300F80, 0xF8380FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1417 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1418 { RA, BRAKET, RB, LIMM, BRAKETdup },
1419 { C_ZZ13, C_DI16, C_AA8, C_X15 }},
1420
1421 /* mov_s b,u8 11011bbbuuuuuuuu. Wants UIMM8_8_S_PCREL. */
1422 { "mov_s", 0x0000D800, 0x0000F800, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1423 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1424 { RB_S, UIMM8_8_S }, { 0 }},
1425
1426 /* mov<.f> b,s12 00100bbb10001010FBBBssssssSSSSSS. Wants
1427 SIMM12_20_PCREL. */
1428 { "mov", 0x208A0000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1429 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1430 { RB, SIMM12_20 }, { C_F }},
1431
1432 /* mov<.f> b,limm 00100bbb00001010FBBB111110RRRRRR. */
1433 { "mov", 0x200A0F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1434 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1435 { RB, LIMM }, { C_F }},
1436
1437 /* sub_s c,b,u3 01101bbbccc01uuu. UIMM3_13_S_PCREL. */
1438 { "sub_s", 0x00006808, 0x0000F818, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1439 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1440 { RC_S, RB_S, UIMM3_13_S }, { 0 }},
1441
1442 /* sub<.f> a,b,u6 00100bbb01000010FBBBuuuuuuAAAAAA.
1443 UIMM6_20_PCREL. */
1444 { "sub", 0x20420000, 0xF8FF0000, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1445 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1446 { RA, RB, UIMM6_20 }, { C_F }},
1447
1448 /* sub<.f> a,b,limm 00100bbb00000010FBBB111110AAAAAA. */
1449 { "sub", 0x20020F80, 0xF8FF0FC0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1450 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1451 { RA, RB, LIMM }, { C_F }},
1452
1453 /* mpy<.f> a,b,u6 00100bbb01011010FBBBuuuuuuAAAAAA.
1454 UIMM6_20_PCREL. */
1455 { "mpy", 0x205A0000, 0xF8FF0000, ARC_OPCODE_ARC700 | ARC_OPCODE_ARCv2EM
1456 | ARC_OPCODE_ARCv2HS, ARITH, MPY6E, { RA, RB, UIMM6_20 }, { C_F }},
1457
1458 /* mpy<.f> a,b,limm 00100bbb00011010FBBB111110AAAAAA. */
1459 { "mpy", 0x201A0F80, 0xF8FF0FC0, ARC_OPCODE_ARC700 | ARC_OPCODE_ARCv2EM
1460 | ARC_OPCODE_ARCv2HS, ARITH, MPY6E, { RA, RB, LIMM }, { C_F }},
1461
1462 /* mov<.f><.cc> b,u6 00100bbb11001010FBBBuuuuuu1QQQQQ.
1463 UIMM6_20_PCREL. */
1464 { "mov", 0x20CA0020, 0xF8FF0020, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1465 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1466 { RB, UIMM6_20 }, { C_F, C_CC }},
1467
1468 /* mov<.f><.cc> b,limm 00100bbb11001010FBBB1111100QQQQQ. */
1469 { "mov", 0x20CA0F80, 0xF8FF0FE0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1470 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, MEMORY, NONE,
1471 { RB, LIMM }, { C_F, C_CC }},
1472
1473 /* add<.f><.cc> b,b,u6 00100bbb11000000FBBBuuuuuu1QQQQQ.
1474 UIMM6_20_PCREL. */
1475 { "add", 0x20C00020, 0xF8FF0020, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1476 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1477 { RB, RBdup, UIMM6_20 }, { C_F, C_CC }},
1478
1479 /* add<.f><.cc> b,b,limm 00100bbb11000000FBBB1111100QQQQQ. */
1480 { "add", 0x20C00F80, 0xF8FF0FE0, ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700
1481 | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS, ARITH, NONE,
1482 { RB, RBdup, LIMM }, { C_F, C_CC }}
1483};
1484
1485const unsigned arc_num_relax_opcodes = ARRAY_SIZE (arc_relax_opcodes);
This page took 0.780857 seconds and 4 git commands to generate.