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