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