| /* This file is automatically generated by aarch64-gen. Do not edit! */ |
| /* Copyright (C) 2012-2016 Free Software Foundation, Inc. |
| Contributed by ARM Ltd. |
| |
| This file is part of the GNU opcodes library. |
| |
| This library is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3, or (at your option) |
| any later version. |
| |
| It is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
| License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING3. If not, |
| see <http://www.gnu.org/licenses/>. */ |
| |
| #include "sysdep.h" |
| #include "aarch64-asm.h" |
| |
| |
| const aarch64_opcode * |
| aarch64_find_real_opcode (const aarch64_opcode *opcode) |
| { |
| /* Use the index as the key to locate the real opcode. */ |
| int key = opcode - aarch64_opcode_table; |
| int value; |
| switch (key) |
| { |
| case 3: /* ngc */ |
| case 2: /* sbc */ |
| value = 2; /* --> sbc. */ |
| break; |
| case 5: /* ngcs */ |
| case 4: /* sbcs */ |
| value = 4; /* --> sbcs. */ |
| break; |
| case 8: /* cmn */ |
| case 7: /* adds */ |
| value = 7; /* --> adds. */ |
| break; |
| case 11: /* cmp */ |
| case 10: /* subs */ |
| value = 10; /* --> subs. */ |
| break; |
| case 13: /* mov */ |
| case 12: /* add */ |
| value = 12; /* --> add. */ |
| break; |
| case 15: /* cmn */ |
| case 14: /* adds */ |
| value = 14; /* --> adds. */ |
| break; |
| case 18: /* cmp */ |
| case 17: /* subs */ |
| value = 17; /* --> subs. */ |
| break; |
| case 21: /* cmn */ |
| case 20: /* adds */ |
| value = 20; /* --> adds. */ |
| break; |
| case 23: /* neg */ |
| case 22: /* sub */ |
| value = 22; /* --> sub. */ |
| break; |
| case 26: /* negs */ |
| case 25: /* cmp */ |
| case 24: /* subs */ |
| value = 24; /* --> subs. */ |
| break; |
| case 150: /* mov */ |
| case 149: /* umov */ |
| value = 149; /* --> umov. */ |
| break; |
| case 152: /* mov */ |
| case 151: /* ins */ |
| value = 151; /* --> ins. */ |
| break; |
| case 154: /* mov */ |
| case 153: /* ins */ |
| value = 153; /* --> ins. */ |
| break; |
| case 236: /* mvn */ |
| case 235: /* not */ |
| value = 235; /* --> not. */ |
| break; |
| case 311: /* mov */ |
| case 310: /* orr */ |
| value = 310; /* --> orr. */ |
| break; |
| case 380: /* sxtl */ |
| case 379: /* sshll */ |
| value = 379; /* --> sshll. */ |
| break; |
| case 382: /* sxtl2 */ |
| case 381: /* sshll2 */ |
| value = 381; /* --> sshll2. */ |
| break; |
| case 404: /* uxtl */ |
| case 403: /* ushll */ |
| value = 403; /* --> ushll. */ |
| break; |
| case 406: /* uxtl2 */ |
| case 405: /* ushll2 */ |
| value = 405; /* --> ushll2. */ |
| break; |
| case 527: /* mov */ |
| case 526: /* dup */ |
| value = 526; /* --> dup. */ |
| break; |
| case 614: /* sxtw */ |
| case 613: /* sxth */ |
| case 612: /* sxtb */ |
| case 615: /* asr */ |
| case 611: /* sbfx */ |
| case 610: /* sbfiz */ |
| case 609: /* sbfm */ |
| value = 609; /* --> sbfm. */ |
| break; |
| case 618: /* bfc */ |
| case 619: /* bfxil */ |
| case 617: /* bfi */ |
| case 616: /* bfm */ |
| value = 616; /* --> bfm. */ |
| break; |
| case 624: /* uxth */ |
| case 623: /* uxtb */ |
| case 626: /* lsr */ |
| case 625: /* lsl */ |
| case 622: /* ubfx */ |
| case 621: /* ubfiz */ |
| case 620: /* ubfm */ |
| value = 620; /* --> ubfm. */ |
| break; |
| case 644: /* cset */ |
| case 643: /* cinc */ |
| case 642: /* csinc */ |
| value = 642; /* --> csinc. */ |
| break; |
| case 647: /* csetm */ |
| case 646: /* cinv */ |
| case 645: /* csinv */ |
| value = 645; /* --> csinv. */ |
| break; |
| case 649: /* cneg */ |
| case 648: /* csneg */ |
| value = 648; /* --> csneg. */ |
| break; |
| case 667: /* rev */ |
| case 668: /* rev64 */ |
| value = 667; /* --> rev. */ |
| break; |
| case 675: /* lsl */ |
| case 674: /* lslv */ |
| value = 674; /* --> lslv. */ |
| break; |
| case 677: /* lsr */ |
| case 676: /* lsrv */ |
| value = 676; /* --> lsrv. */ |
| break; |
| case 679: /* asr */ |
| case 678: /* asrv */ |
| value = 678; /* --> asrv. */ |
| break; |
| case 681: /* ror */ |
| case 680: /* rorv */ |
| value = 680; /* --> rorv. */ |
| break; |
| case 691: /* mul */ |
| case 690: /* madd */ |
| value = 690; /* --> madd. */ |
| break; |
| case 693: /* mneg */ |
| case 692: /* msub */ |
| value = 692; /* --> msub. */ |
| break; |
| case 695: /* smull */ |
| case 694: /* smaddl */ |
| value = 694; /* --> smaddl. */ |
| break; |
| case 697: /* smnegl */ |
| case 696: /* smsubl */ |
| value = 696; /* --> smsubl. */ |
| break; |
| case 700: /* umull */ |
| case 699: /* umaddl */ |
| value = 699; /* --> umaddl. */ |
| break; |
| case 702: /* umnegl */ |
| case 701: /* umsubl */ |
| value = 701; /* --> umsubl. */ |
| break; |
| case 713: /* ror */ |
| case 712: /* extr */ |
| value = 712; /* --> extr. */ |
| break; |
| case 920: /* bic */ |
| case 919: /* and */ |
| value = 919; /* --> and. */ |
| break; |
| case 922: /* mov */ |
| case 921: /* orr */ |
| value = 921; /* --> orr. */ |
| break; |
| case 925: /* tst */ |
| case 924: /* ands */ |
| value = 924; /* --> ands. */ |
| break; |
| case 930: /* uxtw */ |
| case 929: /* mov */ |
| case 928: /* orr */ |
| value = 928; /* --> orr. */ |
| break; |
| case 932: /* mvn */ |
| case 931: /* orn */ |
| value = 931; /* --> orn. */ |
| break; |
| case 936: /* tst */ |
| case 935: /* ands */ |
| value = 935; /* --> ands. */ |
| break; |
| case 1062: /* staddb */ |
| case 966: /* ldaddb */ |
| value = 966; /* --> ldaddb. */ |
| break; |
| case 1063: /* staddh */ |
| case 967: /* ldaddh */ |
| value = 967; /* --> ldaddh. */ |
| break; |
| case 1064: /* stadd */ |
| case 968: /* ldadd */ |
| value = 968; /* --> ldadd. */ |
| break; |
| case 1065: /* staddlb */ |
| case 970: /* ldaddlb */ |
| value = 970; /* --> ldaddlb. */ |
| break; |
| case 1066: /* staddlh */ |
| case 973: /* ldaddlh */ |
| value = 973; /* --> ldaddlh. */ |
| break; |
| case 1067: /* staddl */ |
| case 976: /* ldaddl */ |
| value = 976; /* --> ldaddl. */ |
| break; |
| case 1068: /* stclrb */ |
| case 978: /* ldclrb */ |
| value = 978; /* --> ldclrb. */ |
| break; |
| case 1069: /* stclrh */ |
| case 979: /* ldclrh */ |
| value = 979; /* --> ldclrh. */ |
| break; |
| case 1070: /* stclr */ |
| case 980: /* ldclr */ |
| value = 980; /* --> ldclr. */ |
| break; |
| case 1071: /* stclrlb */ |
| case 982: /* ldclrlb */ |
| value = 982; /* --> ldclrlb. */ |
| break; |
| case 1072: /* stclrlh */ |
| case 985: /* ldclrlh */ |
| value = 985; /* --> ldclrlh. */ |
| break; |
| case 1073: /* stclrl */ |
| case 988: /* ldclrl */ |
| value = 988; /* --> ldclrl. */ |
| break; |
| case 1074: /* steorb */ |
| case 990: /* ldeorb */ |
| value = 990; /* --> ldeorb. */ |
| break; |
| case 1075: /* steorh */ |
| case 991: /* ldeorh */ |
| value = 991; /* --> ldeorh. */ |
| break; |
| case 1076: /* steor */ |
| case 992: /* ldeor */ |
| value = 992; /* --> ldeor. */ |
| break; |
| case 1077: /* steorlb */ |
| case 994: /* ldeorlb */ |
| value = 994; /* --> ldeorlb. */ |
| break; |
| case 1078: /* steorlh */ |
| case 997: /* ldeorlh */ |
| value = 997; /* --> ldeorlh. */ |
| break; |
| case 1079: /* steorl */ |
| case 1000: /* ldeorl */ |
| value = 1000; /* --> ldeorl. */ |
| break; |
| case 1080: /* stsetb */ |
| case 1002: /* ldsetb */ |
| value = 1002; /* --> ldsetb. */ |
| break; |
| case 1081: /* stseth */ |
| case 1003: /* ldseth */ |
| value = 1003; /* --> ldseth. */ |
| break; |
| case 1082: /* stset */ |
| case 1004: /* ldset */ |
| value = 1004; /* --> ldset. */ |
| break; |
| case 1083: /* stsetlb */ |
| case 1006: /* ldsetlb */ |
| value = 1006; /* --> ldsetlb. */ |
| break; |
| case 1084: /* stsetlh */ |
| case 1009: /* ldsetlh */ |
| value = 1009; /* --> ldsetlh. */ |
| break; |
| case 1085: /* stsetl */ |
| case 1012: /* ldsetl */ |
| value = 1012; /* --> ldsetl. */ |
| break; |
| case 1086: /* stsmaxb */ |
| case 1014: /* ldsmaxb */ |
| value = 1014; /* --> ldsmaxb. */ |
| break; |
| case 1087: /* stsmaxh */ |
| case 1015: /* ldsmaxh */ |
| value = 1015; /* --> ldsmaxh. */ |
| break; |
| case 1088: /* stsmax */ |
| case 1016: /* ldsmax */ |
| value = 1016; /* --> ldsmax. */ |
| break; |
| case 1089: /* stsmaxlb */ |
| case 1018: /* ldsmaxlb */ |
| value = 1018; /* --> ldsmaxlb. */ |
| break; |
| case 1090: /* stsmaxlh */ |
| case 1021: /* ldsmaxlh */ |
| value = 1021; /* --> ldsmaxlh. */ |
| break; |
| case 1091: /* stsmaxl */ |
| case 1024: /* ldsmaxl */ |
| value = 1024; /* --> ldsmaxl. */ |
| break; |
| case 1092: /* stsminb */ |
| case 1026: /* ldsminb */ |
| value = 1026; /* --> ldsminb. */ |
| break; |
| case 1093: /* stsminh */ |
| case 1027: /* ldsminh */ |
| value = 1027; /* --> ldsminh. */ |
| break; |
| case 1094: /* stsmin */ |
| case 1028: /* ldsmin */ |
| value = 1028; /* --> ldsmin. */ |
| break; |
| case 1095: /* stsminlb */ |
| case 1030: /* ldsminlb */ |
| value = 1030; /* --> ldsminlb. */ |
| break; |
| case 1096: /* stsminlh */ |
| case 1033: /* ldsminlh */ |
| value = 1033; /* --> ldsminlh. */ |
| break; |
| case 1097: /* stsminl */ |
| case 1036: /* ldsminl */ |
| value = 1036; /* --> ldsminl. */ |
| break; |
| case 1098: /* stumaxb */ |
| case 1038: /* ldumaxb */ |
| value = 1038; /* --> ldumaxb. */ |
| break; |
| case 1099: /* stumaxh */ |
| case 1039: /* ldumaxh */ |
| value = 1039; /* --> ldumaxh. */ |
| break; |
| case 1100: /* stumax */ |
| case 1040: /* ldumax */ |
| value = 1040; /* --> ldumax. */ |
| break; |
| case 1101: /* stumaxlb */ |
| case 1042: /* ldumaxlb */ |
| value = 1042; /* --> ldumaxlb. */ |
| break; |
| case 1102: /* stumaxlh */ |
| case 1045: /* ldumaxlh */ |
| value = 1045; /* --> ldumaxlh. */ |
| break; |
| case 1103: /* stumaxl */ |
| case 1048: /* ldumaxl */ |
| value = 1048; /* --> ldumaxl. */ |
| break; |
| case 1104: /* stuminb */ |
| case 1050: /* lduminb */ |
| value = 1050; /* --> lduminb. */ |
| break; |
| case 1105: /* stuminh */ |
| case 1051: /* lduminh */ |
| value = 1051; /* --> lduminh. */ |
| break; |
| case 1106: /* stumin */ |
| case 1052: /* ldumin */ |
| value = 1052; /* --> ldumin. */ |
| break; |
| case 1107: /* stuminlb */ |
| case 1054: /* lduminlb */ |
| value = 1054; /* --> lduminlb. */ |
| break; |
| case 1108: /* stuminlh */ |
| case 1057: /* lduminlh */ |
| value = 1057; /* --> lduminlh. */ |
| break; |
| case 1109: /* stuminl */ |
| case 1060: /* lduminl */ |
| value = 1060; /* --> lduminl. */ |
| break; |
| case 1111: /* mov */ |
| case 1110: /* movn */ |
| value = 1110; /* --> movn. */ |
| break; |
| case 1113: /* mov */ |
| case 1112: /* movz */ |
| value = 1112; /* --> movz. */ |
| break; |
| case 1126: /* psb */ |
| case 1125: /* esb */ |
| case 1124: /* sevl */ |
| case 1123: /* sev */ |
| case 1122: /* wfi */ |
| case 1121: /* wfe */ |
| case 1120: /* yield */ |
| case 1119: /* nop */ |
| case 1118: /* hint */ |
| value = 1118; /* --> hint. */ |
| break; |
| case 1135: /* tlbi */ |
| case 1134: /* ic */ |
| case 1133: /* dc */ |
| case 1132: /* at */ |
| case 1131: /* sys */ |
| value = 1131; /* --> sys. */ |
| break; |
| default: return NULL; |
| } |
| |
| return aarch64_opcode_table + value; |
| } |
| |
| const char* |
| aarch64_insert_operand (const aarch64_operand *self, |
| const aarch64_opnd_info *info, |
| aarch64_insn *code, const aarch64_inst *inst) |
| { |
| /* Use the index as the key. */ |
| int key = self - aarch64_operands; |
| switch (key) |
| { |
| case 1: |
| case 2: |
| case 3: |
| case 4: |
| case 5: |
| case 6: |
| case 7: |
| case 8: |
| case 9: |
| case 10: |
| case 14: |
| case 15: |
| case 16: |
| case 17: |
| case 19: |
| case 20: |
| case 21: |
| case 22: |
| case 23: |
| case 24: |
| case 25: |
| case 26: |
| case 27: |
| case 35: |
| case 36: |
| return aarch64_ins_regno (self, info, code, inst); |
| case 12: |
| return aarch64_ins_reg_extended (self, info, code, inst); |
| case 13: |
| return aarch64_ins_reg_shifted (self, info, code, inst); |
| case 18: |
| return aarch64_ins_ft (self, info, code, inst); |
| case 28: |
| case 29: |
| case 30: |
| return aarch64_ins_reglane (self, info, code, inst); |
| case 31: |
| return aarch64_ins_reglist (self, info, code, inst); |
| case 32: |
| return aarch64_ins_ldst_reglist (self, info, code, inst); |
| case 33: |
| return aarch64_ins_ldst_reglist_r (self, info, code, inst); |
| case 34: |
| return aarch64_ins_ldst_elemlist (self, info, code, inst); |
| case 37: |
| case 46: |
| case 47: |
| case 48: |
| case 49: |
| case 50: |
| case 51: |
| case 52: |
| case 53: |
| case 54: |
| case 55: |
| case 56: |
| case 57: |
| case 58: |
| case 67: |
| case 68: |
| case 69: |
| case 70: |
| return aarch64_ins_imm (self, info, code, inst); |
| case 38: |
| case 39: |
| return aarch64_ins_advsimd_imm_shift (self, info, code, inst); |
| case 40: |
| case 41: |
| case 42: |
| return aarch64_ins_advsimd_imm_modified (self, info, code, inst); |
| case 59: |
| return aarch64_ins_limm (self, info, code, inst); |
| case 60: |
| return aarch64_ins_aimm (self, info, code, inst); |
| case 61: |
| return aarch64_ins_imm_half (self, info, code, inst); |
| case 62: |
| return aarch64_ins_fbits (self, info, code, inst); |
| case 64: |
| case 65: |
| return aarch64_ins_cond (self, info, code, inst); |
| case 71: |
| case 77: |
| return aarch64_ins_addr_simple (self, info, code, inst); |
| case 72: |
| return aarch64_ins_addr_regoff (self, info, code, inst); |
| case 73: |
| case 74: |
| case 75: |
| return aarch64_ins_addr_simm (self, info, code, inst); |
| case 76: |
| return aarch64_ins_addr_uimm12 (self, info, code, inst); |
| case 78: |
| return aarch64_ins_simd_addr_post (self, info, code, inst); |
| case 79: |
| return aarch64_ins_sysreg (self, info, code, inst); |
| case 80: |
| return aarch64_ins_pstatefield (self, info, code, inst); |
| case 81: |
| case 82: |
| case 83: |
| case 84: |
| return aarch64_ins_sysins_op (self, info, code, inst); |
| case 85: |
| case 86: |
| return aarch64_ins_barrier (self, info, code, inst); |
| case 87: |
| return aarch64_ins_prfop (self, info, code, inst); |
| case 88: |
| return aarch64_ins_hint (self, info, code, inst); |
| default: assert (0); abort (); |
| } |
| } |