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