1 1.1 christos /* NDS32-specific support for 32-bit ELF. 2 1.1.1.9 christos Copyright (C) 2012-2026 Free Software Foundation, Inc. 3 1.1 christos Contributed by Andes Technology Corporation. 4 1.1 christos 5 1.1 christos This file is part of BFD, the Binary File Descriptor library. 6 1.1 christos 7 1.1 christos This program is free software; you can redistribute it and/or modify 8 1.1 christos it under the terms of the GNU General Public License as published by 9 1.1 christos the Free Software Foundation; either version 3 of the License, or 10 1.1 christos (at your option) any later version. 11 1.1 christos 12 1.1 christos This program is distributed in the hope that it will be useful, 13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this program; if not, write to the Free Software 19 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 20 1.1 christos 02110-1301, USA. */ 21 1.1 christos 22 1.1 christos 23 1.1.1.4 christos #include "sysdep.h" 24 1.1 christos 25 1.1.1.6 christos #include <stdint.h> 26 1.1 christos #include <assert.h> 27 1.1 christos 28 1.1 christos #include "safe-ctype.h" 29 1.1 christos #include "libiberty.h" 30 1.1 christos #include "hashtab.h" 31 1.1 christos #include "bfd.h" 32 1.1.1.4 christos #include "opintl.h" 33 1.1 christos 34 1.1.1.5 christos #include <config.h> 35 1.1.1.5 christos #include <stdlib.h> 36 1.1.1.5 christos #include <string.h> 37 1.1.1.5 christos 38 1.1 christos #include "opcode/nds32.h" 39 1.1 christos #include "nds32-asm.h" 40 1.1 christos 41 1.1 christos /* There at at most MAX_LEX_NUM lexical elements in a syntax. */ 42 1.1 christos #define MAX_LEX_NUM 32 43 1.1 christos /* A operand in syntax string should be at most this long. */ 44 1.1 christos #define MAX_LEX_LEN 64 45 1.1 christos /* The max length of a keyword can be. */ 46 1.1 christos #define MAX_KEYWORD_LEN 32 47 1.1 christos /* This LEX is a plain char or operand. */ 48 1.1 christos #define IS_LEX_CHAR(c) (((c) >> 7) == 0) 49 1.1.1.5 christos #define LEX_SET_FIELD(k,c) ((c) | (((k) + 1) << 8)) 50 1.1.1.5 christos #define LEX_GET_FIELD(k,c) (nds32_field_table[k])[((c) & 0xff)] 51 1.1 christos /* Get the char in this lexical element. */ 52 1.1 christos #define LEX_CHAR(c) ((c) & 0xff) 53 1.1 christos 54 1.1 christos #define USRIDX(group, usr) ((group) | ((usr) << 5)) 55 1.1 christos #define SRIDX(major, minor, ext) \ 56 1.1 christos (((major) << 7) | ((minor) << 3) | (ext)) 57 1.1 christos 58 1.1 christos static int parse_re (struct nds32_asm_desc *, struct nds32_asm_insn *, 59 1.1 christos char **, int64_t *); 60 1.1 christos static int parse_re2 (struct nds32_asm_desc *, struct nds32_asm_insn *, 61 1.1 christos char **, int64_t *); 62 1.1 christos static int parse_fe5 (struct nds32_asm_desc *, struct nds32_asm_insn *, 63 1.1 christos char **, int64_t *); 64 1.1 christos static int parse_pi5 (struct nds32_asm_desc *, struct nds32_asm_insn *, 65 1.1 christos char **, int64_t *); 66 1.1.1.5 christos static int parse_aext_reg (struct nds32_asm_desc *, char **, 67 1.1.1.5 christos int *, int); 68 1.1 christos static int parse_a30b20 (struct nds32_asm_desc *, struct nds32_asm_insn *, 69 1.1 christos char **, int64_t *); 70 1.1 christos static int parse_rt21 (struct nds32_asm_desc *, struct nds32_asm_insn *, 71 1.1 christos char **, int64_t *); 72 1.1 christos static int parse_rte_start (struct nds32_asm_desc *, struct nds32_asm_insn *, 73 1.1 christos char **, int64_t *); 74 1.1 christos static int parse_rte_end (struct nds32_asm_desc *, struct nds32_asm_insn *, 75 1.1 christos char **, int64_t *); 76 1.1 christos static int parse_rte69_start (struct nds32_asm_desc *, struct nds32_asm_insn *, 77 1.1 christos char **, int64_t *); 78 1.1 christos static int parse_rte69_end (struct nds32_asm_desc *, struct nds32_asm_insn *, 79 1.1 christos char **, int64_t *); 80 1.1 christos static int parse_im5_ip (struct nds32_asm_desc *, struct nds32_asm_insn *, 81 1.1 christos char **, int64_t *); 82 1.1 christos static int parse_im5_mr (struct nds32_asm_desc *, struct nds32_asm_insn *, 83 1.1 christos char **, int64_t *); 84 1.1 christos static int parse_im6_ip (struct nds32_asm_desc *, struct nds32_asm_insn *, 85 1.1 christos char **, int64_t *); 86 1.1 christos static int parse_im6_iq (struct nds32_asm_desc *, struct nds32_asm_insn *, 87 1.1 christos char **, int64_t *); 88 1.1 christos static int parse_im6_mr (struct nds32_asm_desc *, struct nds32_asm_insn *, 89 1.1 christos char **, int64_t *); 90 1.1 christos static int parse_im6_ms (struct nds32_asm_desc *, struct nds32_asm_insn *, 91 1.1 christos char **, int64_t *); 92 1.1 christos 93 1.1 christos /* These are operand prefixes for input/output semantic. 94 1.1 christos 95 1.1 christos % input 96 1.1 christos = output 97 1.1 christos & both 98 1.1 christos {} optional operand 99 1.1 christos 100 1.1 christos Field table for operands and bit-fields. */ 101 1.1 christos 102 1.1.1.6 christos const field_t nds32_operand_fields[] = 103 1.1 christos { 104 1.1 christos {"rt", 20, 5, 0, HW_GPR, NULL}, 105 1.1 christos {"ra", 15, 5, 0, HW_GPR, NULL}, 106 1.1 christos {"rb", 10, 5, 0, HW_GPR, NULL}, 107 1.1 christos {"rd", 5, 5, 0, HW_GPR, NULL}, 108 1.1 christos {"re", 10, 5, 0, HW_GPR, parse_re}, /* lmw smw lmwa smwa. */ 109 1.1 christos {"fst", 20, 5, 0, HW_FSR, NULL}, 110 1.1 christos {"fsa", 15, 5, 0, HW_FSR, NULL}, 111 1.1 christos {"fsb", 10, 5, 0, HW_FSR, NULL}, 112 1.1 christos {"fdt", 20, 5, 0, HW_FDR, NULL}, 113 1.1 christos {"fda", 15, 5, 0, HW_FDR, NULL}, 114 1.1 christos {"fdb", 10, 5, 0, HW_FDR, NULL}, 115 1.1 christos {"cprt", 20, 5, 0, HW_CPR, NULL}, 116 1.1 christos {"cp", 13, 2, 0, HW_CP, NULL}, 117 1.1 christos {"sh", 5, 5, 0, HW_UINT, NULL}, /* sh in ALU instructions. */ 118 1.1 christos {"sv", 8, 2, 0, HW_UINT, NULL}, /* sv in MEM instructions. */ 119 1.1 christos {"dt", 21, 1, 0, HW_DXR, NULL}, 120 1.1 christos {"usr", 10, 10, 0, HW_USR, NULL}, /* User Special Registers. */ 121 1.1 christos {"sr", 10, 10, 0, HW_SR, NULL}, /* System Registers. */ 122 1.1 christos {"ridx", 10, 10, 0, HW_UINT, NULL}, /* Raw value for mfusr/mfsr. */ 123 1.1 christos {"enb4", 6, 4, 0, HW_UINT, NULL}, /* Enable4 for LSMW. */ 124 1.1 christos {"swid", 5, 15, 0, HW_UINT, NULL}, 125 1.1 christos {"stdby_st", 5, 2, 0, HW_STANDBY_ST, NULL}, 126 1.1 christos {"tlbop_st", 5, 5, 0, HW_TLBOP_ST, NULL}, 127 1.1 christos {"tlbop_stx", 5, 5, 0, HW_UINT, NULL}, 128 1.1 christos {"cctl_st0", 5, 5, 0, HW_CCTL_ST0, NULL}, 129 1.1 christos {"cctl_st1", 5, 5, 0, HW_CCTL_ST1, NULL}, 130 1.1 christos {"cctl_st2", 5, 5, 0, HW_CCTL_ST2, NULL}, 131 1.1 christos {"cctl_st3", 5, 5, 0, HW_CCTL_ST3, NULL}, 132 1.1 christos {"cctl_st4", 5, 5, 0, HW_CCTL_ST4, NULL}, 133 1.1 christos {"cctl_st5", 5, 5, 0, HW_CCTL_ST5, NULL}, 134 1.1 christos {"cctl_stx", 5, 5, 0, HW_UINT, NULL}, 135 1.1 christos {"cctl_lv", 10, 1, 0, HW_CCTL_LV, NULL}, 136 1.1 christos {"msync_st", 5, 3, 0, HW_MSYNC_ST, NULL}, 137 1.1 christos {"msync_stx", 5, 3, 0, HW_UINT, NULL}, 138 1.1 christos {"dpref_st", 20, 4, 0, HW_DPREF_ST, NULL}, 139 1.1 christos {"rt5", 5, 5, 0, HW_GPR, NULL}, 140 1.1 christos {"ra5", 0, 5, 0, HW_GPR, NULL}, 141 1.1 christos {"rt4", 5, 4, 0, HW_GPR, NULL}, 142 1.1 christos {"rt3", 6, 3, 0, HW_GPR, NULL}, 143 1.1 christos {"rt38", 8, 3, 0, HW_GPR, NULL}, /* rt3 used in 38 form. */ 144 1.1 christos {"ra3", 3, 3, 0, HW_GPR, NULL}, 145 1.1 christos {"rb3", 0, 3, 0, HW_GPR, NULL}, 146 1.1 christos {"rt5e", 4, 4, 1, HW_GPR, NULL}, /* for movd44. */ 147 1.1 christos {"ra5e", 0, 4, 1, HW_GPR, NULL}, /* for movd44. */ 148 1.1 christos {"re2", 5, 2, 0, HW_GPR, parse_re2}, /* re in push25/pop25. */ 149 1.1 christos {"fe5", 0, 5, 2, HW_UINT, parse_fe5}, /* imm5u in lwi45.fe. */ 150 1.1 christos {"pi5", 0, 5, 0, HW_UINT, parse_pi5}, /* imm5u in movpi45. */ 151 1.1 christos {"abdim", 2, 3, 0, HW_ABDIM, NULL}, /* Flags for LSMW. */ 152 1.1 christos {"abm", 2, 3, 0, HW_ABM, NULL}, /* Flags for LSMWZB. */ 153 1.1 christos {"dtiton", 8, 2, 0, HW_DTITON, NULL}, 154 1.1 christos {"dtitoff", 8, 2, 0, HW_DTITOFF, NULL}, 155 1.1 christos 156 1.1 christos {"i5s", 0, 5, 0, HW_INT, NULL}, 157 1.1 christos {"i10s", 0, 10, 0, HW_INT, NULL}, 158 1.1 christos {"i15s", 0, 15, 0, HW_INT, NULL}, 159 1.1 christos {"i19s", 0, 19, 0, HW_INT, NULL}, 160 1.1 christos {"i20s", 0, 20, 0, HW_INT, NULL}, 161 1.1 christos {"i8s1", 0, 8, 1, HW_INT, NULL}, 162 1.1 christos {"i11br3", 8, 11, 0, HW_INT, NULL}, 163 1.1 christos {"i14s1", 0, 14, 1, HW_INT, NULL}, 164 1.1 christos {"i15s1", 0, 15, 1, HW_INT, NULL}, 165 1.1 christos {"i16s1", 0, 16, 1, HW_INT, NULL}, 166 1.1.1.5 christos {"i16u5", 5, 16, 0, HW_UINT, NULL}, 167 1.1 christos {"i18s1", 0, 18, 1, HW_INT, NULL}, 168 1.1 christos {"i24s1", 0, 24, 1, HW_INT, NULL}, 169 1.1 christos {"i8s2", 0, 8, 2, HW_INT, NULL}, 170 1.1 christos {"i12s2", 0, 12, 2, HW_INT, NULL}, 171 1.1 christos {"i15s2", 0, 15, 2, HW_INT, NULL}, 172 1.1 christos {"i17s2", 0, 17, 2, HW_INT, NULL}, 173 1.1 christos {"i19s2", 0, 19, 2, HW_INT, NULL}, 174 1.1 christos {"i3u", 0, 3, 0, HW_UINT, NULL}, 175 1.1 christos {"i5u", 0, 5, 0, HW_UINT, NULL}, 176 1.1 christos {"ib5u", 10, 5, 0, HW_UINT, NULL}, /* imm5 field in ALU. */ 177 1.1 christos {"ib5s", 10, 5, 0, HW_INT, NULL}, /* imm5 field in ALU. */ 178 1.1 christos {"ia3u", 3, 3, 0, HW_UINT, NULL}, /* for bmski33, fexti33. */ 179 1.1 christos {"i8u", 0, 8, 0, HW_UINT, NULL}, 180 1.1 christos {"ib8u", 7, 8, 0, HW_UINT, NULL}, /* for ffbi. */ 181 1.1 christos {"i15u", 0, 15, 0, HW_UINT, NULL}, 182 1.1 christos {"i20u", 0, 20, 0, HW_UINT, NULL}, 183 1.1 christos {"i3u1", 0, 3, 1, HW_UINT, NULL}, 184 1.1 christos {"i9u1", 0, 9, 1, HW_UINT, NULL}, 185 1.1 christos {"i3u2", 0, 3, 2, HW_UINT, NULL}, 186 1.1 christos {"i6u2", 0, 6, 2, HW_UINT, NULL}, 187 1.1 christos {"i7u2", 0, 7, 2, HW_UINT, NULL}, 188 1.1 christos {"i5u3", 0, 5, 3, HW_UINT, NULL}, /* for pop25/pop25. */ 189 1.1 christos {"i15s3", 0, 15, 3, HW_INT, NULL}, /* for dprefi.d. */ 190 1.1.1.5 christos {"ib4u", 10, 4, 0, HW_UINT, NULL}, /* imm5 field in ALU. */ 191 1.1.1.5 christos {"ib2u", 10, 2, 0, HW_UINT, NULL}, /* imm5 field in ALU. */ 192 1.1 christos 193 1.1 christos {"a_rt", 15, 5, 0, HW_GPR, NULL}, /* for audio-extension. */ 194 1.1 christos {"a_ru", 10, 5, 0, HW_GPR, NULL}, /* for audio-extension. */ 195 1.1 christos {"a_dx", 9, 1, 0, HW_DXR, NULL}, /* for audio-extension. */ 196 1.1 christos {"a_a30", 16, 4, 0, HW_GPR, parse_a30b20}, /* for audio-extension. */ 197 1.1 christos {"a_b20", 12, 4, 0, HW_GPR, parse_a30b20}, /* for audio-extension. */ 198 1.1 christos {"a_rt21", 5, 7, 0, HW_GPR, parse_rt21}, /* for audio-extension. */ 199 1.1 christos {"a_rte", 5, 7, 0, HW_GPR, parse_rte_start}, /* for audio-extension. */ 200 1.1 christos {"a_rte1", 5, 7, 0, HW_GPR, parse_rte_end}, /* for audio-extension. */ 201 1.1 christos {"a_rte69", 6, 4, 0, HW_GPR, parse_rte69_start}, /* for audio-extension. */ 202 1.1 christos {"a_rte69_1", 6, 4, 0, HW_GPR, parse_rte69_end}, /* for audio-extension. */ 203 1.1 christos {"dhy", 5, 2, 0, HW_AEXT_ACC, NULL}, /* for audio-extension. */ 204 1.1 christos {"dxh", 15, 2, 0, HW_AEXT_ACC, NULL}, /* for audio-extension. */ 205 1.1 christos {"aridx", 0, 5, 0, HW_AEXT_ARIDX, NULL}, /* for audio-extension. */ 206 1.1 christos {"aridx2", 0, 5, 0, HW_AEXT_ARIDX2, NULL}, /* for audio-extension. */ 207 1.1 christos {"aridxi", 16, 4, 0, HW_AEXT_ARIDXI, NULL}, /* for audio-extension. */ 208 1.1.1.5 christos {"aridxi_mx", 16, 4, 0, HW_AEXT_ARIDXI_MX, NULL}, /* for audio-extension. */ 209 1.1.1.5 christos {"imm16s", 0, 16, 0, HW_INT, NULL}, /* for audio-extension. */ 210 1.1.1.5 christos {"imm16u", 0, 16, 0, HW_UINT, NULL}, /* for audio-extension. */ 211 1.1 christos {"im5_i", 0, 5, 0, HW_AEXT_IM_I, parse_im5_ip}, /* for audio-extension. */ 212 1.1 christos {"im5_m", 0, 5, 0, HW_AEXT_IM_M, parse_im5_mr}, /* for audio-extension. */ 213 1.1 christos {"im6_ip", 0, 2, 0, HW_AEXT_IM_I, parse_im6_ip}, /* for audio-extension. */ 214 1.1 christos {"im6_iq", 0, 2, 0, HW_AEXT_IM_I, parse_im6_iq}, /* for audio-extension. */ 215 1.1 christos {"im6_mr", 2, 2, 0, HW_AEXT_IM_M, parse_im6_mr}, /* for audio-extension. */ 216 1.1 christos {"im6_ms", 4, 2, 0, HW_AEXT_IM_M, parse_im6_ms}, /* for audio-extension. */ 217 1.1 christos {"cp45", 4, 2, 0, HW_CP, NULL}, /* for cop-extension. */ 218 1.1 christos {"i12u", 8, 12, 0, HW_UINT, NULL}, /* for cop-extension. */ 219 1.1 christos {"cpi19", 6, 19, 0, HW_UINT, NULL}, /* for cop-extension. */ 220 1.1 christos {NULL, 0, 0, 0, 0, NULL} 221 1.1 christos }; 222 1.1 christos 223 1.1.1.3 christos #define DEF_REG(r) (N32_BIT (r)) 224 1.1.1.3 christos #define USE_REG(r) (N32_BIT (r)) 225 1.1 christos #define RT(r) (r << 20) 226 1.1 christos #define RA(r) (r << 15) 227 1.1 christos #define RB(r) (r << 10) 228 1.1 christos #define RA5(r) (r) 229 1.1 christos 230 1.1 christos struct nds32_opcode nds32_opcodes[] = 231 1.1 christos { 232 1.1 christos /* opc6_encoding table OPC_6. */ 233 1.1 christos {"lbi", "=rt,[%ra{+%i15s}]", OP6 (LBI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 234 1.1 christos {"lhi", "=rt,[%ra{+%i15s1}]", OP6 (LHI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 235 1.1 christos {"lwi", "=rt,[%ra{+%i15s2}]", OP6 (LWI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 236 1.1 christos {"lbi.bi", "=rt,[%ra],%i15s", OP6 (LBI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 237 1.1 christos {"lhi.bi", "=rt,[%ra],%i15s1", OP6 (LHI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 238 1.1 christos {"lwi.bi", "=rt,[%ra],%i15s2", OP6 (LWI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 239 1.1 christos {"sbi", "%rt,[%ra{+%i15s}]", OP6 (SBI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 240 1.1 christos {"shi", "%rt,[%ra{+%i15s1}]", OP6 (SHI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 241 1.1 christos {"swi", "%rt,[%ra{+%i15s2}]", OP6 (SWI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 242 1.1 christos {"sbi.bi", "%rt,[%ra],%i15s", OP6 (SBI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 243 1.1 christos {"shi.bi", "%rt,[%ra],%i15s1", OP6 (SHI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 244 1.1 christos {"swi.bi", "%rt,[%ra],%i15s2", OP6 (SWI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 245 1.1 christos 246 1.1 christos {"lbsi", "=rt,[%ra{+%i15s}]", OP6 (LBSI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 247 1.1 christos {"lhsi", "=rt,[%ra{+%i15s1}]", OP6 (LHSI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 248 1.1 christos {"lbsi.bi", "=rt,[%ra],%i15s", OP6 (LBSI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 249 1.1 christos {"lhsi.bi", "=rt,[%ra],%i15s1", OP6 (LHSI_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 250 1.1 christos {"movi", "=rt,%i20s", OP6 (MOVI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 251 1.1 christos {"sethi", "=rt,%i20u", OP6 (SETHI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 252 1.1 christos {"addi", "=rt,%ra,%i15s", OP6 (ADDI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 253 1.1 christos {"subri", "=rt,%ra,%i15s", OP6 (SUBRI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 254 1.1 christos {"andi", "=rt,%ra,%i15u", OP6 (ANDI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 255 1.1 christos {"xori", "=rt,%ra,%i15u", OP6 (XORI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 256 1.1 christos {"ori", "=rt,%ra,%i15u", OP6 (ORI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 257 1.1 christos {"slti", "=rt,%ra,%i15s", OP6 (SLTI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 258 1.1 christos {"sltsi", "=rt,%ra,%i15s", OP6 (SLTSI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 259 1.1 christos {"bitci", "=rt,%ra,%i15u", OP6 (BITCI), 4, ATTR_V3, 0, NULL, 0, NULL}, 260 1.1 christos 261 1.1 christos /* seg-DPREFI. */ 262 1.1 christos {"dprefi.w", "%dpref_st,[%ra{+%i15s2}]", OP6 (DPREFI), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 263 1.1.1.3 christos {"dprefi.d", "%dpref_st,[%ra{+%i15s3}]", OP6 (DPREFI) | N32_BIT (24), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 264 1.1 christos /* seg-LBGP. */ 265 1.1 christos {"lbi.gp", "=rt,[+%i19s]", OP6 (LBGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 266 1.1.1.3 christos {"lbsi.gp", "=rt,[+%i19s]", OP6 (LBGP) | N32_BIT (19), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 267 1.1 christos /* seg-LWC/0. */ 268 1.1 christos {"cplwi", "%cp,=cprt,[%ra{+%i12s2}]", OP6 (LWC), 4, 0, 0, NULL, 0, NULL}, 269 1.1.1.3 christos {"cplwi.bi", "%cp,=cprt,[%ra],%i12s2", OP6 (LWC) | N32_BIT (12), 4, 0, 0, NULL, 0, NULL}, 270 1.1 christos /* seg-SWC/0. */ 271 1.1 christos {"cpswi", "%cp,=cprt,[%ra{+%i12s2}]", OP6 (SWC), 4, 0, 0, NULL, 0, NULL}, 272 1.1.1.3 christos {"cpswi.bi", "%cp,=cprt,[%ra],%i12s2", OP6 (SWC) | N32_BIT (12), 4, 0, 0, NULL, 0, NULL}, 273 1.1 christos /* seg-LDC/0. */ 274 1.1 christos {"cpldi", "%cp,%cprt,[%ra{+%i12s2}]", OP6 (LDC), 4, 0, 0, NULL, 0, NULL}, 275 1.1.1.3 christos {"cpldi.bi", "%cp,%cprt,[%ra],%i12s2", OP6 (LDC) | N32_BIT (12), 4, 0, 0, NULL, 0, NULL}, 276 1.1 christos /* seg-SDC/0. */ 277 1.1 christos {"cpsdi", "%cp,%cprt,[%ra{+%i12s2}]", OP6 (SDC), 4, 0, 0, NULL, 0, NULL}, 278 1.1.1.3 christos {"cpsdi.bi", "%cp,%cprt,[%ra],%i12s2", OP6 (SDC) | N32_BIT (12), 4, 0, 0, NULL, 0, NULL}, 279 1.1 christos /* seg-LSMW. */ 280 1.1 christos {"lmw", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMW), 4, ATTR_ALL, 0, NULL, 0, NULL}, 281 1.1 christos {"lmwa", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMWA), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 282 1.1 christos {"lmwzb", "%abm %rt,[%ra],%re{,%enb4}", LSMW (LSMWZB), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 283 1.1.1.3 christos {"smw", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMW) | N32_BIT (5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 284 1.1.1.3 christos {"smwa", "%abdim %rt,[%ra],%re{,%enb4}", LSMW (LSMWA) | N32_BIT (5), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 285 1.1.1.3 christos {"smwzb", "%abm %rt,[%ra],%re{,%enb4}", LSMW (LSMWZB) | N32_BIT (5), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 286 1.1 christos /* seg-HWGP. */ 287 1.1 christos {"lhi.gp", "=rt,[+%i18s1]", OP6 (HWGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 288 1.1 christos {"lhsi.gp", "=rt,[+%i18s1]", OP6 (HWGP) | (2 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 289 1.1 christos {"shi.gp", "%rt,[+%i18s1]", OP6 (HWGP) | (4 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 290 1.1 christos {"lwi.gp", "=rt,[+%i17s2]", OP6 (HWGP) | (6 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 291 1.1 christos {"swi.gp", "%rt,[+%i17s2]", OP6 (HWGP) | (7 << 17), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 292 1.1 christos 293 1.1 christos /* seg-SBGP. */ 294 1.1 christos {"sbi.gp", "%rt,[+%i19s]", OP6 (SBGP), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 295 1.1.1.3 christos {"addi.gp", "=rt,%i19s", OP6 (SBGP) | N32_BIT (19), 4, ATTR (GPREL) | ATTR_V2UP, USE_REG (29), NULL, 0, NULL}, 296 1.1 christos /* seg-JI. */ 297 1.1 christos {"j", "%i24s1", OP6 (JI), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 298 1.1.1.3 christos {"jal", "%i24s1", OP6 (JI) | N32_BIT (24), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 299 1.1 christos /* seg-JREG. */ 300 1.1 christos {"jr", "%rb", JREG (JR), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 301 1.1 christos {"jral", "%rt,%rb", JREG (JRAL), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 302 1.1 christos {"jrnez", "%rb", JREG (JRNEZ), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL}, 303 1.1 christos {"jralnez", "%rt,%rb", JREG (JRALNEZ), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL}, 304 1.1 christos {"ret", "%rb", JREG (JR) | JREG_RET, 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 305 1.1 christos {"jral", "%rb", JREG (JRAL) | RT (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 306 1.1 christos {"jralnez", "%rb", JREG (JRALNEZ) | RT (30), 4, ATTR (BRANCH) | ATTR_V3, 0, NULL, 0, NULL}, 307 1.1 christos {"ret", "", JREG (JR) | JREG_RET | RB (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 308 1.1 christos {"jr", "%dtitoff %rb", JREG (JR), 4, ATTR (BRANCH) | ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 309 1.1 christos {"ret", "%dtitoff %rb", JREG (JR) | JREG_RET, 4, ATTR (BRANCH) | ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 310 1.1 christos {"jral", "%dtiton %rt,%rb", JREG (JRAL), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 311 1.1 christos {"jral", "%dtiton %rb", JREG (JRAL) | RT (30), 4, ATTR (BRANCH) | ATTR_ALL, 0, NULL, 0, NULL}, 312 1.1 christos /* seg-BR1. */ 313 1.1 christos {"beq", "%rt,%ra,%i14s1", OP6 (BR1), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 314 1.1.1.3 christos {"bne", "%rt,%ra,%i14s1", OP6 (BR1) | N32_BIT (14), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 315 1.1 christos /* seg-BR2. */ 316 1.1 christos {"beqz", "%rt,%i16s1", BR2 (BEQZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 317 1.1 christos {"bnez", "%rt,%i16s1", BR2 (BNEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 318 1.1 christos {"bgez", "%rt,%i16s1", BR2 (BGEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 319 1.1 christos {"bltz", "%rt,%i16s1", BR2 (BLTZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 320 1.1 christos {"bgtz", "%rt,%i16s1", BR2 (BGTZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 321 1.1 christos {"blez", "%rt,%i16s1", BR2 (BLEZ), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 322 1.1 christos {"bgezal", "%rt,%i16s1", BR2 (BGEZAL), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 323 1.1 christos {"bltzal", "%rt,%i16s1", BR2 (BLTZAL), 4, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 324 1.1 christos /* seg-BR3. */ 325 1.1 christos {"beqc", "%rt,%i11br3,%i8s1", OP6 (BR3), 4, ATTR_PCREL | ATTR_V3MUP, 0, NULL, 0, NULL}, 326 1.1.1.3 christos {"bnec", "%rt,%i11br3,%i8s1", OP6 (BR3) | N32_BIT (19), 4, ATTR_PCREL | ATTR_V3MUP, 0, NULL, 0, NULL}, 327 1.1 christos /* seg-SIMD. */ 328 1.1 christos {"pbsad", "%rt,%ra,%rb", SIMD (PBSAD), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL}, 329 1.1 christos {"pbsada", "%rt,%ra,%rb", SIMD (PBSADA), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL}, 330 1.1 christos /* seg-ALU1. */ 331 1.1 christos {"add", "=rt,%ra,%rb", ALU1 (ADD), 4, ATTR_ALL, 0, NULL, 0, NULL}, 332 1.1 christos {"sub", "=rt,%ra,%rb", ALU1 (SUB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 333 1.1 christos {"and", "=rt,%ra,%rb", ALU1 (AND), 4, ATTR_ALL, 0, NULL, 0, NULL}, 334 1.1 christos {"xor", "=rt,%ra,%rb", ALU1 (XOR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 335 1.1 christos {"or", "=rt,%ra,%rb", ALU1 (OR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 336 1.1 christos {"nor", "=rt,%ra,%rb", ALU1 (NOR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 337 1.1 christos {"slt", "=rt,%ra,%rb", ALU1 (SLT), 4, ATTR_ALL, 0, NULL, 0, NULL}, 338 1.1 christos {"slts", "=rt,%ra,%rb", ALU1 (SLTS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 339 1.1 christos {"slli", "=rt,%ra,%ib5u", ALU1 (SLLI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 340 1.1 christos {"srli", "=rt,%ra,%ib5u", ALU1 (SRLI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 341 1.1 christos {"srai", "=rt,%ra,%ib5u", ALU1 (SRAI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 342 1.1 christos {"rotri", "=rt,%ra,%ib5u", ALU1 (ROTRI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 343 1.1 christos {"sll", "=rt,%ra,%rb", ALU1 (SLL), 4, ATTR_ALL, 0, NULL, 0, NULL}, 344 1.1 christos {"srl", "=rt,%ra,%rb", ALU1 (SRL), 4, ATTR_ALL, 0, NULL, 0, NULL}, 345 1.1 christos {"sra", "=rt,%ra,%rb", ALU1 (SRA), 4, ATTR_ALL, 0, NULL, 0, NULL}, 346 1.1 christos {"rotr", "=rt,%ra,%rb", ALU1 (ROTR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 347 1.1 christos {"seb", "=rt,%ra", ALU1 (SEB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 348 1.1 christos {"seh", "=rt,%ra", ALU1 (SEH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 349 1.1 christos {"bitc", "=rt,%ra,%rb", ALU1 (BITC), 4, ATTR_V3, 0, NULL, 0, NULL}, 350 1.1 christos {"zeh", "=rt,%ra", ALU1 (ZEH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 351 1.1 christos {"wsbh", "=rt,%ra", ALU1 (WSBH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 352 1.1 christos {"divsr", "=rt,=rd,%ra,%rb", ALU1 (DIVSR), 4, ATTR (DIV) | ATTR_V2UP, 0, NULL, 0, NULL}, 353 1.1 christos {"divr", "=rt,=rd,%ra,%rb", ALU1 (DIVR), 4, ATTR (DIV) | ATTR_V2UP, 0, NULL, 0, NULL}, 354 1.1 christos {"sva", "=rt,%ra,%rb", ALU1 (SVA), 4, ATTR_ALL, 0, NULL, 0, NULL}, 355 1.1 christos {"svs", "=rt,%ra,%rb", ALU1 (SVS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 356 1.1 christos {"cmovz", "=rt,%ra,%rb", ALU1 (CMOVZ), 4, ATTR_ALL, 0, NULL, 0, NULL}, 357 1.1 christos {"cmovn", "=rt,%ra,%rb", ALU1 (CMOVN), 4, ATTR_ALL, 0, NULL, 0, NULL}, 358 1.1 christos {"or_srli", "=rt,%ra,%rb,%sh", ALU1 (OR_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL}, 359 1.1 christos {"add_srli", "=rt,%ra,%rb,%sh", ALU1 (ADD_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL}, 360 1.1 christos {"sub_srli", "=rt,%ra,%rb,%sh", ALU1 (SUB_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL}, 361 1.1 christos {"and_srli", "=rt,%ra,%rb,%sh", ALU1 (AND_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL}, 362 1.1 christos {"xor_srli", "=rt,%ra,%rb,%sh", ALU1 (XOR_SRLI), 4, ATTR_V3, 0, NULL, 0, NULL}, 363 1.1 christos {"add_slli", "=rt,%ra,%rb,%sh", ALU1 (ADD), 4, ATTR_V3, 0, NULL, 0, NULL}, 364 1.1 christos {"sub_slli", "=rt,%ra,%rb,%sh", ALU1 (SUB), 4, ATTR_V3, 0, NULL, 0, NULL}, 365 1.1 christos {"and_slli", "=rt,%ra,%rb,%sh", ALU1 (AND), 4, ATTR_V3, 0, NULL, 0, NULL}, 366 1.1 christos {"xor_slli", "=rt,%ra,%rb,%sh", ALU1 (XOR), 4, ATTR_V3, 0, NULL, 0, NULL}, 367 1.1 christos {"or_slli", "=rt,%ra,%rb,%sh", ALU1 (OR), 4, ATTR_V3, 0, NULL, 0, NULL}, 368 1.1 christos {"nop", "", ALU1 (SRLI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 369 1.1 christos /* seg-ALU2. */ 370 1.1 christos {"max", "=rt,%ra,%rb", ALU2 (MAX), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 371 1.1 christos {"min", "=rt,%ra,%rb", ALU2 (MIN), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 372 1.1 christos {"ave", "=rt,%ra,%rb", ALU2 (AVE), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 373 1.1 christos {"abs", "=rt,%ra", ALU2 (ABS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 374 1.1 christos {"clips", "=rt,%ra,%ib5u", ALU2 (CLIPS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 375 1.1 christos {"clip", "=rt,%ra,%ib5u", ALU2 (CLIP), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 376 1.1 christos {"clo", "=rt,%ra", ALU2 (CLO), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 377 1.1 christos {"clz", "=rt,%ra", ALU2 (CLZ), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 378 1.1 christos {"bset", "=rt,%ra,%ib5u", ALU2 (BSET), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 379 1.1 christos {"bclr", "=rt,%ra,%ib5u", ALU2 (BCLR), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 380 1.1 christos {"btgl", "=rt,%ra,%ib5u", ALU2 (BTGL), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 381 1.1 christos {"btst", "=rt,%ra,%ib5u", ALU2 (BTST), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 382 1.1 christos {"bse", "=rt,%ra,=rb", ALU2 (BSE), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL}, 383 1.1 christos {"bsp", "=rt,%ra,=rb", ALU2 (BSP), 4, ATTR (PERF2_EXT), 0, NULL, 0, NULL}, 384 1.1 christos {"ffzmism", "=rt,%ra,%rb", ALU2 (FFZMISM), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 385 1.1.1.5 christos {"mfusr", "=rt,%usr", ALU2 (MFUSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 386 1.1.1.5 christos {"mtusr", "%rt,%usr", ALU2 (MTUSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 387 1.1.1.5 christos {"mfusr", "=rt,%ridx", ALU2 (MFUSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 388 1.1.1.5 christos {"mtusr", "%rt,%ridx", ALU2 (MTUSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 389 1.1 christos {"mul", "=rt,%ra,%rb", ALU2 (MUL), 4, ATTR_ALL, 0, NULL, 0, NULL}, 390 1.1 christos {"madds64", "=dt,%ra,%rb", ALU2 (MADDS64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL}, 391 1.1 christos {"madd64", "=dt,%ra,%rb", ALU2 (MADD64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL}, 392 1.1 christos {"msubs64", "=dt,%ra,%rb", ALU2 (MSUBS64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL}, 393 1.1 christos {"msub64", "=dt,%ra,%rb", ALU2 (MSUB64), 4, ATTR (MAC) | ATTR_ALL, 0, NULL, 0, NULL}, 394 1.1 christos {"divs", "=dt,%ra,%rb", ALU2 (DIVS), 4, ATTR (DIV) | ATTR (DXREG), 0, NULL, 0, NULL}, 395 1.1 christos {"div", "=dt,%ra,%rb", ALU2 (DIV), 4, ATTR (DIV) | ATTR (DXREG), 0, NULL, 0, NULL}, 396 1.1 christos {"mult32", "=dt,%ra,%rb", ALU2 (MULT32), 4, ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL}, 397 1.1 christos 398 1.1 christos /* seg-ALU2_FFBI. */ 399 1.1 christos {"ffb", "=rt,%ra,%rb", ALU2 (FFB), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 400 1.1.1.3 christos {"ffbi", "=rt,%ra,%ib8u", ALU2 (FFBI) | N32_BIT (6), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 401 1.1 christos /* seg-ALU2_FLMISM. */ 402 1.1 christos {"ffmism", "=rt,%ra,%rb", ALU2 (FFMISM), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 403 1.1.1.3 christos {"flmism", "=rt,%ra,%rb", ALU2 (FLMISM) | N32_BIT (6), 4, ATTR (STR_EXT), 0, NULL, 0, NULL}, 404 1.1 christos /* seg-ALU2_MULSR64. */ 405 1.1 christos {"mults64", "=dt,%ra,%rb", ALU2 (MULTS64), 4, ATTR_ALL, 0, NULL, 0, NULL}, 406 1.1.1.3 christos {"mulsr64", "=rt,%ra,%rb", ALU2 (MULSR64)| N32_BIT (6), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 407 1.1 christos /* seg-ALU2_MULR64. */ 408 1.1 christos {"mult64", "=dt,%ra,%rb", ALU2 (MULT64), 4, ATTR_ALL, 0, NULL, 0, NULL}, 409 1.1.1.3 christos {"mulr64", "=rt,%ra,%rb", ALU2 (MULR64) | N32_BIT (6), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 410 1.1 christos /* seg-ALU2_MADDR32. */ 411 1.1 christos {"madd32", "=dt,%ra,%rb", ALU2 (MADD32), 4, ATTR (MAC) | ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL}, 412 1.1.1.3 christos {"maddr32", "=rt,%ra,%rb", ALU2 (MADDR32) | N32_BIT (6), 4, ATTR (MAC) | ATTR_V2UP, 0, NULL, 0, NULL}, 413 1.1 christos /* seg-ALU2_MSUBR32. */ 414 1.1 christos {"msub32", "=dt,%ra,%rb", ALU2 (MSUB32), 4, ATTR (MAC) | ATTR (DXREG) | ATTR_ALL, 0, NULL, 0, NULL}, 415 1.1.1.3 christos {"msubr32", "=rt,%ra,%rb", ALU2 (MSUBR32) | N32_BIT (6), 4, ATTR (MAC) | ATTR_V2UP, 0, NULL, 0, NULL}, 416 1.1 christos 417 1.1 christos /* seg-MISC. */ 418 1.1 christos {"standby", "%stdby_st", MISC (STANDBY), 4, ATTR_ALL, 0, NULL, 0, NULL}, 419 1.1 christos {"mfsr", "=rt,%sr", MISC (MFSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 420 1.1 christos {"iret", "", MISC (IRET), 4, ATTR_ALL, 0, NULL, 0, NULL}, 421 1.1 christos {"trap", "%swid", MISC (TRAP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 422 1.1 christos {"teqz", "%rt{,%swid}", MISC (TEQZ), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 423 1.1 christos {"tnez", "%rt{,%swid}", MISC (TNEZ), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 424 1.1 christos {"dsb", "", MISC (DSB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 425 1.1 christos {"isb", "", MISC (ISB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 426 1.1 christos {"break", "%swid", MISC (BREAK), 4, ATTR_ALL, 0, NULL, 0, NULL}, 427 1.1 christos {"syscall", "%swid", MISC (SYSCALL), 4, ATTR_ALL, 0, NULL, 0, NULL}, 428 1.1 christos {"msync", "%msync_st", MISC (MSYNC), 4, ATTR_ALL, 0, NULL, 0, NULL}, 429 1.1 christos {"isync", "%rt", MISC (ISYNC), 4, ATTR_ALL, 0, NULL, 0, NULL}, 430 1.1 christos /* seg-MISC_MTSR. */ 431 1.1 christos {"mtsr", "%rt,%sr", MISC (MTSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 432 1.1 christos /* seg-MISC_SETEND. */ 433 1.1.1.3 christos {"setend.l", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | N32_BIT (5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 434 1.1.1.3 christos {"setend.b", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | N32_BIT (5) | N32_BIT (20), 4, ATTR_ALL, 0, NULL, 0, NULL}, 435 1.1 christos /* seg-MISC_SETGIE. */ 436 1.1.1.3 christos {"setgie.d", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | N32_BIT (6), 4, ATTR_ALL, 0, NULL, 0, NULL}, 437 1.1.1.3 christos {"setgie.e", "", MISC (MTSR) | (SRIDX (1, 0, 0) << 10) | N32_BIT (6) | N32_BIT (20), 4, ATTR_ALL, 0, NULL, 0, NULL}, 438 1.1 christos {"mfsr", "=rt,%ridx", MISC (MFSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 439 1.1 christos {"mtsr", "%rt,%ridx", MISC (MTSR), 4, ATTR_ALL, 0, NULL, 0, NULL}, 440 1.1 christos {"trap", "", MISC (TRAP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 441 1.1 christos {"break", "", MISC (BREAK), 4, ATTR_ALL, 0, NULL, 0, NULL}, 442 1.1 christos {"msync", "", MISC (MSYNC), 4, ATTR_ALL, 0, NULL, 0, NULL}, 443 1.1 christos /* seg-MISC_TLBOP. */ 444 1.1 christos {"tlbop", "%ra,%tlbop_st", MISC (TLBOP), 4, ATTR_ALL, 0, NULL, 0, NULL}, 445 1.1 christos {"tlbop", "%ra,%tlbop_stx", MISC (TLBOP), 4, ATTR_ALL, 0, NULL, 0, NULL}, 446 1.1 christos {"tlbop", "%rt,%ra,pb", MISC (TLBOP) | (5 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 447 1.1.1.5 christos {"tlbop", "%rt,%ra,probe", MISC (TLBOP) | (5 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 448 1.1 christos {"tlbop", "flua", MISC (TLBOP) | (7 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 449 1.1 christos {"tlbop", "flushall", MISC (TLBOP) | (7 << 5), 4, ATTR_ALL, 0, NULL, 0, NULL}, 450 1.1 christos 451 1.1 christos /* seg-MEM. */ 452 1.1 christos {"lb", "=rt,[%ra+(%rb<<%sv)]", MEM (LB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 453 1.1 christos {"lb", "=rt,[%ra+%rb{<<%sv}]", MEM (LB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 454 1.1 christos {"lh", "=rt,[%ra+(%rb<<%sv)]", MEM (LH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 455 1.1 christos {"lh", "=rt,[%ra+%rb{<<%sv}]", MEM (LH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 456 1.1 christos {"lw", "=rt,[%ra+(%rb<<%sv)]", MEM (LW), 4, ATTR_ALL, 0, NULL, 0, NULL}, 457 1.1 christos {"lw", "=rt,[%ra+%rb{<<%sv}]", MEM (LW), 4, ATTR_ALL, 0, NULL, 0, NULL}, 458 1.1 christos {"ld", "=rt,[%ra+(%rb<<%sv)]", MEM (LD), 4, ATTR_ALL, 0, NULL, 0, NULL}, 459 1.1 christos {"lb.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 460 1.1 christos {"lb.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 461 1.1 christos {"lb.p", "=rt,[%ra],%rb{<<%sv}", MEM (LB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 462 1.1 christos {"lh.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 463 1.1 christos {"lh.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 464 1.1 christos {"lh.p", "=rt,[%ra],%rb{<<%sv}", MEM (LH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 465 1.1 christos {"lw.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 466 1.1 christos {"lw.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 467 1.1 christos {"lw.p", "=rt,[%ra],%rb{<<%sv}", MEM (LW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 468 1.1 christos {"ld.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LD_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 469 1.1 christos {"sb", "=rt,[%ra+(%rb<<%sv)]", MEM (SB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 470 1.1 christos {"sb", "%rt,[%ra+%rb{<<%sv}]", MEM (SB), 4, ATTR_ALL, 0, NULL, 0, NULL}, 471 1.1 christos {"sh", "=rt,[%ra+(%rb<<%sv)]", MEM (SH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 472 1.1 christos {"sh", "%rt,[%ra+%rb{<<%sv}]", MEM (SH), 4, ATTR_ALL, 0, NULL, 0, NULL}, 473 1.1 christos {"sw", "=rt,[%ra+(%rb<<%sv)]", MEM (SW), 4, ATTR_ALL, 0, NULL, 0, NULL}, 474 1.1 christos {"sw", "%rt,[%ra+%rb{<<%sv}]", MEM (SW), 4, ATTR_ALL, 0, NULL, 0, NULL}, 475 1.1 christos {"sd", "=rt,[%ra+(%rb<<%sv)]", MEM (SD), 4, ATTR_ALL, 0, NULL, 0, NULL}, 476 1.1 christos {"sb.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 477 1.1 christos {"sb.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 478 1.1 christos {"sb.p", "%rt,[%ra],%rb{<<%sv}", MEM (SB_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 479 1.1 christos {"sh.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 480 1.1 christos {"sh.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 481 1.1 christos {"sh.p", "%rt,[%ra],%rb{<<%sv}", MEM (SH_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 482 1.1 christos {"sw.bi", "%rt,[%ra],%rb{<<%sv}", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 483 1.1 christos {"sw.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 484 1.1 christos {"sw.p", "%rt,[%ra],%rb{<<%sv}", MEM (SW_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 485 1.1 christos {"sd.bi", "=rt,[%ra],(%rb<<%sv)", MEM (SD_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 486 1.1 christos 487 1.1 christos {"lbs", "=rt,[%ra+(%rb<<%sv)]", MEM (LBS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 488 1.1 christos {"lbs", "=rt,[%ra+%rb{<<%sv}]", MEM (LBS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 489 1.1 christos {"lhs", "=rt,[%ra+(%rb<<%sv)]", MEM (LHS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 490 1.1 christos {"lhs", "=rt,[%ra+%rb{<<%sv}]", MEM (LHS), 4, ATTR_ALL, 0, NULL, 0, NULL}, 491 1.1 christos {"lbs.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LBS_BI),4, ATTR_ALL, 0, NULL, 0, NULL}, 492 1.1 christos {"lbs.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LBS_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 493 1.1 christos {"lbs.p", "=rt,[%ra],%rb{<<%sv}", MEM (LBS_BI),4, ATTR_ALL, 0, NULL, 0, NULL}, 494 1.1 christos {"lhs.bi", "=rt,[%ra],%rb{<<%sv}", MEM (LHS_BI),4, ATTR_ALL, 0, NULL, 0, NULL}, 495 1.1 christos {"lhs.bi", "=rt,[%ra],(%rb<<%sv)", MEM (LHS_BI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 496 1.1 christos {"lhs.p", "=rt,[%ra],%rb{<<%sv}", MEM (LHS_BI),4, ATTR_ALL, 0, NULL, 0, NULL}, 497 1.1 christos {"llw", "=rt,[%ra+(%rb<<%sv)]", MEM (LLW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 498 1.1 christos {"llw", "=rt,[%ra+%rb{<<%sv}]", MEM (LLW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 499 1.1 christos {"scw", "%rt,[%ra+(%rb<<%sv)]", MEM (SCW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 500 1.1 christos {"scw", "%rt,[%ra+%rb{<<%sv}]", MEM (SCW), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 501 1.1 christos 502 1.1 christos {"lbup", "=rt,[%ra+(%rb<<%sv)]", MEM (LBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 503 1.1 christos {"lbup", "=rt,[%ra+%rb{<<%sv}]", MEM (LBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 504 1.1 christos {"lwup", "=rt,[%ra+(%rb<<%sv)]", MEM (LWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 505 1.1 christos {"lwup", "=rt,[%ra+%rb{<<%sv}]", MEM (LWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 506 1.1 christos {"sbup", "%rt,[%ra+(%rb<<%sv)]", MEM (SBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 507 1.1 christos {"sbup", "%rt,[%ra+%rb{<<%sv}]", MEM (SBUP), 4, ATTR_V3MEX_V2, 0, NULL, 0, NULL}, 508 1.1 christos {"swup", "%rt,[%ra+(%rb<<%sv)]", MEM (SWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 509 1.1 christos {"swup", "%rt,[%ra+%rb{<<%sv}]", MEM (SWUP), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 510 1.1 christos 511 1.1 christos {"dpref", "%dpref_st,[%ra]", OP6 (DPREFI), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 512 1.1 christos {"dpref", "%dpref_st,[%ra+(%rb<<%sv)]", MEM (DPREF), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 513 1.1 christos {"dpref", "%dpref_st,[%ra+%rb{<<%sv}]", MEM (DPREF), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 514 1.1 christos 515 1.1 christos /* For missing-operand-load/store instructions. */ 516 1.1 christos {"lb", "=rt,[%ra]", OP6 (LBI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 517 1.1 christos {"lh", "=rt,[%ra]", OP6 (LHI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 518 1.1 christos {"lw", "=rt,[%ra]", OP6 (LWI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 519 1.1 christos {"lbs", "=rt,[%ra]", OP6 (LBSI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 520 1.1 christos {"lhs", "=rt,[%ra]", OP6 (LHSI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 521 1.1 christos {"sb", "%rt,[%ra]", OP6 (SBI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 522 1.1 christos {"sh", "%rt,[%ra]", OP6 (SHI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 523 1.1 christos {"sw", "%rt,[%ra]", OP6 (SWI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 524 1.1 christos 525 1.1 christos /* seg-LWC0. */ 526 1.1 christos {"flsi", "=fst,[%ra{+%i12s2}]", OP6 (LWC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 527 1.1 christos {"flsi.bi", "=fst,[%ra],%i12s2", FPU_RA_IMMBI (LWC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 528 1.1 christos /* seg-SWC0. */ 529 1.1 christos {"fssi", "=fst,[%ra{+%i12s2}]", OP6 (SWC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 530 1.1 christos {"fssi.bi", "=fst,[%ra],%i12s2", FPU_RA_IMMBI (SWC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 531 1.1 christos /* seg-LDC0. */ 532 1.1 christos {"fldi", "=fdt,[%ra{+%i12s2}]", OP6 (LDC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 533 1.1 christos {"fldi.bi", "=fdt,[%ra],%i12s2", FPU_RA_IMMBI (LDC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 534 1.1 christos /* seg-SDC0. */ 535 1.1 christos {"fsdi", "=fdt,[%ra{+%i12s2}]", OP6 (SDC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 536 1.1 christos {"fsdi.bi", "=fdt,[%ra],%i12s2", FPU_RA_IMMBI (SDC), 4, ATTR (FPU), 0, NULL, 0, NULL}, 537 1.1 christos 538 1.1 christos /* seg-FPU_FS1. */ 539 1.1 christos {"fadds", "=fst,%fsa,%fsb", FS1 (FADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 540 1.1 christos {"fsubs", "=fst,%fsa,%fsb", FS1 (FSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 541 1.1 christos {"fcpynss", "=fst,%fsa,%fsb", FS1 (FCPYNSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 542 1.1 christos {"fcpyss", "=fst,%fsa,%fsb", FS1 (FCPYSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 543 1.1 christos {"fmadds", "=fst,%fsa,%fsb", FS1 (FMADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 544 1.1 christos {"fmsubs", "=fst,%fsa,%fsb", FS1 (FMSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 545 1.1 christos {"fcmovns", "=fst,%fsa,%fsb", FS1 (FCMOVNS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 546 1.1 christos {"fcmovzs", "=fst,%fsa,%fsb", FS1 (FCMOVZS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 547 1.1 christos {"fnmadds", "=fst,%fsa,%fsb", FS1 (FNMADDS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 548 1.1 christos {"fnmsubs", "=fst,%fsa,%fsb", FS1 (FNMSUBS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 549 1.1 christos {"fmuls", "=fst,%fsa,%fsb", FS1 (FMULS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 550 1.1 christos {"fdivs", "=fst,%fsa,%fsb", FS1 (FDIVS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 551 1.1 christos 552 1.1 christos /* seg-FPU_FS1_F2OP. */ 553 1.1 christos {"fs2d", "=fdt,%fsa", FS1_F2OP (FS2D), 4, ATTR (FPU) | ATTR (FPU_SP_EXT) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 554 1.1 christos {"fsqrts", "=fst,%fsa", FS1_F2OP (FSQRTS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 555 1.1 christos {"fabss", "=fst,%fsa", FS1_F2OP (FABSS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 556 1.1 christos {"fui2s", "=fst,%fsa", FS1_F2OP (FUI2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 557 1.1 christos {"fsi2s", "=fst,%fsa", FS1_F2OP (FSI2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 558 1.1 christos {"fs2ui", "=fst,%fsa", FS1_F2OP (FS2UI), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 559 1.1 christos {"fs2ui.z", "=fst,%fsa", FS1_F2OP (FS2UI_Z), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 560 1.1 christos {"fs2si", "=fst,%fsa", FS1_F2OP (FS2SI), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 561 1.1 christos {"fs2si.z", "=fst,%fsa", FS1_F2OP (FS2SI_Z), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 562 1.1 christos /* seg-FPU_FS2. */ 563 1.1 christos {"fcmpeqs", "=fst,%fsa,%fsb", FS2 (FCMPEQS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 564 1.1 christos {"fcmpeqs.e", "=fst,%fsa,%fsb", FS2 (FCMPEQS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 565 1.1 christos {"fcmplts", "=fst,%fsa,%fsb", FS2 (FCMPLTS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 566 1.1 christos {"fcmplts.e", "=fst,%fsa,%fsb", FS2 (FCMPLTS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 567 1.1 christos {"fcmples", "=fst,%fsa,%fsb", FS2 (FCMPLES), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 568 1.1 christos {"fcmples.e", "=fst,%fsa,%fsb", FS2 (FCMPLES_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 569 1.1 christos {"fcmpuns", "=fst,%fsa,%fsb", FS2 (FCMPUNS), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 570 1.1 christos {"fcmpuns.e", "=fst,%fsa,%fsb", FS2 (FCMPUNS_E), 4, ATTR (FPU) | ATTR (FPU_SP_EXT), 0, NULL, 0, NULL}, 571 1.1 christos /* seg-FPU_FD1. */ 572 1.1 christos {"faddd", "=fdt,%fda,%fdb", FD1 (FADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 573 1.1 christos {"fsubd", "=fdt,%fda,%fdb", FD1 (FSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 574 1.1 christos {"fcpynsd", "=fdt,%fda,%fdb", FD1 (FCPYNSD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 575 1.1 christos {"fcpysd", "=fdt,%fda,%fdb", FD1 (FCPYSD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 576 1.1 christos {"fmaddd", "=fdt,%fda,%fdb", FD1 (FMADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 577 1.1 christos {"fmsubd", "=fdt,%fda,%fdb", FD1 (FMSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 578 1.1 christos {"fcmovnd", "=fdt,%fda,%fsb", FD1 (FCMOVND), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 579 1.1 christos {"fcmovzd", "=fdt,%fda,%fsb", FD1 (FCMOVZD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 580 1.1 christos {"fnmaddd", "=fdt,%fda,%fdb", FD1 (FNMADDD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 581 1.1 christos {"fnmsubd", "=fdt,%fda,%fdb", FD1 (FNMSUBD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 582 1.1 christos {"fmuld", "=fdt,%fda,%fdb", FD1 (FMULD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 583 1.1 christos {"fdivd", "=fdt,%fda,%fdb", FD1 (FDIVD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 584 1.1 christos /* seg-FPU_FD1_F2OP. */ 585 1.1 christos {"fd2s", "=fst,%fda", FD1_F2OP (FD2S), 4, ATTR (FPU) | ATTR (FPU_SP_EXT) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 586 1.1 christos {"fsqrtd", "=fdt,%fda", FD1_F2OP (FSQRTD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 587 1.1 christos {"fabsd", "=fdt,%fda", FD1_F2OP (FABSD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 588 1.1 christos {"fui2d", "=fdt,%fsa", FD1_F2OP (FUI2D), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 589 1.1 christos {"fsi2d", "=fdt,%fsa", FD1_F2OP (FSI2D), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 590 1.1 christos {"fd2ui", "=fst,%fda", FD1_F2OP (FD2UI), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 591 1.1 christos {"fd2ui.z", "=fst,%fda", FD1_F2OP (FD2UI_Z), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 592 1.1 christos {"fd2si", "=fst,%fda", FD1_F2OP (FD2SI), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 593 1.1 christos {"fd2si.z", "=fst,%fda", FD1_F2OP (FD2SI_Z), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 594 1.1 christos /* seg-FPU_FD2. */ 595 1.1 christos {"fcmpeqd", "=fst,%fda,%fdb", FD2 (FCMPEQD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 596 1.1 christos {"fcmpeqd.e", "=fst,%fda,%fdb", FD2 (FCMPEQD_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 597 1.1 christos {"fcmpltd", "=fst,%fda,%fdb", FD2 (FCMPLTD), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 598 1.1 christos {"fcmpltd.e", "=fst,%fda,%fdb", FD2 (FCMPLTD_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 599 1.1 christos {"fcmpled", "=fst,%fda,%fdb", FD2 (FCMPLED), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 600 1.1 christos {"fcmpled.e", "=fst,%fda,%fdb", FD2 (FCMPLED_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 601 1.1 christos {"fcmpund", "=fst,%fda,%fdb", FD2 (FCMPUND), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 602 1.1 christos {"fcmpund.e", "=fst,%fda,%fdb", FD2 (FCMPUND_E), 4, ATTR (FPU) | ATTR (FPU_DP_EXT), 0, NULL, 0, NULL}, 603 1.1 christos /* seg-FPU_MFCP. */ 604 1.1 christos {"fmfsr", "=rt,%fsa", MFCP (FMFSR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 605 1.1 christos {"fmfdr", "=rt,%fda", MFCP (FMFDR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 606 1.1 christos /* seg-FPU_MFCP_XR. */ 607 1.1 christos {"fmfcfg", "=rt", MFCP_XR(FMFCFG), 4, ATTR (FPU), 0, NULL, 0, NULL}, 608 1.1 christos {"fmfcsr", "=rt", MFCP_XR(FMFCSR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 609 1.1 christos /* seg-FPU_MTCP. */ 610 1.1 christos 611 1.1 christos {"fmtsr", "%rt,=fsa", MTCP (FMTSR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 612 1.1 christos {"fmtdr", "%rt,=fda", MTCP (FMTDR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 613 1.1 christos /* seg-FPU_MTCP_XR. */ 614 1.1 christos {"fmtcsr", "%rt", MTCP_XR(FMTCSR), 4, ATTR (FPU), 0, NULL, 0, NULL}, 615 1.1 christos /* seg-FPU_FLS. */ 616 1.1 christos {"fls", "=fst,[%ra+(%rb<<%sv)]", FPU_MEM(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 617 1.1 christos {"fls.bi", "=fst,[%ra],(%rb<<%sv)", FPU_MEMBI(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 618 1.1 christos /* seg-FPU_FLD. */ 619 1.1 christos {"fld", "=fdt,[%ra+(%rb<<%sv)]", FPU_MEM(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 620 1.1 christos {"fld.bi", "=fdt,[%ra],(%rb<<%sv)", FPU_MEMBI(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 621 1.1 christos /* seg-FPU_FSS. */ 622 1.1 christos {"fss", "=fst,[%ra+(%rb<<%sv)]", FPU_MEM(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 623 1.1 christos {"fss.bi", "=fst,[%ra],(%rb<<%sv)", FPU_MEMBI(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 624 1.1 christos /* seg-FPU_FSD. */ 625 1.1 christos {"fsd", "=fdt,[%ra+(%rb<<%sv)]", FPU_MEM(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 626 1.1 christos {"fsd.bi", "=fdt,[%ra],(%rb<<%sv)", FPU_MEMBI(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 627 1.1 christos {"fls", "=fst,[%ra+%rb{<<%sv}]", FPU_MEM(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 628 1.1 christos {"fls.bi", "=fst,[%ra],%rb{<<%sv}", FPU_MEMBI(FLS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 629 1.1 christos {"fld", "=fdt,[%ra+%rb{<<%sv}]", FPU_MEM(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 630 1.1 christos {"fld.bi", "=fdt,[%ra],%rb{<<%sv}", FPU_MEMBI(FLD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 631 1.1 christos {"fss", "=fst,[%ra+%rb{<<%sv}]", FPU_MEM(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 632 1.1 christos {"fss.bi", "=fst,[%ra],%rb{<<%sv}", FPU_MEMBI(FSS), 4, ATTR (FPU), 0, NULL, 0, NULL}, 633 1.1 christos {"fsd", "=fdt,[%ra+%rb{<<%sv}]", FPU_MEM(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 634 1.1 christos {"fsd.bi", "=fdt,[%ra],%rb{<<%sv}", FPU_MEMBI(FSD), 4, ATTR (FPU), 0, NULL, 0, NULL}, 635 1.1 christos {"cctl", "%ra,%cctl_st0", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 636 1.1 christos {"cctl", "%ra,%cctl_st1{,%cctl_lv}", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 637 1.1 christos {"cctl", "=rt,%ra,%cctl_st2", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 638 1.1 christos {"cctl", "%rt,%ra,%cctl_st3", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 639 1.1 christos {"cctl", "%cctl_st4", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 640 1.1 christos {"cctl", "%cctl_st5{,%cctl_lv}", MISC (CCTL), 4, ATTR_V3, 0, NULL, 0, NULL}, 641 1.1 christos {"cctl", "=rt,%ra,%cctl_stx,%cctl_lv", MISC (CCTL), 4, ATTR_V3MEX_V1, 0, NULL, 0, NULL}, 642 1.1 christos /* seg-Alias instructions. */ 643 1.1 christos {"neg", "=rt,%ra", OP6 (SUBRI), 4, ATTR_ALL, 0, NULL, 0, NULL}, 644 1.1 christos {"zeb", "=rt,%ra", OP6 (ANDI) | 0xff, 4, ATTR_ALL, 0, NULL, 0, NULL}, 645 1.1 christos 646 1.1 christos /* seg-COP. */ 647 1.1 christos {"cpe1", "%cp45,%cpi19", OP6 (COP) | 0x00, 4, ATTR_ALL, 0, NULL, 0, NULL}, 648 1.1 christos {"cpe2", "%cp45,%cpi19", OP6 (COP) | 0x04, 4, ATTR_ALL, 0, NULL, 0, NULL}, 649 1.1 christos {"cpe3", "%cp45,%cpi19", OP6 (COP) | 0x08, 4, ATTR_ALL, 0, NULL, 0, NULL}, 650 1.1 christos {"cpe4", "%cp45,%cpi19", OP6 (COP) | 0x0C, 4, ATTR_ALL, 0, NULL, 0, NULL}, 651 1.1 christos /* seg-COP-MFCPX. */ 652 1.1 christos {"mfcpw", "%cp45,=rt,%i12u", OP6 (COP) | 0x01, 4, ATTR_ALL, 0, NULL, 0, NULL}, 653 1.1 christos {"mfcpd", "%cp45,=rt,%i12u", OP6 (COP) | 0x41, 4, ATTR_ALL, 0, NULL, 0, NULL}, 654 1.1 christos {"mfcppw", "%cp45,=rt,%i12u", OP6 (COP) | 0xc1, 4, ATTR_ALL, 0, NULL, 0, NULL}, 655 1.1 christos /* seg-COP-CPLW. */ 656 1.1 christos {"cplw", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x02, 4, ATTR_ALL, 0, NULL, 0, NULL}, 657 1.1 christos {"cplw.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x82, 4, ATTR_ALL, 0, NULL, 0, NULL}, 658 1.1 christos /* seg-COP-CPLD. */ 659 1.1 christos {"cpld", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x03, 4, ATTR_ALL, 0, NULL, 0, NULL}, 660 1.1 christos {"cpld.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x83, 4, ATTR_ALL, 0, NULL, 0, NULL}, 661 1.1 christos /* seg-COP-MTCPX. */ 662 1.1 christos {"mtcpw", "%cp45,%rt,%i12u", OP6 (COP) | 0x09, 4, ATTR_ALL, 0, NULL, 0, NULL}, 663 1.1 christos {"mtcpd", "%cp45,%rt,%i12u", OP6 (COP) | 0x49, 4, ATTR_ALL, 0, NULL, 0, NULL}, 664 1.1 christos {"mtcppw", "%cp45,%rt,%i12u", OP6 (COP) | 0xc9, 4, ATTR_ALL, 0, NULL, 0, NULL}, 665 1.1 christos /* seg-COP-CPSW. */ 666 1.1 christos {"cpsw", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x0a, 4, ATTR_ALL, 0, NULL, 0, NULL}, 667 1.1 christos {"cpsw.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x8a, 4, ATTR_ALL, 0, NULL, 0, NULL}, 668 1.1 christos /* seg-COP-CPSD. */ 669 1.1 christos {"cpsd", "%cp45,%cprt,[%ra+%rb<<%sv]", OP6 (COP) | 0x0b, 4, ATTR_ALL, 0, NULL, 0, NULL}, 670 1.1 christos {"cpsd.bi", "%cp45,%cprt,[%ra],%rb<<%sv", OP6 (COP) | 0x8b, 4, ATTR_ALL, 0, NULL, 0, NULL}, 671 1.1 christos 672 1.1 christos /* 16-bit instructions. */ 673 1.1 christos /* get bit14~bit11 of 16-bit instruction. */ 674 1.1 christos {"beqz38", "%rt38,%i8s1", 0xc000, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 675 1.1 christos {"bnez38", "%rt38,%i8s1", 0xc800, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 676 1.1 christos {"beqs38", "%rt38,%i8s1", 0xd000, 2, ATTR_PCREL | ATTR_ALL, USE_REG (5), NULL, 0, NULL}, 677 1.1 christos {"bnes38", "%rt38,%i8s1", 0xd800, 2, ATTR_PCREL | ATTR_ALL, USE_REG (5), NULL, 0, NULL}, 678 1.1 christos 679 1.1 christos /* SEG00, get bit10. */ 680 1.1 christos {"mov55", "=rt5,%ra5", 0x8000, 2, ATTR_ALL, 0, NULL, 0, NULL}, 681 1.1 christos {"movi55", "=rt5,%i5s", 0x8400, 2, ATTR_ALL, 0, NULL, 0, NULL}, 682 1.1 christos /* SEG01 bit10~bit9. */ 683 1.1 christos {"add45", "=rt4,%ra5", 0x8800, 2, ATTR_ALL, 0, NULL, 0, NULL}, 684 1.1 christos {"sub45", "=rt4,%ra5", 0x8a00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 685 1.1 christos {"addi45", "=rt4,%i5u", 0x8c00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 686 1.1 christos {"subi45", "=rt4,%i5u", 0x8e00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 687 1.1 christos /* SEG02 bit10~bit9. */ 688 1.1 christos {"srai45", "=rt4,%i5u", 0x9000, 2, ATTR_ALL, 0, NULL, 0, NULL}, 689 1.1 christos {"srli45", "=rt4,%i5u", 0x9200, 2, ATTR_ALL, 0, NULL, 0, NULL}, 690 1.1 christos {"slli333", "=rt3,%ra3,%i3u", 0x9400, 2, ATTR_ALL, 0, NULL, 0, NULL}, 691 1.1 christos /* SEG03 bit10~bit9. */ 692 1.1 christos {"add333", "=rt3,%ra3,%rb3", 0x9800, 2, ATTR_ALL, 0, NULL, 0, NULL}, 693 1.1 christos {"sub333", "=rt3,%ra3,%rb3", 0x9a00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 694 1.1 christos {"addi333", "=rt3,%ra3,%i3u", 0x9c00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 695 1.1 christos {"subi333", "=rt3,%ra3,%i3u", 0x9e00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 696 1.1 christos /* SEG04 bit10~bit9. */ 697 1.1 christos {"lwi333", "=rt3,[%ra3{+%i3u2}]", 0xa000, 2, ATTR_ALL, 0, NULL, 0, NULL}, 698 1.1 christos {"lwi333.bi", "=rt3,[%ra3],%i3u2", 0xa200, 2, ATTR_ALL, 0, NULL, 0, NULL}, 699 1.1 christos {"lhi333", "=rt3,[%ra3{+%i3u1}]", 0xa400, 2, ATTR_ALL, 0, NULL, 0, NULL}, 700 1.1 christos {"lbi333", "=rt3,[%ra3{+%i3u}]", 0xa600, 2, ATTR_ALL, 0, NULL, 0, NULL}, 701 1.1 christos /* SEG05 bit10~bit9. */ 702 1.1 christos {"swi333", "%rt3,[%ra3{+%i3u2}]", 0xa800, 2, ATTR_ALL, 0, NULL, 0, NULL}, 703 1.1 christos {"swi333.bi", "%rt3,[%ra3],%i3u2", 0xaa00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 704 1.1 christos {"shi333", "%rt3,[%ra3{+%i3u1}]", 0xac00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 705 1.1 christos {"sbi333", "%rt3,[%ra3{+%i3u}]", 0xae00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 706 1.1 christos /* SEG06 bit10~bit9. */ 707 1.1 christos {"addri36.sp", "%rt3,%i6u2", 0xb000, 2, ATTR_V3MUP, USE_REG (31), NULL, 0, NULL}, 708 1.1 christos {"lwi45.fe", "=rt4,%fe5", 0xb200, 2, ATTR_V3MUP, USE_REG (8), NULL, 0, NULL}, 709 1.1 christos {"lwi450", "=rt4,[%ra5]", 0xb400, 2, ATTR_ALL, 0, NULL, 0, NULL}, 710 1.1 christos {"swi450", "%rt4,[%ra5]", 0xb600, 2, ATTR_ALL, 0, NULL, 0, NULL}, 711 1.1 christos /* SEG07 bit7. */ 712 1.1 christos {"lwi37", "=rt38,[$fp{+%i7u2}]", 0xb800, 2, ATTR_ALL, USE_REG (28), NULL, 0, NULL}, 713 1.1 christos {"swi37", "%rt38,[$fp{+%i7u2}]", 0xb880, 2, ATTR_ALL, USE_REG (28), NULL, 0, NULL}, 714 1.1 christos /* SEG10_1 if Rt3=5. */ 715 1.1 christos {"j8", "%i8s1", 0xd500, 2, ATTR_PCREL | ATTR_ALL, 0, NULL, 0, NULL}, 716 1.1 christos /* SEG11_2 bit7~bit5. */ 717 1.1 christos {"jr5", "%ra5", 0xdd00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 718 1.1 christos {"jral5", "%ra5", 0xdd20, 2, ATTR_ALL, 0, NULL, 0, NULL}, 719 1.1 christos {"ret5", "%ra5", 0xdd80, 2, ATTR_ALL, 0, NULL, 0, NULL}, 720 1.1 christos {"add5.pc", "%ra5", 0xdda0, 2, ATTR_V3, 0, NULL, 0, NULL}, 721 1.1 christos /* SEG11_3 if Ra5=30. */ 722 1.1 christos {"ret5", "", 0xdd80 | RA5 (30), 2, ATTR_ALL, 0, NULL, 0, NULL}, 723 1.1 christos /* SEG12 bit10~bit9. */ 724 1.1 christos {"slts45", "%rt4,%ra5", 0xe000, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL}, 725 1.1 christos {"slt45", "%rt4,%ra5", 0xe200, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL}, 726 1.1 christos {"sltsi45", "%rt4,%i5u", 0xe400, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL}, 727 1.1 christos {"slti45", "%rt4,%i5u", 0xe600, 2, ATTR_ALL, DEF_REG (15), NULL, 0, NULL}, 728 1.1 christos /* SEG13 bit10~bit9. */ 729 1.1 christos {"break16", "%i5u", 0xea00, 2, ATTR_ALL, 0, NULL, 0, NULL}, 730 1.1 christos {"addi10.sp", "%i10s", 0xec00, 2, ATTR_V2UP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL}, 731 1.1 christos {"addi10.sp", "%i10s", 0xec00, 2, ATTR_V2UP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL}, 732 1.1 christos /* SEG13_1 bit8. */ 733 1.1 christos {"beqzs8", "%i8s1", 0xe800, 2, ATTR_PCREL | ATTR_ALL, USE_REG (15), NULL, 0, NULL}, 734 1.1 christos {"bnezs8", "%i8s1", 0xe900, 2, ATTR_PCREL | ATTR_ALL, USE_REG (15), NULL, 0, NULL}, 735 1.1 christos /* SEG14 bit7. */ 736 1.1 christos {"lwi37.sp", "=rt38,[+%i7u2]", 0xf000, 2, ATTR_V2UP, USE_REG (31), NULL, 0, NULL}, 737 1.1 christos {"swi37.sp", "%rt38,[+%i7u2]", 0xf080, 2, ATTR_V2UP, USE_REG (31), NULL, 0, NULL}, 738 1.1 christos /* SEG15 bit10~bit9. */ 739 1.1 christos {"movpi45", "=rt4,%pi5", 0xfa00, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 740 1.1 christos /* SEG15_1 bit8. */ 741 1.1 christos {"movd44", "=rt5e,%ra5e", 0xfd00, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 742 1.1 christos 743 1.1 christos /* SEG-BFMI333 bit2~bit0. */ 744 1.1 christos {"zeb33", "=rt3,%ra3", 0x9600, 2, ATTR_ALL, 0, NULL, 0, NULL}, 745 1.1 christos {"zeh33", "=rt3,%ra3", 0x9601, 2, ATTR_ALL, 0, NULL, 0, NULL}, 746 1.1 christos {"seb33", "=rt3,%ra3", 0x9602, 2, ATTR_ALL, 0, NULL, 0, NULL}, 747 1.1 christos {"seh33", "=rt3,%ra3", 0x9603, 2, ATTR_ALL, 0, NULL, 0, NULL}, 748 1.1 christos {"xlsb33", "=rt3,%ra3", 0x9604, 2, ATTR_ALL, 0, NULL, 0, NULL}, 749 1.1 christos {"x11b33", "=rt3,%ra3", 0x9605, 2, ATTR_ALL, 0, NULL, 0, NULL}, 750 1.1 christos {"bmski33", "=rt3,%ia3u", 0x9606, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 751 1.1 christos {"fexti33", "=rt3,%ia3u", 0x9607, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 752 1.1 christos /* SEG-PUSHPOP25 bit8~bit7. */ 753 1.1 christos {"push25", "%re2,%i5u3", 0xfc00, 2, ATTR_V3MUP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL}, 754 1.1 christos {"pop25", "%re2,%i5u3", 0xfc80, 2, ATTR_V3MUP, USE_REG (31) | DEF_REG (31), NULL, 0, NULL}, 755 1.1 christos /* SEG-MISC33 bit2~bit0. */ 756 1.1 christos {"neg33", "=rt3,%ra3", 0xfe02, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 757 1.1 christos {"not33", "=rt3,%ra3", 0xfe03, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 758 1.1 christos {"mul33", "=rt3,%ra3", 0xfe04, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 759 1.1 christos {"xor33", "=rt3,%ra3", 0xfe05, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 760 1.1 christos {"and33", "=rt3,%ra3", 0xfe06, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 761 1.1 christos {"or33", "=rt3,%ra3", 0xfe07, 2, ATTR_V3MUP, 0, NULL, 0, NULL}, 762 1.1 christos /* SEG-Alias instructions. */ 763 1.1 christos {"nop16", "", 0x9200, 2, ATTR_ALL, 0, NULL, 0, NULL}, 764 1.1 christos 765 1.1 christos /* Saturation ext ISA. */ 766 1.1 christos {"kaddw", "=rt,%ra,%rb", ALU2 (KADD), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 767 1.1 christos {"ksubw", "=rt,%ra,%rb", ALU2 (KSUB), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 768 1.1.1.3 christos {"kaddh", "=rt,%ra,%rb", ALU2 (KADD) | N32_BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 769 1.1.1.3 christos {"ksubh", "=rt,%ra,%rb", ALU2 (KSUB) | N32_BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 770 1.1 christos {"kdmbb", "=rt,%ra,%rb", ALU2 (KMxy), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 771 1.1.1.3 christos {"kdmbt", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 772 1.1.1.3 christos {"kdmtb", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 773 1.1.1.3 christos {"kdmtt", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (6) | N32_BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 774 1.1.1.3 christos {"khmbb", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (8), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 775 1.1.1.3 christos {"khmbt", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (8) | N32_BIT (6), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 776 1.1.1.3 christos {"khmtb", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (8) | N32_BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 777 1.1.1.3 christos {"khmtt", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (8) | N32_BIT (6) | N32_BIT (7), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 778 1.1.1.5 christos {"kslraw", "=rt,%ra,%rb", ALU2 (KSLRAW), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 779 1.1.1.5 christos {"ksll", "=rt,%ra,%rb", ALU2 (KSLRAW), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 780 1.1.1.5 christos {"kslraw.u", "=rt,%ra,%rb", ALU2 (KSLRAWu), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 781 1.1.1.3 christos {"rdov", "=rt", ALU2 (MFUSR) | N32_BIT (6) | ( 0x1e << 15), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 782 1.1.1.3 christos {"clrov", "", ALU2 (MTUSR) | N32_BIT (6) | ( 0x1e << 15), 4, ATTR (SATURATION_EXT), 0, NULL, 0, NULL}, 783 1.1 christos 784 1.1 christos /* Audio ext. instructions. */ 785 1.1 christos 786 1.1.1.5 christos {"amtari", "%aridxi,%imm16u", AUDIO (AMTARI), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 787 1.1.1.5 christos {"amtari", "%aridxi_mx,%imm16s", AUDIO (AMTARI), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 788 1.1 christos /* N32_AEXT_AMADD */ 789 1.1 christos {"alr2", "=a_rt,=a_ru,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x1 << 6), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 790 1.1 christos {"amaddl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMADD) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 791 1.1 christos {"amaddl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMADD) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 792 1.1 christos {"amaddl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 793 1.1 christos {"amaddl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADD) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 794 1.1 christos {"amaddsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMADD) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 795 1.1 christos {"alr", "=a_rt,[%im5_i],%im5_m", AUDIO (AMADD) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 796 1.1 christos {"amadd", "=a_dx,%ra,%rb", AUDIO (AMADD), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 797 1.1 christos {"amabbs", "=a_dx,%ra,%rb", AUDIO (AMADD) | 0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 798 1.1 christos /* N32_AEXT_AMSUB */ 799 1.1 christos {"amsubl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 800 1.1 christos {"amsubl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 801 1.1 christos {"amsubl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUB) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 802 1.1 christos {"amsubl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUB) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 803 1.1 christos {"amsubsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 804 1.1 christos {"asr", "%ra,[%im5_i],%im5_m", AUDIO (AMSUB) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 805 1.1 christos {"amsub", "=a_dx,%ra,%rb", AUDIO (AMSUB), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 806 1.1 christos {"amabts", "=a_dx,%ra,%rb", AUDIO (AMSUB) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 807 1.1 christos /* N32_AEXT_AMULT */ 808 1.1 christos {"amultl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMULT) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 809 1.1 christos {"amultl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMULT) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 810 1.1 christos {"amultl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULT) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 811 1.1 christos {"amultl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULT) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 812 1.1 christos {"amultsa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMULT) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 813 1.1 christos {"ala", "=dxh,[%im5_i],%im5_m", AUDIO (AMULT) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 814 1.1 christos {"amult", "=a_dx,%ra,%rb", AUDIO (AMULT), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 815 1.1 christos {"amatbs", "=a_dx,%ra,%rb", AUDIO (AMULT) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 816 1.1 christos {"asats48", "=a_dx", AUDIO (AMULT) | (0x02 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 817 1.1 christos {"awext", "%ra,%a_dx,%i5u", AUDIO (AMULT) | (0x03 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 818 1.1 christos /* N32_AEXT_AMFAR */ 819 1.1 christos {"amatts", "=a_dx,%ra,%rb", AUDIO (AMFAR) | 0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 820 1.1 christos {"asa", "=dxh,[%im5_i],%im5_m", AUDIO (AMFAR) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 821 1.1 christos {"amtar", "%ra,%aridx", AUDIO (AMFAR) | (0x02 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 822 1.1 christos {"amtar2", "%ra,%aridx2", AUDIO (AMFAR) | (0x12 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 823 1.1 christos {"amfar", "=ra,%aridx", AUDIO (AMFAR) | (0x03 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 824 1.1 christos {"amfar2", "=ra,%aridx2", AUDIO (AMFAR) | (0x13 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 825 1.1 christos /* N32_AEXT_AMADDS */ 826 1.1 christos {"amaddsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 827 1.1 christos {"amaddsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 828 1.1 christos {"amaddsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADDS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 829 1.1 christos {"amaddsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMADDS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 830 1.1 christos {"amaddssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMADDS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 831 1.1 christos {"aupi", "%im5_i,%im5_m", AUDIO (AMADDS) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 832 1.1 christos {"amadds", "=a_dx,%ra,%rb", AUDIO (AMADDS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 833 1.1 christos {"ambbs", "=a_dx,%ra,%rb", AUDIO (AMADDS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 834 1.1 christos {"amawbs", "=a_dx,%ra,%rb", AUDIO (AMADDS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 835 1.1 christos /* N32_AEXT_AMSUBS */ 836 1.1 christos {"amsubsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 837 1.1 christos {"amsubsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 838 1.1 christos {"amsubsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 839 1.1 christos {"amsubsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMSUBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 840 1.1 christos {"amsubssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMSUBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 841 1.1 christos {"amsubs", "=a_dx,%ra,%rb", AUDIO (AMSUBS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 842 1.1 christos {"ambts", "=a_dx,%ra,%rb", AUDIO (AMSUBS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 843 1.1 christos {"amawts", "=a_dx,%ra,%rb", AUDIO (AMSUBS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 844 1.1 christos /* N32_AEXT_AMULTS */ 845 1.1 christos {"amultsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 846 1.1 christos {"amultsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 847 1.1 christos {"amultsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 848 1.1 christos {"amultsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMULTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 849 1.1 christos {"amultssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMULTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 850 1.1 christos {"amults", "=a_dx,%ra,%rb", AUDIO (AMULTS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 851 1.1 christos {"amtbs", "=a_dx,%ra,%rb", AUDIO (AMULTS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 852 1.1 christos {"amwbs", "=a_dx,%ra,%rb", AUDIO (AMULTS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 853 1.1 christos /* N32_AEXT_AMNEGS */ 854 1.1 christos {"amnegsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 855 1.1 christos {"amnegsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 856 1.1 christos {"amnegsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMNEGS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 857 1.1 christos {"amnegsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMNEGS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 858 1.1 christos {"amnegssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMNEGS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 859 1.1 christos {"amnegs", "=a_dx,%ra,%rb", AUDIO (AMNEGS), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 860 1.1 christos {"amtts", "=a_dx,%ra,%rb", AUDIO (AMNEGS) |0x01, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 861 1.1 christos {"amwts", "=a_dx,%ra,%rb", AUDIO (AMNEGS) |0x02, 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 862 1.1 christos /* N32_AEXT_AADDL */ 863 1.1 christos {"aaddl", "=a_rte69,%ra,%rb,%a_rte69_1,[%im5_i],%im5_m", AUDIO (AADDL), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 864 1.1 christos {"asubl", "=a_rte69,%ra,%rb,%a_rte69_1,[%im5_i],%im5_m", AUDIO (AADDL) | (0x01 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 865 1.1 christos /* N32_AEXT_AMAWBS */ 866 1.1 christos {"amawbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 867 1.1 christos {"amawbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 868 1.1 christos {"amawbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 869 1.1 christos {"amawbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 870 1.1 christos {"amawbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMAWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 871 1.1 christos /* N32_AEXT_AMAWTS */ 872 1.1 christos {"amawtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 873 1.1 christos {"amawtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 874 1.1 christos {"amawtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 875 1.1 christos {"amawtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMAWTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 876 1.1 christos {"amawtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMAWTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 877 1.1 christos /* N32_AEXT_AMWBS */ 878 1.1 christos {"amwbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 879 1.1 christos {"amwbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 880 1.1 christos {"amwbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 881 1.1 christos {"amwbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 882 1.1 christos {"amwbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 883 1.1 christos {"amwbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 884 1.1 christos /* N32_AEXT_AMWTS */ 885 1.1 christos {"amwtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 886 1.1 christos {"amwtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 887 1.1 christos {"amwtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 888 1.1 christos {"amwtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMWTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 889 1.1 christos {"amwtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMWTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 890 1.1 christos /* N32_AEXT_AMABBS */ 891 1.1 christos {"amabbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 892 1.1 christos {"amabbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 893 1.1 christos {"amabbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 894 1.1 christos {"amabbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 895 1.1 christos {"amabbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMABBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 896 1.1 christos /* N32_AEXT_AMABTS */ 897 1.1 christos {"amabtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 898 1.1 christos {"amabtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 899 1.1 christos {"amabtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 900 1.1 christos {"amabtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMABTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 901 1.1 christos {"amabtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMABTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 902 1.1 christos /* N32_AEXT_AMATBS */ 903 1.1 christos {"amatbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 904 1.1 christos {"amatbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 905 1.1 christos {"amatbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 906 1.1 christos {"amatbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 907 1.1 christos {"amatbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMATBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 908 1.1 christos /* N32_AEXT_AMATTS */ 909 1.1 christos {"amattsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 910 1.1 christos {"amattsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 911 1.1 christos {"amattsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 912 1.1 christos {"amattsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMATTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 913 1.1 christos {"amattssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMATTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 914 1.1 christos /* N32_AEXT_AMBBS */ 915 1.1 christos {"ambbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 916 1.1 christos {"ambbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 917 1.1 christos {"ambbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 918 1.1 christos {"ambbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 919 1.1 christos {"ambbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMBBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 920 1.1 christos /* N32_AEXT_AMBTS */ 921 1.1 christos {"ambtsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 922 1.1 christos {"ambtsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 923 1.1 christos {"ambtsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 924 1.1 christos {"ambtsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMBTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 925 1.1 christos {"ambtssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMBTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 926 1.1 christos /* N32_AEXT_AMTBS */ 927 1.1 christos {"amtbsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 928 1.1 christos {"amtbsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 929 1.1 christos {"amtbsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTBS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 930 1.1 christos {"amtbsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTBS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 931 1.1 christos {"amtbssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMTBS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 932 1.1 christos /* N32_AEXT_AMTTS */ 933 1.1 christos {"amttsl.s", "=a_dx,%ra,%rb,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x04 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 934 1.1 christos {"amttsl.l", "=a_dx,%a_a30,%a_b20,%a_rt21,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x06 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 935 1.1 christos {"amttsl2.s", "=a_dx,%ra,%rb,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTTS) | (0x08 << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 936 1.1 christos {"amttsl2.l", "=a_dx,%a_a30,%a_b20,%a_rte,%a_rte1,[%im6_ip],[%im6_iq],%im6_mr,%im6_ms", AUDIO (AMTTS) | (0x0A << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 937 1.1 christos {"amttssa", "=a_dx,%ra,%rb,%dhy,[%im5_i],%im5_m", AUDIO (AMTTS) | (0x0C << 5), 4, ATTR (AUDIO_ISAEXT), 0, NULL, 0, NULL}, 938 1.1.1.5 christos 939 1.1.1.5 christos /* DSP ISA. */ 940 1.1.1.5 christos /* ALU2 Bit 9-6 = 0000. */ 941 1.1.1.5 christos {"add64", "=rt,%ra,%rb", ALU2 (ADD64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 942 1.1.1.5 christos {"sub64", "=rt,%ra,%rb", ALU2 (SUB64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 943 1.1.1.5 christos {"smal", "=rt,%ra,%rb", ALU2 (SMAL), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 944 1.1.1.5 christos {"radd64", "=rt,%ra,%rb", ALU2 (RADD64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 945 1.1.1.5 christos {"rsub64", "=rt,%ra,%rb", ALU2 (RSUB64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 946 1.1.1.5 christos {"uradd64", "=rt,%ra,%rb", ALU2 (URADD64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 947 1.1.1.5 christos {"ursub64", "=rt,%ra,%rb", ALU2 (URSUB64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 948 1.1.1.5 christos {"kadd64", "=rt,%ra,%rb", ALU2 (KADD64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 949 1.1.1.5 christos {"ksub64", "=rt,%ra,%rb", ALU2 (KSUB64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 950 1.1.1.5 christos {"ukadd64", "=rt,%ra,%rb", ALU2 (UKADD64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 951 1.1.1.5 christos {"uksub64", "=rt,%ra,%rb", ALU2 (UKSUB64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 952 1.1.1.5 christos /* ALU2 Bit 9-6 = 0001. */ 953 1.1.1.5 christos {"smar64", "=rt,%ra,%rb", ALU2_1 (SMAR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 954 1.1.1.5 christos {"umar64", "=rt,%ra,%rb", ALU2_1 (UMAR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 955 1.1.1.5 christos {"smsr64", "=rt,%ra,%rb", ALU2_1 (SMSR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 956 1.1.1.5 christos {"umsr64", "=rt,%ra,%rb", ALU2_1 (UMSR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 957 1.1.1.5 christos {"kmar64", "=rt,%ra,%rb", ALU2_1 (KMAR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 958 1.1.1.5 christos {"ukmar64", "=rt,%ra,%rb", ALU2_1 (UKMAR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 959 1.1.1.5 christos {"kmsr64", "=rt,%ra,%rb", ALU2_1 (KMSR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 960 1.1.1.5 christos {"ukmsr64", "=rt,%ra,%rb", ALU2_1 (UKMSR64), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 961 1.1.1.5 christos {"smalda", "=rt,%ra,%rb", ALU2_1 (SMALDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 962 1.1.1.5 christos {"smslda", "=rt,%ra,%rb", ALU2_1 (SMSLDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 963 1.1.1.5 christos {"smalds", "=rt,%ra,%rb", ALU2_1 (SMALDS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 964 1.1.1.5 christos {"smalbb", "=rt,%ra,%rb", ALU2_1 (SMALBB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 965 1.1.1.5 christos {"smalxda", "=rt,%ra,%rb", ALU2_1 (SMALXDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 966 1.1.1.5 christos {"smslxda", "=rt,%ra,%rb", ALU2_1 (SMSLXDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 967 1.1.1.5 christos {"smalxds", "=rt,%ra,%rb", ALU2_1 (SMALXDS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 968 1.1.1.5 christos {"smalbt", "=rt,%ra,%rb", ALU2_1 (SMALBT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 969 1.1.1.5 christos {"smalbt", "=rt,%ra,%rb", ALU2_1 (SMALBT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 970 1.1.1.5 christos {"smaldrs", "=rt,%ra,%rb", ALU2_1 (SMALDRS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 971 1.1.1.5 christos {"smaltt", "=rt,%ra,%rb", ALU2_1 (SMALTT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 972 1.1.1.5 christos {"smds", "=rt,%ra,%rb", ALU2_1 (SMDS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 973 1.1.1.5 christos {"smxds", "=rt,%ra,%rb", ALU2_1 (SMXDS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 974 1.1.1.5 christos {"smdrs", "=rt,%ra,%rb", ALU2_1 (SMDRS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 975 1.1.1.5 christos {"kmadrs", "=rt,%ra,%rb", ALU2_1 (KMADRS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 976 1.1.1.5 christos {"kmads", "=rt,%ra,%rb", ALU2_1 (KMADS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 977 1.1.1.5 christos {"kmaxds", "=rt,%ra,%rb", ALU2_1 (KMAXDS), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 978 1.1.1.5 christos /* DSP MISC. */ 979 1.1.1.5 christos {"bpick", "=rt,%ra,%rb,%rd", MISC (BPICK), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 980 1.1.1.5 christos /* ALU_2 KMxy. */ 981 1.1.1.5 christos {"khm16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9) | N32_BIT (8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 982 1.1.1.5 christos {"khmx16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9) | N32_BIT (8) | N32_BIT (6), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 983 1.1.1.5 christos {"smul16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 984 1.1.1.5 christos {"smulx16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9) | N32_BIT (6), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 985 1.1.1.5 christos {"umul16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9) | N32_BIT (7), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 986 1.1.1.5 christos {"umulx16", "=rt,%ra,%rb", ALU2 (KMxy) | N32_BIT (9) | N32_BIT (7) | N32_BIT (6), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 987 1.1.1.5 christos /* ALU2 Bit 9-6 = 0010. */ 988 1.1.1.5 christos {"kadd16", "=rt,%ra,%rb", ALU2_2 (KADD16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 989 1.1.1.5 christos {"ksub16", "=rt,%ra,%rb", ALU2_2 (KSUB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 990 1.1.1.5 christos {"kcras16", "=rt,%ra,%rb", ALU2_2 (KCRAS16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 991 1.1.1.5 christos {"kcrsa16", "=rt,%ra,%rb", ALU2_2 (KCRSA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 992 1.1.1.5 christos {"kadd8", "=rt,%ra,%rb", ALU2_2 (KADD8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 993 1.1.1.5 christos {"ksub8", "=rt,%ra,%rb", ALU2_2 (KSUB8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 994 1.1.1.5 christos {"wext", "=rt,%ra,%rb", ALU2_2 (WEXT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 995 1.1.1.5 christos {"wexti", "=rt,%ra,%ib5u", ALU2_2 (WEXTI), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 996 1.1.1.5 christos {"ukadd16", "=rt,%ra,%rb", ALU2_2 (UKADD16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 997 1.1.1.5 christos {"uksub16", "=rt,%ra,%rb", ALU2_2 (UKSUB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 998 1.1.1.5 christos {"ukcras16", "=rt,%ra,%rb", ALU2_2 (UKCRAS16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 999 1.1.1.5 christos {"ukcrsa16", "=rt,%ra,%rb", ALU2_2 (UKCRSA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1000 1.1.1.5 christos {"ukadd8", "=rt,%ra,%rb", ALU2_2 (UKADD8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1001 1.1.1.5 christos {"uksub8", "=rt,%ra,%rb", ALU2_2 (UKSUB8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1002 1.1.1.5 christos /* ONEOP. */ 1003 1.1.1.5 christos #define DSP_ONEOP(n) ((n) << 10) 1004 1.1.1.5 christos {"sunpkd810", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x0), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1005 1.1.1.5 christos {"sunpkd820", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x1), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1006 1.1.1.5 christos {"sunpkd830", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x2), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1007 1.1.1.5 christos {"sunpkd831", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x3), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1008 1.1.1.5 christos {"zunpkd810", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x4), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1009 1.1.1.5 christos {"zunpkd820", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x5), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1010 1.1.1.5 christos {"zunpkd830", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x6), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1011 1.1.1.5 christos {"zunpkd831", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x7), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1012 1.1.1.5 christos {"kabs", "=rt,%ra", ALU2 (ABS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 1013 1.1.1.5 christos {"kabs16", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0x8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1014 1.1.1.5 christos {"kabs8", "=rt,%ra", ALU2_2 (ONEOP) | DSP_ONEOP (0xc), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1015 1.1.1.5 christos {"insb", "=rt,%ra,%ib2u", ALU2_2 (ONEOP) | DSP_ONEOP (0x10), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1016 1.1.1.5 christos {"smbb", "=rt,%ra,%rb", ALU2_2 (SMBB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1017 1.1.1.5 christos {"smbt", "=rt,%ra,%rb", ALU2_2 (SMBT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1018 1.1.1.5 christos {"smtt", "=rt,%ra,%rb", ALU2_2 (SMTT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1019 1.1.1.5 christos {"kmabb", "=rt,%ra,%rb", ALU2_2 (KMABB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1020 1.1.1.5 christos {"kmabt", "=rt,%ra,%rb", ALU2_2 (KMABT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1021 1.1.1.5 christos {"kmatt", "=rt,%ra,%rb", ALU2_2 (KMATT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1022 1.1.1.5 christos {"kmda", "=rt,%ra,%rb", ALU2_2 (KMDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1023 1.1.1.5 christos {"kmxda", "=rt,%ra,%rb", ALU2_2 (KMXDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1024 1.1.1.5 christos {"kmada", "=rt,%ra,%rb", ALU2_2 (KMADA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1025 1.1.1.5 christos {"kmaxda", "=rt,%ra,%rb", ALU2_2 (KMAXDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1026 1.1.1.5 christos {"kmsda", "=rt,%ra,%rb", ALU2_2 (KMSDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1027 1.1.1.5 christos {"kmsxda", "=rt,%ra,%rb", ALU2_2 (KMSXDA), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1028 1.1.1.5 christos {"radd16", "=rt,%ra,%rb", ALU2_2 (RADD16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1029 1.1.1.5 christos {"rsub16", "=rt,%ra,%rb", ALU2_2 (RSUB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1030 1.1.1.5 christos {"rcras16", "=rt,%ra,%rb", ALU2_2 (RCRAS16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1031 1.1.1.5 christos {"rcrsa16", "=rt,%ra,%rb", ALU2_2 (RCRSA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1032 1.1.1.5 christos {"radd8", "=rt,%ra,%rb", ALU2_2 (RADD8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1033 1.1.1.5 christos {"rsub8", "=rt,%ra,%rb", ALU2_2 (RSUB8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1034 1.1.1.5 christos {"raddw", "=rt,%ra,%rb", ALU2_2 (RADDW), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1035 1.1.1.5 christos {"rsubw", "=rt,%ra,%rb", ALU2_2 (RSUBW), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1036 1.1.1.5 christos {"uradd16", "=rt,%ra,%rb", ALU2_2 (URADD16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1037 1.1.1.5 christos {"ursub16", "=rt,%ra,%rb", ALU2_2 (URSUB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1038 1.1.1.5 christos {"urcras16", "=rt,%ra,%rb", ALU2_2 (URCRAS16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1039 1.1.1.5 christos {"urcrsa16", "=rt,%ra,%rb", ALU2_2 (URCRSA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1040 1.1.1.5 christos {"uradd8", "=rt,%ra,%rb", ALU2_2 (URADD8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1041 1.1.1.5 christos {"ursub8", "=rt,%ra,%rb", ALU2_2 (URSUB8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1042 1.1.1.5 christos {"uraddw", "=rt,%ra,%rb", ALU2_2 (URADDW), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1043 1.1.1.5 christos {"ursubw", "=rt,%ra,%rb", ALU2_2 (URSUBW), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1044 1.1.1.5 christos {"add16", "=rt,%ra,%rb", ALU2_2 (ADD16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1045 1.1.1.5 christos {"sub16", "=rt,%ra,%rb", ALU2_2 (SUB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1046 1.1.1.5 christos {"cras16", "=rt,%ra,%rb", ALU2_2 (CRAS16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1047 1.1.1.5 christos {"crsa16", "=rt,%ra,%rb", ALU2_2 (CRSA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1048 1.1.1.5 christos {"add8", "=rt,%ra,%rb", ALU2_2 (ADD8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1049 1.1.1.5 christos {"sub8", "=rt,%ra,%rb", ALU2_2 (SUB8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1050 1.1.1.5 christos {"bitrev", "=rt,%ra,%rb", ALU2_2 (BITREV), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1051 1.1.1.5 christos {"bitrevi", "=rt,%ra,%ib5u", ALU2_2 (BITREVI), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1052 1.1.1.5 christos {"smmul", "=rt,%ra,%rb", ALU2_2 (SMMUL), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1053 1.1.1.5 christos {"smmul.u", "=rt,%ra,%rb", ALU2_2 (SMMULu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1054 1.1.1.5 christos {"kmmac", "=rt,%ra,%rb", ALU2_2 (KMMAC), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1055 1.1.1.5 christos {"kmmac.u", "=rt,%ra,%rb", ALU2_2 (KMMACu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1056 1.1.1.5 christos {"kmmsb", "=rt,%ra,%rb", ALU2_2 (KMMSB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1057 1.1.1.5 christos {"kmmsb.u", "=rt,%ra,%rb", ALU2_2 (KMMSBu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1058 1.1.1.5 christos {"kwmmul", "=rt,%ra,%rb", ALU2_2 (KWMMUL), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1059 1.1.1.5 christos {"kwmmul.u", "=rt,%ra,%rb", ALU2_2 (KWMMULu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1060 1.1.1.5 christos /* ALU2 Bit 9-6 = 0010. */ 1061 1.1.1.5 christos {"smmwb", "=rt,%ra,%rb", ALU2_3 (SMMWB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1062 1.1.1.5 christos {"smmwb.u", "=rt,%ra,%rb", ALU2_3 (SMMWBu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1063 1.1.1.5 christos {"smmwt", "=rt,%ra,%rb", ALU2_3 (SMMWT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1064 1.1.1.5 christos {"smmwt.u", "=rt,%ra,%rb", ALU2_3 (SMMWTu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1065 1.1.1.5 christos {"kmmawb", "=rt,%ra,%rb", ALU2_3 (KMMAWB), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1066 1.1.1.5 christos {"kmmawb.u", "=rt,%ra,%rb", ALU2_3 (KMMAWBu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1067 1.1.1.5 christos {"kmmawt", "=rt,%ra,%rb", ALU2_3 (KMMAWT), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1068 1.1.1.5 christos {"kmmawt.u", "=rt,%ra,%rb", ALU2_3 (KMMAWTu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1069 1.1.1.5 christos {"pktt16", "=rt,%ra,%rb", ALU2_3 (PKTT16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1070 1.1.1.5 christos {"pktb16", "=rt,%ra,%rb", ALU2_3 (PKTB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1071 1.1.1.5 christos {"pkbt16", "=rt,%ra,%rb", ALU2_3 (PKBT16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1072 1.1.1.5 christos {"pkbb16", "=rt,%ra,%rb", ALU2_3 (PKBB16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1073 1.1.1.5 christos {"sclip32", "=rt,%ra,%ib5u", ALU2 (CLIPS), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 1074 1.1.1.5 christos {"sclip16", "=rt,%ra,%ib4u", ALU2_3 (SCLIP16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1075 1.1.1.5 christos {"smax16", "=rt,%ra,%rb", ALU2_3 (SMAX16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1076 1.1.1.5 christos {"smax8", "=rt,%ra,%rb", ALU2_3 (SMAX8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1077 1.1.1.5 christos {"uclip32", "=rt,%ra,%ib5u", ALU2 (CLIP), 4, ATTR (PERF_EXT), 0, NULL, 0, NULL}, 1078 1.1.1.5 christos {"uclip16", "=rt,%ra,%ib4u", ALU2_3 (UCLIP16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1079 1.1.1.5 christos {"umax16", "=rt,%ra,%rb", ALU2_3 (UMAX16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1080 1.1.1.5 christos {"umax8", "=rt,%ra,%rb", ALU2_3 (UMAX8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1081 1.1.1.5 christos {"sra16", "=rt,%ra,%rb", ALU2_3 (SRA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1082 1.1.1.5 christos {"sra16.u", "=rt,%ra,%rb", ALU2_3 (SRA16u), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1083 1.1.1.5 christos {"srl16", "=rt,%ra,%rb", ALU2_3 (SRL16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1084 1.1.1.5 christos {"srl16.u", "=rt,%ra,%rb", ALU2_3 (SRL16u), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1085 1.1.1.5 christos {"sll16", "=rt,%ra,%rb", ALU2_3 (SLL16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1086 1.1.1.5 christos {"kslra16", "=rt,%ra,%rb", ALU2_3 (KSLRA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1087 1.1.1.5 christos {"ksll16", "=rt,%ra,%rb", ALU2_3 (KSLRA16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1088 1.1.1.5 christos {"kslra16.u", "=rt,%ra,%rb", ALU2_3 (KSLRA16u), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1089 1.1.1.5 christos {"sra.u", "=rt,%ra,%rb", ALU2_3 (SRAu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1090 1.1.1.5 christos {"srai16", "=rt,%ra,%ib4u", ALU2_3 (SRAI16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1091 1.1.1.5 christos {"srai16.u", "=rt,%ra,%ib4u", ALU2_3 (SRAI16u), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1092 1.1.1.5 christos {"srli16", "=rt,%ra,%ib4u", ALU2_3 (SRLI16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1093 1.1.1.5 christos {"srli16.u", "=rt,%ra,%ib4u", ALU2_3 (SRLI16u), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1094 1.1.1.5 christos {"slli16", "=rt,%ra,%ib4u", ALU2_3 (SLLI16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1095 1.1.1.5 christos {"kslli16", "=rt,%ra,%ib4u", ALU2_3 (KSLLI16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1096 1.1.1.5 christos {"kslli", "=rt,%ra,%ib5u", ALU2_3 (KSLLI), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1097 1.1.1.5 christos {"srai.u", "=rt,%ra,%ib5u", ALU2_3 (SRAIu), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1098 1.1.1.5 christos {"cmpeq16", "=rt,%ra,%rb", ALU2_3 (CMPEQ16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1099 1.1.1.5 christos {"scmplt16", "=rt,%ra,%rb", ALU2_3 (SCMPLT16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1100 1.1.1.5 christos {"scmple16", "=rt,%ra,%rb", ALU2_3 (SCMPLE16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1101 1.1.1.5 christos {"smin16", "=rt,%ra,%rb", ALU2_3 (SMIN16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1102 1.1.1.5 christos {"cmpeq8", "=rt,%ra,%rb", ALU2_3 (CMPEQ8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1103 1.1.1.5 christos {"scmplt8", "=rt,%ra,%rb", ALU2_3 (SCMPLT8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1104 1.1.1.5 christos {"scmple8", "=rt,%ra,%rb", ALU2_3 (SCMPLE8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1105 1.1.1.5 christos {"smin8", "=rt,%ra,%rb", ALU2_3 (SMIN8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1106 1.1.1.5 christos {"ucmplt16", "=rt,%ra,%rb", ALU2_3 (UCMPLT16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1107 1.1.1.5 christos {"ucmple16", "=rt,%ra,%rb", ALU2_3 (UCMPLE16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1108 1.1.1.5 christos {"umin16", "=rt,%ra,%rb", ALU2_3 (UMIN16), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1109 1.1.1.5 christos {"ucmplt8", "=rt,%ra,%rb", ALU2_3 (UCMPLT8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1110 1.1.1.5 christos {"ucmple8", "=rt,%ra,%rb", ALU2_3 (UCMPLE8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1111 1.1.1.5 christos {"umin8", "=rt,%ra,%rb", ALU2_3 (UMIN8), 4, ATTR (DSP_ISAEXT), 0, NULL, 0, NULL}, 1112 1.1.1.5 christos {"mtlbi", "%i16s1", BR2 (SOP0) | N32_BIT (20), 4, ATTR (ZOL) | ATTR (DSP_ISAEXT) | ATTR (PCREL), 0, NULL, 0, NULL}, 1113 1.1.1.5 christos {"mtlei", "%i16s1", BR2 (SOP0) | N32_BIT (21), 4, ATTR (ZOL) | ATTR (DSP_ISAEXT) | ATTR (PCREL), 0, NULL, 0, NULL}, 1114 1.1 christos {NULL, NULL, 0, 0, 0, 0, NULL, 0, NULL}, 1115 1.1 christos }; 1116 1.1 christos 1117 1.1.1.6 christos const keyword_t nds32_keyword_gpr[] = 1118 1.1 christos { 1119 1.1 christos /* Standard names. */ 1120 1.1 christos {"r0", 0, ATTR (RDREG)}, {"r1", 1, ATTR (RDREG)}, {"r2", 2, ATTR (RDREG)}, 1121 1.1 christos {"r3", 3, ATTR (RDREG)}, {"r4", 4, ATTR (RDREG)}, {"r5", 5, ATTR (RDREG)}, 1122 1.1 christos {"r6", 6, ATTR (RDREG)}, {"r7", 7, ATTR (RDREG)}, {"r8", 8, ATTR (RDREG)}, 1123 1.1 christos {"r9", 9, ATTR (RDREG)}, {"r10", 10, ATTR (RDREG)}, {"r11", 11, 0}, 1124 1.1 christos {"r12", 12, 0}, {"r13", 13, 0}, {"r14", 14, 0}, {"r15", 15, ATTR (RDREG)}, 1125 1.1 christos {"r16", 16, 0}, {"r17", 17, 0}, {"r18", 18, 0}, {"r19", 19, 0}, 1126 1.1 christos {"r20", 20, 0}, {"r21", 21, 0}, {"r22", 22, 0}, {"r23", 23, 0}, 1127 1.1 christos {"r24", 24, 0}, {"r25", 25, 0}, 1128 1.1 christos {"p0", 26, 0}, {"p1", 27, 0}, 1129 1.1 christos {"fp", 28, ATTR (RDREG)}, {"gp", 29, ATTR (RDREG)}, 1130 1.1 christos {"lp", 30, ATTR (RDREG)}, {"sp", 31, ATTR (RDREG)}, 1131 1.1 christos {"r26", 26, 0}, {"r27", 27, 0}, 1132 1.1 christos {"r28", 28, ATTR (RDREG)}, {"r29", 29, ATTR (RDREG)}, 1133 1.1 christos {"r30", 30, ATTR (RDREG)}, {"r31", 31, ATTR (RDREG)}, 1134 1.1 christos /* Names for parameter passing. */ 1135 1.1 christos {"a0", 0, ATTR (RDREG)}, {"a1", 1, ATTR (RDREG)}, 1136 1.1 christos {"a2", 2, ATTR (RDREG)}, {"a3", 3, ATTR (RDREG)}, 1137 1.1 christos {"a4", 4, ATTR (RDREG)}, {"a5", 5, ATTR (RDREG)}, 1138 1.1 christos /* Names reserved for 5-bit addressing only. */ 1139 1.1 christos {"s0", 6, ATTR (RDREG)}, {"s1", 7, ATTR (RDREG)}, 1140 1.1 christos {"s2", 8, ATTR (RDREG)}, {"s3", 9, ATTR (RDREG)}, 1141 1.1 christos {"s4", 10, ATTR (RDREG)}, {"s5", 11, 0}, {"s6", 12, 0}, {"s7", 13, 0}, 1142 1.1 christos {"s8", 14, 0}, {"s9", 28, ATTR (RDREG)}, 1143 1.1 christos {"ta", 15, ATTR (RDREG)}, 1144 1.1 christos {"t0", 16, 0}, {"t1", 17, 0}, {"t2", 18, 0}, {"t3", 19, 0}, 1145 1.1 christos {"t4", 20, 0}, {"t5", 21, 0}, {"t6", 22, 0}, {"t7", 23, 0}, 1146 1.1 christos {"t8", 24, 0}, {"t9", 25, 0}, 1147 1.1 christos /* Names reserved for 4-bit addressing only. */ 1148 1.1 christos {"h0", 0, ATTR (RDREG)}, {"h1", 1, ATTR (RDREG)}, 1149 1.1 christos {"h2", 2, ATTR (RDREG)}, {"h3", 3, ATTR (RDREG)}, 1150 1.1 christos {"h4", 4, ATTR (RDREG)}, {"h5", 5, ATTR (RDREG)}, 1151 1.1 christos {"h6", 6, ATTR (RDREG)}, {"h7", 7, ATTR (RDREG)}, 1152 1.1 christos {"h8", 8, ATTR (RDREG)}, {"h9", 9, ATTR (RDREG)}, 1153 1.1 christos {"h10", 10, ATTR (RDREG)}, {"h11", 11, 0}, 1154 1.1 christos {"h12", 16, 0}, {"h13", 17, 0}, {"h14", 18, 0}, {"h15", 19, 0}, 1155 1.1 christos /* Names reserved for 3-bit addressing only. */ 1156 1.1 christos {"o0", 0, ATTR (RDREG)}, {"o1", 1, ATTR (RDREG)}, 1157 1.1 christos {"o2", 2, ATTR (RDREG)}, {"o3", 3, ATTR (RDREG)}, 1158 1.1 christos {"o4", 4, ATTR (RDREG)}, {"o5", 5, ATTR (RDREG)}, 1159 1.1 christos {"o6", 6, ATTR (RDREG)}, {"o7", 7, ATTR (RDREG)}, 1160 1.1 christos {NULL, 0, 0} 1161 1.1 christos }; 1162 1.1 christos 1163 1.1.1.6 christos static const keyword_t keyword_usr[] = 1164 1.1 christos { 1165 1.1 christos {"d0.lo", USRIDX (0, 0), 0}, 1166 1.1 christos {"d0.hi", USRIDX (0, 1), 0}, 1167 1.1 christos {"d1.lo", USRIDX (0, 2), 0}, 1168 1.1 christos {"d1.hi", USRIDX (0, 3), 0}, 1169 1.1.1.5 christos {"lb", USRIDX (0, 25), 0}, 1170 1.1.1.5 christos {"le", USRIDX (0, 26), 0}, 1171 1.1.1.5 christos {"lc", USRIDX (0, 27), 0}, 1172 1.1 christos {"itb", USRIDX (0, 28), 0}, 1173 1.1 christos {"ifc_lp", USRIDX (0, 29), 0}, 1174 1.1 christos {"pc", USRIDX (0, 31), 0}, 1175 1.1 christos 1176 1.1 christos {"dma_cfg", USRIDX (1, 0), 0}, 1177 1.1 christos {"dma_gcsw", USRIDX (1, 1), 0}, 1178 1.1 christos {"dma_chnsel", USRIDX (1, 2), 0}, 1179 1.1 christos {"dma_act", USRIDX (1, 3), 0}, 1180 1.1 christos {"dma_setup", USRIDX (1, 4), 0}, 1181 1.1 christos {"dma_isaddr", USRIDX (1, 5), 0}, 1182 1.1 christos {"dma_esaddr", USRIDX (1, 6), 0}, 1183 1.1 christos {"dma_tcnt", USRIDX (1, 7), 0}, 1184 1.1 christos {"dma_status", USRIDX (1, 8), 0}, 1185 1.1 christos {"dma_2dset", USRIDX (1, 9), 0}, 1186 1.1 christos {"dma_rcnt", USRIDX (1, 23), 0}, 1187 1.1 christos {"dma_hstatus", USRIDX (1, 24), 0}, 1188 1.1 christos {"dma_2dsctl", USRIDX (1, 25), 0}, 1189 1.1 christos 1190 1.1 christos {"pfmc0", USRIDX (2, 0), 0}, 1191 1.1 christos {"pfmc1", USRIDX (2, 1), 0}, 1192 1.1 christos {"pfmc2", USRIDX (2, 2), 0}, 1193 1.1 christos {"pfm_ctl", USRIDX (2, 4), 0}, 1194 1.1 christos 1195 1.1 christos {NULL, 0, 0} 1196 1.1 christos }; 1197 1.1 christos 1198 1.1.1.6 christos static const keyword_t keyword_dxr[] = 1199 1.1 christos { 1200 1.1 christos {"d0", 0, 0}, {"d1", 1, 0}, {NULL, 0, 0} 1201 1.1 christos }; 1202 1.1 christos 1203 1.1.1.6 christos static const keyword_t keyword_sr[] = 1204 1.1 christos { 1205 1.1 christos {"cpu_ver", SRIDX (0, 0, 0), 0}, {"cr0", SRIDX (0, 0, 0), 0}, 1206 1.1 christos {"icm_cfg", SRIDX (0, 1, 0), 0}, {"cr1", SRIDX (0, 1, 0), 0}, 1207 1.1 christos {"dcm_cfg", SRIDX (0, 2, 0), 0}, {"cr2", SRIDX (0, 2, 0), 0}, 1208 1.1 christos {"mmu_cfg", SRIDX (0, 3, 0), 0}, {"cr3", SRIDX (0, 3, 0), 0}, 1209 1.1 christos {"msc_cfg", SRIDX (0, 4, 0), 0}, {"cr4", SRIDX (0, 4, 0), 0}, 1210 1.1 christos {"msc_cfg2", SRIDX (0, 4, 1), 0}, {"cr7", SRIDX (0, 4, 1), 0}, 1211 1.1 christos {"core_id", SRIDX (0, 0, 1), 0}, {"cr5", SRIDX (0, 0, 1), 0}, 1212 1.1 christos {"fucop_exist", SRIDX (0, 5, 0), 0}, {"cr6", SRIDX (0, 5, 0), 0}, 1213 1.1 christos 1214 1.1 christos {"psw", SRIDX (1, 0, 0), 0}, {"ir0", SRIDX (1, 0, 0), 0}, 1215 1.1 christos {"ipsw", SRIDX (1, 0, 1), 0}, {"ir1", SRIDX (1, 0, 1), 0}, 1216 1.1 christos {"p_ipsw", SRIDX (1, 0, 2), 0}, {"ir2", SRIDX (1, 0, 2), 0}, 1217 1.1 christos {"ivb", SRIDX (1, 1, 1), 0}, {"ir3", SRIDX (1, 1, 1), 0}, 1218 1.1 christos {"eva", SRIDX (1, 2, 1), 0}, {"ir4", SRIDX (1, 2, 1), 0}, 1219 1.1 christos {"p_eva", SRIDX (1, 2, 2), 0}, {"ir5", SRIDX (1, 2, 2), 0}, 1220 1.1 christos {"itype", SRIDX (1, 3, 1), 0}, {"ir6", SRIDX (1, 3, 1), 0}, 1221 1.1 christos {"p_itype", SRIDX (1, 3, 2), 0}, {"ir7", SRIDX (1, 3, 2), 0}, 1222 1.1 christos {"merr", SRIDX (1, 4, 1), 0}, {"ir8", SRIDX (1, 4, 1), 0}, 1223 1.1 christos {"ipc", SRIDX (1, 5, 1), 0}, {"ir9", SRIDX (1, 5, 1), 0}, 1224 1.1 christos {"p_ipc", SRIDX (1, 5, 2), 0}, {"ir10", SRIDX (1, 5, 2), 0}, 1225 1.1 christos {"oipc", SRIDX (1, 5, 3), 0}, {"ir11", SRIDX (1, 5, 3), 0}, 1226 1.1.1.5 christos {"dipc", SRIDX (1, 5, 3), 0}, 1227 1.1 christos {"p_p0", SRIDX (1, 6, 2), 0}, {"ir12", SRIDX (1, 6, 2), 0}, 1228 1.1 christos {"p_p1", SRIDX (1, 7, 2), 0}, {"ir13", SRIDX (1, 7, 2), 0}, 1229 1.1 christos {"int_mask", SRIDX (1, 8, 0), 0}, {"ir14", SRIDX (1, 8, 0), 0}, 1230 1.1 christos {"int_pend", SRIDX (1, 9, 0), 0}, {"ir15", SRIDX (1, 9, 0), 0}, 1231 1.1 christos {"sp_usr", SRIDX (1, 10, 0), 0}, {"ir16", SRIDX (1, 10, 0), 0}, 1232 1.1 christos {"sp_priv", SRIDX (1, 10, 1), 0}, {"ir17", SRIDX (1, 10, 1), 0}, 1233 1.1 christos {"int_pri", SRIDX (1, 11, 0), 0}, {"ir18", SRIDX (1, 11, 0), 0}, 1234 1.1 christos {"int_ctrl", SRIDX (1, 1, 2), 0}, {"ir19", SRIDX (1, 1, 2), 0}, 1235 1.1 christos {"sp_usr1", SRIDX (1, 10, 2), 0}, {"ir20", SRIDX (1, 10, 2), 0}, 1236 1.1 christos {"sp_priv1", SRIDX (1, 10, 3), 0}, {"ir21", SRIDX (1, 10, 3), 0}, 1237 1.1 christos {"sp_usr2", SRIDX (1, 10, 4), 0}, {"ir22", SRIDX (1, 10, 4), 0}, 1238 1.1 christos {"sp_priv2", SRIDX (1, 10, 5), 0}, {"ir23", SRIDX (1, 10, 5), 0}, 1239 1.1 christos {"sp_usr3", SRIDX (1, 10, 6), 0}, {"ir24", SRIDX (1, 10, 6), 0}, 1240 1.1 christos {"sp_priv3", SRIDX (1, 10, 7), 0}, {"ir25", SRIDX (1, 10, 7), 0}, 1241 1.1 christos {"int_mask2", SRIDX (1, 8, 1), 0}, {"ir26", SRIDX (1, 8, 1), 0}, 1242 1.1 christos {"int_pend2", SRIDX (1, 9, 1), 0}, {"ir27", SRIDX (1, 9, 1), 0}, 1243 1.1 christos {"int_pri2", SRIDX (1, 11, 1), 0}, {"ir28", SRIDX (1, 11, 1), 0}, 1244 1.1 christos {"int_trigger", SRIDX (1, 9, 4), 0}, {"ir29", SRIDX (1, 9, 4), 0}, 1245 1.1 christos {"int_gpr_push_dis", SRIDX(1, 1, 3), 0}, {"ir30", SRIDX (1, 1, 3), 0}, 1246 1.1.1.5 christos {"int_mask3", SRIDX(1, 8, 2), 0}, {"ir31", SRIDX (1, 8, 2), 0}, 1247 1.1.1.5 christos {"int_pend3", SRIDX(1, 9, 2), 0}, {"ir32", SRIDX (1, 9, 2), 0}, 1248 1.1.1.5 christos {"int_pri3", SRIDX(1, 11, 2), 0}, {"ir33", SRIDX (1, 11, 2), 0}, 1249 1.1.1.5 christos {"int_pri4", SRIDX(1, 11, 3), 0}, {"ir34", SRIDX (1, 11, 3), 0}, 1250 1.1.1.5 christos {"int_trigger2", SRIDX(1, 9, 5), 0}, {"ir35", SRIDX (1, 9, 5), 0}, 1251 1.1 christos 1252 1.1 christos {"mmu_ctl", SRIDX (2, 0, 0), 0}, {"mr0", SRIDX (2, 0, 0), 0}, 1253 1.1 christos {"l1_pptb", SRIDX (2, 1, 0), 0}, {"mr1", SRIDX (2, 1, 0), 0}, 1254 1.1 christos {"tlb_vpn", SRIDX (2, 2, 0), 0}, {"mr2", SRIDX (2, 2, 0), 0}, 1255 1.1 christos {"tlb_data", SRIDX (2, 3, 0), 0}, {"mr3", SRIDX (2, 3, 0), 0}, 1256 1.1 christos {"tlb_misc", SRIDX (2, 4, 0), 0}, {"mr4", SRIDX (2, 4, 0), 0}, 1257 1.1 christos {"vlpt_idx", SRIDX (2, 5, 0), 0}, {"mr5", SRIDX (2, 5, 0), 0}, 1258 1.1 christos {"ilmb", SRIDX (2, 6, 0), 0}, {"mr6", SRIDX (2, 6, 0), 0}, 1259 1.1 christos {"dlmb", SRIDX (2, 7, 0), 0}, {"mr7", SRIDX (2, 7, 0), 0}, 1260 1.1 christos {"cache_ctl", SRIDX (2, 8, 0), 0}, {"mr8", SRIDX (2, 8, 0), 0}, 1261 1.1 christos {"hsmp_saddr", SRIDX (2, 9, 0), 0}, {"mr9", SRIDX (2, 9, 0), 0}, 1262 1.1 christos {"hsmp_eaddr", SRIDX (2, 9, 1), 0}, {"mr10", SRIDX (2, 9, 1), 0}, 1263 1.1 christos {"bg_region", SRIDX (2, 0, 1), 0}, {"mr11", SRIDX (2, 0, 1), 0}, 1264 1.1 christos 1265 1.1 christos {"pfmc0", SRIDX (4, 0, 0), 0}, {"pfr0", SRIDX (4, 0, 0), 0}, 1266 1.1 christos {"pfmc1", SRIDX (4, 0, 1), 0}, {"pfr1", SRIDX (4, 0, 1), 0}, 1267 1.1 christos {"pfmc2", SRIDX (4, 0, 2), 0}, {"pfr2", SRIDX (4, 0, 2), 0}, 1268 1.1 christos {"pfm_ctl", SRIDX (4, 1, 0), 0}, {"pfr3", SRIDX (4, 1, 0), 0}, 1269 1.1.1.5 christos {"pft_ctl", SRIDX (4, 2, 0), 0}, {"pfr4", SRIDX (4, 2, 0), 0}, 1270 1.1 christos {"hsp_ctl", SRIDX (4, 6, 0), 0}, {"hspr0", SRIDX (4, 6, 0), 0}, 1271 1.1 christos {"sp_bound", SRIDX (4, 6, 1), 0}, {"hspr1", SRIDX (4, 6, 1), 0}, 1272 1.1 christos {"sp_bound_priv", SRIDX (4, 6, 2), 0},{"hspr2", SRIDX (4, 6, 2), 0}, 1273 1.1.1.5 christos {"sp_base", SRIDX (4, 6, 3), 0}, {"hspr3", SRIDX (4, 6, 3), 0}, 1274 1.1.1.5 christos {"sp_base_priv", SRIDX (4, 6, 4), 0}, {"hspr4", SRIDX (4, 6, 4), 0}, 1275 1.1 christos 1276 1.1 christos {"dma_cfg", SRIDX (5, 0, 0), 0}, {"dmar0", SRIDX (5, 0, 0), 0}, 1277 1.1 christos {"dma_gcsw", SRIDX (5, 1, 0), 0}, {"dmar1", SRIDX (5, 1, 0), 0}, 1278 1.1 christos {"dma_chnsel", SRIDX (5, 2, 0), 0}, {"dmar2", SRIDX (5, 2, 0), 0}, 1279 1.1 christos {"dma_act", SRIDX (5, 3, 0), 0}, {"dmar3", SRIDX (5, 3, 0), 0}, 1280 1.1 christos {"dma_setup", SRIDX (5, 4, 0), 0}, {"dmar4", SRIDX (5, 4, 0), 0}, 1281 1.1 christos {"dma_isaddr", SRIDX (5, 5, 0), 0}, {"dmar5", SRIDX (5, 5, 0), 0}, 1282 1.1 christos {"dma_esaddr", SRIDX (5, 6, 0), 0}, {"dmar6", SRIDX (5, 6, 0), 0}, 1283 1.1 christos {"dma_tcnt", SRIDX (5, 7, 0), 0}, {"dmar7", SRIDX (5, 7, 0), 0}, 1284 1.1 christos {"dma_status", SRIDX (5, 8, 0), 0}, {"dmar8", SRIDX (5, 8, 0), 0}, 1285 1.1 christos {"dma_2dset", SRIDX (5, 9, 0), 0}, {"dmar9", SRIDX (5, 9, 0), 0}, 1286 1.1 christos {"dma_2dsctl", SRIDX (5, 9, 1), 0}, {"dmar10", SRIDX (5, 9, 1), 0}, 1287 1.1 christos {"dma_rcnt", SRIDX (5, 7, 1), 0}, {"dmar11", SRIDX (5, 7, 1), 0}, 1288 1.1 christos {"dma_hstatus", SRIDX (5, 8, 1), 0}, {"dmar12", SRIDX (5, 8, 1), 0}, 1289 1.1 christos 1290 1.1 christos {"sdz_ctl", SRIDX (2, 15, 0), 0}, {"idr0", SRIDX (2, 15, 0), 0}, 1291 1.1 christos {"misc_ctl", SRIDX (2, 15, 1), 0}, {"n12misc_ctl", SRIDX (2, 15, 1), 0}, 1292 1.1 christos {"idr1", SRIDX (2, 15, 1), 0}, 1293 1.1 christos {"ecc_misc", SRIDX (2, 15, 2), 0}, {"idr2", SRIDX (2, 15, 2), 0}, 1294 1.1 christos 1295 1.1 christos {"secur0", SRIDX (6, 0, 0), 0}, {"sfcr", SRIDX (6, 0, 0), 0}, 1296 1.1 christos {"secur1", SRIDX (6, 1, 0), 0}, {"sign", SRIDX (6, 1, 0), 0}, 1297 1.1.1.5 christos {"secur2", SRIDX (6, 1, 1), 0}, {"isign", SRIDX (6, 1, 1), 0}, 1298 1.1.1.5 christos {"secur3", SRIDX (6, 1, 2), 0}, {"p_isign", SRIDX (6, 1, 2), 0}, 1299 1.1 christos 1300 1.1 christos {"prusr_acc_ctl", SRIDX (4, 4, 0), 0}, 1301 1.1 christos {"fucpr", SRIDX (4, 5, 0), 0}, {"fucop_ctl", SRIDX (4, 5, 0), 0}, 1302 1.1 christos 1303 1.1 christos {"bpc0", SRIDX (3, 0, 0), 0}, {"dr0", SRIDX (3, 0, 0), 0}, 1304 1.1.1.5 christos {"bpc1", SRIDX (3, 0, 1), 0}, {"dr5", SRIDX (3, 0, 1), 0}, 1305 1.1.1.5 christos {"bpc2", SRIDX (3, 0, 2), 0}, {"dr10", SRIDX (3, 0, 2), 0}, 1306 1.1.1.5 christos {"bpc3", SRIDX (3, 0, 3), 0}, {"dr15", SRIDX (3, 0, 3), 0}, 1307 1.1.1.5 christos {"bpc4", SRIDX (3, 0, 4), 0}, {"dr20", SRIDX (3, 0, 4), 0}, 1308 1.1.1.5 christos {"bpc5", SRIDX (3, 0, 5), 0}, {"dr25", SRIDX (3, 0, 5), 0}, 1309 1.1.1.5 christos {"bpc6", SRIDX (3, 0, 6), 0}, {"dr30", SRIDX (3, 0, 6), 0}, 1310 1.1.1.5 christos {"bpc7", SRIDX (3, 0, 7), 0}, {"dr35", SRIDX (3, 0, 7), 0}, 1311 1.1.1.5 christos {"bpa0", SRIDX (3, 1, 0), 0}, {"dr1", SRIDX (3, 1, 0), 0}, 1312 1.1.1.5 christos {"bpa1", SRIDX (3, 1, 1), 0}, {"dr6", SRIDX (3, 1, 1), 0}, 1313 1.1.1.5 christos {"bpa2", SRIDX (3, 1, 2), 0}, {"dr11", SRIDX (3, 1, 2), 0}, 1314 1.1.1.5 christos {"bpa3", SRIDX (3, 1, 3), 0}, {"dr16", SRIDX (3, 1, 3), 0}, 1315 1.1.1.5 christos {"bpa4", SRIDX (3, 1, 4), 0}, {"dr21", SRIDX (3, 1, 4), 0}, 1316 1.1.1.5 christos {"bpa5", SRIDX (3, 1, 5), 0}, {"dr26", SRIDX (3, 1, 5), 0}, 1317 1.1.1.5 christos {"bpa6", SRIDX (3, 1, 6), 0}, {"dr31", SRIDX (3, 1, 6), 0}, 1318 1.1.1.5 christos {"bpa7", SRIDX (3, 1, 7), 0}, {"dr36", SRIDX (3, 1, 7), 0}, 1319 1.1.1.5 christos {"bpam0", SRIDX (3, 2, 0), 0}, {"dr2", SRIDX (3, 2, 0), 0}, 1320 1.1.1.5 christos {"bpam1", SRIDX (3, 2, 1), 0}, {"dr7", SRIDX (3, 2, 1), 0}, 1321 1.1.1.5 christos {"bpam2", SRIDX (3, 2, 2), 0}, {"dr12", SRIDX (3, 2, 2), 0}, 1322 1.1.1.5 christos {"bpam3", SRIDX (3, 2, 3), 0}, {"dr17", SRIDX (3, 2, 3), 0}, 1323 1.1.1.5 christos {"bpam4", SRIDX (3, 2, 4), 0}, {"dr22", SRIDX (3, 2, 4), 0}, 1324 1.1.1.5 christos {"bpam5", SRIDX (3, 2, 5), 0}, {"dr27", SRIDX (3, 2, 5), 0}, 1325 1.1.1.5 christos {"bpam6", SRIDX (3, 2, 6), 0}, {"dr32", SRIDX (3, 2, 6), 0}, 1326 1.1.1.5 christos {"bpam7", SRIDX (3, 2, 7), 0}, {"dr37", SRIDX (3, 2, 7), 0}, 1327 1.1.1.5 christos {"bpv0", SRIDX (3, 3, 0), 0}, {"dr3", SRIDX (3, 3, 0), 0}, 1328 1.1.1.5 christos {"bpv1", SRIDX (3, 3, 1), 0}, {"dr8", SRIDX (3, 3, 1), 0}, 1329 1.1.1.5 christos {"bpv2", SRIDX (3, 3, 2), 0}, {"dr13", SRIDX (3, 3, 2), 0}, 1330 1.1.1.5 christos {"bpv3", SRIDX (3, 3, 3), 0}, {"dr18", SRIDX (3, 3, 3), 0}, 1331 1.1.1.5 christos {"bpv4", SRIDX (3, 3, 4), 0}, {"dr23", SRIDX (3, 3, 4), 0}, 1332 1.1.1.5 christos {"bpv5", SRIDX (3, 3, 5), 0}, {"dr28", SRIDX (3, 3, 5), 0}, 1333 1.1.1.5 christos {"bpv6", SRIDX (3, 3, 6), 0}, {"dr33", SRIDX (3, 3, 6), 0}, 1334 1.1.1.5 christos {"bpv7", SRIDX (3, 3, 7), 0}, {"dr38", SRIDX (3, 3, 7), 0}, 1335 1.1.1.5 christos {"bpcid0", SRIDX (3, 4, 0), 0}, {"dr4", SRIDX (3, 4, 0), 0}, 1336 1.1.1.5 christos {"bpcid1", SRIDX (3, 4, 1), 0}, {"dr9", SRIDX (3, 4, 1), 0}, 1337 1.1.1.5 christos {"bpcid2", SRIDX (3, 4, 2), 0}, {"dr14", SRIDX (3, 4, 2), 0}, 1338 1.1.1.5 christos {"bpcid3", SRIDX (3, 4, 3), 0}, {"dr19", SRIDX (3, 4, 3), 0}, 1339 1.1.1.5 christos {"bpcid4", SRIDX (3, 4, 4), 0}, {"dr24", SRIDX (3, 4, 4), 0}, 1340 1.1.1.5 christos {"bpcid5", SRIDX (3, 4, 5), 0}, {"dr29", SRIDX (3, 4, 5), 0}, 1341 1.1.1.5 christos {"bpcid6", SRIDX (3, 4, 6), 0}, {"dr34", SRIDX (3, 4, 6), 0}, 1342 1.1 christos {"bpcid7", SRIDX (3, 4, 7), 0}, {"dr39", SRIDX (3, 4, 7), 0}, 1343 1.1 christos {"edm_cfg", SRIDX (3, 5, 0), 0}, {"dr40", SRIDX (3, 5, 0), 0}, 1344 1.1 christos {"edmsw", SRIDX (3, 6, 0), 0}, {"dr41", SRIDX (3, 6, 0), 0}, 1345 1.1 christos {"edm_ctl", SRIDX (3, 7, 0), 0}, {"dr42", SRIDX (3, 7, 0), 0}, 1346 1.1 christos {"edm_dtr", SRIDX (3, 8, 0), 0}, {"dr43", SRIDX (3, 8, 0), 0}, 1347 1.1 christos {"bpmtc", SRIDX (3, 9, 0), 0}, {"dr44", SRIDX (3, 9, 0), 0}, 1348 1.1 christos {"dimbr", SRIDX (3, 10, 0), 0}, {"dr45", SRIDX (3, 10, 0), 0}, 1349 1.1 christos {"tecr0", SRIDX (3, 14, 0), 0}, {"dr46", SRIDX (3, 14, 0), 0}, 1350 1.1 christos {"tecr1", SRIDX (3, 14, 1), 0}, {"dr47", SRIDX (3, 14, 1), 0}, 1351 1.1 christos {NULL,0 ,0} 1352 1.1 christos }; 1353 1.1 christos 1354 1.1.1.6 christos static const keyword_t keyword_cp[] = 1355 1.1 christos { 1356 1.1 christos {"cp0", 0, 0}, {"cp1", 1, 0}, {"cp2", 2, 0}, {"cp3", 3, 0}, {NULL, 0, 0} 1357 1.1 christos }; 1358 1.1 christos 1359 1.1.1.6 christos static const keyword_t keyword_cpr[] = 1360 1.1 christos { 1361 1.1 christos {"cpr0", 0, 0}, {"cpr1", 1, 0}, {"cpr2", 2, 0}, {"cpr3", 3, 0}, 1362 1.1 christos {"cpr4", 4, 0}, {"cpr5", 5, 0}, {"cpr6", 6, 0}, {"cpr7", 7, 0}, 1363 1.1 christos {"cpr8", 8, 0}, {"cpr9", 9, 0}, {"cpr10", 10, 0}, {"cpr11", 11, 0}, 1364 1.1 christos {"cpr12", 12, 0}, {"cpr13", 13, 0}, {"cpr14", 14, 0}, {"cpr15", 15, 0}, 1365 1.1 christos {"cpr16", 16, 0}, {"cpr17", 17, 0}, {"cpr18", 18, 0}, {"cpr19", 19, 0}, 1366 1.1 christos {"cpr20", 20, 0}, {"cpr21", 21, 0}, {"cpr22", 22, 0}, {"cpr23", 23, 0}, 1367 1.1 christos {"cpr24", 24, 0}, {"cpr25", 25, 0}, {"cpr26", 26, 0}, {"cpr27", 27, 0}, 1368 1.1 christos {"cpr28", 28, 0}, {"cpr29", 29, 0}, {"cpr30", 30, 0}, {"cpr31", 31, 0}, 1369 1.1 christos {NULL, 0, 0} 1370 1.1 christos }; 1371 1.1 christos 1372 1.1.1.6 christos static const keyword_t keyword_fsr[] = 1373 1.1 christos { 1374 1.1 christos {"fs0", 0, 0}, {"fs1", 1, 0}, {"fs2", 2, 0}, {"fs3", 3, 0}, {"fs4", 4, 0}, 1375 1.1 christos {"fs5", 5, 0}, {"fs6", 6, 0}, {"fs7", 7, 0}, {"fs8", 8, 0}, {"fs9", 9, 0}, 1376 1.1 christos {"fs10", 10, 0}, {"fs11", 11, 0}, {"fs12", 12, 0}, {"fs13", 13, 0}, 1377 1.1 christos {"fs14", 14, 0}, {"fs15", 15, 0}, {"fs16", 16, 0}, {"fs17", 17, 0}, 1378 1.1 christos {"fs18", 18, 0}, {"fs19", 19, 0}, {"fs20", 20, 0}, {"fs21", 21, 0}, 1379 1.1 christos {"fs22", 22, 0}, {"fs23", 23, 0}, {"fs24", 24, 0}, {"fs25", 25, 0}, 1380 1.1 christos {"fs26", 26, 0}, {"fs27", 27, 0}, {"fs28", 28, 0}, {"fs29", 29, 0}, 1381 1.1 christos {"fs30", 30, 0}, {"fs31", 31, 0}, {NULL, 0 ,0} 1382 1.1 christos }; 1383 1.1 christos 1384 1.1.1.6 christos static const keyword_t keyword_fdr[] = 1385 1.1 christos { 1386 1.1 christos {"fd0", 0, 0}, {"fd1", 1, 0}, {"fd2", 2, 0}, {"fd3", 3, 0}, {"fd4", 4, 0}, 1387 1.1 christos {"fd5", 5, 0}, {"fd6", 6, 0}, {"fd7", 7, 0}, {"fd8", 8, 0}, {"fd9", 9, 0}, 1388 1.1 christos {"fd10", 10, 0}, {"fd11", 11, 0}, {"fd12", 12, 0}, {"fd13", 13, 0}, 1389 1.1 christos {"fd14", 14, 0}, {"fd15", 15, 0}, {"fd16", 16, 0}, {"fd17", 17, 0}, 1390 1.1 christos {"fd18", 18, 0}, {"fd19", 19, 0}, {"fd20", 20, 0}, {"fd21", 21, 0}, 1391 1.1 christos {"fd22", 22, 0}, {"fd23", 23, 0}, {"fd24", 24, 0}, {"fd25", 25, 0}, 1392 1.1 christos {"fd26", 26, 0}, {"fd27", 27, 0}, {"fd28", 28, 0}, {"fd29", 29, 0}, 1393 1.1 christos {"fd30", 30, 0}, {"fd31", 31, 0}, {NULL, 0, 0} 1394 1.1 christos }; 1395 1.1 christos 1396 1.1.1.6 christos static const keyword_t keyword_abdim[] = 1397 1.1 christos { 1398 1.1 christos {"bi", 0, 0}, {"bim", 1, 0}, {"bd", 2, 0}, {"bdm", 3, 0}, 1399 1.1 christos {"ai", 4, 0}, {"aim", 5, 0}, {"ad", 6, 0}, {"adm", 7, 0}, 1400 1.1 christos {NULL, 0, 0} 1401 1.1 christos }; 1402 1.1 christos 1403 1.1.1.6 christos static const keyword_t keyword_abm[] = 1404 1.1 christos { 1405 1.1 christos {"b", 0, 0}, {"bm", 1, 0}, {"bx", 2, 0}, {"bmx", 3, 0}, 1406 1.1 christos {"a", 4, 0}, {"am", 5, 0}, {"ax", 6, 0}, {"amx", 7, 0}, 1407 1.1 christos {NULL, 0, 0} 1408 1.1 christos }; 1409 1.1 christos 1410 1.1 christos static const keyword_t keyword_dtiton[] = 1411 1.1 christos { 1412 1.1 christos {"iton", 1, 0}, {"ton", 3, 0}, {NULL, 0, 0} 1413 1.1 christos }; 1414 1.1 christos 1415 1.1 christos static const keyword_t keyword_dtitoff[] = 1416 1.1 christos { 1417 1.1 christos {"itoff", 1, 0}, {"toff", 3, 0}, {NULL, 0, 0} 1418 1.1 christos }; 1419 1.1 christos 1420 1.1.1.6 christos static const keyword_t keyword_dpref_st[] = 1421 1.1 christos { 1422 1.1 christos {"srd", 0, 0}, {"mrd", 1, 0}, {"swr", 2, 0}, {"mwr", 3, 0}, 1423 1.1 christos {"pte", 4, 0}, {"clwr", 5, 0}, {NULL, 0, 0} 1424 1.1 christos }; 1425 1.1 christos 1426 1.1 christos /* CCTL Ra, SubType. */ 1427 1.1 christos static const keyword_t keyword_cctl_st0[] = 1428 1.1 christos { 1429 1.1 christos {"l1d_ix_inval", 0X0, 0}, {"l1d_ix_wb", 0X1, 0}, {"l1d_ix_wbinval", 0X2, 0}, 1430 1.1 christos {"l1d_va_fillck", 0XB, 0}, {"l1d_va_ulck", 0XC, 0}, {"l1i_ix_inval", 0X10, 0}, 1431 1.1 christos {"l1i_va_fillck", 0X1B, 0}, {"l1i_va_ulck", 0X1C, 0}, 1432 1.1 christos {NULL, 0, 0} 1433 1.1 christos }; 1434 1.1 christos 1435 1.1 christos /* CCTL Ra, SubType, level. */ 1436 1.1 christos static const keyword_t keyword_cctl_st1[] = 1437 1.1 christos { 1438 1.1 christos {"l1d_va_inval", 0X8, 0}, {"l1d_va_wb", 0X9, 0}, 1439 1.1 christos {"l1d_va_wbinval", 0XA, 0}, {"l1i_va_inval", 0X18, 0}, 1440 1.1 christos {NULL, 0, 0} 1441 1.1 christos }; 1442 1.1 christos 1443 1.1 christos /* CCTL Rt, Ra, SubType. */ 1444 1.1 christos static const keyword_t keyword_cctl_st2[] = 1445 1.1 christos { 1446 1.1 christos {"l1d_ix_rtag", 0X3, 0}, {"l1d_ix_rwd", 0X4, 0}, 1447 1.1 christos {"l1i_ix_rtag", 0X13, 0}, {"l1i_ix_rwd", 0X14, 0}, 1448 1.1 christos {NULL, 0, 0} 1449 1.1 christos }; 1450 1.1 christos 1451 1.1 christos /* CCTL Rb, Ra, SubType. */ 1452 1.1 christos static const keyword_t keyword_cctl_st3[] = 1453 1.1 christos { 1454 1.1 christos {"l1d_ix_wtag", 0X5, 0}, {"l1d_ix_wwd", 0X6, 0}, 1455 1.1 christos {"l1i_ix_wtag", 0X15, 0}, {"l1i_ix_wwd", 0X16, 0}, 1456 1.1 christos {NULL, 0, 0} 1457 1.1 christos }; 1458 1.1 christos 1459 1.1 christos /* CCTL L1D_INVALALL. */ 1460 1.1 christos static const keyword_t keyword_cctl_st4[] = 1461 1.1 christos { 1462 1.1 christos {"l1d_invalall", 0x7, 0}, {NULL, 0, 0} 1463 1.1 christos }; 1464 1.1 christos 1465 1.1 christos /* CCTL L1D_WBALL, level. */ 1466 1.1 christos static const keyword_t keyword_cctl_st5[] = 1467 1.1 christos { 1468 1.1 christos {"l1d_wball", 0xf, 0}, {NULL, 0, 0} 1469 1.1 christos }; 1470 1.1 christos 1471 1.1.1.6 christos static const keyword_t keyword_cctl_lv[] = 1472 1.1 christos { 1473 1.1 christos {"1level", 0, 0}, {"alevel", 1, 0}, {"0", 0, 0}, {"1", 1, 0}, 1474 1.1 christos {NULL, 0, 0}, 1475 1.1 christos }; 1476 1.1 christos 1477 1.1 christos static const keyword_t keyword_tlbop_st[] = 1478 1.1 christos { 1479 1.1 christos {"targetread", 0, 0}, {"trd", 0, 0}, 1480 1.1 christos {"targetwrite", 1, 0}, {"twr", 1, 0}, 1481 1.1 christos {"rwrite", 2, 0}, {"rwr", 2, 0}, 1482 1.1 christos {"rwritelock", 3, 0}, {"rwlk", 3, 0}, 1483 1.1 christos {"unlock", 4, 0}, {"unlk", 4, 0}, 1484 1.1 christos {"invalidate", 6, 0}, {"inv", 6, 0}, 1485 1.1 christos {NULL, 0, 0}, 1486 1.1 christos }; 1487 1.1 christos 1488 1.1.1.6 christos static const keyword_t keyword_standby_st[] = 1489 1.1 christos { 1490 1.1 christos {"no_wake_grant", 0, 0}, 1491 1.1 christos {"wake_grant", 1, 0}, 1492 1.1 christos {"wait_done", 2, 0}, 1493 1.1 christos {"0", 0, 0}, 1494 1.1 christos {"1", 1, 0}, 1495 1.1 christos {"2", 2, 0}, 1496 1.1 christos {"3", 3, 0}, 1497 1.1 christos {NULL, 0, 0}, 1498 1.1 christos }; 1499 1.1 christos 1500 1.1.1.6 christos static const keyword_t keyword_msync_st[] = 1501 1.1 christos { 1502 1.1 christos {"all", 0, 0}, {"store", 1, 0}, 1503 1.1 christos {NULL, 0, 0} 1504 1.1 christos }; 1505 1.1 christos 1506 1.1.1.6 christos static const keyword_t keyword_im5_i[] = 1507 1.1 christos { 1508 1.1 christos {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1509 1.1 christos {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1510 1.1 christos {NULL, 0, 0} 1511 1.1 christos }; 1512 1.1 christos 1513 1.1.1.6 christos static const keyword_t keyword_im5_m[] = 1514 1.1 christos { 1515 1.1 christos {"m0", 0, 0}, {"m1", 1, 0}, {"m2", 2, 0}, {"m3", 3, 0}, 1516 1.1 christos {"m4", 4, 0}, {"m5", 5, 0}, {"m6", 6, 0}, {"m7", 7, 0}, 1517 1.1 christos {NULL, 0, 0} 1518 1.1 christos }; 1519 1.1 christos 1520 1.1.1.6 christos static const keyword_t keyword_accumulator[] = 1521 1.1 christos { 1522 1.1 christos {"d0.lo", 0, 0}, {"d0.hi", 1, 0}, {"d1.lo", 2, 0}, {"d1.hi", 3, 0}, 1523 1.1 christos {NULL, 0, 0} 1524 1.1 christos }; 1525 1.1 christos 1526 1.1.1.6 christos static const keyword_t keyword_aridx[] = 1527 1.1 christos { 1528 1.1 christos {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1529 1.1 christos {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1530 1.1 christos {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0}, 1531 1.1 christos {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0}, 1532 1.1 christos {"d0.l24", 16, 0}, {"d1.l24", 17, 0}, 1533 1.1 christos {"shft_ctl0", 18, 0}, {"shft_ctl1", 19, 0}, 1534 1.1 christos {"lb", 24, 0}, {"le", 25, 0}, {"lc", 26, 0}, {"adm_vbase", 27, 0}, 1535 1.1 christos {NULL, 0, 0} 1536 1.1 christos }; 1537 1.1 christos 1538 1.1.1.6 christos static const keyword_t keyword_aridx2[] = 1539 1.1 christos { 1540 1.1 christos {"cbb0", 0, 0}, {"cbb1", 1, 0}, {"cbb2", 2, 0}, {"cbb3", 3, 0}, 1541 1.1 christos {"cbe0", 4, 0}, {"cbe1", 5, 0}, {"cbe2", 6, 0}, {"cbe3", 7, 0}, 1542 1.1 christos {"cb_ctl", 31, 0}, 1543 1.1 christos {NULL, 0, 0} 1544 1.1 christos }; 1545 1.1 christos 1546 1.1.1.6 christos static const keyword_t keyword_aridxi[] = 1547 1.1 christos { 1548 1.1 christos {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1549 1.1 christos {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1550 1.1 christos {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0}, 1551 1.1 christos {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0}, 1552 1.1 christos {NULL, 0, 0} 1553 1.1 christos }; 1554 1.1 christos 1555 1.1.1.6 christos static const keyword_t keyword_aridxi_mx[] = 1556 1.1.1.5 christos { 1557 1.1.1.5 christos {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0}, 1558 1.1.1.5 christos {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0}, 1559 1.1.1.5 christos {NULL, 0, 0} 1560 1.1.1.5 christos }; 1561 1.1.1.5 christos 1562 1.1.1.6 christos const keyword_t *nds32_keywords[_HW_LAST] = 1563 1.1 christos { 1564 1.1.1.6 christos nds32_keyword_gpr, keyword_usr, keyword_dxr, keyword_sr, keyword_fsr, 1565 1.1 christos keyword_fdr, keyword_cp, keyword_cpr, keyword_abdim, keyword_abm, 1566 1.1 christos keyword_dtiton, keyword_dtitoff, keyword_dpref_st, 1567 1.1 christos keyword_cctl_st0, keyword_cctl_st1, keyword_cctl_st2, 1568 1.1 christos keyword_cctl_st3, keyword_cctl_st4, keyword_cctl_st5, 1569 1.1 christos keyword_cctl_lv, keyword_tlbop_st, keyword_standby_st, 1570 1.1 christos keyword_msync_st, 1571 1.1 christos keyword_im5_i, keyword_im5_m, 1572 1.1.1.5 christos keyword_accumulator, keyword_aridx, keyword_aridx2, 1573 1.1.1.5 christos keyword_aridxi, keyword_aridxi_mx 1574 1.1 christos }; 1575 1.1.1.5 christos 1576 1.1.1.5 christos const keyword_t **nds32_keyword_table[NDS32_CORE_COUNT]; 1577 1.1.1.5 christos static unsigned int nds32_keyword_count_table[NDS32_CORE_COUNT]; 1578 1.1.1.5 christos const field_t *nds32_field_table[NDS32_CORE_COUNT]; 1579 1.1.1.5 christos opcode_t *nds32_opcode_table[NDS32_CORE_COUNT]; 1580 1.1 christos 1581 1.1.1.5 christos 1583 1.1 christos /* Hash table for syntax lex. */ 1584 1.1 christos static htab_t field_htab; 1585 1.1 christos /* Hash table for opcodes. */ 1586 1.1 christos static htab_t opcode_htab; 1587 1.1.1.5 christos /* Hash table for hardware resources. */ 1588 1.1 christos static htab_t *hw_ktabs; 1589 1.1 christos 1590 1.1 christos static hashval_t 1591 1.1 christos htab_hash_hash (const void *p) 1592 1.1 christos { 1593 1.1 christos struct nds32_hash_entry *h = (struct nds32_hash_entry *) p; 1594 1.1 christos 1595 1.1 christos return htab_hash_string (h->name); 1596 1.1 christos } 1597 1.1 christos 1598 1.1 christos static int 1599 1.1 christos htab_hash_eq (const void *p, const void *q) 1600 1.1 christos { 1601 1.1 christos struct nds32_hash_entry *h = (struct nds32_hash_entry *) p; 1602 1.1 christos const char *name = (const char *) q; 1603 1.1 christos 1604 1.1 christos return strcmp (name, h->name) == 0; 1605 1.1 christos } 1606 1.1 christos 1607 1.1.1.5 christos 1609 1.1 christos static void 1610 1.1.1.5 christos build_operand_hash_table (void) 1611 1.1 christos { 1612 1.1.1.5 christos unsigned k; 1613 1.1.1.5 christos 1614 1.1 christos field_htab = htab_create_alloc (128, htab_hash_hash, htab_hash_eq, 1615 1.1.1.5 christos NULL, xcalloc, free); 1616 1.1 christos 1617 1.1.1.5 christos for (k = 0; k < NDS32_CORE_COUNT; k++) 1618 1.1 christos { 1619 1.1.1.5 christos const field_t *fld; 1620 1.1.1.5 christos 1621 1.1.1.5 christos fld = nds32_field_table[k]; 1622 1.1 christos if (fld == NULL) 1623 1.1.1.5 christos continue; 1624 1.1.1.5 christos 1625 1.1.1.5 christos /* Add op-codes. */ 1626 1.1.1.5 christos while (fld->name != NULL) 1627 1.1.1.5 christos { 1628 1.1 christos hashval_t hash; 1629 1.1.1.5 christos const field_t **slot; 1630 1.1.1.5 christos 1631 1.1.1.5 christos hash = htab_hash_string (fld->name); 1632 1.1 christos slot = (const field_t **) 1633 1.1.1.5 christos htab_find_slot_with_hash (field_htab, fld->name, hash, INSERT); 1634 1.1.1.5 christos 1635 1.1.1.5 christos assert (slot != NULL && *slot == NULL); 1636 1.1.1.5 christos *slot = fld++; 1637 1.1.1.5 christos } 1638 1.1 christos } 1639 1.1.1.5 christos } 1640 1.1.1.5 christos 1641 1.1.1.5 christos static void 1642 1.1.1.5 christos build_keyword_hash_table (void) 1643 1.1 christos { 1644 1.1.1.5 christos unsigned int i, j, k, n; 1645 1.1.1.5 christos 1646 1.1.1.5 christos /* Count total keyword tables. */ 1647 1.1.1.5 christos for (n = 0, i = 0; i < NDS32_CORE_COUNT; i++) 1648 1.1 christos { 1649 1.1 christos n += nds32_keyword_count_table[i]; 1650 1.1.1.5 christos } 1651 1.1.1.5 christos 1652 1.1.1.5 christos /* Allocate space. */ 1653 1.1.1.5 christos hw_ktabs = (htab_t *) malloc (n * sizeof (struct htab)); 1654 1.1.1.5 christos for (i = 0; i < n; i++) 1655 1.1.1.5 christos { 1656 1.1.1.5 christos hw_ktabs[i] = htab_create_alloc (128, htab_hash_hash, htab_hash_eq, 1657 1.1.1.5 christos NULL, xcalloc, free); 1658 1.1.1.5 christos } 1659 1.1.1.5 christos 1660 1.1.1.5 christos for (n = 0, k = 0; k < NDS32_CORE_COUNT; k++, n += j) 1661 1.1.1.5 christos { 1662 1.1.1.5 christos const keyword_t **kwd; 1663 1.1.1.5 christos 1664 1.1.1.5 christos if ((j = nds32_keyword_count_table[k]) == 0) 1665 1.1.1.5 christos continue; 1666 1.1.1.5 christos 1667 1.1.1.5 christos /* Add keywords. */ 1668 1.1.1.5 christos kwd = nds32_keyword_table[k]; 1669 1.1.1.5 christos for (i = 0; i < j; i++) 1670 1.1.1.5 christos { 1671 1.1.1.5 christos htab_t htab; 1672 1.1.1.5 christos const keyword_t *kw; 1673 1.1.1.5 christos 1674 1.1.1.5 christos kw = kwd[i]; 1675 1.1.1.5 christos htab = hw_ktabs[n + i]; 1676 1.1.1.5 christos while (kw->name != NULL) 1677 1.1.1.5 christos { 1678 1.1.1.5 christos hashval_t hash; 1679 1.1.1.5 christos const keyword_t **slot; 1680 1.1.1.5 christos 1681 1.1.1.5 christos hash = htab_hash_string (kw->name); 1682 1.1.1.5 christos slot = (const keyword_t **) 1683 1.1.1.5 christos htab_find_slot_with_hash (htab, kw->name, hash, INSERT); 1684 1.1.1.5 christos 1685 1.1.1.5 christos assert (slot != NULL && *slot == NULL); 1686 1.1.1.5 christos *slot = kw++; 1687 1.1.1.5 christos } 1688 1.1 christos } 1689 1.1 christos } 1690 1.1 christos } 1691 1.1 christos 1692 1.1 christos /* Build the syntax for a given opcode OPC. It parses the string 1693 1.1 christos pointed by INSTRUCTION and store the result on SYNTAX, so 1694 1.1 christos when we assemble an instruction, we don't have to parse the syntax 1695 1.1 christos again. */ 1696 1.1 christos 1697 1.1 christos static void 1698 1.1 christos build_opcode_syntax (struct nds32_opcode *opc) 1699 1.1 christos { 1700 1.1 christos char odstr[MAX_LEX_LEN]; 1701 1.1 christos const char *str; 1702 1.1 christos const char *end; 1703 1.1 christos lex_t *plex; 1704 1.1 christos int len; 1705 1.1 christos hashval_t hash; 1706 1.1 christos field_t *fd; 1707 1.1 christos int opt = 0; 1708 1.1 christos 1709 1.1 christos /* Check whether it has been initialized. */ 1710 1.1 christos if (opc->syntax) 1711 1.1 christos return; 1712 1.1.1.5 christos 1713 1.1 christos opc->syntax = xmalloc (MAX_LEX_NUM * sizeof (lex_t)); 1714 1.1 christos memset (opc->syntax, 0, MAX_LEX_NUM * sizeof (lex_t)); 1715 1.1 christos 1716 1.1 christos str = opc->instruction; 1717 1.1 christos plex = opc->syntax; 1718 1.1.1.5 christos while (*str) 1719 1.1 christos { 1720 1.1 christos int fidx, i, k; 1721 1.1 christos 1722 1.1 christos switch (*str) 1723 1.1 christos { 1724 1.1 christos case '%': 1725 1.1 christos *plex = SYN_INPUT; 1726 1.1 christos break; 1727 1.1 christos case '=': 1728 1.1 christos *plex = SYN_OUTPUT; 1729 1.1 christos break; 1730 1.1 christos case '&': 1731 1.1 christos *plex = SYN_INPUT | SYN_OUTPUT; 1732 1.1 christos break; 1733 1.1 christos case '{': 1734 1.1 christos *plex++ = SYN_LOPT; 1735 1.1 christos opt++; 1736 1.1 christos str++; 1737 1.1 christos continue; 1738 1.1 christos case '}': 1739 1.1 christos *plex++ = SYN_ROPT; 1740 1.1 christos str++; 1741 1.1 christos continue; 1742 1.1 christos default: 1743 1.1 christos *plex++ = *str++; 1744 1.1 christos continue; 1745 1.1 christos } 1746 1.1 christos str++; 1747 1.1 christos 1748 1.1 christos /* Extract operand. */ 1749 1.1 christos end = str; 1750 1.1 christos while (ISALNUM (*end) || *end == '_') 1751 1.1 christos end++; 1752 1.1 christos len = end - str; 1753 1.1 christos memcpy (odstr, str, len); 1754 1.1 christos odstr[len] = '\0'; 1755 1.1 christos 1756 1.1 christos hash = htab_hash_string (odstr); 1757 1.1 christos fd = (field_t *) htab_find_with_hash (field_htab, odstr, hash); 1758 1.1 christos 1759 1.1.1.4 christos if (fd == NULL) 1760 1.1.1.4 christos { 1761 1.1.1.4 christos /* xgettext: c-format */ 1762 1.1 christos opcodes_error_handler (_("internal error: unknown operand, %s"), str); 1763 1.1.1.5 christos abort (); 1764 1.1.1.5 christos } 1765 1.1.1.5 christos 1766 1.1.1.5 christos /* We are not sure how these tables are organized. */ 1767 1.1.1.5 christos /* Thus, the minimal index should be the right one. */ 1768 1.1.1.5 christos for (fidx = 256, k = 0, i = 0; i < NDS32_CORE_COUNT; i++) 1769 1.1.1.5 christos { 1770 1.1.1.5 christos int tmp; 1771 1.1.1.5 christos 1772 1.1.1.5 christos tmp = fd - nds32_field_table[i]; 1773 1.1.1.5 christos if (tmp >= 0 && tmp < fidx) 1774 1.1.1.5 christos { 1775 1.1.1.5 christos fidx = tmp; 1776 1.1.1.5 christos k = i; 1777 1.1.1.6 christos } 1778 1.1.1.5 christos } 1779 1.1 christos assert (fidx >= 0 && fidx < (int) ARRAY_SIZE (nds32_operand_fields)); 1780 1.1 christos *plex |= LEX_SET_FIELD (k, fidx); 1781 1.1 christos 1782 1.1 christos str += len; 1783 1.1 christos plex++; 1784 1.1 christos } 1785 1.1 christos 1786 1.1 christos *plex = 0; 1787 1.1 christos opc->variant = opt; 1788 1.1 christos return; 1789 1.1.1.5 christos } 1790 1.1.1.5 christos 1791 1.1 christos static void 1792 1.1.1.5 christos build_opcode_hash_table (void) 1793 1.1 christos { 1794 1.1.1.5 christos unsigned k; 1795 1.1 christos 1796 1.1 christos opcode_htab = htab_create_alloc (512, htab_hash_hash, htab_hash_eq, 1797 1.1.1.5 christos NULL, xcalloc, free); 1798 1.1 christos 1799 1.1.1.5 christos for (k = 0; k < NDS32_CORE_COUNT; k++) 1800 1.1.1.5 christos { 1801 1.1.1.5 christos opcode_t *opc; 1802 1.1.1.5 christos 1803 1.1.1.5 christos opc = nds32_opcode_table[k]; 1804 1.1 christos if (opc == NULL) 1805 1.1.1.5 christos continue; 1806 1.1.1.5 christos 1807 1.1 christos /* Add op-codes. */ 1808 1.1.1.5 christos while ((opc->opcode != NULL) && (opc->instruction != NULL)) 1809 1.1.1.5 christos { 1810 1.1.1.5 christos hashval_t hash; 1811 1.1 christos opcode_t **slot; 1812 1.1.1.5 christos 1813 1.1.1.5 christos hash = htab_hash_string (opc->opcode); 1814 1.1.1.5 christos slot = (opcode_t **) 1815 1.1 christos htab_find_slot_with_hash (opcode_htab, opc->opcode, hash, 1816 1.1 christos INSERT); 1817 1.1 christos 1818 1.1.1.5 christos #define NDS32_PREINIT_SYNTAX 1819 1.1.1.5 christos #if defined (NDS32_PREINIT_SYNTAX) 1820 1.1 christos /* Initial SYNTAX when build opcode table, so bug in syntax 1821 1.1 christos can be found when initialized rather than used. */ 1822 1.1 christos build_opcode_syntax (opc); 1823 1.1 christos #endif 1824 1.1 christos 1825 1.1 christos if (*slot == NULL) 1826 1.1 christos { 1827 1.1 christos /* This is the new one. */ 1828 1.1 christos *slot = opc; 1829 1.1 christos } 1830 1.1.1.5 christos else 1831 1.1.1.5 christos { 1832 1.1 christos opcode_t *ptr; 1833 1.1.1.5 christos 1834 1.1.1.5 christos /* Already exists. Append to the list. */ 1835 1.1.1.5 christos ptr = *slot; 1836 1.1.1.5 christos while (ptr->next) 1837 1.1.1.5 christos ptr = ptr->next; 1838 1.1 christos ptr->next = opc; 1839 1.1.1.5 christos opc->next = NULL; 1840 1.1 christos } 1841 1.1 christos opc++; 1842 1.1 christos } 1843 1.1 christos } 1844 1.1.1.5 christos } 1845 1.1.1.5 christos 1846 1.1.1.5 christos /* Initialize the assembler. It must be called before assembling. */ 1847 1.1.1.5 christos 1848 1.1.1.5 christos void 1849 1.1.1.5 christos nds32_asm_init (nds32_asm_desc_t *pdesc, int flags) 1850 1.1.1.5 christos { 1851 1.1.1.5 christos pdesc->flags = flags; 1852 1.1.1.5 christos pdesc->mach = flags & NASM_OPEN_ARCH_MASK; 1853 1.1.1.6 christos 1854 1.1.1.5 christos /* Setup main core. */ 1855 1.1.1.5 christos nds32_keyword_table[NDS32_MAIN_CORE] = &nds32_keywords[0]; 1856 1.1.1.6 christos nds32_keyword_count_table[NDS32_MAIN_CORE] = _HW_LAST; 1857 1.1.1.5 christos nds32_opcode_table[NDS32_MAIN_CORE] = &nds32_opcodes[0]; 1858 1.1.1.5 christos nds32_field_table[NDS32_MAIN_CORE] = &nds32_operand_fields[0]; 1859 1.1.1.5 christos 1860 1.1.1.5 christos /* Build operand hash table. */ 1861 1.1.1.5 christos build_operand_hash_table (); 1862 1.1.1.5 christos 1863 1.1.1.5 christos /* Build keyword hash tables. */ 1864 1.1.1.5 christos build_keyword_hash_table (); 1865 1.1.1.5 christos 1866 1.1.1.5 christos /* Build op-code hash table. */ 1867 1.1.1.5 christos build_opcode_hash_table (); 1868 1.1 christos } 1869 1.1 christos 1870 1.1 christos /* Parse the input and store operand keyword string in ODSTR. 1871 1.1 christos This function is only used for parsing keywords, 1872 1.1 christos HW_INT/HW_UINT are parsed parse_operand callback handler. */ 1873 1.1 christos 1874 1.1 christos static char * 1875 1.1 christos parse_to_delimiter (char *str, char odstr[MAX_KEYWORD_LEN]) 1876 1.1 christos { 1877 1.1 christos char *outp = odstr; 1878 1.1 christos 1879 1.1 christos while (ISALNUM (*str) || *str == '.' || *str == '_') 1880 1.1 christos *outp++ = TOLOWER (*str++); 1881 1.1 christos 1882 1.1 christos *outp = '\0'; 1883 1.1 christos return str; 1884 1.1 christos } 1885 1.1 christos 1886 1.1 christos /* Parse the operand of lmw/smw/lmwa/smwa. */ 1887 1.1 christos 1888 1.1 christos static int 1889 1.1 christos parse_re (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1890 1.1 christos struct nds32_asm_insn *pinsn, char **pstr, int64_t *value) 1891 1.1 christos { 1892 1.1 christos char *end = *pstr; 1893 1.1 christos char odstr[MAX_KEYWORD_LEN]; 1894 1.1 christos keyword_t *k; 1895 1.1 christos hashval_t hash; 1896 1.1 christos 1897 1.1 christos if (*end == '$') 1898 1.1 christos end++; 1899 1.1 christos end = parse_to_delimiter (end, odstr); 1900 1.1 christos 1901 1.1 christos hash = htab_hash_string (odstr); 1902 1.1 christos k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash); 1903 1.1 christos 1904 1.1 christos if (k == NULL) 1905 1.1 christos return NASM_ERR_OPERAND; 1906 1.1 christos 1907 1.1 christos if (__GF (pinsn->insn, 20, 5) > (unsigned int) k->value) 1908 1.1.1.5 christos return NASM_ERR_OPERAND; 1909 1.1.1.5 christos 1910 1.1.1.5 christos /* Register not allowed in reduced register. */ 1911 1.1.1.5 christos if ((pdesc->flags & NASM_OPEN_REDUCED_REG) 1912 1.1.1.5 christos && (k->attr & ATTR (RDREG)) == 0) 1913 1.1 christos return NASM_ERR_REG_REDUCED; 1914 1.1 christos 1915 1.1 christos *value = k->value; 1916 1.1 christos *pstr = end; 1917 1.1 christos return NASM_R_CONST; 1918 1.1 christos } 1919 1.1 christos 1920 1.1 christos /* Parse the operand of push25/pop25. */ 1921 1.1 christos 1922 1.1 christos static int 1923 1.1 christos parse_re2 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1924 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1925 1.1 christos char **pstr, int64_t *value) 1926 1.1 christos { 1927 1.1 christos char *end = *pstr; 1928 1.1 christos char odstr[MAX_KEYWORD_LEN]; 1929 1.1 christos keyword_t *k; 1930 1.1 christos hashval_t hash; 1931 1.1 christos 1932 1.1 christos if (*end == '$') 1933 1.1 christos end++; 1934 1.1 christos end = parse_to_delimiter (end, odstr); 1935 1.1 christos 1936 1.1 christos hash = htab_hash_string (odstr); 1937 1.1 christos k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash); 1938 1.1 christos 1939 1.1 christos if (k == NULL) 1940 1.1.1.5 christos return NASM_ERR_OPERAND; 1941 1.1.1.5 christos 1942 1.1.1.5 christos /* Register not allowed in reduced register. */ 1943 1.1.1.5 christos if ((pdesc->flags & NASM_OPEN_REDUCED_REG) 1944 1.1.1.5 christos && (k->attr & ATTR (RDREG)) == 0) 1945 1.1 christos return NASM_ERR_REG_REDUCED; 1946 1.1 christos 1947 1.1 christos if (k->value == 6) 1948 1.1 christos *value = 0; 1949 1.1 christos else if (k->value == 8) 1950 1.1 christos *value = 1; 1951 1.1 christos else if (k->value == 10) 1952 1.1 christos *value = 2; 1953 1.1 christos else if (k->value == 14) 1954 1.1 christos *value = 3; 1955 1.1 christos else 1956 1.1 christos return NASM_ERR_OPERAND; 1957 1.1 christos 1958 1.1 christos *pstr = end; 1959 1.1 christos return NASM_R_CONST; 1960 1.1 christos } 1961 1.1 christos 1962 1.1 christos /* Parse the operand of lwi45.fe. */ 1963 1.1 christos 1964 1.1 christos static int 1965 1.1 christos parse_fe5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn, 1966 1.1 christos char **pstr, int64_t *value) 1967 1.1 christos { 1968 1.1 christos int r; 1969 1.1 christos 1970 1.1 christos r = pdesc->parse_operand (pdesc, pinsn, pstr, value); 1971 1.1 christos if (r != NASM_R_CONST) 1972 1.1 christos return NASM_ERR_OPERAND; 1973 1.1 christos 1974 1.1 christos /* 128 == 32 << 2. Leave the shift to parse_opreand, 1975 1.1 christos so it can check whether it is a multiple of 4. */ 1976 1.1 christos *value = 128 + *value; 1977 1.1 christos return r; 1978 1.1 christos } 1979 1.1 christos 1980 1.1 christos /* Parse the operand of movpi45. */ 1981 1.1 christos 1982 1.1 christos static int 1983 1.1 christos parse_pi5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn, 1984 1.1 christos char **pstr, int64_t *value) 1985 1.1 christos { 1986 1.1 christos int r; 1987 1.1 christos 1988 1.1 christos r = pdesc->parse_operand (pdesc, pinsn, pstr, value); 1989 1.1 christos if (r != NASM_R_CONST) 1990 1.1 christos return NASM_ERR_OPERAND; 1991 1.1 christos 1992 1.1 christos *value -= 16; 1993 1.1 christos return r; 1994 1.1 christos } 1995 1.1 christos 1996 1.1 christos static int aext_a30b20 = 0; 1997 1.1 christos static int aext_rte = 0; 1998 1.1 christos static int aext_im5_ip = 0; 1999 1.1 christos static int aext_im6_ip = 0; 2000 1.1.1.5 christos /* Parse the operand of audio ext. */ 2001 1.1.1.5 christos static int 2002 1.1 christos parse_aext_reg (struct nds32_asm_desc *pdesc, char **pstr, 2003 1.1 christos int *value, int hw_res) 2004 1.1 christos { 2005 1.1 christos char *end = *pstr; 2006 1.1 christos char odstr[MAX_KEYWORD_LEN]; 2007 1.1 christos keyword_t *k; 2008 1.1 christos hashval_t hash; 2009 1.1 christos 2010 1.1 christos if (*end == '$') 2011 1.1 christos end++; 2012 1.1 christos end = parse_to_delimiter (end, odstr); 2013 1.1 christos 2014 1.1 christos hash = htab_hash_string (odstr); 2015 1.1 christos k = htab_find_with_hash (hw_ktabs[hw_res], odstr, hash); 2016 1.1 christos 2017 1.1 christos if (k == NULL) 2018 1.1.1.5 christos return NASM_ERR_OPERAND; 2019 1.1.1.5 christos 2020 1.1.1.5 christos if (hw_res == HW_GPR 2021 1.1.1.5 christos && (pdesc->flags & NASM_OPEN_REDUCED_REG) 2022 1.1.1.5 christos && (k->attr & ATTR (RDREG)) == 0) 2023 1.1 christos return NASM_ERR_REG_REDUCED; 2024 1.1 christos 2025 1.1 christos *value = k->value; 2026 1.1 christos *pstr = end; 2027 1.1 christos return NASM_R_CONST; 2028 1.1 christos } 2029 1.1.1.5 christos 2030 1.1 christos static int 2031 1.1 christos parse_a30b20 (struct nds32_asm_desc *pdesc, 2032 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2033 1.1 christos char **pstr, int64_t *value) 2034 1.1 christos { 2035 1.1.1.5 christos int rt_value, ret; 2036 1.1.1.5 christos 2037 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2038 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2039 1.1 christos return NASM_ERR_REG_REDUCED; 2040 1.1 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)) 2041 1.1 christos return NASM_ERR_OPERAND; 2042 1.1 christos 2043 1.1 christos *value = rt_value; 2044 1.1 christos aext_a30b20 = rt_value; 2045 1.1 christos return NASM_R_CONST; 2046 1.1 christos } 2047 1.1.1.5 christos 2048 1.1 christos static int 2049 1.1 christos parse_rt21 (struct nds32_asm_desc *pdesc, 2050 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2051 1.1 christos char **pstr, int64_t *value) 2052 1.1 christos { 2053 1.1.1.5 christos int rt_value, ret, tmp_value, tmp1, tmp2; 2054 1.1.1.5 christos 2055 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2056 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2057 1.1 christos return NASM_ERR_REG_REDUCED; 2058 1.1.1.5 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)) 2059 1.1 christos return NASM_ERR_OPERAND; 2060 1.1 christos 2061 1.1 christos tmp1 = (aext_a30b20 & 0x08); 2062 1.1 christos tmp2 = (rt_value & 0x08); 2063 1.1 christos if (tmp1 != tmp2) 2064 1.1 christos return NASM_ERR_OPERAND; 2065 1.1 christos 2066 1.1 christos /* Rt=CONCAT(c, t21, t0), t21:bit11-10, t0:bit5. */ 2067 1.1 christos tmp_value = (rt_value & 0x06) << 4; 2068 1.1 christos tmp_value |= (rt_value & 0x01); 2069 1.1 christos *value = tmp_value; 2070 1.1 christos return NASM_R_CONST; 2071 1.1 christos } 2072 1.1.1.5 christos 2073 1.1 christos static int 2074 1.1 christos parse_rte_start (struct nds32_asm_desc *pdesc, 2075 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2076 1.1 christos char **pstr, int64_t *value) 2077 1.1 christos { 2078 1.1.1.5 christos int rt_value, ret, tmp1, tmp2; 2079 1.1.1.5 christos 2080 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2081 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2082 1.1 christos return NASM_ERR_REG_REDUCED; 2083 1.1 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 15) 2084 1.1.1.5 christos || (rt_value & 0x01)) 2085 1.1 christos return NASM_ERR_OPERAND; 2086 1.1 christos 2087 1.1 christos tmp1 = (aext_a30b20 & 0x08); 2088 1.1 christos tmp2 = (rt_value & 0x08); 2089 1.1 christos if (tmp1 != tmp2) 2090 1.1 christos return NASM_ERR_OPERAND; 2091 1.1 christos 2092 1.1 christos aext_rte = rt_value; 2093 1.1 christos /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */ 2094 1.1 christos rt_value = (rt_value & 0x06) << 4; 2095 1.1 christos *value = rt_value; 2096 1.1 christos return NASM_R_CONST; 2097 1.1 christos } 2098 1.1.1.5 christos 2099 1.1 christos static int 2100 1.1 christos parse_rte_end (struct nds32_asm_desc *pdesc, 2101 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2102 1.1 christos char **pstr, int64_t *value) 2103 1.1 christos { 2104 1.1.1.5 christos int rt_value, ret, tmp1, tmp2; 2105 1.1.1.5 christos 2106 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2107 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2108 1.1 christos return NASM_ERR_REG_REDUCED; 2109 1.1 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 15) 2110 1.1 christos || ((rt_value & 0x01) == 0) 2111 1.1.1.5 christos || (rt_value != (aext_rte + 1))) 2112 1.1 christos return NASM_ERR_OPERAND; 2113 1.1 christos 2114 1.1 christos tmp1 = (aext_a30b20 & 0x08); 2115 1.1 christos tmp2 = (rt_value & 0x08); 2116 1.1.1.5 christos if (tmp1 != tmp2) 2117 1.1 christos return NASM_ERR_OPERAND; 2118 1.1 christos 2119 1.1 christos /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */ 2120 1.1 christos rt_value = (rt_value & 0x06) << 4; 2121 1.1 christos *value = rt_value; 2122 1.1 christos return NASM_R_CONST; 2123 1.1 christos } 2124 1.1.1.5 christos 2125 1.1 christos static int 2126 1.1 christos parse_rte69_start (struct nds32_asm_desc *pdesc, 2127 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2128 1.1 christos char **pstr, int64_t *value) 2129 1.1 christos { 2130 1.1.1.5 christos int rt_value, ret; 2131 1.1.1.5 christos 2132 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2133 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2134 1.1 christos return NASM_ERR_REG_REDUCED; 2135 1.1 christos if ((ret == NASM_ERR_OPERAND) 2136 1.1.1.5 christos || (rt_value & 0x01)) 2137 1.1 christos return NASM_ERR_OPERAND; 2138 1.1 christos 2139 1.1 christos aext_rte = rt_value; 2140 1.1 christos rt_value = (rt_value >> 1); 2141 1.1 christos *value = rt_value; 2142 1.1 christos return NASM_R_CONST; 2143 1.1 christos } 2144 1.1.1.5 christos 2145 1.1 christos static int 2146 1.1 christos parse_rte69_end (struct nds32_asm_desc *pdesc, 2147 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2148 1.1 christos char **pstr, int64_t *value) 2149 1.1 christos { 2150 1.1.1.5 christos int rt_value, ret; 2151 1.1.1.5 christos 2152 1.1.1.5 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_GPR); 2153 1.1 christos if (ret == NASM_ERR_REG_REDUCED) 2154 1.1 christos return NASM_ERR_REG_REDUCED; 2155 1.1 christos if ((ret == NASM_ERR_OPERAND) 2156 1.1 christos || ((rt_value & 0x01) == 0) 2157 1.1.1.5 christos || (rt_value != (aext_rte + 1))) 2158 1.1 christos return NASM_ERR_OPERAND; 2159 1.1 christos 2160 1.1 christos aext_rte = rt_value; 2161 1.1 christos rt_value = (rt_value >> 1); 2162 1.1 christos *value = rt_value; 2163 1.1 christos return NASM_R_CONST; 2164 1.1 christos } 2165 1.1.1.5 christos 2166 1.1 christos static int 2167 1.1 christos parse_im5_ip (struct nds32_asm_desc *pdesc, 2168 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2169 1.1 christos char **pstr, int64_t *value) 2170 1.1 christos { 2171 1.1.1.5 christos int rt_value, ret, new_value; 2172 1.1 christos 2173 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_I); 2174 1.1.1.5 christos if (ret == NASM_ERR_OPERAND) 2175 1.1 christos return NASM_ERR_OPERAND; 2176 1.1 christos 2177 1.1 christos /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */ 2178 1.1 christos new_value = (rt_value & 0x04) << 2; 2179 1.1 christos new_value |= (rt_value & 0x03); 2180 1.1 christos *value = new_value; 2181 1.1 christos aext_im5_ip = new_value; 2182 1.1 christos return NASM_R_CONST; 2183 1.1 christos } 2184 1.1.1.5 christos 2185 1.1 christos static int 2186 1.1 christos parse_im5_mr (struct nds32_asm_desc *pdesc, 2187 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2188 1.1 christos char **pstr, int64_t *value) 2189 1.1 christos { 2190 1.1.1.5 christos int rt_value, ret, new_value, tmp1, tmp2; 2191 1.1 christos 2192 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_M); 2193 1.1.1.5 christos if (ret == NASM_ERR_OPERAND) 2194 1.1 christos return NASM_ERR_OPERAND; 2195 1.1 christos 2196 1.1 christos /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */ 2197 1.1 christos new_value = (rt_value & 0x07) << 2; 2198 1.1 christos tmp1 = (aext_im5_ip & 0x10); 2199 1.1 christos tmp2 = (new_value & 0x10); 2200 1.1.1.5 christos if (tmp1 != tmp2) 2201 1.1 christos return NASM_ERR_OPERAND; 2202 1.1 christos 2203 1.1 christos *value = new_value; 2204 1.1 christos return NASM_R_CONST; 2205 1.1 christos } 2206 1.1.1.5 christos 2207 1.1 christos static int 2208 1.1 christos parse_im6_ip (struct nds32_asm_desc *pdesc, 2209 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2210 1.1 christos char **pstr, int64_t *value) 2211 1.1 christos { 2212 1.1.1.5 christos int rt_value, ret; 2213 1.1 christos 2214 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_I); 2215 1.1.1.5 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 3)) 2216 1.1 christos return NASM_ERR_OPERAND; 2217 1.1 christos 2218 1.1 christos /* p = 0.bit[1:0]. */ 2219 1.1 christos aext_im6_ip = rt_value; 2220 1.1 christos *value = aext_im6_ip; 2221 1.1 christos return NASM_R_CONST; 2222 1.1 christos } 2223 1.1.1.5 christos 2224 1.1 christos static int 2225 1.1 christos parse_im6_iq (struct nds32_asm_desc *pdesc, 2226 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2227 1.1 christos char **pstr, int64_t *value) 2228 1.1 christos { 2229 1.1.1.5 christos int rt_value, ret; 2230 1.1 christos 2231 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_I); 2232 1.1.1.5 christos if ((ret == NASM_ERR_OPERAND) || (rt_value < 4)) 2233 1.1 christos return NASM_ERR_OPERAND; 2234 1.1 christos 2235 1.1 christos /* q = 1.bit[1:0]. */ 2236 1.1.1.5 christos if ((rt_value & 0x03) != aext_im6_ip) 2237 1.1 christos return NASM_ERR_OPERAND; 2238 1.1 christos 2239 1.1 christos *value = aext_im6_ip; 2240 1.1 christos return NASM_R_CONST; 2241 1.1 christos } 2242 1.1.1.5 christos 2243 1.1 christos static int 2244 1.1 christos parse_im6_mr (struct nds32_asm_desc *pdesc, 2245 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2246 1.1 christos char **pstr, int64_t *value) 2247 1.1 christos { 2248 1.1.1.5 christos int rt_value, ret; 2249 1.1 christos 2250 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_M); 2251 1.1.1.5 christos if ((ret == NASM_ERR_OPERAND) || (rt_value > 3)) 2252 1.1 christos return NASM_ERR_OPERAND; 2253 1.1 christos 2254 1.1 christos /* r = 0.bit[3:2]. */ 2255 1.1 christos *value = (rt_value & 0x03); 2256 1.1 christos return NASM_R_CONST; 2257 1.1 christos } 2258 1.1.1.5 christos 2259 1.1 christos static int 2260 1.1 christos parse_im6_ms (struct nds32_asm_desc *pdesc, 2261 1.1 christos struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 2262 1.1 christos char **pstr, int64_t *value) 2263 1.1 christos { 2264 1.1.1.5 christos int rt_value, ret; 2265 1.1 christos 2266 1.1 christos ret = parse_aext_reg (pdesc, pstr, &rt_value, HW_AEXT_IM_M); 2267 1.1.1.5 christos if ((ret == NASM_ERR_OPERAND) || (rt_value < 4)) 2268 1.1 christos return NASM_ERR_OPERAND; 2269 1.1 christos 2270 1.1 christos /* s = 1.bit[5:4]. */ 2271 1.1 christos *value = (rt_value & 0x03); 2272 1.1 christos return NASM_R_CONST; 2273 1.1 christos } 2274 1.1 christos 2275 1.1 christos /* Generic operand parse base on the information provided by the field. */ 2276 1.1 christos 2277 1.1 christos static int 2278 1.1 christos parse_operand (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 2279 1.1 christos char **str, int syn) 2280 1.1 christos { 2281 1.1 christos char odstr[MAX_KEYWORD_LEN]; 2282 1.1.1.5 christos char *end; 2283 1.1 christos hashval_t hash; 2284 1.1.1.5 christos const field_t *fld = &LEX_GET_FIELD (((syn >> 8) & 0xff) - 1, syn); 2285 1.1 christos keyword_t *k; 2286 1.1 christos int64_t value = 0; /* 0x100000000; Big enough to overflow. */ 2287 1.1 christos int r; 2288 1.1 christos uint64_t modifier = 0; 2289 1.1 christos 2290 1.1 christos end = *str; 2291 1.1 christos 2292 1.1 christos if (fld->parse) 2293 1.1.1.5 christos { 2294 1.1 christos r = fld->parse (pdesc, pinsn, &end, &value); 2295 1.1.1.5 christos if (r == NASM_ERR_OPERAND || r == NASM_ERR_REG_REDUCED) 2296 1.1 christos { 2297 1.1 christos pdesc->result = r; 2298 1.1 christos return 0; 2299 1.1 christos } 2300 1.1 christos goto done; 2301 1.1.1.5 christos } 2302 1.1.1.5 christos 2303 1.1 christos /* Check valid keyword group. */ 2304 1.1.1.5 christos if (fld->hw_res < HW_INT) 2305 1.1.1.5 christos { 2306 1.1.1.5 christos int n = 0, i; 2307 1.1.1.5 christos 2308 1.1.1.5 christos /* Calculate index of keyword hash table. */ 2309 1.1.1.5 christos for (i = 0; i < (fld->hw_res >> 8); i++) 2310 1.1 christos n += nds32_keyword_count_table[i]; 2311 1.1 christos 2312 1.1 christos /* Parse the operand in assembly code. */ 2313 1.1 christos if (*end == '$') 2314 1.1 christos end++; 2315 1.1 christos end = parse_to_delimiter (end, odstr); 2316 1.1.1.5 christos 2317 1.1.1.5 christos hash = htab_hash_string (odstr); 2318 1.1 christos k = htab_find_with_hash (hw_ktabs[n + (fld->hw_res & 0xff)], odstr, 2319 1.1 christos hash); 2320 1.1 christos 2321 1.1 christos if (k == NULL) 2322 1.1 christos { 2323 1.1 christos pdesc->result = NASM_ERR_OPERAND; 2324 1.1 christos return 0; 2325 1.1 christos } 2326 1.1 christos 2327 1.1 christos if (fld->hw_res == HW_GPR && (pdesc->flags & NASM_OPEN_REDUCED_REG) 2328 1.1 christos && (k->attr & ATTR (RDREG)) == 0) 2329 1.1 christos { 2330 1.1 christos /* Register not allowed in reduced register. */ 2331 1.1 christos pdesc->result = NASM_ERR_REG_REDUCED; 2332 1.1 christos return 0; 2333 1.1 christos } 2334 1.1 christos 2335 1.1 christos if (fld->hw_res == HW_GPR) 2336 1.1 christos { 2337 1.1 christos if (syn & SYN_INPUT) 2338 1.1 christos pinsn->defuse |= USE_REG (k->value); 2339 1.1 christos if (syn & SYN_OUTPUT) 2340 1.1 christos pinsn->defuse |= DEF_REG (k->value); 2341 1.1 christos } 2342 1.1 christos 2343 1.1 christos value = k->value; 2344 1.1 christos if (fld->hw_res == HW_GPR && (fld->bitsize + fld->shift) == 4) 2345 1.1 christos value = nds32_r54map[value]; 2346 1.1 christos } 2347 1.1 christos else if (fld->hw_res == HW_INT || fld->hw_res == HW_UINT) 2348 1.1 christos { 2349 1.1 christos if (*end == '#') 2350 1.1 christos end++; 2351 1.1 christos 2352 1.1 christos /* Handle modifiers. Do we need to make a table for modifiers? 2353 1.1 christos Do we need to check unknown modifier? */ 2354 1.1 christos if (strncasecmp (end, "hi20(", 5) == 0) 2355 1.1 christos { 2356 1.1 christos modifier |= NASM_ATTR_HI20; 2357 1.1 christos end += 5; 2358 1.1 christos } 2359 1.1 christos else if (strncasecmp (end, "lo12(", 5) == 0) 2360 1.1 christos { 2361 1.1 christos modifier |= NASM_ATTR_LO12; 2362 1.1 christos end += 5; 2363 1.1 christos } 2364 1.1 christos else if (strncasecmp (end, "lo20(", 5) == 0) 2365 1.1 christos { 2366 1.1 christos /* e.g., movi. */ 2367 1.1 christos modifier |= NASM_ATTR_LO20; 2368 1.1 christos end += 5; 2369 1.1 christos } 2370 1.1 christos 2371 1.1 christos r = pdesc->parse_operand (pdesc, pinsn, &end, &value); 2372 1.1 christos if (modifier) 2373 1.1 christos { 2374 1.1 christos /* Consume the ')' of modifier. */ 2375 1.1 christos end++; 2376 1.1 christos pinsn->attr |= modifier; 2377 1.1 christos } 2378 1.1 christos 2379 1.1 christos switch (r) 2380 1.1 christos { 2381 1.1 christos case NASM_R_ILLEGAL: 2382 1.1 christos pdesc->result = NASM_ERR_OPERAND; 2383 1.1 christos return 0; 2384 1.1 christos case NASM_R_SYMBOL: 2385 1.1 christos /* This field needs special fix-up. */ 2386 1.1 christos pinsn->field = fld; 2387 1.1 christos break; 2388 1.1 christos case NASM_R_CONST: 2389 1.1 christos if (modifier & NASM_ATTR_HI20) 2390 1.1 christos value = (value >> 12) & 0xfffff; 2391 1.1 christos else if (modifier & NASM_ATTR_LO12) 2392 1.1 christos value = value & 0xfff; 2393 1.1 christos else if (modifier & NASM_ATTR_LO20) 2394 1.1 christos value = value & 0xfffff; 2395 1.1.1.4 christos break; 2396 1.1.1.4 christos default: 2397 1.1.1.4 christos /* xgettext: c-format */ 2398 1.1 christos opcodes_error_handler (_("internal error: don't know how to handle " 2399 1.1 christos "parsing results")); 2400 1.1 christos abort (); 2401 1.1 christos } 2402 1.1 christos } 2403 1.1.1.4 christos else 2404 1.1.1.4 christos { 2405 1.1 christos /* xgettext: c-format */ 2406 1.1 christos opcodes_error_handler (_("internal error: unknown hardware resource")); 2407 1.1 christos abort (); 2408 1.1.1.6 christos } 2409 1.1 christos 2410 1.1 christos done: 2411 1.1 christos /* Don't silently discarding bits. */ 2412 1.1 christos if (value & __MASK (fld->shift)) 2413 1.1 christos { 2414 1.1 christos pdesc->result = NASM_ERR_OUT_OF_RANGE; 2415 1.1 christos return 0; 2416 1.1 christos } 2417 1.1 christos 2418 1.1 christos /* Check the range of signed or unsigned result. */ 2419 1.1 christos if (fld->hw_res != HW_INT && ((int32_t) value >> (fld->bitsize + fld->shift))) 2420 1.1 christos { 2421 1.1 christos pdesc->result = NASM_ERR_OUT_OF_RANGE; 2422 1.1 christos return 0; 2423 1.1 christos } 2424 1.1 christos else if (fld->hw_res == HW_INT) 2425 1.1 christos { 2426 1.1 christos /* Sign-ext the value. */ 2427 1.1 christos if (((value >> 32) == 0) && (value & 0x80000000)) 2428 1.1 christos value |= (int64_t) -1U << 31; 2429 1.1 christos 2430 1.1 christos 2431 1.1 christos /* Shift the value to positive domain. */ 2432 1.1 christos if ((value + (1 << (fld->bitsize + fld->shift - 1))) 2433 1.1 christos >> (fld->bitsize + fld->shift)) 2434 1.1 christos { 2435 1.1 christos pdesc->result = NASM_ERR_OUT_OF_RANGE; 2436 1.1 christos return 0; 2437 1.1 christos } 2438 1.1 christos } 2439 1.1 christos 2440 1.1 christos pinsn->insn |= 2441 1.1 christos (((value >> fld->shift) & __MASK (fld->bitsize)) << fld->bitpos); 2442 1.1 christos *str = end; 2443 1.1 christos return 1; 2444 1.1 christos } 2445 1.1 christos 2446 1.1 christos /* Try to parse an instruction string based on opcode syntax. */ 2447 1.1 christos 2448 1.1 christos static int 2449 1.1 christos parse_insn (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 2450 1.1 christos char *str, struct nds32_opcode *opc) 2451 1.1 christos { 2452 1.1 christos int variant = 0; 2453 1.1 christos char *p = NULL; 2454 1.1 christos 2455 1.1 christos /* A syntax may has optional operands, so we have to try each possible 2456 1.1 christos combination to see if the input is accepted. In order to do so, 2457 1.1 christos bit-N represent whether optional-operand-N is used in this combination. 2458 1.1 christos That is, if bit-N is set, optional-operand-N is not used. 2459 1.1 christos 2460 1.1 christos For example, there are 2 optional operands in this syntax, 2461 1.1 christos 2462 1.1 christos "a{,b}{,c}" 2463 1.1 christos 2464 1.1 christos we can try it 4 times (i.e., 1 << 2) 2465 1.1 christos 2466 1.1 christos 0 (b00): "a,b,c" 2467 1.1 christos 1 (b01): "a,c" 2468 1.1 christos 2 (b10): "a,b" 2469 1.1 christos 3 (b11): "a" 2470 1.1 christos */ 2471 1.1 christos 2472 1.1 christos /* The outer do-while loop is used to try each possible optional 2473 1.1 christos operand combination, and VARIANT is the bit mask. The inner loop 2474 1.1 christos iterates each lexeme in the syntax. */ 2475 1.1 christos 2476 1.1 christos do 2477 1.1 christos { 2478 1.1 christos /* OPT is the number of optional operands we've seen. */ 2479 1.1 christos int opt = 0; 2480 1.1 christos lex_t *plex; 2481 1.1 christos 2482 1.1 christos /* PLEX is the syntax iterator and P is the iterator for input 2483 1.1 christos string. */ 2484 1.1 christos plex = opc->syntax; 2485 1.1 christos p = str; 2486 1.1 christos /* Initial the base value. */ 2487 1.1 christos pinsn->insn = opc->value; 2488 1.1 christos 2489 1.1 christos while (*plex) 2490 1.1 christos { 2491 1.1 christos if (IS_LEX_CHAR (*plex)) 2492 1.1 christos { 2493 1.1 christos /* If it's a plain char, just compare it. */ 2494 1.1 christos if (LEX_CHAR (*plex) != TOLOWER (*p)) 2495 1.1 christos { 2496 1.1 christos if (LEX_CHAR (*plex) == '+' && TOLOWER (*p) == '-') 2497 1.1 christos { 2498 1.1 christos /* We don't define minus format for some signed 2499 1.1 christos immediate case, so ignoring '+' here to parse 2500 1.1 christos negative value eazily. Besides, the minus format 2501 1.1 christos can not support for instruction with relocation. 2502 1.1 christos Ex: lwi $r0, [$r0 + imm] */ 2503 1.1 christos plex++; 2504 1.1 christos continue; 2505 1.1 christos } 2506 1.1 christos pdesc->result = NASM_ERR_SYNTAX; 2507 1.1 christos goto reject; 2508 1.1 christos } 2509 1.1 christos p++; 2510 1.1 christos } 2511 1.1 christos else if (*plex & SYN_LOPT) 2512 1.1 christos { 2513 1.1 christos /* If it's '{' and it's not used in this iteration, 2514 1.1 christos just skip the whole optional operand. */ 2515 1.1 christos if ((1 << (opt++)) & variant) 2516 1.1 christos { 2517 1.1 christos while ((*plex & SYN_ROPT) == 0) 2518 1.1 christos plex++; 2519 1.1 christos } 2520 1.1 christos } 2521 1.1 christos else if (*plex & SYN_ROPT) 2522 1.1 christos { 2523 1.1 christos /* ignore. */ 2524 1.1 christos } 2525 1.1 christos else 2526 1.1 christos { 2527 1.1 christos /* If it's a operand, parse the input operand from input. */ 2528 1.1 christos if (!parse_operand (pdesc, pinsn, &p, *plex)) 2529 1.1 christos goto reject; 2530 1.1 christos } 2531 1.1 christos plex++; 2532 1.1 christos } 2533 1.1 christos 2534 1.1 christos /* Check whether this syntax is accepted. */ 2535 1.1 christos if (*plex == 0 && (*p == '\0' || *p == '!' || *p == '#')) 2536 1.1.1.6 christos return 1; 2537 1.1 christos 2538 1.1 christos reject: 2539 1.1 christos /* If not accepted, try another combination. */ 2540 1.1 christos variant++; 2541 1.1 christos } 2542 1.1 christos while (variant < (1 << opc->variant)); 2543 1.1 christos 2544 1.1 christos return 0; 2545 1.1 christos } 2546 1.1 christos 2547 1.1 christos void 2548 1.1 christos nds32_assemble (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 2549 1.1 christos char *str) 2550 1.1 christos { 2551 1.1 christos struct nds32_opcode *opc; 2552 1.1 christos char *s; 2553 1.1 christos char *mnemoic; 2554 1.1 christos char *dot; 2555 1.1 christos hashval_t hash; 2556 1.1 christos 2557 1.1 christos /* Duplicate the string, so we can modify it for convenience. */ 2558 1.1 christos s = strdup (str); 2559 1.1 christos mnemoic = s; 2560 1.1 christos str = s; 2561 1.1 christos 2562 1.1 christos /* Find opcode mnemoic. */ 2563 1.1 christos while (*s != ' ' && *s != '\t' && *s != '\0') 2564 1.1 christos s++; 2565 1.1 christos if (*s != '\0') 2566 1.1 christos *s++ = '\0'; 2567 1.1.1.6 christos dot = strchr (mnemoic, '.'); 2568 1.1 christos 2569 1.1 christos retry_dot: 2570 1.1 christos /* Lookup the opcode syntax. */ 2571 1.1 christos hash = htab_hash_string (mnemoic); 2572 1.1 christos opc = (struct nds32_opcode *) 2573 1.1 christos htab_find_with_hash (opcode_htab, mnemoic, hash); 2574 1.1 christos 2575 1.1 christos /* If we cannot find a match syntax, try it again without `.'. 2576 1.1 christos For example, try "lmw.adm" first and then try "lmw" again. */ 2577 1.1 christos if (opc == NULL && dot != NULL) 2578 1.1 christos { 2579 1.1 christos *dot = '\0'; 2580 1.1 christos s[-1] = ' '; 2581 1.1 christos s = dot + 1; 2582 1.1 christos dot = NULL; 2583 1.1 christos goto retry_dot; 2584 1.1 christos } 2585 1.1 christos else if (opc == NULL) 2586 1.1 christos { 2587 1.1 christos pdesc->result = NASM_ERR_UNKNOWN_OP; 2588 1.1 christos goto out; 2589 1.1 christos } 2590 1.1 christos 2591 1.1 christos /* There may be multiple syntaxes for a given opcode. 2592 1.1 christos Try each one until a match is found. */ 2593 1.1 christos for (; opc; opc = opc->next) 2594 1.1 christos { 2595 1.1 christos /* Build opcode syntax, if it's not been initialized yet. */ 2596 1.1 christos if (opc->syntax == NULL) 2597 1.1 christos build_opcode_syntax (opc); 2598 1.1 christos 2599 1.1 christos /* Reset status before assemble. */ 2600 1.1 christos pinsn->defuse = opc->defuse; 2601 1.1 christos pinsn->insn = 0; 2602 1.1 christos pinsn->field = NULL; 2603 1.1 christos /* Use opcode attributes to initial instruction attributes. */ 2604 1.1 christos pinsn->attr = opc->attr; 2605 1.1 christos if (parse_insn (pdesc, pinsn, s, opc)) 2606 1.1 christos break; 2607 1.1 christos } 2608 1.1 christos 2609 1.1 christos pinsn->opcode = opc; 2610 1.1 christos if (opc == NULL) 2611 1.1 christos { 2612 1.1 christos if (pdesc->result == NASM_OK) 2613 1.1 christos pdesc->result = NASM_ERR_SYNTAX; 2614 1.1 christos goto out; 2615 1.1 christos } 2616 1.1 christos 2617 1.1 christos /* A matched opcode is found. Write the result to instruction buffer. */ 2618 1.1.1.6 christos pdesc->result = NASM_OK; 2619 1.1 christos 2620 1.1 christos out: 2621 free (str); 2622 } 2623