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