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