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