1 /* NDS32-specific support for 32-bit ELF. 2 Copyright (C) 2012-2014 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 {"core_id", SRIDX (0, 0, 1), 0}, {"cr5", SRIDX (0, 0, 1), 0}, 1028 {"fucop_exist", SRIDX (0, 5, 0), 0}, {"cr6", SRIDX (0, 5, 0), 0}, 1029 1030 {"psw", SRIDX (1, 0, 0), 0}, {"ir0", SRIDX (1, 0, 0), 0}, 1031 {"ipsw", SRIDX (1, 0, 1), 0}, {"ir1", SRIDX (1, 0, 1), 0}, 1032 {"p_ipsw", SRIDX (1, 0, 2), 0}, {"ir2", SRIDX (1, 0, 2), 0}, 1033 {"ivb", SRIDX (1, 1, 1), 0}, {"ir3", SRIDX (1, 1, 1), 0}, 1034 {"eva", SRIDX (1, 2, 1), 0}, {"ir4", SRIDX (1, 2, 1), 0}, 1035 {"p_eva", SRIDX (1, 2, 2), 0}, {"ir5", SRIDX (1, 2, 2), 0}, 1036 {"itype", SRIDX (1, 3, 1), 0}, {"ir6", SRIDX (1, 3, 1), 0}, 1037 {"p_itype", SRIDX (1, 3, 2), 0}, {"ir7", SRIDX (1, 3, 2), 0}, 1038 {"merr", SRIDX (1, 4, 1), 0}, {"ir8", SRIDX (1, 4, 1), 0}, 1039 {"ipc", SRIDX (1, 5, 1), 0}, {"ir9", SRIDX (1, 5, 1), 0}, 1040 {"p_ipc", SRIDX (1, 5, 2), 0}, {"ir10", SRIDX (1, 5, 2), 0}, 1041 {"oipc", SRIDX (1, 5, 3), 0}, {"ir11", SRIDX (1, 5, 3), 0}, 1042 {"p_p0", SRIDX (1, 6, 2), 0}, {"ir12", SRIDX (1, 6, 2), 0}, 1043 {"p_p1", SRIDX (1, 7, 2), 0}, {"ir13", SRIDX (1, 7, 2), 0}, 1044 {"int_mask", SRIDX (1, 8, 0), 0}, {"ir14", SRIDX (1, 8, 0), 0}, 1045 {"int_pend", SRIDX (1, 9, 0), 0}, {"ir15", SRIDX (1, 9, 0), 0}, 1046 {"sp_usr", SRIDX (1, 10, 0), 0}, {"ir16", SRIDX (1, 10, 0), 0}, 1047 {"sp_priv", SRIDX (1, 10, 1), 0}, {"ir17", SRIDX (1, 10, 1), 0}, 1048 {"int_pri", SRIDX (1, 11, 0), 0}, {"ir18", SRIDX (1, 11, 0), 0}, 1049 {"int_ctrl", SRIDX (1, 1, 2), 0}, {"ir19", SRIDX (1, 1, 2), 0}, 1050 {"sp_usr1", SRIDX (1, 10, 2), 0}, {"ir20", SRIDX (1, 10, 2), 0}, 1051 {"sp_priv1", SRIDX (1, 10, 3), 0}, {"ir21", SRIDX (1, 10, 3), 0}, 1052 {"sp_usr2", SRIDX (1, 10, 4), 0}, {"ir22", SRIDX (1, 10, 4), 0}, 1053 {"sp_priv2", SRIDX (1, 10, 5), 0}, {"ir23", SRIDX (1, 10, 5), 0}, 1054 {"sp_usr3", SRIDX (1, 10, 6), 0}, {"ir24", SRIDX (1, 10, 6), 0}, 1055 {"sp_priv3", SRIDX (1, 10, 7), 0}, {"ir25", SRIDX (1, 10, 7), 0}, 1056 {"int_mask2", SRIDX (1, 8, 1), 0}, {"ir26", SRIDX (1, 8, 1), 0}, 1057 {"int_pend2", SRIDX (1, 9, 1), 0}, {"ir27", SRIDX (1, 9, 1), 0}, 1058 {"int_pri2", SRIDX (1, 11, 1), 0}, {"ir28", SRIDX (1, 11, 1), 0}, 1059 {"int_trigger", SRIDX (1, 9, 4), 0}, {"ir29", SRIDX (1, 9, 4), 0}, 1060 {"int_gpr_push_dis", SRIDX(1, 1, 3), 0}, {"ir30", SRIDX (1, 1, 3), 0}, 1061 1062 {"mmu_ctl", SRIDX (2, 0, 0), 0}, {"mr0", SRIDX (2, 0, 0), 0}, 1063 {"l1_pptb", SRIDX (2, 1, 0), 0}, {"mr1", SRIDX (2, 1, 0), 0}, 1064 {"tlb_vpn", SRIDX (2, 2, 0), 0}, {"mr2", SRIDX (2, 2, 0), 0}, 1065 {"tlb_data", SRIDX (2, 3, 0), 0}, {"mr3", SRIDX (2, 3, 0), 0}, 1066 {"tlb_misc", SRIDX (2, 4, 0), 0}, {"mr4", SRIDX (2, 4, 0), 0}, 1067 {"vlpt_idx", SRIDX (2, 5, 0), 0}, {"mr5", SRIDX (2, 5, 0), 0}, 1068 {"ilmb", SRIDX (2, 6, 0), 0}, {"mr6", SRIDX (2, 6, 0), 0}, 1069 {"dlmb", SRIDX (2, 7, 0), 0}, {"mr7", SRIDX (2, 7, 0), 0}, 1070 {"cache_ctl", SRIDX (2, 8, 0), 0}, {"mr8", SRIDX (2, 8, 0), 0}, 1071 {"hsmp_saddr", SRIDX (2, 9, 0), 0}, {"mr9", SRIDX (2, 9, 0), 0}, 1072 {"hsmp_eaddr", SRIDX (2, 9, 1), 0}, {"mr10", SRIDX (2, 9, 1), 0}, 1073 {"bg_region", SRIDX (2, 0, 1), 0}, {"mr11", SRIDX (2, 0, 1), 0}, 1074 1075 {"pfmc0", SRIDX (4, 0, 0), 0}, {"pfr0", SRIDX (4, 0, 0), 0}, 1076 {"pfmc1", SRIDX (4, 0, 1), 0}, {"pfr1", SRIDX (4, 0, 1), 0}, 1077 {"pfmc2", SRIDX (4, 0, 2), 0}, {"pfr2", SRIDX (4, 0, 2), 0}, 1078 {"pfm_ctl", SRIDX (4, 1, 0), 0}, {"pfr3", SRIDX (4, 1, 0), 0}, 1079 1080 {"dma_cfg", SRIDX (5, 0, 0), 0}, {"dmar0", SRIDX (5, 0, 0), 0}, 1081 {"dma_gcsw", SRIDX (5, 1, 0), 0}, {"dmar1", SRIDX (5, 1, 0), 0}, 1082 {"dma_chnsel", SRIDX (5, 2, 0), 0}, {"dmar2", SRIDX (5, 2, 0), 0}, 1083 {"dma_act", SRIDX (5, 3, 0), 0}, {"dmar3", SRIDX (5, 3, 0), 0}, 1084 {"dma_setup", SRIDX (5, 4, 0), 0}, {"dmar4", SRIDX (5, 4, 0), 0}, 1085 {"dma_isaddr", SRIDX (5, 5, 0), 0}, {"dmar5", SRIDX (5, 5, 0), 0}, 1086 {"dma_esaddr", SRIDX (5, 6, 0), 0}, {"dmar6", SRIDX (5, 6, 0), 0}, 1087 {"dma_tcnt", SRIDX (5, 7, 0), 0}, {"dmar7", SRIDX (5, 7, 0), 0}, 1088 {"dma_status", SRIDX (5, 8, 0), 0}, {"dmar8", SRIDX (5, 8, 0), 0}, 1089 {"dma_2dset", SRIDX (5, 9, 0), 0}, {"dmar9", SRIDX (5, 9, 0), 0}, 1090 {"dma_2dsctl", SRIDX (5, 9, 1), 0}, {"dmar10", SRIDX (5, 9, 1), 0}, 1091 {"dma_rcnt", SRIDX (5, 7, 1), 0}, {"dmar11", SRIDX (5, 7, 1), 0}, 1092 {"dma_hstatus", SRIDX (5, 8, 1), 0}, {"dmar12", SRIDX (5, 8, 1), 0}, 1093 1094 {"sdz_ctl", SRIDX (2, 15, 0), 0}, {"idr0", SRIDX (2, 15, 0), 0}, 1095 {"misc_ctl", SRIDX (2, 15, 1), 0}, {"n12misc_ctl", SRIDX (2, 15, 1), 0}, 1096 {"idr1", SRIDX (2, 15, 1), 0}, 1097 1098 {"secur0", SRIDX (6, 0, 0), 0}, {"sfcr", SRIDX (6, 0, 0), 0}, 1099 1100 {"prusr_acc_ctl", SRIDX (4, 4, 0), 0}, 1101 {"fucpr", SRIDX (4, 5, 0), 0}, {"fucop_ctl", SRIDX (4, 5, 0), 0}, 1102 1103 {"bpc0", SRIDX (3, 0, 0), 0}, {"dr0", SRIDX (3, 0, 0), 0}, 1104 {"bpc1", SRIDX (3, 0, 1), 0}, {"dr1", SRIDX (3, 0, 1), 0}, 1105 {"bpc2", SRIDX (3, 0, 2), 0}, {"dr2", SRIDX (3, 0, 2), 0}, 1106 {"bpc3", SRIDX (3, 0, 3), 0}, {"dr3", SRIDX (3, 0, 3), 0}, 1107 {"bpc4", SRIDX (3, 0, 4), 0}, {"dr4", SRIDX (3, 0, 4), 0}, 1108 {"bpc5", SRIDX (3, 0, 5), 0}, {"dr5", SRIDX (3, 0, 5), 0}, 1109 {"bpc6", SRIDX (3, 0, 6), 0}, {"dr6", SRIDX (3, 0, 6), 0}, 1110 {"bpc7", SRIDX (3, 0, 7), 0}, {"dr7", SRIDX (3, 0, 7), 0}, 1111 {"bpa0", SRIDX (3, 1, 0), 0}, {"dr8", SRIDX (3, 1, 0), 0}, 1112 {"bpa1", SRIDX (3, 1, 1), 0}, {"dr9", SRIDX (3, 1, 1), 0}, 1113 {"bpa2", SRIDX (3, 1, 2), 0}, {"dr10", SRIDX (3, 1, 2), 0}, 1114 {"bpa3", SRIDX (3, 1, 3), 0}, {"dr11", SRIDX (3, 1, 3), 0}, 1115 {"bpa4", SRIDX (3, 1, 4), 0}, {"dr12", SRIDX (3, 1, 4), 0}, 1116 {"bpa5", SRIDX (3, 1, 5), 0}, {"dr13", SRIDX (3, 1, 5), 0}, 1117 {"bpa6", SRIDX (3, 1, 6), 0}, {"dr14", SRIDX (3, 1, 6), 0}, 1118 {"bpa7", SRIDX (3, 1, 7), 0}, {"dr15", SRIDX (3, 1, 7), 0}, 1119 {"bpam0", SRIDX (3, 2, 0), 0}, {"dr16", SRIDX (3, 2, 0), 0}, 1120 {"bpam1", SRIDX (3, 2, 1), 0}, {"dr17", SRIDX (3, 2, 1), 0}, 1121 {"bpam2", SRIDX (3, 2, 2), 0}, {"dr18", SRIDX (3, 2, 2), 0}, 1122 {"bpam3", SRIDX (3, 2, 3), 0}, {"dr19", SRIDX (3, 2, 3), 0}, 1123 {"bpam4", SRIDX (3, 2, 4), 0}, {"dr20", SRIDX (3, 2, 4), 0}, 1124 {"bpam5", SRIDX (3, 2, 5), 0}, {"dr21", SRIDX (3, 2, 5), 0}, 1125 {"bpam6", SRIDX (3, 2, 6), 0}, {"dr22", SRIDX (3, 2, 6), 0}, 1126 {"bpam7", SRIDX (3, 2, 7), 0}, {"dr23", SRIDX (3, 2, 7), 0}, 1127 {"bpv0", SRIDX (3, 3, 0), 0}, {"dr24", SRIDX (3, 3, 0), 0}, 1128 {"bpv1", SRIDX (3, 3, 1), 0}, {"dr25", SRIDX (3, 3, 1), 0}, 1129 {"bpv2", SRIDX (3, 3, 2), 0}, {"dr26", SRIDX (3, 3, 2), 0}, 1130 {"bpv3", SRIDX (3, 3, 3), 0}, {"dr27", SRIDX (3, 3, 3), 0}, 1131 {"bpv4", SRIDX (3, 3, 4), 0}, {"dr28", SRIDX (3, 3, 4), 0}, 1132 {"bpv5", SRIDX (3, 3, 5), 0}, {"dr29", SRIDX (3, 3, 5), 0}, 1133 {"bpv6", SRIDX (3, 3, 6), 0}, {"dr30", SRIDX (3, 3, 6), 0}, 1134 {"bpv7", SRIDX (3, 3, 7), 0}, {"dr31", SRIDX (3, 3, 7), 0}, 1135 {"bpcid0", SRIDX (3, 4, 0), 0}, {"dr32", SRIDX (3, 4, 0), 0}, 1136 {"bpcid1", SRIDX (3, 4, 1), 0}, {"dr33", SRIDX (3, 4, 1), 0}, 1137 {"bpcid2", SRIDX (3, 4, 2), 0}, {"dr34", SRIDX (3, 4, 2), 0}, 1138 {"bpcid3", SRIDX (3, 4, 3), 0}, {"dr35", SRIDX (3, 4, 3), 0}, 1139 {"bpcid4", SRIDX (3, 4, 4), 0}, {"dr36", SRIDX (3, 4, 4), 0}, 1140 {"bpcid5", SRIDX (3, 4, 5), 0}, {"dr37", SRIDX (3, 4, 5), 0}, 1141 {"bpcid6", SRIDX (3, 4, 6), 0}, {"dr38", SRIDX (3, 4, 6), 0}, 1142 {"bpcid7", SRIDX (3, 4, 7), 0}, {"dr39", SRIDX (3, 4, 7), 0}, 1143 {"edm_cfg", SRIDX (3, 5, 0), 0}, {"dr40", SRIDX (3, 5, 0), 0}, 1144 {"edmsw", SRIDX (3, 6, 0), 0}, {"dr41", SRIDX (3, 6, 0), 0}, 1145 {"edm_ctl", SRIDX (3, 7, 0), 0}, {"dr42", SRIDX (3, 7, 0), 0}, 1146 {"edm_dtr", SRIDX (3, 8, 0), 0}, {"dr43", SRIDX (3, 8, 0), 0}, 1147 {"bpmtc", SRIDX (3, 9, 0), 0}, {"dr44", SRIDX (3, 9, 0), 0}, 1148 {"dimbr", SRIDX (3, 10, 0), 0}, {"dr45", SRIDX (3, 10, 0), 0}, 1149 {"tecr0", SRIDX (3, 14, 0), 0}, {"dr46", SRIDX (3, 14, 0), 0}, 1150 {"tecr1", SRIDX (3, 14, 1), 0}, {"dr47", SRIDX (3, 14, 1), 0}, 1151 {NULL,0 ,0} 1152 }; 1153 1154 const keyword_t keyword_cp[] = 1155 { 1156 {"cp0", 0, 0}, {"cp1", 1, 0}, {"cp2", 2, 0}, {"cp3", 3, 0}, {NULL, 0, 0} 1157 }; 1158 1159 const keyword_t keyword_cpr[] = 1160 { 1161 {"cpr0", 0, 0}, {"cpr1", 1, 0}, {"cpr2", 2, 0}, {"cpr3", 3, 0}, 1162 {"cpr4", 4, 0}, {"cpr5", 5, 0}, {"cpr6", 6, 0}, {"cpr7", 7, 0}, 1163 {"cpr8", 8, 0}, {"cpr9", 9, 0}, {"cpr10", 10, 0}, {"cpr11", 11, 0}, 1164 {"cpr12", 12, 0}, {"cpr13", 13, 0}, {"cpr14", 14, 0}, {"cpr15", 15, 0}, 1165 {"cpr16", 16, 0}, {"cpr17", 17, 0}, {"cpr18", 18, 0}, {"cpr19", 19, 0}, 1166 {"cpr20", 20, 0}, {"cpr21", 21, 0}, {"cpr22", 22, 0}, {"cpr23", 23, 0}, 1167 {"cpr24", 24, 0}, {"cpr25", 25, 0}, {"cpr26", 26, 0}, {"cpr27", 27, 0}, 1168 {"cpr28", 28, 0}, {"cpr29", 29, 0}, {"cpr30", 30, 0}, {"cpr31", 31, 0}, 1169 {NULL, 0, 0} 1170 }; 1171 1172 const keyword_t keyword_fsr[] = 1173 { 1174 {"fs0", 0, 0}, {"fs1", 1, 0}, {"fs2", 2, 0}, {"fs3", 3, 0}, {"fs4", 4, 0}, 1175 {"fs5", 5, 0}, {"fs6", 6, 0}, {"fs7", 7, 0}, {"fs8", 8, 0}, {"fs9", 9, 0}, 1176 {"fs10", 10, 0}, {"fs11", 11, 0}, {"fs12", 12, 0}, {"fs13", 13, 0}, 1177 {"fs14", 14, 0}, {"fs15", 15, 0}, {"fs16", 16, 0}, {"fs17", 17, 0}, 1178 {"fs18", 18, 0}, {"fs19", 19, 0}, {"fs20", 20, 0}, {"fs21", 21, 0}, 1179 {"fs22", 22, 0}, {"fs23", 23, 0}, {"fs24", 24, 0}, {"fs25", 25, 0}, 1180 {"fs26", 26, 0}, {"fs27", 27, 0}, {"fs28", 28, 0}, {"fs29", 29, 0}, 1181 {"fs30", 30, 0}, {"fs31", 31, 0}, {NULL, 0 ,0} 1182 }; 1183 1184 const keyword_t keyword_fdr[] = 1185 { 1186 {"fd0", 0, 0}, {"fd1", 1, 0}, {"fd2", 2, 0}, {"fd3", 3, 0}, {"fd4", 4, 0}, 1187 {"fd5", 5, 0}, {"fd6", 6, 0}, {"fd7", 7, 0}, {"fd8", 8, 0}, {"fd9", 9, 0}, 1188 {"fd10", 10, 0}, {"fd11", 11, 0}, {"fd12", 12, 0}, {"fd13", 13, 0}, 1189 {"fd14", 14, 0}, {"fd15", 15, 0}, {"fd16", 16, 0}, {"fd17", 17, 0}, 1190 {"fd18", 18, 0}, {"fd19", 19, 0}, {"fd20", 20, 0}, {"fd21", 21, 0}, 1191 {"fd22", 22, 0}, {"fd23", 23, 0}, {"fd24", 24, 0}, {"fd25", 25, 0}, 1192 {"fd26", 26, 0}, {"fd27", 27, 0}, {"fd28", 28, 0}, {"fd29", 29, 0}, 1193 {"fd30", 30, 0}, {"fd31", 31, 0}, {NULL, 0, 0} 1194 }; 1195 1196 const keyword_t keyword_abdim[] = 1197 { 1198 {"bi", 0, 0}, {"bim", 1, 0}, {"bd", 2, 0}, {"bdm", 3, 0}, 1199 {"ai", 4, 0}, {"aim", 5, 0}, {"ad", 6, 0}, {"adm", 7, 0}, 1200 {NULL, 0, 0} 1201 }; 1202 1203 const keyword_t keyword_abm[] = 1204 { 1205 {"b", 0, 0}, {"bm", 1, 0}, {"bx", 2, 0}, {"bmx", 3, 0}, 1206 {"a", 4, 0}, {"am", 5, 0}, {"ax", 6, 0}, {"amx", 7, 0}, 1207 {NULL, 0, 0} 1208 }; 1209 1210 static const keyword_t keyword_dtiton[] = 1211 { 1212 {"iton", 1, 0}, {"ton", 3, 0}, {NULL, 0, 0} 1213 }; 1214 1215 static const keyword_t keyword_dtitoff[] = 1216 { 1217 {"itoff", 1, 0}, {"toff", 3, 0}, {NULL, 0, 0} 1218 }; 1219 1220 const keyword_t keyword_dpref_st[] = 1221 { 1222 {"srd", 0, 0}, {"mrd", 1, 0}, {"swr", 2, 0}, {"mwr", 3, 0}, 1223 {"pte", 4, 0}, {"clwr", 5, 0}, {NULL, 0, 0} 1224 }; 1225 1226 /* CCTL Ra, SubType. */ 1227 static const keyword_t keyword_cctl_st0[] = 1228 { 1229 {"l1d_ix_inval", 0X0, 0}, {"l1d_ix_wb", 0X1, 0}, {"l1d_ix_wbinval", 0X2, 0}, 1230 {"l1d_va_fillck", 0XB, 0}, {"l1d_va_ulck", 0XC, 0}, {"l1i_ix_inval", 0X10, 0}, 1231 {"l1i_va_fillck", 0X1B, 0}, {"l1i_va_ulck", 0X1C, 0}, 1232 {NULL, 0, 0} 1233 }; 1234 1235 /* CCTL Ra, SubType, level. */ 1236 static const keyword_t keyword_cctl_st1[] = 1237 { 1238 {"l1d_va_inval", 0X8, 0}, {"l1d_va_wb", 0X9, 0}, 1239 {"l1d_va_wbinval", 0XA, 0}, {"l1i_va_inval", 0X18, 0}, 1240 {NULL, 0, 0} 1241 }; 1242 1243 /* CCTL Rt, Ra, SubType. */ 1244 static const keyword_t keyword_cctl_st2[] = 1245 { 1246 {"l1d_ix_rtag", 0X3, 0}, {"l1d_ix_rwd", 0X4, 0}, 1247 {"l1i_ix_rtag", 0X13, 0}, {"l1i_ix_rwd", 0X14, 0}, 1248 {NULL, 0, 0} 1249 }; 1250 1251 /* CCTL Rb, Ra, SubType. */ 1252 static const keyword_t keyword_cctl_st3[] = 1253 { 1254 {"l1d_ix_wtag", 0X5, 0}, {"l1d_ix_wwd", 0X6, 0}, 1255 {"l1i_ix_wtag", 0X15, 0}, {"l1i_ix_wwd", 0X16, 0}, 1256 {NULL, 0, 0} 1257 }; 1258 1259 /* CCTL L1D_INVALALL. */ 1260 static const keyword_t keyword_cctl_st4[] = 1261 { 1262 {"l1d_invalall", 0x7, 0}, {NULL, 0, 0} 1263 }; 1264 1265 /* CCTL L1D_WBALL, level. */ 1266 static const keyword_t keyword_cctl_st5[] = 1267 { 1268 {"l1d_wball", 0xf, 0}, {NULL, 0, 0} 1269 }; 1270 1271 const keyword_t keyword_cctl_lv[] = 1272 { 1273 {"1level", 0, 0}, {"alevel", 1, 0}, {"0", 0, 0}, {"1", 1, 0}, 1274 {NULL, 0, 0}, 1275 }; 1276 1277 static const keyword_t keyword_tlbop_st[] = 1278 { 1279 {"targetread", 0, 0}, {"trd", 0, 0}, 1280 {"targetwrite", 1, 0}, {"twr", 1, 0}, 1281 {"rwrite", 2, 0}, {"rwr", 2, 0}, 1282 {"rwritelock", 3, 0}, {"rwlk", 3, 0}, 1283 {"unlock", 4, 0}, {"unlk", 4, 0}, 1284 {"invalidate", 6, 0}, {"inv", 6, 0}, 1285 {NULL, 0, 0}, 1286 }; 1287 1288 const keyword_t keyword_standby_st[] = 1289 { 1290 {"no_wake_grant", 0, 0}, 1291 {"wake_grant", 1, 0}, 1292 {"wait_done", 2, 0}, 1293 {"0", 0, 0}, 1294 {"1", 1, 0}, 1295 {"2", 2, 0}, 1296 {"3", 3, 0}, 1297 {NULL, 0, 0}, 1298 }; 1299 1300 const keyword_t keyword_msync_st[] = 1301 { 1302 {"all", 0, 0}, {"store", 1, 0}, 1303 {NULL, 0, 0} 1304 }; 1305 1306 const keyword_t keyword_im5_i[] = 1307 { 1308 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1309 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1310 {NULL, 0, 0} 1311 }; 1312 1313 const keyword_t keyword_im5_m[] = 1314 { 1315 {"m0", 0, 0}, {"m1", 1, 0}, {"m2", 2, 0}, {"m3", 3, 0}, 1316 {"m4", 4, 0}, {"m5", 5, 0}, {"m6", 6, 0}, {"m7", 7, 0}, 1317 {NULL, 0, 0} 1318 }; 1319 1320 const keyword_t keyword_accumulator[] = 1321 { 1322 {"d0.lo", 0, 0}, {"d0.hi", 1, 0}, {"d1.lo", 2, 0}, {"d1.hi", 3, 0}, 1323 {NULL, 0, 0} 1324 }; 1325 1326 const keyword_t keyword_aridx[] = 1327 { 1328 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1329 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1330 {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0}, 1331 {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0}, 1332 {"d0.l24", 16, 0}, {"d1.l24", 17, 0}, 1333 {"shft_ctl0", 18, 0}, {"shft_ctl1", 19, 0}, 1334 {"lb", 24, 0}, {"le", 25, 0}, {"lc", 26, 0}, {"adm_vbase", 27, 0}, 1335 {NULL, 0, 0} 1336 }; 1337 1338 const keyword_t keyword_aridx2[] = 1339 { 1340 {"cbb0", 0, 0}, {"cbb1", 1, 0}, {"cbb2", 2, 0}, {"cbb3", 3, 0}, 1341 {"cbe0", 4, 0}, {"cbe1", 5, 0}, {"cbe2", 6, 0}, {"cbe3", 7, 0}, 1342 {"cb_ctl", 31, 0}, 1343 {NULL, 0, 0} 1344 }; 1345 1346 const keyword_t keyword_aridxi[] = 1347 { 1348 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0}, 1349 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0}, 1350 {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0}, 1351 {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0}, 1352 {NULL, 0, 0} 1353 }; 1354 1355 const keyword_t *keywords[_HW_LAST] = 1356 { 1357 keyword_gpr, keyword_usr, keyword_dxr, keyword_sr, keyword_fsr, 1358 keyword_fdr, keyword_cp, keyword_cpr, keyword_abdim, keyword_abm, 1359 keyword_dtiton, keyword_dtitoff, keyword_dpref_st, 1360 keyword_cctl_st0, keyword_cctl_st1, keyword_cctl_st2, 1361 keyword_cctl_st3, keyword_cctl_st4, keyword_cctl_st5, 1362 keyword_cctl_lv, keyword_tlbop_st, keyword_standby_st, 1363 keyword_msync_st, 1364 keyword_im5_i, keyword_im5_m, 1365 keyword_accumulator, keyword_aridx, keyword_aridx2, keyword_aridxi 1366 }; 1367 1368 /* Hash table for syntax lex. */ 1370 static htab_t field_htab; 1371 /* Hash table for opcodes. */ 1372 static htab_t opcode_htab; 1373 /* Hash table for hardware resources. */ 1374 static htab_t hw_ktabs[_HW_LAST]; 1375 1376 static hashval_t 1377 htab_hash_hash (const void *p) 1378 { 1379 struct nds32_hash_entry *h = (struct nds32_hash_entry *) p; 1380 1381 return htab_hash_string (h->name); 1382 } 1383 1384 static int 1385 htab_hash_eq (const void *p, const void *q) 1386 { 1387 struct nds32_hash_entry *h = (struct nds32_hash_entry *) p; 1388 const char *name = (const char *) q; 1389 1390 return strcmp (name, h->name) == 0; 1391 } 1392 1393 /* Build a hash table for array BASE. Each element is in size of SIZE, 1395 and it's first element is a pointer to the key of string. 1396 It stops inserting elements until reach an NULL key. */ 1397 1398 static htab_t 1399 build_hash_table (const void *base, size_t size) 1400 { 1401 htab_t htab; 1402 hashval_t hash; 1403 const char *p; 1404 1405 htab = htab_create_alloc (128, htab_hash_hash, htab_hash_eq, 1406 NULL, xcalloc, free); 1407 1408 p = base; 1409 while (1) 1410 { 1411 struct nds32_hash_entry **slot; 1412 struct nds32_hash_entry *h; 1413 1414 h = (struct nds32_hash_entry *) p; 1415 1416 if (h->name == NULL) 1417 break; 1418 1419 hash = htab_hash_string (h->name); 1420 slot = (struct nds32_hash_entry **) 1421 htab_find_slot_with_hash (htab, h->name, hash, INSERT); 1422 1423 assert (slot != NULL && *slot == NULL); 1424 1425 *slot = h; 1426 1427 p = p + size; 1428 } 1429 1430 return htab; 1431 } 1432 1433 /* Build the syntax for a given opcode OPC. It parses the string 1434 pointed by INSTRUCTION and store the result on SYNTAX, so 1435 when we assemble an instruction, we don't have to parse the syntax 1436 again. */ 1437 1438 static void 1439 build_opcode_syntax (struct nds32_opcode *opc) 1440 { 1441 char odstr[MAX_LEX_LEN]; 1442 const char *str; 1443 const char *end; 1444 lex_t *plex; 1445 int len; 1446 hashval_t hash; 1447 field_t *fd; 1448 int opt = 0; 1449 1450 /* Check whether it has been initialized. */ 1451 if (opc->syntax) 1452 return; 1453 1454 opc->syntax = xmalloc (MAX_LEX_NUM * sizeof (lex_t)); 1455 1456 str = opc->instruction; 1457 plex = opc->syntax; 1458 while (*str) 1459 { 1460 int fidx; 1461 1462 switch (*str) 1463 { 1464 case '%': 1465 *plex = SYN_INPUT; 1466 break; 1467 case '=': 1468 *plex = SYN_OUTPUT; 1469 break; 1470 case '&': 1471 *plex = SYN_INPUT | SYN_OUTPUT; 1472 break; 1473 case '{': 1474 *plex++ = SYN_LOPT; 1475 opt++; 1476 str++; 1477 continue; 1478 case '}': 1479 *plex++ = SYN_ROPT; 1480 str++; 1481 continue; 1482 default: 1483 *plex++ = *str++; 1484 continue; 1485 } 1486 str++; 1487 1488 /* Extract operand. */ 1489 end = str; 1490 while (ISALNUM (*end) || *end == '_') 1491 end++; 1492 len = end - str; 1493 memcpy (odstr, str, len); 1494 odstr[len] = '\0'; 1495 1496 hash = htab_hash_string (odstr); 1497 fd = (field_t *) htab_find_with_hash (field_htab, odstr, hash); 1498 fidx = fd - operand_fields; 1499 1500 if (fd == NULL) 1501 { 1502 fprintf (stderr, "Internal error: Unknown operand, %s\n", str); 1503 } 1504 assert (fd && fidx >= 0 && fidx < (int) ARRAY_SIZE (operand_fields)); 1505 *plex |= LEX_SET_FIELD (fidx); 1506 1507 str += len; 1508 plex++; 1509 } 1510 1511 *plex = 0; 1512 opc->variant = opt; 1513 return; 1514 } 1515 1516 /* Initialize the assembler. It must be called before assembling. */ 1517 1518 void 1519 nds32_asm_init (nds32_asm_desc_t *pdesc, int flags) 1520 { 1521 int i; 1522 hashval_t hash; 1523 1524 pdesc->flags = flags; 1525 pdesc->mach = flags & NASM_OPEN_ARCH_MASK; 1526 1527 /* Build keyword tables. */ 1528 field_htab = build_hash_table (operand_fields, 1529 sizeof (operand_fields[0])); 1530 1531 for (i = 0; i < _HW_LAST; i++) 1532 hw_ktabs[i] = build_hash_table (keywords[i], sizeof (keyword_t)); 1533 1534 /* Build opcode table. */ 1535 opcode_htab = htab_create_alloc (128, htab_hash_hash, htab_hash_eq, 1536 NULL, xcalloc, free); 1537 1538 for (i = 0; i < (int) ARRAY_SIZE (nds32_opcodes); i++) 1539 { 1540 struct nds32_opcode **slot; 1541 struct nds32_opcode *opc; 1542 1543 opc = &nds32_opcodes[i]; 1544 if ((opc->opcode != NULL) && (opc->instruction != NULL)) 1545 { 1546 hash = htab_hash_string (opc->opcode); 1547 slot = (struct nds32_opcode **) 1548 htab_find_slot_with_hash (opcode_htab, opc->opcode, hash, INSERT); 1549 1550 #define NDS32_PREINIT_SYNTAX 1551 #if defined (NDS32_PREINIT_SYNTAX) 1552 /* Initial SYNTAX when build opcode table, so bug in syntax can be 1553 found when initialized rather than used. */ 1554 build_opcode_syntax (opc); 1555 #endif 1556 1557 if (*slot == NULL) 1558 { 1559 /* This is the new one. */ 1560 *slot = opc; 1561 } 1562 else 1563 { 1564 /* Already exists. Append to the list. */ 1565 opc = *slot; 1566 while (opc->next) 1567 opc = opc->next; 1568 opc->next = &nds32_opcodes[i]; 1569 } 1570 } 1571 } 1572 } 1573 1574 /* Parse the input and store operand keyword string in ODSTR. 1575 This function is only used for parsing keywords, 1576 HW_INT/HW_UINT are parsed parse_operand callback handler. */ 1577 1578 static char * 1579 parse_to_delimiter (char *str, char odstr[MAX_KEYWORD_LEN]) 1580 { 1581 char *outp = odstr; 1582 1583 while (ISALNUM (*str) || *str == '.' || *str == '_') 1584 *outp++ = TOLOWER (*str++); 1585 1586 *outp = '\0'; 1587 return str; 1588 } 1589 1590 /* Parse the operand of lmw/smw/lmwa/smwa. */ 1591 1592 static int 1593 parse_re (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1594 struct nds32_asm_insn *pinsn, char **pstr, int64_t *value) 1595 { 1596 char *end = *pstr; 1597 char odstr[MAX_KEYWORD_LEN]; 1598 keyword_t *k; 1599 hashval_t hash; 1600 1601 if (*end == '$') 1602 end++; 1603 end = parse_to_delimiter (end, odstr); 1604 1605 hash = htab_hash_string (odstr); 1606 k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash); 1607 1608 if (k == NULL) 1609 return NASM_ERR_OPERAND; 1610 1611 if (__GF (pinsn->insn, 20, 5) > (unsigned int) k->value) 1612 return NASM_ERR_OPERAND; 1613 1614 *value = k->value; 1615 *pstr = end; 1616 return NASM_R_CONST; 1617 } 1618 1619 /* Parse the operand of push25/pop25. */ 1620 1621 static int 1622 parse_re2 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1623 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1624 char **pstr, int64_t *value) 1625 { 1626 char *end = *pstr; 1627 char odstr[MAX_KEYWORD_LEN]; 1628 keyword_t *k; 1629 hashval_t hash; 1630 1631 if (*end == '$') 1632 end++; 1633 end = parse_to_delimiter (end, odstr); 1634 1635 hash = htab_hash_string (odstr); 1636 k = htab_find_with_hash (hw_ktabs[HW_GPR], odstr, hash); 1637 1638 if (k == NULL) 1639 return NASM_ERR_OPERAND; 1640 1641 if (k->value == 6) 1642 *value = 0; 1643 else if (k->value == 8) 1644 *value = 1; 1645 else if (k->value == 10) 1646 *value = 2; 1647 else if (k->value == 14) 1648 *value = 3; 1649 else 1650 return NASM_ERR_OPERAND; 1651 1652 *pstr = end; 1653 return NASM_R_CONST; 1654 } 1655 1656 /* Parse the operand of lwi45.fe. */ 1657 1658 static int 1659 parse_fe5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn, 1660 char **pstr, int64_t *value) 1661 { 1662 int r; 1663 1664 r = pdesc->parse_operand (pdesc, pinsn, pstr, value); 1665 if (r != NASM_R_CONST) 1666 return NASM_ERR_OPERAND; 1667 1668 /* 128 == 32 << 2. Leave the shift to parse_opreand, 1669 so it can check whether it is a multiple of 4. */ 1670 *value = 128 + *value; 1671 return r; 1672 } 1673 1674 /* Parse the operand of movpi45. */ 1675 1676 static int 1677 parse_pi5 (struct nds32_asm_desc *pdesc, struct nds32_asm_insn *pinsn, 1678 char **pstr, int64_t *value) 1679 { 1680 int r; 1681 1682 r = pdesc->parse_operand (pdesc, pinsn, pstr, value); 1683 if (r != NASM_R_CONST) 1684 return NASM_ERR_OPERAND; 1685 1686 *value -= 16; 1687 return r; 1688 } 1689 1690 static int aext_a30b20 = 0; 1691 static int aext_rte = 0; 1692 static int aext_im5_ip = 0; 1693 static int aext_im6_ip = 0; 1694 /* Parse the operand of audio ext. */ 1695 static int 1696 parse_aext_reg (char **pstr, int *value, int hw_res) 1697 { 1698 char *end = *pstr; 1699 char odstr[MAX_KEYWORD_LEN]; 1700 keyword_t *k; 1701 hashval_t hash; 1702 1703 if (*end == '$') 1704 end++; 1705 end = parse_to_delimiter (end, odstr); 1706 1707 hash = htab_hash_string (odstr); 1708 k = htab_find_with_hash (hw_ktabs[hw_res], odstr, hash); 1709 1710 if (k == NULL) 1711 return NASM_ERR_OPERAND; 1712 1713 *value = k->value; 1714 *pstr = end; 1715 return NASM_R_CONST; 1716 } 1717 1718 static int 1719 parse_a30b20 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1720 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1721 char **pstr, int64_t *value) 1722 { 1723 int rt_value, ret; 1724 1725 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1726 1727 if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)) 1728 return NASM_ERR_OPERAND; 1729 1730 *value = rt_value; 1731 aext_a30b20 = rt_value; 1732 return NASM_R_CONST; 1733 } 1734 1735 static int 1736 parse_rt21 (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1737 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1738 char **pstr, int64_t *value) 1739 { 1740 int rt_value, ret, tmp_value, tmp1, tmp2; 1741 1742 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1743 1744 if ((ret == NASM_ERR_OPERAND) || (rt_value > 15)) 1745 return NASM_ERR_OPERAND; 1746 tmp1 = (aext_a30b20 & 0x08); 1747 tmp2 = (rt_value & 0x08); 1748 if (tmp1 != tmp2) 1749 return NASM_ERR_OPERAND; 1750 1751 /* Rt=CONCAT(c, t21, t0), t21:bit11-10, t0:bit5. */ 1752 tmp_value = (rt_value & 0x06) << 4; 1753 tmp_value |= (rt_value & 0x01); 1754 *value = tmp_value; 1755 return NASM_R_CONST; 1756 } 1757 1758 static int 1759 parse_rte_start (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1760 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1761 char **pstr, int64_t *value) 1762 { 1763 int rt_value, ret, tmp1, tmp2; 1764 1765 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1766 1767 if ((ret == NASM_ERR_OPERAND) || (rt_value > 15) 1768 || (rt_value & 0x01)) 1769 return NASM_ERR_OPERAND; 1770 tmp1 = (aext_a30b20 & 0x08); 1771 tmp2 = (rt_value & 0x08); 1772 if (tmp1 != tmp2) 1773 return NASM_ERR_OPERAND; 1774 1775 aext_rte = rt_value; 1776 /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */ 1777 rt_value = (rt_value & 0x06) << 4; 1778 *value = rt_value; 1779 return NASM_R_CONST; 1780 } 1781 1782 static int 1783 parse_rte_end (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1784 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1785 char **pstr, int64_t *value) 1786 { 1787 int rt_value, ret, tmp1, tmp2; 1788 1789 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1790 if ((ret == NASM_ERR_OPERAND) || (rt_value > 15) 1791 || ((rt_value & 0x01) == 0) 1792 || (rt_value != (aext_rte + 1))) 1793 return NASM_ERR_OPERAND; 1794 tmp1 = (aext_a30b20 & 0x08); 1795 tmp2 = (rt_value & 0x08); 1796 if (tmp1 != tmp2) 1797 return NASM_ERR_OPERAND; 1798 /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */ 1799 rt_value = (rt_value & 0x06) << 4; 1800 *value = rt_value; 1801 return NASM_R_CONST; 1802 } 1803 1804 static int 1805 parse_rte69_start (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1806 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1807 char **pstr, int64_t *value) 1808 { 1809 int rt_value, ret; 1810 1811 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1812 if ((ret == NASM_ERR_OPERAND) 1813 || (rt_value & 0x01)) 1814 return NASM_ERR_OPERAND; 1815 aext_rte = rt_value; 1816 rt_value = (rt_value >> 1); 1817 *value = rt_value; 1818 return NASM_R_CONST; 1819 } 1820 1821 static int 1822 parse_rte69_end (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1823 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1824 char **pstr, int64_t *value) 1825 { 1826 int rt_value, ret; 1827 1828 ret = parse_aext_reg (pstr, &rt_value, HW_GPR); 1829 if ((ret == NASM_ERR_OPERAND) 1830 || ((rt_value & 0x01) == 0) 1831 || (rt_value != (aext_rte + 1))) 1832 return NASM_ERR_OPERAND; 1833 aext_rte = rt_value; 1834 rt_value = (rt_value >> 1); 1835 *value = rt_value; 1836 return NASM_R_CONST; 1837 } 1838 1839 static int 1840 parse_im5_ip (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1841 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1842 char **pstr, int64_t *value) 1843 { 1844 int rt_value, ret, new_value; 1845 1846 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I); 1847 if (ret == NASM_ERR_OPERAND) 1848 return NASM_ERR_OPERAND; 1849 /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */ 1850 new_value = (rt_value & 0x04) << 2; 1851 new_value |= (rt_value & 0x03); 1852 *value = new_value; 1853 aext_im5_ip = new_value; 1854 return NASM_R_CONST; 1855 } 1856 1857 static int 1858 parse_im5_mr (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1859 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1860 char **pstr, int64_t *value) 1861 { 1862 int rt_value, ret, new_value, tmp1, tmp2; 1863 1864 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M); 1865 if (ret == NASM_ERR_OPERAND) 1866 return NASM_ERR_OPERAND; 1867 /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */ 1868 new_value = (rt_value & 0x07) << 2; 1869 tmp1 = (aext_im5_ip & 0x10); 1870 tmp2 = (new_value & 0x10); 1871 if (tmp1 != tmp2) 1872 return NASM_ERR_OPERAND; 1873 *value = new_value; 1874 return NASM_R_CONST; 1875 } 1876 1877 static int 1878 parse_im6_ip (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1879 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1880 char **pstr, int64_t *value) 1881 { 1882 int rt_value, ret; 1883 1884 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I); 1885 if ((ret == NASM_ERR_OPERAND) || (rt_value > 3)) 1886 return NASM_ERR_OPERAND; 1887 /* p = 0.bit[1:0]. */ 1888 aext_im6_ip = rt_value; 1889 *value = aext_im6_ip; 1890 return NASM_R_CONST; 1891 } 1892 1893 static int 1894 parse_im6_iq (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1895 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1896 char **pstr, int64_t *value) 1897 { 1898 int rt_value, ret; 1899 1900 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_I); 1901 if ((ret == NASM_ERR_OPERAND) || (rt_value < 4)) 1902 return NASM_ERR_OPERAND; 1903 /* q = 1.bit[1:0]. */ 1904 if ((rt_value & 0x03) != aext_im6_ip) 1905 return NASM_ERR_OPERAND; 1906 *value = aext_im6_ip; 1907 return NASM_R_CONST; 1908 } 1909 1910 static int 1911 parse_im6_mr (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1912 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1913 char **pstr, int64_t *value) 1914 { 1915 int rt_value, ret; 1916 1917 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M); 1918 if ((ret == NASM_ERR_OPERAND) || (rt_value > 3)) 1919 return NASM_ERR_OPERAND; 1920 /* r = 0.bit[3:2]. */ 1921 *value = (rt_value & 0x03); 1922 return NASM_R_CONST; 1923 } 1924 1925 static int 1926 parse_im6_ms (struct nds32_asm_desc *pdesc ATTRIBUTE_UNUSED, 1927 struct nds32_asm_insn *pinsn ATTRIBUTE_UNUSED, 1928 char **pstr, int64_t *value) 1929 { 1930 int rt_value, ret; 1931 1932 ret = parse_aext_reg (pstr, &rt_value, HW_AEXT_IM_M); 1933 if ((ret == NASM_ERR_OPERAND) || (rt_value < 4)) 1934 return NASM_ERR_OPERAND; 1935 /* s = 1.bit[5:4]. */ 1936 *value = (rt_value & 0x03); 1937 return NASM_R_CONST; 1938 } 1939 1940 /* Generic operand parse base on the information provided by the field. */ 1941 1942 static int 1943 parse_operand (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 1944 char **str, int syn) 1945 { 1946 char odstr[MAX_KEYWORD_LEN]; 1947 char *end; 1948 hashval_t hash; 1949 const field_t *fld = &LEX_GET_FIELD (syn); 1950 keyword_t *k; 1951 int64_t value; 1952 int r; 1953 uint64_t modifier = 0; 1954 1955 end = *str; 1956 1957 if (fld->parse) 1958 { 1959 r = fld->parse (pdesc, pinsn, &end, &value); 1960 if (r == NASM_ERR_OPERAND) 1961 { 1962 pdesc->result = NASM_ERR_OPERAND; 1963 return 0; 1964 } 1965 goto done; 1966 } 1967 1968 if (fld->hw_res < _HW_LAST) 1969 { 1970 /* Parse the operand in assembly code. */ 1971 if (*end == '$') 1972 end++; 1973 end = parse_to_delimiter (end, odstr); 1974 1975 hash = htab_hash_string (odstr); 1976 k = htab_find_with_hash (hw_ktabs[fld->hw_res], odstr, hash); 1977 1978 if (k == NULL) 1979 { 1980 pdesc->result = NASM_ERR_OPERAND; 1981 return 0; 1982 } 1983 1984 if (fld->hw_res == HW_GPR && (pdesc->flags & NASM_OPEN_REDUCED_REG) 1985 && (k->attr & ATTR (RDREG)) == 0) 1986 { 1987 /* Register not allowed in reduced register. */ 1988 pdesc->result = NASM_ERR_REG_REDUCED; 1989 return 0; 1990 } 1991 1992 if (fld->hw_res == HW_GPR) 1993 { 1994 if (syn & SYN_INPUT) 1995 pinsn->defuse |= USE_REG (k->value); 1996 if (syn & SYN_OUTPUT) 1997 pinsn->defuse |= DEF_REG (k->value); 1998 } 1999 2000 value = k->value; 2001 if (fld->hw_res == HW_GPR && (fld->bitsize + fld->shift) == 4) 2002 value = nds32_r54map[value]; 2003 } 2004 else if (fld->hw_res == HW_INT || fld->hw_res == HW_UINT) 2005 { 2006 if (*end == '#') 2007 end++; 2008 2009 /* Handle modifiers. Do we need to make a table for modifiers? 2010 Do we need to check unknown modifier? */ 2011 if (strncasecmp (end, "hi20(", 5) == 0) 2012 { 2013 modifier |= NASM_ATTR_HI20; 2014 end += 5; 2015 } 2016 else if (strncasecmp (end, "lo12(", 5) == 0) 2017 { 2018 modifier |= NASM_ATTR_LO12; 2019 end += 5; 2020 } 2021 else if (strncasecmp (end, "lo20(", 5) == 0) 2022 { 2023 /* e.g., movi. */ 2024 modifier |= NASM_ATTR_LO20; 2025 end += 5; 2026 } 2027 2028 r = pdesc->parse_operand (pdesc, pinsn, &end, &value); 2029 if (modifier) 2030 { 2031 /* Consume the ')' of modifier. */ 2032 end++; 2033 pinsn->attr |= modifier; 2034 } 2035 2036 switch (r) 2037 { 2038 case NASM_R_ILLEGAL: 2039 pdesc->result = NASM_ERR_OPERAND; 2040 return 0; 2041 case NASM_R_SYMBOL: 2042 /* This field needs special fix-up. */ 2043 pinsn->field = fld; 2044 break; 2045 case NASM_R_CONST: 2046 if (modifier & NASM_ATTR_HI20) 2047 value = (value >> 12) & 0xfffff; 2048 else if (modifier & NASM_ATTR_LO12) 2049 value = value & 0xfff; 2050 else if (modifier & NASM_ATTR_LO20) 2051 value = value & 0xfffff; 2052 break; 2053 default: 2054 fprintf (stderr, "Internal error: Don't know how to handle " 2055 "parsing results.\n"); 2056 abort (); 2057 } 2058 } 2059 else 2060 { 2061 fprintf (stderr, "Internal error: Unknown hardware resource.\n"); 2062 abort (); 2063 } 2064 2065 done: 2066 /* Don't silently discarding bits. */ 2067 if (value & __MASK (fld->shift)) 2068 { 2069 pdesc->result = NASM_ERR_OUT_OF_RANGE; 2070 return 0; 2071 } 2072 2073 /* Check the range of signed or unsigned result. */ 2074 if (fld->hw_res != HW_INT && ((int32_t) value >> (fld->bitsize + fld->shift))) 2075 { 2076 pdesc->result = NASM_ERR_OUT_OF_RANGE; 2077 return 0; 2078 } 2079 else if (fld->hw_res == HW_INT) 2080 { 2081 /* Sign-ext the value. */ 2082 if (((value >> 32) == 0) && (value & 0x80000000)) 2083 value |= (int64_t) -1 << 31; 2084 2085 2086 /* Shift the value to positive domain. */ 2087 if ((value + (1 << (fld->bitsize + fld->shift - 1))) 2088 >> (fld->bitsize + fld->shift)) 2089 { 2090 pdesc->result = NASM_ERR_OUT_OF_RANGE; 2091 return 0; 2092 } 2093 } 2094 2095 pinsn->insn |= 2096 (((value >> fld->shift) & __MASK (fld->bitsize)) << fld->bitpos); 2097 *str = end; 2098 return 1; 2099 } 2100 2101 /* Try to parse an instruction string based on opcode syntax. */ 2102 2103 static int 2104 parse_insn (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 2105 char *str, struct nds32_opcode *opc) 2106 { 2107 int variant = 0; 2108 char *p = NULL; 2109 2110 /* A syntax may has optional operands, so we have to try each possible 2111 combination to see if the input is accepted. In order to do so, 2112 bit-N represent whether optional-operand-N is used in this combination. 2113 That is, if bit-N is set, optional-operand-N is not used. 2114 2115 For example, there are 2 optional operands in this syntax, 2116 2117 "a{,b}{,c}" 2118 2119 we can try it 4 times (i.e., 1 << 2) 2120 2121 0 (b00): "a,b,c" 2122 1 (b01): "a,c" 2123 2 (b10): "a,b" 2124 3 (b11): "a" 2125 */ 2126 2127 /* The outer do-while loop is used to try each possible optional 2128 operand combination, and VARIANT is the bit mask. The inner loop 2129 iterates each lexeme in the syntax. */ 2130 2131 do 2132 { 2133 /* OPT is the number of optional operands we've seen. */ 2134 int opt = 0; 2135 lex_t *plex; 2136 2137 /* PLEX is the syntax iterator and P is the iterator for input 2138 string. */ 2139 plex = opc->syntax; 2140 p = str; 2141 /* Initial the base value. */ 2142 pinsn->insn = opc->value; 2143 2144 while (*plex) 2145 { 2146 if (IS_LEX_CHAR (*plex)) 2147 { 2148 /* If it's a plain char, just compare it. */ 2149 if (LEX_CHAR (*plex) != TOLOWER (*p)) 2150 { 2151 if (LEX_CHAR (*plex) == '+' && TOLOWER (*p) == '-') 2152 { 2153 /* We don't define minus format for some signed 2154 immediate case, so ignoring '+' here to parse 2155 negative value eazily. Besides, the minus format 2156 can not support for instruction with relocation. 2157 Ex: lwi $r0, [$r0 + imm] */ 2158 plex++; 2159 continue; 2160 } 2161 pdesc->result = NASM_ERR_SYNTAX; 2162 goto reject; 2163 } 2164 p++; 2165 } 2166 else if (*plex & SYN_LOPT) 2167 { 2168 /* If it's '{' and it's not used in this iteration, 2169 just skip the whole optional operand. */ 2170 if ((1 << (opt++)) & variant) 2171 { 2172 while ((*plex & SYN_ROPT) == 0) 2173 plex++; 2174 } 2175 } 2176 else if (*plex & SYN_ROPT) 2177 { 2178 /* ignore. */ 2179 } 2180 else 2181 { 2182 /* If it's a operand, parse the input operand from input. */ 2183 if (!parse_operand (pdesc, pinsn, &p, *plex)) 2184 goto reject; 2185 } 2186 plex++; 2187 } 2188 2189 /* Check whether this syntax is accepted. */ 2190 if (*plex == 0 && (*p == '\0' || *p == '!' || *p == '#')) 2191 return 1; 2192 2193 reject: 2194 /* If not accepted, try another combination. */ 2195 variant++; 2196 } 2197 while (variant < (1 << opc->variant)); 2198 2199 return 0; 2200 } 2201 2202 void 2203 nds32_assemble (nds32_asm_desc_t *pdesc, nds32_asm_insn_t *pinsn, 2204 char *str) 2205 { 2206 struct nds32_opcode *opc; 2207 char *s; 2208 char *mnemoic; 2209 char *dot; 2210 hashval_t hash; 2211 2212 /* Duplicate the string, so we can modify it for convenience. */ 2213 s = strdup (str); 2214 mnemoic = s; 2215 str = s; 2216 2217 /* Find opcode mnemoic. */ 2218 while (*s != ' ' && *s != '\t' && *s != '\0') 2219 s++; 2220 if (*s != '\0') 2221 *s++ = '\0'; 2222 dot = strchr (mnemoic, '.'); 2223 2224 retry_dot: 2225 /* Lookup the opcode syntax. */ 2226 hash = htab_hash_string (mnemoic); 2227 opc = (struct nds32_opcode *) 2228 htab_find_with_hash (opcode_htab, mnemoic, hash); 2229 2230 /* If we cannot find a match syntax, try it again without `.'. 2231 For example, try "lmw.adm" first and then try "lmw" again. */ 2232 if (opc == NULL && dot != NULL) 2233 { 2234 *dot = '\0'; 2235 s[-1] = ' '; 2236 s = dot + 1; 2237 dot = NULL; 2238 goto retry_dot; 2239 } 2240 else if (opc == NULL) 2241 { 2242 pdesc->result = NASM_ERR_UNKNOWN_OP; 2243 goto out; 2244 } 2245 2246 /* There may be multiple syntaxes for a given opcode. 2247 Try each one until a match is found. */ 2248 for (; opc; opc = opc->next) 2249 { 2250 /* Build opcode syntax, if it's not been initialized yet. */ 2251 if (opc->syntax == NULL) 2252 build_opcode_syntax (opc); 2253 2254 /* Reset status before assemble. */ 2255 pinsn->defuse = opc->defuse; 2256 pinsn->insn = 0; 2257 pinsn->field = NULL; 2258 /* Use opcode attributes to initial instruction attributes. */ 2259 pinsn->attr = opc->attr; 2260 if (parse_insn (pdesc, pinsn, s, opc)) 2261 break; 2262 } 2263 2264 pinsn->opcode = opc; 2265 if (opc == NULL) 2266 { 2267 pdesc->result = NASM_ERR_SYNTAX; 2268 goto out; 2269 } 2270 2271 /* A matched opcode is found. Write the result to instruction buffer. */ 2272 pdesc->result = NASM_OK; 2273 2274 out: 2275 free (str); 2276 } 2277