1 /* NDS32-specific support for 32-bit ELF.
2 Copyright (C) 2012-2017 Free Software Foundation, Inc.
3 Contributed by Andes Technology Corporation.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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
30 #include "safe-ctype.h"
31 #include "libiberty.h"
35 #include "opcode/nds32.h"
36 #include "nds32-asm.h"
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)
51 #define USRIDX(group, usr) ((group) | ((usr) << 5))
52 #define SRIDX(major, minor, ext) \
53 (((major) << 7) | ((minor) << 3) | (ext))
55 static int parse_re (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
57 static int parse_re2 (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
59 static int parse_fe5 (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
61 static int parse_pi5 (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
63 static int parse_aext_reg (char **, int *, int);
64 static int parse_a30b20 (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
66 static int parse_rt21 (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
68 static int parse_rte_start (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
70 static int parse_rte_end (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
72 static int parse_rte69_start (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
74 static int parse_rte69_end (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
76 static int parse_im5_ip (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
78 static int parse_im5_mr (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
80 static int parse_im6_ip (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
82 static int parse_im6_iq (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
84 static int parse_im6_mr (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
86 static int parse_im6_ms (struct nds32_asm_desc
*, struct nds32_asm_insn
*,
89 /* These are operand prefixes for input/output semantic.
96 Field table for operands and bit-fields. */
98 const field_t operand_fields
[] =
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
},
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. */
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
}
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)
222 struct nds32_opcode nds32_opcodes
[] =
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
739 {"movd44", "=rt5e,%ra5e", 0xfd00, 2, ATTR_V3MUP
, 0, NULL
, 0, NULL
},
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
},
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
},
781 /* Audio ext. instructions. */
783 {"amtari", "%aridxi,%imm16", AUDIO (AMTARI
), 4, ATTR (AUDIO_ISAEXT
), 0, NULL
, 0, NULL
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
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
},
937 const keyword_t keyword_gpr
[] =
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
)},
983 const keyword_t keyword_usr
[] =
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},
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},
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},
1015 const keyword_t keyword_dxr
[] =
1017 {"d0", 0, 0}, {"d1", 1, 0}, {NULL
, 0, 0}
1020 const keyword_t keyword_sr
[] =
1022 {"cpu_ver", SRIDX (0, 0, 0), 0}, {"cr0", SRIDX (0, 0, 0), 0},
1023 {"icm_cfg", SRIDX (0, 1, 0), 0}, {"cr1", SRIDX (0, 1, 0), 0},
1024 {"dcm_cfg", SRIDX (0, 2, 0), 0}, {"cr2", SRIDX (0, 2, 0), 0},
1025 {"mmu_cfg", SRIDX (0, 3, 0), 0}, {"cr3", SRIDX (0, 3, 0), 0},
1026 {"msc_cfg", SRIDX (0, 4, 0), 0}, {"cr4", SRIDX (0, 4, 0), 0},
1027 {"msc_cfg2", SRIDX (0, 4, 1), 0}, {"cr7", SRIDX (0, 4, 1), 0},
1028 {"core_id", SRIDX (0, 0, 1), 0}, {"cr5", SRIDX (0, 0, 1), 0},
1029 {"fucop_exist", SRIDX (0, 5, 0), 0}, {"cr6", SRIDX (0, 5, 0), 0},
1031 {"psw", SRIDX (1, 0, 0), 0}, {"ir0", SRIDX (1, 0, 0), 0},
1032 {"ipsw", SRIDX (1, 0, 1), 0}, {"ir1", SRIDX (1, 0, 1), 0},
1033 {"p_ipsw", SRIDX (1, 0, 2), 0}, {"ir2", SRIDX (1, 0, 2), 0},
1034 {"ivb", SRIDX (1, 1, 1), 0}, {"ir3", SRIDX (1, 1, 1), 0},
1035 {"eva", SRIDX (1, 2, 1), 0}, {"ir4", SRIDX (1, 2, 1), 0},
1036 {"p_eva", SRIDX (1, 2, 2), 0}, {"ir5", SRIDX (1, 2, 2), 0},
1037 {"itype", SRIDX (1, 3, 1), 0}, {"ir6", SRIDX (1, 3, 1), 0},
1038 {"p_itype", SRIDX (1, 3, 2), 0}, {"ir7", SRIDX (1, 3, 2), 0},
1039 {"merr", SRIDX (1, 4, 1), 0}, {"ir8", SRIDX (1, 4, 1), 0},
1040 {"ipc", SRIDX (1, 5, 1), 0}, {"ir9", SRIDX (1, 5, 1), 0},
1041 {"p_ipc", SRIDX (1, 5, 2), 0}, {"ir10", SRIDX (1, 5, 2), 0},
1042 {"oipc", SRIDX (1, 5, 3), 0}, {"ir11", SRIDX (1, 5, 3), 0},
1043 {"p_p0", SRIDX (1, 6, 2), 0}, {"ir12", SRIDX (1, 6, 2), 0},
1044 {"p_p1", SRIDX (1, 7, 2), 0}, {"ir13", SRIDX (1, 7, 2), 0},
1045 {"int_mask", SRIDX (1, 8, 0), 0}, {"ir14", SRIDX (1, 8, 0), 0},
1046 {"int_pend", SRIDX (1, 9, 0), 0}, {"ir15", SRIDX (1, 9, 0), 0},
1047 {"sp_usr", SRIDX (1, 10, 0), 0}, {"ir16", SRIDX (1, 10, 0), 0},
1048 {"sp_priv", SRIDX (1, 10, 1), 0}, {"ir17", SRIDX (1, 10, 1), 0},
1049 {"int_pri", SRIDX (1, 11, 0), 0}, {"ir18", SRIDX (1, 11, 0), 0},
1050 {"int_ctrl", SRIDX (1, 1, 2), 0}, {"ir19", SRIDX (1, 1, 2), 0},
1051 {"sp_usr1", SRIDX (1, 10, 2), 0}, {"ir20", SRIDX (1, 10, 2), 0},
1052 {"sp_priv1", SRIDX (1, 10, 3), 0}, {"ir21", SRIDX (1, 10, 3), 0},
1053 {"sp_usr2", SRIDX (1, 10, 4), 0}, {"ir22", SRIDX (1, 10, 4), 0},
1054 {"sp_priv2", SRIDX (1, 10, 5), 0}, {"ir23", SRIDX (1, 10, 5), 0},
1055 {"sp_usr3", SRIDX (1, 10, 6), 0}, {"ir24", SRIDX (1, 10, 6), 0},
1056 {"sp_priv3", SRIDX (1, 10, 7), 0}, {"ir25", SRIDX (1, 10, 7), 0},
1057 {"int_mask2", SRIDX (1, 8, 1), 0}, {"ir26", SRIDX (1, 8, 1), 0},
1058 {"int_pend2", SRIDX (1, 9, 1), 0}, {"ir27", SRIDX (1, 9, 1), 0},
1059 {"int_pri2", SRIDX (1, 11, 1), 0}, {"ir28", SRIDX (1, 11, 1), 0},
1060 {"int_trigger", SRIDX (1, 9, 4), 0}, {"ir29", SRIDX (1, 9, 4), 0},
1061 {"int_gpr_push_dis", SRIDX(1, 1, 3), 0}, {"ir30", SRIDX (1, 1, 3), 0},
1063 {"mmu_ctl", SRIDX (2, 0, 0), 0}, {"mr0", SRIDX (2, 0, 0), 0},
1064 {"l1_pptb", SRIDX (2, 1, 0), 0}, {"mr1", SRIDX (2, 1, 0), 0},
1065 {"tlb_vpn", SRIDX (2, 2, 0), 0}, {"mr2", SRIDX (2, 2, 0), 0},
1066 {"tlb_data", SRIDX (2, 3, 0), 0}, {"mr3", SRIDX (2, 3, 0), 0},
1067 {"tlb_misc", SRIDX (2, 4, 0), 0}, {"mr4", SRIDX (2, 4, 0), 0},
1068 {"vlpt_idx", SRIDX (2, 5, 0), 0}, {"mr5", SRIDX (2, 5, 0), 0},
1069 {"ilmb", SRIDX (2, 6, 0), 0}, {"mr6", SRIDX (2, 6, 0), 0},
1070 {"dlmb", SRIDX (2, 7, 0), 0}, {"mr7", SRIDX (2, 7, 0), 0},
1071 {"cache_ctl", SRIDX (2, 8, 0), 0}, {"mr8", SRIDX (2, 8, 0), 0},
1072 {"hsmp_saddr", SRIDX (2, 9, 0), 0}, {"mr9", SRIDX (2, 9, 0), 0},
1073 {"hsmp_eaddr", SRIDX (2, 9, 1), 0}, {"mr10", SRIDX (2, 9, 1), 0},
1074 {"bg_region", SRIDX (2, 0, 1), 0}, {"mr11", SRIDX (2, 0, 1), 0},
1076 {"pfmc0", SRIDX (4, 0, 0), 0}, {"pfr0", SRIDX (4, 0, 0), 0},
1077 {"pfmc1", SRIDX (4, 0, 1), 0}, {"pfr1", SRIDX (4, 0, 1), 0},
1078 {"pfmc2", SRIDX (4, 0, 2), 0}, {"pfr2", SRIDX (4, 0, 2), 0},
1079 {"pfm_ctl", SRIDX (4, 1, 0), 0}, {"pfr3", SRIDX (4, 1, 0), 0},
1080 {"hsp_ctl", SRIDX (4, 6, 0), 0}, {"hspr0", SRIDX (4, 6, 0), 0},
1081 {"sp_bound", SRIDX (4, 6, 1), 0}, {"hspr1", SRIDX (4, 6, 1), 0},
1082 {"sp_bound_priv", SRIDX (4, 6, 2), 0},{"hspr2", SRIDX (4, 6, 2), 0},
1084 {"dma_cfg", SRIDX (5, 0, 0), 0}, {"dmar0", SRIDX (5, 0, 0), 0},
1085 {"dma_gcsw", SRIDX (5, 1, 0), 0}, {"dmar1", SRIDX (5, 1, 0), 0},
1086 {"dma_chnsel", SRIDX (5, 2, 0), 0}, {"dmar2", SRIDX (5, 2, 0), 0},
1087 {"dma_act", SRIDX (5, 3, 0), 0}, {"dmar3", SRIDX (5, 3, 0), 0},
1088 {"dma_setup", SRIDX (5, 4, 0), 0}, {"dmar4", SRIDX (5, 4, 0), 0},
1089 {"dma_isaddr", SRIDX (5, 5, 0), 0}, {"dmar5", SRIDX (5, 5, 0), 0},
1090 {"dma_esaddr", SRIDX (5, 6, 0), 0}, {"dmar6", SRIDX (5, 6, 0), 0},
1091 {"dma_tcnt", SRIDX (5, 7, 0), 0}, {"dmar7", SRIDX (5, 7, 0), 0},
1092 {"dma_status", SRIDX (5, 8, 0), 0}, {"dmar8", SRIDX (5, 8, 0), 0},
1093 {"dma_2dset", SRIDX (5, 9, 0), 0}, {"dmar9", SRIDX (5, 9, 0), 0},
1094 {"dma_2dsctl", SRIDX (5, 9, 1), 0}, {"dmar10", SRIDX (5, 9, 1), 0},
1095 {"dma_rcnt", SRIDX (5, 7, 1), 0}, {"dmar11", SRIDX (5, 7, 1), 0},
1096 {"dma_hstatus", SRIDX (5, 8, 1), 0}, {"dmar12", SRIDX (5, 8, 1), 0},
1098 {"sdz_ctl", SRIDX (2, 15, 0), 0}, {"idr0", SRIDX (2, 15, 0), 0},
1099 {"misc_ctl", SRIDX (2, 15, 1), 0}, {"n12misc_ctl", SRIDX (2, 15, 1), 0},
1100 {"idr1", SRIDX (2, 15, 1), 0},
1101 {"ecc_misc", SRIDX (2, 15, 2), 0}, {"idr2", SRIDX (2, 15, 2), 0},
1103 {"secur0", SRIDX (6, 0, 0), 0}, {"sfcr", SRIDX (6, 0, 0), 0},
1104 {"secur1", SRIDX (6, 1, 0), 0}, {"sign", SRIDX (6, 1, 0), 0},
1105 {"secur2", SRIDX (6, 1, 1), 0}, {"isign", SRIDX (6, 1, 1), 0},
1106 {"secur3", SRIDX (6, 1, 2), 0}, {"p_isign", SRIDX (6, 1, 2), 0},
1108 {"prusr_acc_ctl", SRIDX (4, 4, 0), 0},
1109 {"fucpr", SRIDX (4, 5, 0), 0}, {"fucop_ctl", SRIDX (4, 5, 0), 0},
1111 {"bpc0", SRIDX (3, 0, 0), 0}, {"dr0", SRIDX (3, 0, 0), 0},
1112 {"bpc1", SRIDX (3, 0, 1), 0}, {"dr1", SRIDX (3, 0, 1), 0},
1113 {"bpc2", SRIDX (3, 0, 2), 0}, {"dr2", SRIDX (3, 0, 2), 0},
1114 {"bpc3", SRIDX (3, 0, 3), 0}, {"dr3", SRIDX (3, 0, 3), 0},
1115 {"bpc4", SRIDX (3, 0, 4), 0}, {"dr4", SRIDX (3, 0, 4), 0},
1116 {"bpc5", SRIDX (3, 0, 5), 0}, {"dr5", SRIDX (3, 0, 5), 0},
1117 {"bpc6", SRIDX (3, 0, 6), 0}, {"dr6", SRIDX (3, 0, 6), 0},
1118 {"bpc7", SRIDX (3, 0, 7), 0}, {"dr7", SRIDX (3, 0, 7), 0},
1119 {"bpa0", SRIDX (3, 1, 0), 0}, {"dr8", SRIDX (3, 1, 0), 0},
1120 {"bpa1", SRIDX (3, 1, 1), 0}, {"dr9", SRIDX (3, 1, 1), 0},
1121 {"bpa2", SRIDX (3, 1, 2), 0}, {"dr10", SRIDX (3, 1, 2), 0},
1122 {"bpa3", SRIDX (3, 1, 3), 0}, {"dr11", SRIDX (3, 1, 3), 0},
1123 {"bpa4", SRIDX (3, 1, 4), 0}, {"dr12", SRIDX (3, 1, 4), 0},
1124 {"bpa5", SRIDX (3, 1, 5), 0}, {"dr13", SRIDX (3, 1, 5), 0},
1125 {"bpa6", SRIDX (3, 1, 6), 0}, {"dr14", SRIDX (3, 1, 6), 0},
1126 {"bpa7", SRIDX (3, 1, 7), 0}, {"dr15", SRIDX (3, 1, 7), 0},
1127 {"bpam0", SRIDX (3, 2, 0), 0}, {"dr16", SRIDX (3, 2, 0), 0},
1128 {"bpam1", SRIDX (3, 2, 1), 0}, {"dr17", SRIDX (3, 2, 1), 0},
1129 {"bpam2", SRIDX (3, 2, 2), 0}, {"dr18", SRIDX (3, 2, 2), 0},
1130 {"bpam3", SRIDX (3, 2, 3), 0}, {"dr19", SRIDX (3, 2, 3), 0},
1131 {"bpam4", SRIDX (3, 2, 4), 0}, {"dr20", SRIDX (3, 2, 4), 0},
1132 {"bpam5", SRIDX (3, 2, 5), 0}, {"dr21", SRIDX (3, 2, 5), 0},
1133 {"bpam6", SRIDX (3, 2, 6), 0}, {"dr22", SRIDX (3, 2, 6), 0},
1134 {"bpam7", SRIDX (3, 2, 7), 0}, {"dr23", SRIDX (3, 2, 7), 0},
1135 {"bpv0", SRIDX (3, 3, 0), 0}, {"dr24", SRIDX (3, 3, 0), 0},
1136 {"bpv1", SRIDX (3, 3, 1), 0}, {"dr25", SRIDX (3, 3, 1), 0},
1137 {"bpv2", SRIDX (3, 3, 2), 0}, {"dr26", SRIDX (3, 3, 2), 0},
1138 {"bpv3", SRIDX (3, 3, 3), 0}, {"dr27", SRIDX (3, 3, 3), 0},
1139 {"bpv4", SRIDX (3, 3, 4), 0}, {"dr28", SRIDX (3, 3, 4), 0},
1140 {"bpv5", SRIDX (3, 3, 5), 0}, {"dr29", SRIDX (3, 3, 5), 0},
1141 {"bpv6", SRIDX (3, 3, 6), 0}, {"dr30", SRIDX (3, 3, 6), 0},
1142 {"bpv7", SRIDX (3, 3, 7), 0}, {"dr31", SRIDX (3, 3, 7), 0},
1143 {"bpcid0", SRIDX (3, 4, 0), 0}, {"dr32", SRIDX (3, 4, 0), 0},
1144 {"bpcid1", SRIDX (3, 4, 1), 0}, {"dr33", SRIDX (3, 4, 1), 0},
1145 {"bpcid2", SRIDX (3, 4, 2), 0}, {"dr34", SRIDX (3, 4, 2), 0},
1146 {"bpcid3", SRIDX (3, 4, 3), 0}, {"dr35", SRIDX (3, 4, 3), 0},
1147 {"bpcid4", SRIDX (3, 4, 4), 0}, {"dr36", SRIDX (3, 4, 4), 0},
1148 {"bpcid5", SRIDX (3, 4, 5), 0}, {"dr37", SRIDX (3, 4, 5), 0},
1149 {"bpcid6", SRIDX (3, 4, 6), 0}, {"dr38", SRIDX (3, 4, 6), 0},
1150 {"bpcid7", SRIDX (3, 4, 7), 0}, {"dr39", SRIDX (3, 4, 7), 0},
1151 {"edm_cfg", SRIDX (3, 5, 0), 0}, {"dr40", SRIDX (3, 5, 0), 0},
1152 {"edmsw", SRIDX (3, 6, 0), 0}, {"dr41", SRIDX (3, 6, 0), 0},
1153 {"edm_ctl", SRIDX (3, 7, 0), 0}, {"dr42", SRIDX (3, 7, 0), 0},
1154 {"edm_dtr", SRIDX (3, 8, 0), 0}, {"dr43", SRIDX (3, 8, 0), 0},
1155 {"bpmtc", SRIDX (3, 9, 0), 0}, {"dr44", SRIDX (3, 9, 0), 0},
1156 {"dimbr", SRIDX (3, 10, 0), 0}, {"dr45", SRIDX (3, 10, 0), 0},
1157 {"tecr0", SRIDX (3, 14, 0), 0}, {"dr46", SRIDX (3, 14, 0), 0},
1158 {"tecr1", SRIDX (3, 14, 1), 0}, {"dr47", SRIDX (3, 14, 1), 0},
1162 const keyword_t keyword_cp
[] =
1164 {"cp0", 0, 0}, {"cp1", 1, 0}, {"cp2", 2, 0}, {"cp3", 3, 0}, {NULL
, 0, 0}
1167 const keyword_t keyword_cpr
[] =
1169 {"cpr0", 0, 0}, {"cpr1", 1, 0}, {"cpr2", 2, 0}, {"cpr3", 3, 0},
1170 {"cpr4", 4, 0}, {"cpr5", 5, 0}, {"cpr6", 6, 0}, {"cpr7", 7, 0},
1171 {"cpr8", 8, 0}, {"cpr9", 9, 0}, {"cpr10", 10, 0}, {"cpr11", 11, 0},
1172 {"cpr12", 12, 0}, {"cpr13", 13, 0}, {"cpr14", 14, 0}, {"cpr15", 15, 0},
1173 {"cpr16", 16, 0}, {"cpr17", 17, 0}, {"cpr18", 18, 0}, {"cpr19", 19, 0},
1174 {"cpr20", 20, 0}, {"cpr21", 21, 0}, {"cpr22", 22, 0}, {"cpr23", 23, 0},
1175 {"cpr24", 24, 0}, {"cpr25", 25, 0}, {"cpr26", 26, 0}, {"cpr27", 27, 0},
1176 {"cpr28", 28, 0}, {"cpr29", 29, 0}, {"cpr30", 30, 0}, {"cpr31", 31, 0},
1180 const keyword_t keyword_fsr
[] =
1182 {"fs0", 0, 0}, {"fs1", 1, 0}, {"fs2", 2, 0}, {"fs3", 3, 0}, {"fs4", 4, 0},
1183 {"fs5", 5, 0}, {"fs6", 6, 0}, {"fs7", 7, 0}, {"fs8", 8, 0}, {"fs9", 9, 0},
1184 {"fs10", 10, 0}, {"fs11", 11, 0}, {"fs12", 12, 0}, {"fs13", 13, 0},
1185 {"fs14", 14, 0}, {"fs15", 15, 0}, {"fs16", 16, 0}, {"fs17", 17, 0},
1186 {"fs18", 18, 0}, {"fs19", 19, 0}, {"fs20", 20, 0}, {"fs21", 21, 0},
1187 {"fs22", 22, 0}, {"fs23", 23, 0}, {"fs24", 24, 0}, {"fs25", 25, 0},
1188 {"fs26", 26, 0}, {"fs27", 27, 0}, {"fs28", 28, 0}, {"fs29", 29, 0},
1189 {"fs30", 30, 0}, {"fs31", 31, 0}, {NULL
, 0 ,0}
1192 const keyword_t keyword_fdr
[] =
1194 {"fd0", 0, 0}, {"fd1", 1, 0}, {"fd2", 2, 0}, {"fd3", 3, 0}, {"fd4", 4, 0},
1195 {"fd5", 5, 0}, {"fd6", 6, 0}, {"fd7", 7, 0}, {"fd8", 8, 0}, {"fd9", 9, 0},
1196 {"fd10", 10, 0}, {"fd11", 11, 0}, {"fd12", 12, 0}, {"fd13", 13, 0},
1197 {"fd14", 14, 0}, {"fd15", 15, 0}, {"fd16", 16, 0}, {"fd17", 17, 0},
1198 {"fd18", 18, 0}, {"fd19", 19, 0}, {"fd20", 20, 0}, {"fd21", 21, 0},
1199 {"fd22", 22, 0}, {"fd23", 23, 0}, {"fd24", 24, 0}, {"fd25", 25, 0},
1200 {"fd26", 26, 0}, {"fd27", 27, 0}, {"fd28", 28, 0}, {"fd29", 29, 0},
1201 {"fd30", 30, 0}, {"fd31", 31, 0}, {NULL
, 0, 0}
1204 const keyword_t keyword_abdim
[] =
1206 {"bi", 0, 0}, {"bim", 1, 0}, {"bd", 2, 0}, {"bdm", 3, 0},
1207 {"ai", 4, 0}, {"aim", 5, 0}, {"ad", 6, 0}, {"adm", 7, 0},
1211 const keyword_t keyword_abm
[] =
1213 {"b", 0, 0}, {"bm", 1, 0}, {"bx", 2, 0}, {"bmx", 3, 0},
1214 {"a", 4, 0}, {"am", 5, 0}, {"ax", 6, 0}, {"amx", 7, 0},
1218 static const keyword_t keyword_dtiton
[] =
1220 {"iton", 1, 0}, {"ton", 3, 0}, {NULL
, 0, 0}
1223 static const keyword_t keyword_dtitoff
[] =
1225 {"itoff", 1, 0}, {"toff", 3, 0}, {NULL
, 0, 0}
1228 const keyword_t keyword_dpref_st
[] =
1230 {"srd", 0, 0}, {"mrd", 1, 0}, {"swr", 2, 0}, {"mwr", 3, 0},
1231 {"pte", 4, 0}, {"clwr", 5, 0}, {NULL
, 0, 0}
1234 /* CCTL Ra, SubType. */
1235 static const keyword_t keyword_cctl_st0
[] =
1237 {"l1d_ix_inval", 0X0, 0}, {"l1d_ix_wb", 0X1, 0}, {"l1d_ix_wbinval", 0X2, 0},
1238 {"l1d_va_fillck", 0XB, 0}, {"l1d_va_ulck", 0XC, 0}, {"l1i_ix_inval", 0X10, 0},
1239 {"l1i_va_fillck", 0X1B, 0}, {"l1i_va_ulck", 0X1C, 0},
1243 /* CCTL Ra, SubType, level. */
1244 static const keyword_t keyword_cctl_st1
[] =
1246 {"l1d_va_inval", 0X8, 0}, {"l1d_va_wb", 0X9, 0},
1247 {"l1d_va_wbinval", 0XA, 0}, {"l1i_va_inval", 0X18, 0},
1251 /* CCTL Rt, Ra, SubType. */
1252 static const keyword_t keyword_cctl_st2
[] =
1254 {"l1d_ix_rtag", 0X3, 0}, {"l1d_ix_rwd", 0X4, 0},
1255 {"l1i_ix_rtag", 0X13, 0}, {"l1i_ix_rwd", 0X14, 0},
1259 /* CCTL Rb, Ra, SubType. */
1260 static const keyword_t keyword_cctl_st3
[] =
1262 {"l1d_ix_wtag", 0X5, 0}, {"l1d_ix_wwd", 0X6, 0},
1263 {"l1i_ix_wtag", 0X15, 0}, {"l1i_ix_wwd", 0X16, 0},
1267 /* CCTL L1D_INVALALL. */
1268 static const keyword_t keyword_cctl_st4
[] =
1270 {"l1d_invalall", 0x7, 0}, {NULL
, 0, 0}
1273 /* CCTL L1D_WBALL, level. */
1274 static const keyword_t keyword_cctl_st5
[] =
1276 {"l1d_wball", 0xf, 0}, {NULL
, 0, 0}
1279 const keyword_t keyword_cctl_lv
[] =
1281 {"1level", 0, 0}, {"alevel", 1, 0}, {"0", 0, 0}, {"1", 1, 0},
1285 static const keyword_t keyword_tlbop_st
[] =
1287 {"targetread", 0, 0}, {"trd", 0, 0},
1288 {"targetwrite", 1, 0}, {"twr", 1, 0},
1289 {"rwrite", 2, 0}, {"rwr", 2, 0},
1290 {"rwritelock", 3, 0}, {"rwlk", 3, 0},
1291 {"unlock", 4, 0}, {"unlk", 4, 0},
1292 {"invalidate", 6, 0}, {"inv", 6, 0},
1296 const keyword_t keyword_standby_st
[] =
1298 {"no_wake_grant", 0, 0},
1299 {"wake_grant", 1, 0},
1300 {"wait_done", 2, 0},
1308 const keyword_t keyword_msync_st
[] =
1310 {"all", 0, 0}, {"store", 1, 0},
1314 const keyword_t keyword_im5_i
[] =
1316 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
1317 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
1321 const keyword_t keyword_im5_m
[] =
1323 {"m0", 0, 0}, {"m1", 1, 0}, {"m2", 2, 0}, {"m3", 3, 0},
1324 {"m4", 4, 0}, {"m5", 5, 0}, {"m6", 6, 0}, {"m7", 7, 0},
1328 const keyword_t keyword_accumulator
[] =
1330 {"d0.lo", 0, 0}, {"d0.hi", 1, 0}, {"d1.lo", 2, 0}, {"d1.hi", 3, 0},
1334 const keyword_t keyword_aridx
[] =
1336 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
1337 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
1338 {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0},
1339 {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0},
1340 {"d0.l24", 16, 0}, {"d1.l24", 17, 0},
1341 {"shft_ctl0", 18, 0}, {"shft_ctl1", 19, 0},
1342 {"lb", 24, 0}, {"le", 25, 0}, {"lc", 26, 0}, {"adm_vbase", 27, 0},
1346 const keyword_t keyword_aridx2
[] =
1348 {"cbb0", 0, 0}, {"cbb1", 1, 0}, {"cbb2", 2, 0}, {"cbb3", 3, 0},
1349 {"cbe0", 4, 0}, {"cbe1", 5, 0}, {"cbe2", 6, 0}, {"cbe3", 7, 0},
1354 const keyword_t keyword_aridxi
[] =
1356 {"i0", 0, 0}, {"i1", 1, 0}, {"i2", 2, 0}, {"i3", 3, 0},
1357 {"i4", 4, 0}, {"i5", 5, 0}, {"i6", 6, 0}, {"i7", 7, 0},
1358 {"mod", 8, 0}, {"m1", 9, 0}, {"m2", 10, 0}, {"m3",11, 0},
1359 {"m5",13, 0}, {"m6",14, 0}, {"m7",15, 0},
1363 const keyword_t
*keywords
[_HW_LAST
] =
1365 keyword_gpr
, keyword_usr
, keyword_dxr
, keyword_sr
, keyword_fsr
,
1366 keyword_fdr
, keyword_cp
, keyword_cpr
, keyword_abdim
, keyword_abm
,
1367 keyword_dtiton
, keyword_dtitoff
, keyword_dpref_st
,
1368 keyword_cctl_st0
, keyword_cctl_st1
, keyword_cctl_st2
,
1369 keyword_cctl_st3
, keyword_cctl_st4
, keyword_cctl_st5
,
1370 keyword_cctl_lv
, keyword_tlbop_st
, keyword_standby_st
,
1372 keyword_im5_i
, keyword_im5_m
,
1373 keyword_accumulator
, keyword_aridx
, keyword_aridx2
, keyword_aridxi
1376 /* Hash table for syntax lex. */
1377 static htab_t field_htab
;
1378 /* Hash table for opcodes. */
1379 static htab_t opcode_htab
;
1380 /* Hash table for hardware resources. */
1381 static htab_t hw_ktabs
[_HW_LAST
];
1384 htab_hash_hash (const void *p
)
1386 struct nds32_hash_entry
*h
= (struct nds32_hash_entry
*) p
;
1388 return htab_hash_string (h
->name
);
1392 htab_hash_eq (const void *p
, const void *q
)
1394 struct nds32_hash_entry
*h
= (struct nds32_hash_entry
*) p
;
1395 const char *name
= (const char *) q
;
1397 return strcmp (name
, h
->name
) == 0;
1400 /* Build a hash table for array BASE. Each element is in size of SIZE,
1401 and it's first element is a pointer to the key of string.
1402 It stops inserting elements until reach an NULL key. */
1405 build_hash_table (const void *base
, size_t size
)
1411 htab
= htab_create_alloc (128, htab_hash_hash
, htab_hash_eq
,
1412 NULL
, xcalloc
, free
);
1417 struct nds32_hash_entry
**slot
;
1418 struct nds32_hash_entry
*h
;
1420 h
= (struct nds32_hash_entry
*) p
;
1422 if (h
->name
== NULL
)
1425 hash
= htab_hash_string (h
->name
);
1426 slot
= (struct nds32_hash_entry
**)
1427 htab_find_slot_with_hash (htab
, h
->name
, hash
, INSERT
);
1429 assert (slot
!= NULL
&& *slot
== NULL
);
1439 /* Build the syntax for a given opcode OPC. It parses the string
1440 pointed by INSTRUCTION and store the result on SYNTAX, so
1441 when we assemble an instruction, we don't have to parse the syntax
1445 build_opcode_syntax (struct nds32_opcode
*opc
)
1447 char odstr
[MAX_LEX_LEN
];
1456 /* Check whether it has been initialized. */
1460 opc
->syntax
= xmalloc (MAX_LEX_NUM
* sizeof (lex_t
));
1462 str
= opc
->instruction
;
1477 *plex
= SYN_INPUT
| SYN_OUTPUT
;
1494 /* Extract operand. */
1496 while (ISALNUM (*end
) || *end
== '_')
1499 memcpy (odstr
, str
, len
);
1502 hash
= htab_hash_string (odstr
);
1503 fd
= (field_t
*) htab_find_with_hash (field_htab
, odstr
, hash
);
1504 fidx
= fd
- operand_fields
;
1508 fprintf (stderr
, "Internal error: Unknown operand, %s\n", str
);
1510 assert (fd
&& fidx
>= 0 && fidx
< (int) ARRAY_SIZE (operand_fields
));
1511 *plex
|= LEX_SET_FIELD (fidx
);
1522 /* Initialize the assembler. It must be called before assembling. */
1525 nds32_asm_init (nds32_asm_desc_t
*pdesc
, int flags
)
1530 pdesc
->flags
= flags
;
1531 pdesc
->mach
= flags
& NASM_OPEN_ARCH_MASK
;
1533 /* Build keyword tables. */
1534 field_htab
= build_hash_table (operand_fields
,
1535 sizeof (operand_fields
[0]));
1537 for (i
= 0; i
< _HW_LAST
; i
++)
1538 hw_ktabs
[i
] = build_hash_table (keywords
[i
], sizeof (keyword_t
));
1540 /* Build opcode table. */
1541 opcode_htab
= htab_create_alloc (128, htab_hash_hash
, htab_hash_eq
,
1542 NULL
, xcalloc
, free
);
1544 for (i
= 0; i
< (int) ARRAY_SIZE (nds32_opcodes
); i
++)
1546 struct nds32_opcode
**slot
;
1547 struct nds32_opcode
*opc
;
1549 opc
= &nds32_opcodes
[i
];
1550 if ((opc
->opcode
!= NULL
) && (opc
->instruction
!= NULL
))
1552 hash
= htab_hash_string (opc
->opcode
);
1553 slot
= (struct nds32_opcode
**)
1554 htab_find_slot_with_hash (opcode_htab
, opc
->opcode
, hash
, INSERT
);
1556 #define NDS32_PREINIT_SYNTAX
1557 #if defined (NDS32_PREINIT_SYNTAX)
1558 /* Initial SYNTAX when build opcode table, so bug in syntax can be
1559 found when initialized rather than used. */
1560 build_opcode_syntax (opc
);
1565 /* This is the new one. */
1570 /* Already exists. Append to the list. */
1574 opc
->next
= &nds32_opcodes
[i
];
1580 /* Parse the input and store operand keyword string in ODSTR.
1581 This function is only used for parsing keywords,
1582 HW_INT/HW_UINT are parsed parse_operand callback handler. */
1585 parse_to_delimiter (char *str
, char odstr
[MAX_KEYWORD_LEN
])
1589 while (ISALNUM (*str
) || *str
== '.' || *str
== '_')
1590 *outp
++ = TOLOWER (*str
++);
1596 /* Parse the operand of lmw/smw/lmwa/smwa. */
1599 parse_re (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1600 struct nds32_asm_insn
*pinsn
, char **pstr
, int64_t *value
)
1603 char odstr
[MAX_KEYWORD_LEN
];
1609 end
= parse_to_delimiter (end
, odstr
);
1611 hash
= htab_hash_string (odstr
);
1612 k
= htab_find_with_hash (hw_ktabs
[HW_GPR
], odstr
, hash
);
1615 return NASM_ERR_OPERAND
;
1617 if (__GF (pinsn
->insn
, 20, 5) > (unsigned int) k
->value
)
1618 return NASM_ERR_OPERAND
;
1622 return NASM_R_CONST
;
1625 /* Parse the operand of push25/pop25. */
1628 parse_re2 (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1629 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1630 char **pstr
, int64_t *value
)
1633 char odstr
[MAX_KEYWORD_LEN
];
1639 end
= parse_to_delimiter (end
, odstr
);
1641 hash
= htab_hash_string (odstr
);
1642 k
= htab_find_with_hash (hw_ktabs
[HW_GPR
], odstr
, hash
);
1645 return NASM_ERR_OPERAND
;
1649 else if (k
->value
== 8)
1651 else if (k
->value
== 10)
1653 else if (k
->value
== 14)
1656 return NASM_ERR_OPERAND
;
1659 return NASM_R_CONST
;
1662 /* Parse the operand of lwi45.fe. */
1665 parse_fe5 (struct nds32_asm_desc
*pdesc
, struct nds32_asm_insn
*pinsn
,
1666 char **pstr
, int64_t *value
)
1670 r
= pdesc
->parse_operand (pdesc
, pinsn
, pstr
, value
);
1671 if (r
!= NASM_R_CONST
)
1672 return NASM_ERR_OPERAND
;
1674 /* 128 == 32 << 2. Leave the shift to parse_opreand,
1675 so it can check whether it is a multiple of 4. */
1676 *value
= 128 + *value
;
1680 /* Parse the operand of movpi45. */
1683 parse_pi5 (struct nds32_asm_desc
*pdesc
, struct nds32_asm_insn
*pinsn
,
1684 char **pstr
, int64_t *value
)
1688 r
= pdesc
->parse_operand (pdesc
, pinsn
, pstr
, value
);
1689 if (r
!= NASM_R_CONST
)
1690 return NASM_ERR_OPERAND
;
1696 static int aext_a30b20
= 0;
1697 static int aext_rte
= 0;
1698 static int aext_im5_ip
= 0;
1699 static int aext_im6_ip
= 0;
1700 /* Parse the operand of audio ext. */
1702 parse_aext_reg (char **pstr
, int *value
, int hw_res
)
1705 char odstr
[MAX_KEYWORD_LEN
];
1711 end
= parse_to_delimiter (end
, odstr
);
1713 hash
= htab_hash_string (odstr
);
1714 k
= htab_find_with_hash (hw_ktabs
[hw_res
], odstr
, hash
);
1717 return NASM_ERR_OPERAND
;
1721 return NASM_R_CONST
;
1725 parse_a30b20 (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1726 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1727 char **pstr
, int64_t *value
)
1731 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1733 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 15))
1734 return NASM_ERR_OPERAND
;
1737 aext_a30b20
= rt_value
;
1738 return NASM_R_CONST
;
1742 parse_rt21 (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1743 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1744 char **pstr
, int64_t *value
)
1746 int rt_value
, ret
, tmp_value
, tmp1
, tmp2
;
1748 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1750 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 15))
1751 return NASM_ERR_OPERAND
;
1752 tmp1
= (aext_a30b20
& 0x08);
1753 tmp2
= (rt_value
& 0x08);
1755 return NASM_ERR_OPERAND
;
1757 /* Rt=CONCAT(c, t21, t0), t21:bit11-10, t0:bit5. */
1758 tmp_value
= (rt_value
& 0x06) << 4;
1759 tmp_value
|= (rt_value
& 0x01);
1761 return NASM_R_CONST
;
1765 parse_rte_start (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1766 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1767 char **pstr
, int64_t *value
)
1769 int rt_value
, ret
, tmp1
, tmp2
;
1771 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1773 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 15)
1774 || (rt_value
& 0x01))
1775 return NASM_ERR_OPERAND
;
1776 tmp1
= (aext_a30b20
& 0x08);
1777 tmp2
= (rt_value
& 0x08);
1779 return NASM_ERR_OPERAND
;
1781 aext_rte
= rt_value
;
1782 /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */
1783 rt_value
= (rt_value
& 0x06) << 4;
1785 return NASM_R_CONST
;
1789 parse_rte_end (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1790 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1791 char **pstr
, int64_t *value
)
1793 int rt_value
, ret
, tmp1
, tmp2
;
1795 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1796 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 15)
1797 || ((rt_value
& 0x01) == 0)
1798 || (rt_value
!= (aext_rte
+ 1)))
1799 return NASM_ERR_OPERAND
;
1800 tmp1
= (aext_a30b20
& 0x08);
1801 tmp2
= (rt_value
& 0x08);
1803 return NASM_ERR_OPERAND
;
1804 /* Rt=CONCAT(c, t21, 0), t21:bit11-10. */
1805 rt_value
= (rt_value
& 0x06) << 4;
1807 return NASM_R_CONST
;
1811 parse_rte69_start (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1812 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1813 char **pstr
, int64_t *value
)
1817 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1818 if ((ret
== NASM_ERR_OPERAND
)
1819 || (rt_value
& 0x01))
1820 return NASM_ERR_OPERAND
;
1821 aext_rte
= rt_value
;
1822 rt_value
= (rt_value
>> 1);
1824 return NASM_R_CONST
;
1828 parse_rte69_end (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1829 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1830 char **pstr
, int64_t *value
)
1834 ret
= parse_aext_reg (pstr
, &rt_value
, HW_GPR
);
1835 if ((ret
== NASM_ERR_OPERAND
)
1836 || ((rt_value
& 0x01) == 0)
1837 || (rt_value
!= (aext_rte
+ 1)))
1838 return NASM_ERR_OPERAND
;
1839 aext_rte
= rt_value
;
1840 rt_value
= (rt_value
>> 1);
1842 return NASM_R_CONST
;
1846 parse_im5_ip (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1847 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1848 char **pstr
, int64_t *value
)
1850 int rt_value
, ret
, new_value
;
1852 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_I
);
1853 if (ret
== NASM_ERR_OPERAND
)
1854 return NASM_ERR_OPERAND
;
1855 /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */
1856 new_value
= (rt_value
& 0x04) << 2;
1857 new_value
|= (rt_value
& 0x03);
1859 aext_im5_ip
= new_value
;
1860 return NASM_R_CONST
;
1864 parse_im5_mr (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1865 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1866 char **pstr
, int64_t *value
)
1868 int rt_value
, ret
, new_value
, tmp1
, tmp2
;
1870 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_M
);
1871 if (ret
== NASM_ERR_OPERAND
)
1872 return NASM_ERR_OPERAND
;
1873 /* p = bit[4].bit[1:0], r = bit[4].bit[3:2]. */
1874 new_value
= (rt_value
& 0x07) << 2;
1875 tmp1
= (aext_im5_ip
& 0x10);
1876 tmp2
= (new_value
& 0x10);
1878 return NASM_ERR_OPERAND
;
1880 return NASM_R_CONST
;
1884 parse_im6_ip (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1885 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1886 char **pstr
, int64_t *value
)
1890 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_I
);
1891 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 3))
1892 return NASM_ERR_OPERAND
;
1893 /* p = 0.bit[1:0]. */
1894 aext_im6_ip
= rt_value
;
1895 *value
= aext_im6_ip
;
1896 return NASM_R_CONST
;
1900 parse_im6_iq (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1901 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1902 char **pstr
, int64_t *value
)
1906 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_I
);
1907 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
< 4))
1908 return NASM_ERR_OPERAND
;
1909 /* q = 1.bit[1:0]. */
1910 if ((rt_value
& 0x03) != aext_im6_ip
)
1911 return NASM_ERR_OPERAND
;
1912 *value
= aext_im6_ip
;
1913 return NASM_R_CONST
;
1917 parse_im6_mr (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1918 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1919 char **pstr
, int64_t *value
)
1923 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_M
);
1924 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
> 3))
1925 return NASM_ERR_OPERAND
;
1926 /* r = 0.bit[3:2]. */
1927 *value
= (rt_value
& 0x03);
1928 return NASM_R_CONST
;
1932 parse_im6_ms (struct nds32_asm_desc
*pdesc ATTRIBUTE_UNUSED
,
1933 struct nds32_asm_insn
*pinsn ATTRIBUTE_UNUSED
,
1934 char **pstr
, int64_t *value
)
1938 ret
= parse_aext_reg (pstr
, &rt_value
, HW_AEXT_IM_M
);
1939 if ((ret
== NASM_ERR_OPERAND
) || (rt_value
< 4))
1940 return NASM_ERR_OPERAND
;
1941 /* s = 1.bit[5:4]. */
1942 *value
= (rt_value
& 0x03);
1943 return NASM_R_CONST
;
1946 /* Generic operand parse base on the information provided by the field. */
1949 parse_operand (nds32_asm_desc_t
*pdesc
, nds32_asm_insn_t
*pinsn
,
1950 char **str
, int syn
)
1952 char odstr
[MAX_KEYWORD_LEN
];
1955 const field_t
*fld
= &LEX_GET_FIELD (syn
);
1959 uint64_t modifier
= 0;
1965 r
= fld
->parse (pdesc
, pinsn
, &end
, &value
);
1966 if (r
== NASM_ERR_OPERAND
)
1968 pdesc
->result
= NASM_ERR_OPERAND
;
1974 if (fld
->hw_res
< _HW_LAST
)
1976 /* Parse the operand in assembly code. */
1979 end
= parse_to_delimiter (end
, odstr
);
1981 hash
= htab_hash_string (odstr
);
1982 k
= htab_find_with_hash (hw_ktabs
[fld
->hw_res
], odstr
, hash
);
1986 pdesc
->result
= NASM_ERR_OPERAND
;
1990 if (fld
->hw_res
== HW_GPR
&& (pdesc
->flags
& NASM_OPEN_REDUCED_REG
)
1991 && (k
->attr
& ATTR (RDREG
)) == 0)
1993 /* Register not allowed in reduced register. */
1994 pdesc
->result
= NASM_ERR_REG_REDUCED
;
1998 if (fld
->hw_res
== HW_GPR
)
2000 if (syn
& SYN_INPUT
)
2001 pinsn
->defuse
|= USE_REG (k
->value
);
2002 if (syn
& SYN_OUTPUT
)
2003 pinsn
->defuse
|= DEF_REG (k
->value
);
2007 if (fld
->hw_res
== HW_GPR
&& (fld
->bitsize
+ fld
->shift
) == 4)
2008 value
= nds32_r54map
[value
];
2010 else if (fld
->hw_res
== HW_INT
|| fld
->hw_res
== HW_UINT
)
2015 /* Handle modifiers. Do we need to make a table for modifiers?
2016 Do we need to check unknown modifier? */
2017 if (strncasecmp (end
, "hi20(", 5) == 0)
2019 modifier
|= NASM_ATTR_HI20
;
2022 else if (strncasecmp (end
, "lo12(", 5) == 0)
2024 modifier
|= NASM_ATTR_LO12
;
2027 else if (strncasecmp (end
, "lo20(", 5) == 0)
2030 modifier
|= NASM_ATTR_LO20
;
2034 r
= pdesc
->parse_operand (pdesc
, pinsn
, &end
, &value
);
2037 /* Consume the ')' of modifier. */
2039 pinsn
->attr
|= modifier
;
2044 case NASM_R_ILLEGAL
:
2045 pdesc
->result
= NASM_ERR_OPERAND
;
2048 /* This field needs special fix-up. */
2052 if (modifier
& NASM_ATTR_HI20
)
2053 value
= (value
>> 12) & 0xfffff;
2054 else if (modifier
& NASM_ATTR_LO12
)
2055 value
= value
& 0xfff;
2056 else if (modifier
& NASM_ATTR_LO20
)
2057 value
= value
& 0xfffff;
2060 fprintf (stderr
, "Internal error: Don't know how to handle "
2061 "parsing results.\n");
2067 fprintf (stderr
, "Internal error: Unknown hardware resource.\n");
2072 /* Don't silently discarding bits. */
2073 if (value
& __MASK (fld
->shift
))
2075 pdesc
->result
= NASM_ERR_OUT_OF_RANGE
;
2079 /* Check the range of signed or unsigned result. */
2080 if (fld
->hw_res
!= HW_INT
&& ((int32_t) value
>> (fld
->bitsize
+ fld
->shift
)))
2082 pdesc
->result
= NASM_ERR_OUT_OF_RANGE
;
2085 else if (fld
->hw_res
== HW_INT
)
2087 /* Sign-ext the value. */
2088 if (((value
>> 32) == 0) && (value
& 0x80000000))
2089 value
|= (int64_t) -1U << 31;
2092 /* Shift the value to positive domain. */
2093 if ((value
+ (1 << (fld
->bitsize
+ fld
->shift
- 1)))
2094 >> (fld
->bitsize
+ fld
->shift
))
2096 pdesc
->result
= NASM_ERR_OUT_OF_RANGE
;
2102 (((value
>> fld
->shift
) & __MASK (fld
->bitsize
)) << fld
->bitpos
);
2107 /* Try to parse an instruction string based on opcode syntax. */
2110 parse_insn (nds32_asm_desc_t
*pdesc
, nds32_asm_insn_t
*pinsn
,
2111 char *str
, struct nds32_opcode
*opc
)
2116 /* A syntax may has optional operands, so we have to try each possible
2117 combination to see if the input is accepted. In order to do so,
2118 bit-N represent whether optional-operand-N is used in this combination.
2119 That is, if bit-N is set, optional-operand-N is not used.
2121 For example, there are 2 optional operands in this syntax,
2125 we can try it 4 times (i.e., 1 << 2)
2133 /* The outer do-while loop is used to try each possible optional
2134 operand combination, and VARIANT is the bit mask. The inner loop
2135 iterates each lexeme in the syntax. */
2139 /* OPT is the number of optional operands we've seen. */
2143 /* PLEX is the syntax iterator and P is the iterator for input
2147 /* Initial the base value. */
2148 pinsn
->insn
= opc
->value
;
2152 if (IS_LEX_CHAR (*plex
))
2154 /* If it's a plain char, just compare it. */
2155 if (LEX_CHAR (*plex
) != TOLOWER (*p
))
2157 if (LEX_CHAR (*plex
) == '+' && TOLOWER (*p
) == '-')
2159 /* We don't define minus format for some signed
2160 immediate case, so ignoring '+' here to parse
2161 negative value eazily. Besides, the minus format
2162 can not support for instruction with relocation.
2163 Ex: lwi $r0, [$r0 + imm] */
2167 pdesc
->result
= NASM_ERR_SYNTAX
;
2172 else if (*plex
& SYN_LOPT
)
2174 /* If it's '{' and it's not used in this iteration,
2175 just skip the whole optional operand. */
2176 if ((1 << (opt
++)) & variant
)
2178 while ((*plex
& SYN_ROPT
) == 0)
2182 else if (*plex
& SYN_ROPT
)
2188 /* If it's a operand, parse the input operand from input. */
2189 if (!parse_operand (pdesc
, pinsn
, &p
, *plex
))
2195 /* Check whether this syntax is accepted. */
2196 if (*plex
== 0 && (*p
== '\0' || *p
== '!' || *p
== '#'))
2200 /* If not accepted, try another combination. */
2203 while (variant
< (1 << opc
->variant
));
2209 nds32_assemble (nds32_asm_desc_t
*pdesc
, nds32_asm_insn_t
*pinsn
,
2212 struct nds32_opcode
*opc
;
2218 /* Duplicate the string, so we can modify it for convenience. */
2223 /* Find opcode mnemoic. */
2224 while (*s
!= ' ' && *s
!= '\t' && *s
!= '\0')
2228 dot
= strchr (mnemoic
, '.');
2231 /* Lookup the opcode syntax. */
2232 hash
= htab_hash_string (mnemoic
);
2233 opc
= (struct nds32_opcode
*)
2234 htab_find_with_hash (opcode_htab
, mnemoic
, hash
);
2236 /* If we cannot find a match syntax, try it again without `.'.
2237 For example, try "lmw.adm" first and then try "lmw" again. */
2238 if (opc
== NULL
&& dot
!= NULL
)
2246 else if (opc
== NULL
)
2248 pdesc
->result
= NASM_ERR_UNKNOWN_OP
;
2252 /* There may be multiple syntaxes for a given opcode.
2253 Try each one until a match is found. */
2254 for (; opc
; opc
= opc
->next
)
2256 /* Build opcode syntax, if it's not been initialized yet. */
2257 if (opc
->syntax
== NULL
)
2258 build_opcode_syntax (opc
);
2260 /* Reset status before assemble. */
2261 pinsn
->defuse
= opc
->defuse
;
2263 pinsn
->field
= NULL
;
2264 /* Use opcode attributes to initial instruction attributes. */
2265 pinsn
->attr
= opc
->attr
;
2266 if (parse_insn (pdesc
, pinsn
, s
, opc
))
2270 pinsn
->opcode
= opc
;
2273 if (pdesc
->result
== NASM_OK
)
2274 pdesc
->result
= NASM_ERR_SYNTAX
;
2278 /* A matched opcode is found. Write the result to instruction buffer. */
2279 pdesc
->result
= NASM_OK
;