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