xref: /netbsd-src/external/gpl3/binutils.old/dist/opcodes/lm32-opc.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1ede78133Schristos /* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
275fd0b74Schristos /* Instruction opcode table for lm32.
375fd0b74Schristos 
475fd0b74Schristos THIS FILE IS MACHINE GENERATED WITH CGEN.
575fd0b74Schristos 
6*e992f068Schristos Copyright (C) 1996-2022 Free Software Foundation, Inc.
775fd0b74Schristos 
875fd0b74Schristos This file is part of the GNU Binutils and/or GDB, the GNU debugger.
975fd0b74Schristos 
1075fd0b74Schristos    This file is free software; you can redistribute it and/or modify
1175fd0b74Schristos    it under the terms of the GNU General Public License as published by
1275fd0b74Schristos    the Free Software Foundation; either version 3, or (at your option)
1375fd0b74Schristos    any later version.
1475fd0b74Schristos 
1575fd0b74Schristos    It is distributed in the hope that it will be useful, but WITHOUT
1675fd0b74Schristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1775fd0b74Schristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1875fd0b74Schristos    License for more details.
1975fd0b74Schristos 
2075fd0b74Schristos    You should have received a copy of the GNU General Public License along
2175fd0b74Schristos    with this program; if not, write to the Free Software Foundation, Inc.,
2275fd0b74Schristos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
2375fd0b74Schristos 
2475fd0b74Schristos */
2575fd0b74Schristos 
2675fd0b74Schristos #include "sysdep.h"
2775fd0b74Schristos #include "ansidecl.h"
2875fd0b74Schristos #include "bfd.h"
2975fd0b74Schristos #include "symcat.h"
3075fd0b74Schristos #include "lm32-desc.h"
3175fd0b74Schristos #include "lm32-opc.h"
3275fd0b74Schristos #include "libiberty.h"
3375fd0b74Schristos 
3475fd0b74Schristos /* The hash functions are recorded here to help keep assembler code out of
3575fd0b74Schristos    the disassembler and vice versa.  */
3675fd0b74Schristos 
3775fd0b74Schristos static int asm_hash_insn_p        (const CGEN_INSN *);
3875fd0b74Schristos static unsigned int asm_hash_insn (const char *);
3975fd0b74Schristos static int dis_hash_insn_p        (const CGEN_INSN *);
4075fd0b74Schristos static unsigned int dis_hash_insn (const char *, CGEN_INSN_INT);
4175fd0b74Schristos 
4275fd0b74Schristos /* Instruction formats.  */
4375fd0b74Schristos 
4475fd0b74Schristos #define F(f) & lm32_cgen_ifld_table[LM32_##f]
4575fd0b74Schristos static const CGEN_IFMT ifmt_empty ATTRIBUTE_UNUSED = {
4675fd0b74Schristos   0, 0, 0x0, { { 0 } }
4775fd0b74Schristos };
4875fd0b74Schristos 
4975fd0b74Schristos static const CGEN_IFMT ifmt_add ATTRIBUTE_UNUSED = {
5075fd0b74Schristos   32, 32, 0xfc0007ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
5175fd0b74Schristos };
5275fd0b74Schristos 
5375fd0b74Schristos static const CGEN_IFMT ifmt_addi ATTRIBUTE_UNUSED = {
5475fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
5575fd0b74Schristos };
5675fd0b74Schristos 
5775fd0b74Schristos static const CGEN_IFMT ifmt_andi ATTRIBUTE_UNUSED = {
5875fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
5975fd0b74Schristos };
6075fd0b74Schristos 
6175fd0b74Schristos static const CGEN_IFMT ifmt_andhii ATTRIBUTE_UNUSED = {
6275fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
6375fd0b74Schristos };
6475fd0b74Schristos 
6575fd0b74Schristos static const CGEN_IFMT ifmt_b ATTRIBUTE_UNUSED = {
6675fd0b74Schristos   32, 32, 0xfc1fffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
6775fd0b74Schristos };
6875fd0b74Schristos 
6975fd0b74Schristos static const CGEN_IFMT ifmt_bi ATTRIBUTE_UNUSED = {
7075fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_CALL) }, { 0 } }
7175fd0b74Schristos };
7275fd0b74Schristos 
7375fd0b74Schristos static const CGEN_IFMT ifmt_be ATTRIBUTE_UNUSED = {
7475fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_BRANCH) }, { 0 } }
7575fd0b74Schristos };
7675fd0b74Schristos 
7775fd0b74Schristos static const CGEN_IFMT ifmt_ori ATTRIBUTE_UNUSED = {
7875fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
7975fd0b74Schristos };
8075fd0b74Schristos 
8175fd0b74Schristos static const CGEN_IFMT ifmt_rcsr ATTRIBUTE_UNUSED = {
8275fd0b74Schristos   32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
8375fd0b74Schristos };
8475fd0b74Schristos 
8575fd0b74Schristos static const CGEN_IFMT ifmt_sextb ATTRIBUTE_UNUSED = {
8675fd0b74Schristos   32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
8775fd0b74Schristos };
8875fd0b74Schristos 
8975fd0b74Schristos static const CGEN_IFMT ifmt_user ATTRIBUTE_UNUSED = {
9075fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_USER) }, { 0 } }
9175fd0b74Schristos };
9275fd0b74Schristos 
9375fd0b74Schristos static const CGEN_IFMT ifmt_wcsr ATTRIBUTE_UNUSED = {
9475fd0b74Schristos   32, 32, 0xfc00ffff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
9575fd0b74Schristos };
9675fd0b74Schristos 
9775fd0b74Schristos static const CGEN_IFMT ifmt_break ATTRIBUTE_UNUSED = {
9875fd0b74Schristos   32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_EXCEPTION) }, { 0 } }
9975fd0b74Schristos };
10075fd0b74Schristos 
10175fd0b74Schristos static const CGEN_IFMT ifmt_bret ATTRIBUTE_UNUSED = {
10275fd0b74Schristos   32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } }
10375fd0b74Schristos };
10475fd0b74Schristos 
10575fd0b74Schristos static const CGEN_IFMT ifmt_mvi ATTRIBUTE_UNUSED = {
10675fd0b74Schristos   32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
10775fd0b74Schristos };
10875fd0b74Schristos 
10975fd0b74Schristos static const CGEN_IFMT ifmt_mvui ATTRIBUTE_UNUSED = {
11075fd0b74Schristos   32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
11175fd0b74Schristos };
11275fd0b74Schristos 
11375fd0b74Schristos static const CGEN_IFMT ifmt_mvhi ATTRIBUTE_UNUSED = {
11475fd0b74Schristos   32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } }
11575fd0b74Schristos };
11675fd0b74Schristos 
11775fd0b74Schristos static const CGEN_IFMT ifmt_mva ATTRIBUTE_UNUSED = {
11875fd0b74Schristos   32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
11975fd0b74Schristos };
12075fd0b74Schristos 
12175fd0b74Schristos static const CGEN_IFMT ifmt_nop ATTRIBUTE_UNUSED = {
12275fd0b74Schristos   32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
12375fd0b74Schristos };
12475fd0b74Schristos 
12575fd0b74Schristos static const CGEN_IFMT ifmt_lwgotrel ATTRIBUTE_UNUSED = {
12675fd0b74Schristos   32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
12775fd0b74Schristos };
12875fd0b74Schristos 
12975fd0b74Schristos static const CGEN_IFMT ifmt_orhigotoffi ATTRIBUTE_UNUSED = {
13075fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
13175fd0b74Schristos };
13275fd0b74Schristos 
13375fd0b74Schristos static const CGEN_IFMT ifmt_addgotoff ATTRIBUTE_UNUSED = {
13475fd0b74Schristos   32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } }
13575fd0b74Schristos };
13675fd0b74Schristos 
13775fd0b74Schristos #undef F
13875fd0b74Schristos 
13975fd0b74Schristos #define A(a) (1 << CGEN_INSN_##a)
14075fd0b74Schristos #define OPERAND(op) LM32_OPERAND_##op
14175fd0b74Schristos #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
14275fd0b74Schristos #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
14375fd0b74Schristos 
14475fd0b74Schristos /* The instruction table.  */
14575fd0b74Schristos 
14675fd0b74Schristos static const CGEN_OPCODE lm32_cgen_insn_opcode_table[MAX_INSNS] =
14775fd0b74Schristos {
14875fd0b74Schristos   /* Special null first entry.
14975fd0b74Schristos      A `num' value of zero is thus invalid.
15075fd0b74Schristos      Also, the special `invalid' insn resides here.  */
15175fd0b74Schristos   { { 0, 0, 0, 0 }, {{0}}, 0, {0}},
15275fd0b74Schristos /* add $r2,$r0,$r1 */
15375fd0b74Schristos   {
15475fd0b74Schristos     { 0, 0, 0, 0 },
15575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
15675fd0b74Schristos     & ifmt_add, { 0xb4000000 }
15775fd0b74Schristos   },
15875fd0b74Schristos /* addi $r1,$r0,$imm */
15975fd0b74Schristos   {
16075fd0b74Schristos     { 0, 0, 0, 0 },
16175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
16275fd0b74Schristos     & ifmt_addi, { 0x34000000 }
16375fd0b74Schristos   },
16475fd0b74Schristos /* and $r2,$r0,$r1 */
16575fd0b74Schristos   {
16675fd0b74Schristos     { 0, 0, 0, 0 },
16775fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
16875fd0b74Schristos     & ifmt_add, { 0xa0000000 }
16975fd0b74Schristos   },
17075fd0b74Schristos /* andi $r1,$r0,$uimm */
17175fd0b74Schristos   {
17275fd0b74Schristos     { 0, 0, 0, 0 },
17375fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
17475fd0b74Schristos     & ifmt_andi, { 0x20000000 }
17575fd0b74Schristos   },
17675fd0b74Schristos /* andhi $r1,$r0,$hi16 */
17775fd0b74Schristos   {
17875fd0b74Schristos     { 0, 0, 0, 0 },
17975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } },
18075fd0b74Schristos     & ifmt_andhii, { 0x60000000 }
18175fd0b74Schristos   },
18275fd0b74Schristos /* b $r0 */
18375fd0b74Schristos   {
18475fd0b74Schristos     { 0, 0, 0, 0 },
18575fd0b74Schristos     { { MNEM, ' ', OP (R0), 0 } },
18675fd0b74Schristos     & ifmt_b, { 0xc0000000 }
18775fd0b74Schristos   },
18875fd0b74Schristos /* bi $call */
18975fd0b74Schristos   {
19075fd0b74Schristos     { 0, 0, 0, 0 },
19175fd0b74Schristos     { { MNEM, ' ', OP (CALL), 0 } },
19275fd0b74Schristos     & ifmt_bi, { 0xe0000000 }
19375fd0b74Schristos   },
19475fd0b74Schristos /* be $r0,$r1,$branch */
19575fd0b74Schristos   {
19675fd0b74Schristos     { 0, 0, 0, 0 },
19775fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
19875fd0b74Schristos     & ifmt_be, { 0x44000000 }
19975fd0b74Schristos   },
20075fd0b74Schristos /* bg $r0,$r1,$branch */
20175fd0b74Schristos   {
20275fd0b74Schristos     { 0, 0, 0, 0 },
20375fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
20475fd0b74Schristos     & ifmt_be, { 0x48000000 }
20575fd0b74Schristos   },
20675fd0b74Schristos /* bge $r0,$r1,$branch */
20775fd0b74Schristos   {
20875fd0b74Schristos     { 0, 0, 0, 0 },
20975fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
21075fd0b74Schristos     & ifmt_be, { 0x4c000000 }
21175fd0b74Schristos   },
21275fd0b74Schristos /* bgeu $r0,$r1,$branch */
21375fd0b74Schristos   {
21475fd0b74Schristos     { 0, 0, 0, 0 },
21575fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
21675fd0b74Schristos     & ifmt_be, { 0x50000000 }
21775fd0b74Schristos   },
21875fd0b74Schristos /* bgu $r0,$r1,$branch */
21975fd0b74Schristos   {
22075fd0b74Schristos     { 0, 0, 0, 0 },
22175fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
22275fd0b74Schristos     & ifmt_be, { 0x54000000 }
22375fd0b74Schristos   },
22475fd0b74Schristos /* bne $r0,$r1,$branch */
22575fd0b74Schristos   {
22675fd0b74Schristos     { 0, 0, 0, 0 },
22775fd0b74Schristos     { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } },
22875fd0b74Schristos     & ifmt_be, { 0x5c000000 }
22975fd0b74Schristos   },
23075fd0b74Schristos /* call $r0 */
23175fd0b74Schristos   {
23275fd0b74Schristos     { 0, 0, 0, 0 },
23375fd0b74Schristos     { { MNEM, ' ', OP (R0), 0 } },
23475fd0b74Schristos     & ifmt_b, { 0xd8000000 }
23575fd0b74Schristos   },
23675fd0b74Schristos /* calli $call */
23775fd0b74Schristos   {
23875fd0b74Schristos     { 0, 0, 0, 0 },
23975fd0b74Schristos     { { MNEM, ' ', OP (CALL), 0 } },
24075fd0b74Schristos     & ifmt_bi, { 0xf8000000 }
24175fd0b74Schristos   },
24275fd0b74Schristos /* cmpe $r2,$r0,$r1 */
24375fd0b74Schristos   {
24475fd0b74Schristos     { 0, 0, 0, 0 },
24575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
24675fd0b74Schristos     & ifmt_add, { 0xe4000000 }
24775fd0b74Schristos   },
24875fd0b74Schristos /* cmpei $r1,$r0,$imm */
24975fd0b74Schristos   {
25075fd0b74Schristos     { 0, 0, 0, 0 },
25175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
25275fd0b74Schristos     & ifmt_addi, { 0x64000000 }
25375fd0b74Schristos   },
25475fd0b74Schristos /* cmpg $r2,$r0,$r1 */
25575fd0b74Schristos   {
25675fd0b74Schristos     { 0, 0, 0, 0 },
25775fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
25875fd0b74Schristos     & ifmt_add, { 0xe8000000 }
25975fd0b74Schristos   },
26075fd0b74Schristos /* cmpgi $r1,$r0,$imm */
26175fd0b74Schristos   {
26275fd0b74Schristos     { 0, 0, 0, 0 },
26375fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
26475fd0b74Schristos     & ifmt_addi, { 0x68000000 }
26575fd0b74Schristos   },
26675fd0b74Schristos /* cmpge $r2,$r0,$r1 */
26775fd0b74Schristos   {
26875fd0b74Schristos     { 0, 0, 0, 0 },
26975fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
27075fd0b74Schristos     & ifmt_add, { 0xec000000 }
27175fd0b74Schristos   },
27275fd0b74Schristos /* cmpgei $r1,$r0,$imm */
27375fd0b74Schristos   {
27475fd0b74Schristos     { 0, 0, 0, 0 },
27575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
27675fd0b74Schristos     & ifmt_addi, { 0x6c000000 }
27775fd0b74Schristos   },
27875fd0b74Schristos /* cmpgeu $r2,$r0,$r1 */
27975fd0b74Schristos   {
28075fd0b74Schristos     { 0, 0, 0, 0 },
28175fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
28275fd0b74Schristos     & ifmt_add, { 0xf0000000 }
28375fd0b74Schristos   },
28475fd0b74Schristos /* cmpgeui $r1,$r0,$uimm */
28575fd0b74Schristos   {
28675fd0b74Schristos     { 0, 0, 0, 0 },
28775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
28875fd0b74Schristos     & ifmt_andi, { 0x70000000 }
28975fd0b74Schristos   },
29075fd0b74Schristos /* cmpgu $r2,$r0,$r1 */
29175fd0b74Schristos   {
29275fd0b74Schristos     { 0, 0, 0, 0 },
29375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
29475fd0b74Schristos     & ifmt_add, { 0xf4000000 }
29575fd0b74Schristos   },
29675fd0b74Schristos /* cmpgui $r1,$r0,$uimm */
29775fd0b74Schristos   {
29875fd0b74Schristos     { 0, 0, 0, 0 },
29975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
30075fd0b74Schristos     & ifmt_andi, { 0x74000000 }
30175fd0b74Schristos   },
30275fd0b74Schristos /* cmpne $r2,$r0,$r1 */
30375fd0b74Schristos   {
30475fd0b74Schristos     { 0, 0, 0, 0 },
30575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
30675fd0b74Schristos     & ifmt_add, { 0xfc000000 }
30775fd0b74Schristos   },
30875fd0b74Schristos /* cmpnei $r1,$r0,$imm */
30975fd0b74Schristos   {
31075fd0b74Schristos     { 0, 0, 0, 0 },
31175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
31275fd0b74Schristos     & ifmt_addi, { 0x7c000000 }
31375fd0b74Schristos   },
31475fd0b74Schristos /* divu $r2,$r0,$r1 */
31575fd0b74Schristos   {
31675fd0b74Schristos     { 0, 0, 0, 0 },
31775fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
31875fd0b74Schristos     & ifmt_add, { 0x8c000000 }
31975fd0b74Schristos   },
32075fd0b74Schristos /* lb $r1,($r0+$imm) */
32175fd0b74Schristos   {
32275fd0b74Schristos     { 0, 0, 0, 0 },
32375fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
32475fd0b74Schristos     & ifmt_addi, { 0x10000000 }
32575fd0b74Schristos   },
32675fd0b74Schristos /* lbu $r1,($r0+$imm) */
32775fd0b74Schristos   {
32875fd0b74Schristos     { 0, 0, 0, 0 },
32975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
33075fd0b74Schristos     & ifmt_addi, { 0x40000000 }
33175fd0b74Schristos   },
33275fd0b74Schristos /* lh $r1,($r0+$imm) */
33375fd0b74Schristos   {
33475fd0b74Schristos     { 0, 0, 0, 0 },
33575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
33675fd0b74Schristos     & ifmt_addi, { 0x1c000000 }
33775fd0b74Schristos   },
33875fd0b74Schristos /* lhu $r1,($r0+$imm) */
33975fd0b74Schristos   {
34075fd0b74Schristos     { 0, 0, 0, 0 },
34175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
34275fd0b74Schristos     & ifmt_addi, { 0x2c000000 }
34375fd0b74Schristos   },
34475fd0b74Schristos /* lw $r1,($r0+$imm) */
34575fd0b74Schristos   {
34675fd0b74Schristos     { 0, 0, 0, 0 },
34775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } },
34875fd0b74Schristos     & ifmt_addi, { 0x28000000 }
34975fd0b74Schristos   },
35075fd0b74Schristos /* modu $r2,$r0,$r1 */
35175fd0b74Schristos   {
35275fd0b74Schristos     { 0, 0, 0, 0 },
35375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
35475fd0b74Schristos     & ifmt_add, { 0xc4000000 }
35575fd0b74Schristos   },
35675fd0b74Schristos /* mul $r2,$r0,$r1 */
35775fd0b74Schristos   {
35875fd0b74Schristos     { 0, 0, 0, 0 },
35975fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
36075fd0b74Schristos     & ifmt_add, { 0x88000000 }
36175fd0b74Schristos   },
36275fd0b74Schristos /* muli $r1,$r0,$imm */
36375fd0b74Schristos   {
36475fd0b74Schristos     { 0, 0, 0, 0 },
36575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
36675fd0b74Schristos     & ifmt_addi, { 0x8000000 }
36775fd0b74Schristos   },
36875fd0b74Schristos /* nor $r2,$r0,$r1 */
36975fd0b74Schristos   {
37075fd0b74Schristos     { 0, 0, 0, 0 },
37175fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
37275fd0b74Schristos     & ifmt_add, { 0x84000000 }
37375fd0b74Schristos   },
37475fd0b74Schristos /* nori $r1,$r0,$uimm */
37575fd0b74Schristos   {
37675fd0b74Schristos     { 0, 0, 0, 0 },
37775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
37875fd0b74Schristos     & ifmt_andi, { 0x4000000 }
37975fd0b74Schristos   },
38075fd0b74Schristos /* or $r2,$r0,$r1 */
38175fd0b74Schristos   {
38275fd0b74Schristos     { 0, 0, 0, 0 },
38375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
38475fd0b74Schristos     & ifmt_add, { 0xb8000000 }
38575fd0b74Schristos   },
38675fd0b74Schristos /* ori $r1,$r0,$lo16 */
38775fd0b74Schristos   {
38875fd0b74Schristos     { 0, 0, 0, 0 },
38975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (LO16), 0 } },
39075fd0b74Schristos     & ifmt_ori, { 0x38000000 }
39175fd0b74Schristos   },
39275fd0b74Schristos /* orhi $r1,$r0,$hi16 */
39375fd0b74Schristos   {
39475fd0b74Schristos     { 0, 0, 0, 0 },
39575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } },
39675fd0b74Schristos     & ifmt_andhii, { 0x78000000 }
39775fd0b74Schristos   },
39875fd0b74Schristos /* rcsr $r2,$csr */
39975fd0b74Schristos   {
40075fd0b74Schristos     { 0, 0, 0, 0 },
40175fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (CSR), 0 } },
40275fd0b74Schristos     & ifmt_rcsr, { 0x90000000 }
40375fd0b74Schristos   },
40475fd0b74Schristos /* sb ($r0+$imm),$r1 */
40575fd0b74Schristos   {
40675fd0b74Schristos     { 0, 0, 0, 0 },
40775fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
40875fd0b74Schristos     & ifmt_addi, { 0x30000000 }
40975fd0b74Schristos   },
41075fd0b74Schristos /* sextb $r2,$r0 */
41175fd0b74Schristos   {
41275fd0b74Schristos     { 0, 0, 0, 0 },
41375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
41475fd0b74Schristos     & ifmt_sextb, { 0xb0000000 }
41575fd0b74Schristos   },
41675fd0b74Schristos /* sexth $r2,$r0 */
41775fd0b74Schristos   {
41875fd0b74Schristos     { 0, 0, 0, 0 },
41975fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
42075fd0b74Schristos     & ifmt_sextb, { 0xdc000000 }
42175fd0b74Schristos   },
42275fd0b74Schristos /* sh ($r0+$imm),$r1 */
42375fd0b74Schristos   {
42475fd0b74Schristos     { 0, 0, 0, 0 },
42575fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
42675fd0b74Schristos     & ifmt_addi, { 0xc000000 }
42775fd0b74Schristos   },
42875fd0b74Schristos /* sl $r2,$r0,$r1 */
42975fd0b74Schristos   {
43075fd0b74Schristos     { 0, 0, 0, 0 },
43175fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
43275fd0b74Schristos     & ifmt_add, { 0xbc000000 }
43375fd0b74Schristos   },
43475fd0b74Schristos /* sli $r1,$r0,$imm */
43575fd0b74Schristos   {
43675fd0b74Schristos     { 0, 0, 0, 0 },
43775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
43875fd0b74Schristos     & ifmt_addi, { 0x3c000000 }
43975fd0b74Schristos   },
44075fd0b74Schristos /* sr $r2,$r0,$r1 */
44175fd0b74Schristos   {
44275fd0b74Schristos     { 0, 0, 0, 0 },
44375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
44475fd0b74Schristos     & ifmt_add, { 0x94000000 }
44575fd0b74Schristos   },
44675fd0b74Schristos /* sri $r1,$r0,$imm */
44775fd0b74Schristos   {
44875fd0b74Schristos     { 0, 0, 0, 0 },
44975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
45075fd0b74Schristos     & ifmt_addi, { 0x14000000 }
45175fd0b74Schristos   },
45275fd0b74Schristos /* sru $r2,$r0,$r1 */
45375fd0b74Schristos   {
45475fd0b74Schristos     { 0, 0, 0, 0 },
45575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
45675fd0b74Schristos     & ifmt_add, { 0x80000000 }
45775fd0b74Schristos   },
45875fd0b74Schristos /* srui $r1,$r0,$imm */
45975fd0b74Schristos   {
46075fd0b74Schristos     { 0, 0, 0, 0 },
46175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } },
46275fd0b74Schristos     & ifmt_addi, { 0x0 }
46375fd0b74Schristos   },
46475fd0b74Schristos /* sub $r2,$r0,$r1 */
46575fd0b74Schristos   {
46675fd0b74Schristos     { 0, 0, 0, 0 },
46775fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
46875fd0b74Schristos     & ifmt_add, { 0xc8000000 }
46975fd0b74Schristos   },
47075fd0b74Schristos /* sw ($r0+$imm),$r1 */
47175fd0b74Schristos   {
47275fd0b74Schristos     { 0, 0, 0, 0 },
47375fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } },
47475fd0b74Schristos     & ifmt_addi, { 0x58000000 }
47575fd0b74Schristos   },
47675fd0b74Schristos /* user $r2,$r0,$r1,$user */
47775fd0b74Schristos   {
47875fd0b74Schristos     { 0, 0, 0, 0 },
47975fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), ',', OP (USER), 0 } },
48075fd0b74Schristos     & ifmt_user, { 0xcc000000 }
48175fd0b74Schristos   },
48275fd0b74Schristos /* wcsr $csr,$r1 */
48375fd0b74Schristos   {
48475fd0b74Schristos     { 0, 0, 0, 0 },
48575fd0b74Schristos     { { MNEM, ' ', OP (CSR), ',', OP (R1), 0 } },
48675fd0b74Schristos     & ifmt_wcsr, { 0xd0000000 }
48775fd0b74Schristos   },
48875fd0b74Schristos /* xor $r2,$r0,$r1 */
48975fd0b74Schristos   {
49075fd0b74Schristos     { 0, 0, 0, 0 },
49175fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
49275fd0b74Schristos     & ifmt_add, { 0x98000000 }
49375fd0b74Schristos   },
49475fd0b74Schristos /* xori $r1,$r0,$uimm */
49575fd0b74Schristos   {
49675fd0b74Schristos     { 0, 0, 0, 0 },
49775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
49875fd0b74Schristos     & ifmt_andi, { 0x18000000 }
49975fd0b74Schristos   },
50075fd0b74Schristos /* xnor $r2,$r0,$r1 */
50175fd0b74Schristos   {
50275fd0b74Schristos     { 0, 0, 0, 0 },
50375fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } },
50475fd0b74Schristos     & ifmt_add, { 0xa4000000 }
50575fd0b74Schristos   },
50675fd0b74Schristos /* xnori $r1,$r0,$uimm */
50775fd0b74Schristos   {
50875fd0b74Schristos     { 0, 0, 0, 0 },
50975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } },
51075fd0b74Schristos     & ifmt_andi, { 0x24000000 }
51175fd0b74Schristos   },
51275fd0b74Schristos /* break */
51375fd0b74Schristos   {
51475fd0b74Schristos     { 0, 0, 0, 0 },
51575fd0b74Schristos     { { MNEM, 0 } },
51675fd0b74Schristos     & ifmt_break, { 0xac000002 }
51775fd0b74Schristos   },
51875fd0b74Schristos /* scall */
51975fd0b74Schristos   {
52075fd0b74Schristos     { 0, 0, 0, 0 },
52175fd0b74Schristos     { { MNEM, 0 } },
52275fd0b74Schristos     & ifmt_break, { 0xac000007 }
52375fd0b74Schristos   },
52475fd0b74Schristos /* bret */
52575fd0b74Schristos   {
52675fd0b74Schristos     { 0, 0, 0, 0 },
52775fd0b74Schristos     { { MNEM, 0 } },
52875fd0b74Schristos     & ifmt_bret, { 0xc3e00000 }
52975fd0b74Schristos   },
53075fd0b74Schristos /* eret */
53175fd0b74Schristos   {
53275fd0b74Schristos     { 0, 0, 0, 0 },
53375fd0b74Schristos     { { MNEM, 0 } },
53475fd0b74Schristos     & ifmt_bret, { 0xc3c00000 }
53575fd0b74Schristos   },
53675fd0b74Schristos /* ret */
53775fd0b74Schristos   {
53875fd0b74Schristos     { 0, 0, 0, 0 },
53975fd0b74Schristos     { { MNEM, 0 } },
54075fd0b74Schristos     & ifmt_bret, { 0xc3a00000 }
54175fd0b74Schristos   },
54275fd0b74Schristos /* mv $r2,$r0 */
54375fd0b74Schristos   {
54475fd0b74Schristos     { 0, 0, 0, 0 },
54575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
54675fd0b74Schristos     & ifmt_sextb, { 0xb8000000 }
54775fd0b74Schristos   },
54875fd0b74Schristos /* mvi $r1,$imm */
54975fd0b74Schristos   {
55075fd0b74Schristos     { 0, 0, 0, 0 },
55175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (IMM), 0 } },
55275fd0b74Schristos     & ifmt_mvi, { 0x34000000 }
55375fd0b74Schristos   },
55475fd0b74Schristos /* mvu $r1,$lo16 */
55575fd0b74Schristos   {
55675fd0b74Schristos     { 0, 0, 0, 0 },
55775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (LO16), 0 } },
55875fd0b74Schristos     & ifmt_mvui, { 0x38000000 }
55975fd0b74Schristos   },
56075fd0b74Schristos /* mvhi $r1,$hi16 */
56175fd0b74Schristos   {
56275fd0b74Schristos     { 0, 0, 0, 0 },
56375fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (HI16), 0 } },
56475fd0b74Schristos     & ifmt_mvhi, { 0x78000000 }
56575fd0b74Schristos   },
56675fd0b74Schristos /* mva $r1,$gp16 */
56775fd0b74Schristos   {
56875fd0b74Schristos     { 0, 0, 0, 0 },
56975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
57075fd0b74Schristos     & ifmt_mva, { 0x37400000 }
57175fd0b74Schristos   },
57275fd0b74Schristos /* not $r2,$r0 */
57375fd0b74Schristos   {
57475fd0b74Schristos     { 0, 0, 0, 0 },
57575fd0b74Schristos     { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } },
57675fd0b74Schristos     & ifmt_sextb, { 0xa4000000 }
57775fd0b74Schristos   },
57875fd0b74Schristos /* nop */
57975fd0b74Schristos   {
58075fd0b74Schristos     { 0, 0, 0, 0 },
58175fd0b74Schristos     { { MNEM, 0 } },
58275fd0b74Schristos     & ifmt_nop, { 0x34000000 }
58375fd0b74Schristos   },
58475fd0b74Schristos /* lb $r1,$gp16 */
58575fd0b74Schristos   {
58675fd0b74Schristos     { 0, 0, 0, 0 },
58775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
58875fd0b74Schristos     & ifmt_mva, { 0x13400000 }
58975fd0b74Schristos   },
59075fd0b74Schristos /* lbu $r1,$gp16 */
59175fd0b74Schristos   {
59275fd0b74Schristos     { 0, 0, 0, 0 },
59375fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
59475fd0b74Schristos     & ifmt_mva, { 0x43400000 }
59575fd0b74Schristos   },
59675fd0b74Schristos /* lh $r1,$gp16 */
59775fd0b74Schristos   {
59875fd0b74Schristos     { 0, 0, 0, 0 },
59975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
60075fd0b74Schristos     & ifmt_mva, { 0x1f400000 }
60175fd0b74Schristos   },
60275fd0b74Schristos /* lhu $r1,$gp16 */
60375fd0b74Schristos   {
60475fd0b74Schristos     { 0, 0, 0, 0 },
60575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
60675fd0b74Schristos     & ifmt_mva, { 0x2f400000 }
60775fd0b74Schristos   },
60875fd0b74Schristos /* lw $r1,$gp16 */
60975fd0b74Schristos   {
61075fd0b74Schristos     { 0, 0, 0, 0 },
61175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } },
61275fd0b74Schristos     & ifmt_mva, { 0x2b400000 }
61375fd0b74Schristos   },
61475fd0b74Schristos /* sb $gp16,$r1 */
61575fd0b74Schristos   {
61675fd0b74Schristos     { 0, 0, 0, 0 },
61775fd0b74Schristos     { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
61875fd0b74Schristos     & ifmt_mva, { 0x33400000 }
61975fd0b74Schristos   },
62075fd0b74Schristos /* sh $gp16,$r1 */
62175fd0b74Schristos   {
62275fd0b74Schristos     { 0, 0, 0, 0 },
62375fd0b74Schristos     { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
62475fd0b74Schristos     & ifmt_mva, { 0xf400000 }
62575fd0b74Schristos   },
62675fd0b74Schristos /* sw $gp16,$r1 */
62775fd0b74Schristos   {
62875fd0b74Schristos     { 0, 0, 0, 0 },
62975fd0b74Schristos     { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } },
63075fd0b74Schristos     & ifmt_mva, { 0x5b400000 }
63175fd0b74Schristos   },
63275fd0b74Schristos /* lw $r1,(gp+$got16) */
63375fd0b74Schristos   {
63475fd0b74Schristos     { 0, 0, 0, 0 },
63575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', 'g', 'p', '+', OP (GOT16), ')', 0 } },
63675fd0b74Schristos     & ifmt_lwgotrel, { 0x2b400000 }
63775fd0b74Schristos   },
63875fd0b74Schristos /* orhi $r1,$r0,$gotoffhi16 */
63975fd0b74Schristos   {
64075fd0b74Schristos     { 0, 0, 0, 0 },
64175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFHI16), 0 } },
64275fd0b74Schristos     & ifmt_orhigotoffi, { 0x78000000 }
64375fd0b74Schristos   },
64475fd0b74Schristos /* addi $r1,$r0,$gotofflo16 */
64575fd0b74Schristos   {
64675fd0b74Schristos     { 0, 0, 0, 0 },
64775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFLO16), 0 } },
64875fd0b74Schristos     & ifmt_addgotoff, { 0x34000000 }
64975fd0b74Schristos   },
65075fd0b74Schristos /* sw ($r0+$gotofflo16),$r1 */
65175fd0b74Schristos   {
65275fd0b74Schristos     { 0, 0, 0, 0 },
65375fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
65475fd0b74Schristos     & ifmt_addgotoff, { 0x58000000 }
65575fd0b74Schristos   },
65675fd0b74Schristos /* lw $r1,($r0+$gotofflo16) */
65775fd0b74Schristos   {
65875fd0b74Schristos     { 0, 0, 0, 0 },
65975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
66075fd0b74Schristos     & ifmt_addgotoff, { 0x28000000 }
66175fd0b74Schristos   },
66275fd0b74Schristos /* sh ($r0+$gotofflo16),$r1 */
66375fd0b74Schristos   {
66475fd0b74Schristos     { 0, 0, 0, 0 },
66575fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
66675fd0b74Schristos     & ifmt_addgotoff, { 0xc000000 }
66775fd0b74Schristos   },
66875fd0b74Schristos /* lh $r1,($r0+$gotofflo16) */
66975fd0b74Schristos   {
67075fd0b74Schristos     { 0, 0, 0, 0 },
67175fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
67275fd0b74Schristos     & ifmt_addgotoff, { 0x1c000000 }
67375fd0b74Schristos   },
67475fd0b74Schristos /* lhu $r1,($r0+$gotofflo16) */
67575fd0b74Schristos   {
67675fd0b74Schristos     { 0, 0, 0, 0 },
67775fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
67875fd0b74Schristos     & ifmt_addgotoff, { 0x2c000000 }
67975fd0b74Schristos   },
68075fd0b74Schristos /* sb ($r0+$gotofflo16),$r1 */
68175fd0b74Schristos   {
68275fd0b74Schristos     { 0, 0, 0, 0 },
68375fd0b74Schristos     { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } },
68475fd0b74Schristos     & ifmt_addgotoff, { 0x30000000 }
68575fd0b74Schristos   },
68675fd0b74Schristos /* lb $r1,($r0+$gotofflo16) */
68775fd0b74Schristos   {
68875fd0b74Schristos     { 0, 0, 0, 0 },
68975fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
69075fd0b74Schristos     & ifmt_addgotoff, { 0x10000000 }
69175fd0b74Schristos   },
69275fd0b74Schristos /* lbu $r1,($r0+$gotofflo16) */
69375fd0b74Schristos   {
69475fd0b74Schristos     { 0, 0, 0, 0 },
69575fd0b74Schristos     { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } },
69675fd0b74Schristos     & ifmt_addgotoff, { 0x40000000 }
69775fd0b74Schristos   },
69875fd0b74Schristos };
69975fd0b74Schristos 
70075fd0b74Schristos #undef A
70175fd0b74Schristos #undef OPERAND
70275fd0b74Schristos #undef MNEM
70375fd0b74Schristos #undef OP
70475fd0b74Schristos 
70575fd0b74Schristos /* Formats for ALIAS macro-insns.  */
70675fd0b74Schristos 
70775fd0b74Schristos #define F(f) & lm32_cgen_ifld_table[LM32_##f]
70875fd0b74Schristos #undef F
70975fd0b74Schristos 
71075fd0b74Schristos /* Each non-simple macro entry points to an array of expansion possibilities.  */
71175fd0b74Schristos 
71275fd0b74Schristos #define A(a) (1 << CGEN_INSN_##a)
71375fd0b74Schristos #define OPERAND(op) LM32_OPERAND_##op
71475fd0b74Schristos #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
71575fd0b74Schristos #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
71675fd0b74Schristos 
71775fd0b74Schristos /* The macro instruction table.  */
71875fd0b74Schristos 
71975fd0b74Schristos static const CGEN_IBASE lm32_cgen_macro_insn_table[] =
72075fd0b74Schristos {
72175fd0b74Schristos };
72275fd0b74Schristos 
72375fd0b74Schristos /* The macro instruction opcode table.  */
72475fd0b74Schristos 
72575fd0b74Schristos static const CGEN_OPCODE lm32_cgen_macro_insn_opcode_table[] =
72675fd0b74Schristos {
72775fd0b74Schristos };
72875fd0b74Schristos 
72975fd0b74Schristos #undef A
73075fd0b74Schristos #undef OPERAND
73175fd0b74Schristos #undef MNEM
73275fd0b74Schristos #undef OP
73375fd0b74Schristos 
73475fd0b74Schristos #ifndef CGEN_ASM_HASH_P
73575fd0b74Schristos #define CGEN_ASM_HASH_P(insn) 1
73675fd0b74Schristos #endif
73775fd0b74Schristos 
73875fd0b74Schristos #ifndef CGEN_DIS_HASH_P
73975fd0b74Schristos #define CGEN_DIS_HASH_P(insn) 1
74075fd0b74Schristos #endif
74175fd0b74Schristos 
74275fd0b74Schristos /* Return non-zero if INSN is to be added to the hash table.
74375fd0b74Schristos    Targets are free to override CGEN_{ASM,DIS}_HASH_P in the .opc file.  */
74475fd0b74Schristos 
74575fd0b74Schristos static int
asm_hash_insn_p(const CGEN_INSN * insn ATTRIBUTE_UNUSED)74675fd0b74Schristos asm_hash_insn_p (const CGEN_INSN *insn ATTRIBUTE_UNUSED)
74775fd0b74Schristos {
74875fd0b74Schristos   return CGEN_ASM_HASH_P (insn);
74975fd0b74Schristos }
75075fd0b74Schristos 
75175fd0b74Schristos static int
dis_hash_insn_p(const CGEN_INSN * insn)75275fd0b74Schristos dis_hash_insn_p (const CGEN_INSN *insn)
75375fd0b74Schristos {
75475fd0b74Schristos   /* If building the hash table and the NO-DIS attribute is present,
75575fd0b74Schristos      ignore.  */
75675fd0b74Schristos   if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_NO_DIS))
75775fd0b74Schristos     return 0;
75875fd0b74Schristos   return CGEN_DIS_HASH_P (insn);
75975fd0b74Schristos }
76075fd0b74Schristos 
76175fd0b74Schristos #ifndef CGEN_ASM_HASH
76275fd0b74Schristos #define CGEN_ASM_HASH_SIZE 127
76375fd0b74Schristos #ifdef CGEN_MNEMONIC_OPERANDS
76475fd0b74Schristos #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE)
76575fd0b74Schristos #else
76675fd0b74Schristos #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE) /*FIXME*/
76775fd0b74Schristos #endif
76875fd0b74Schristos #endif
76975fd0b74Schristos 
77075fd0b74Schristos /* It doesn't make much sense to provide a default here,
77175fd0b74Schristos    but while this is under development we do.
77275fd0b74Schristos    BUFFER is a pointer to the bytes of the insn, target order.
77375fd0b74Schristos    VALUE is the first base_insn_bitsize bits as an int in host order.  */
77475fd0b74Schristos 
77575fd0b74Schristos #ifndef CGEN_DIS_HASH
77675fd0b74Schristos #define CGEN_DIS_HASH_SIZE 256
77775fd0b74Schristos #define CGEN_DIS_HASH(buf, value) (*(unsigned char *) (buf))
77875fd0b74Schristos #endif
77975fd0b74Schristos 
78075fd0b74Schristos /* The result is the hash value of the insn.
78175fd0b74Schristos    Targets are free to override CGEN_{ASM,DIS}_HASH in the .opc file.  */
78275fd0b74Schristos 
78375fd0b74Schristos static unsigned int
asm_hash_insn(const char * mnem)78475fd0b74Schristos asm_hash_insn (const char *mnem)
78575fd0b74Schristos {
78675fd0b74Schristos   return CGEN_ASM_HASH (mnem);
78775fd0b74Schristos }
78875fd0b74Schristos 
78975fd0b74Schristos /* BUF is a pointer to the bytes of the insn, target order.
79075fd0b74Schristos    VALUE is the first base_insn_bitsize bits as an int in host order.  */
79175fd0b74Schristos 
79275fd0b74Schristos static unsigned int
dis_hash_insn(const char * buf ATTRIBUTE_UNUSED,CGEN_INSN_INT value ATTRIBUTE_UNUSED)79375fd0b74Schristos dis_hash_insn (const char *buf ATTRIBUTE_UNUSED,
79475fd0b74Schristos 		     CGEN_INSN_INT value ATTRIBUTE_UNUSED)
79575fd0b74Schristos {
79675fd0b74Schristos   return CGEN_DIS_HASH (buf, value);
79775fd0b74Schristos }
79875fd0b74Schristos 
79975fd0b74Schristos /* Set the recorded length of the insn in the CGEN_FIELDS struct.  */
80075fd0b74Schristos 
80175fd0b74Schristos static void
set_fields_bitsize(CGEN_FIELDS * fields,int size)80275fd0b74Schristos set_fields_bitsize (CGEN_FIELDS *fields, int size)
80375fd0b74Schristos {
80475fd0b74Schristos   CGEN_FIELDS_BITSIZE (fields) = size;
80575fd0b74Schristos }
80675fd0b74Schristos 
80775fd0b74Schristos /* Function to call before using the operand instance table.
80875fd0b74Schristos    This plugs the opcode entries and macro instructions into the cpu table.  */
80975fd0b74Schristos 
81075fd0b74Schristos void
lm32_cgen_init_opcode_table(CGEN_CPU_DESC cd)81175fd0b74Schristos lm32_cgen_init_opcode_table (CGEN_CPU_DESC cd)
81275fd0b74Schristos {
81375fd0b74Schristos   int i;
81475fd0b74Schristos   int num_macros = (sizeof (lm32_cgen_macro_insn_table) /
81575fd0b74Schristos 		    sizeof (lm32_cgen_macro_insn_table[0]));
81675fd0b74Schristos   const CGEN_IBASE *ib = & lm32_cgen_macro_insn_table[0];
81775fd0b74Schristos   const CGEN_OPCODE *oc = & lm32_cgen_macro_insn_opcode_table[0];
81875fd0b74Schristos   CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));
81975fd0b74Schristos 
82075fd0b74Schristos   /* This test has been added to avoid a warning generated
82175fd0b74Schristos      if memset is called with a third argument of value zero.  */
82275fd0b74Schristos   if (num_macros >= 1)
82375fd0b74Schristos     memset (insns, 0, num_macros * sizeof (CGEN_INSN));
82475fd0b74Schristos   for (i = 0; i < num_macros; ++i)
82575fd0b74Schristos     {
82675fd0b74Schristos       insns[i].base = &ib[i];
82775fd0b74Schristos       insns[i].opcode = &oc[i];
82875fd0b74Schristos       lm32_cgen_build_insn_regex (& insns[i]);
82975fd0b74Schristos     }
83075fd0b74Schristos   cd->macro_insn_table.init_entries = insns;
83175fd0b74Schristos   cd->macro_insn_table.entry_size = sizeof (CGEN_IBASE);
83275fd0b74Schristos   cd->macro_insn_table.num_init_entries = num_macros;
83375fd0b74Schristos 
83475fd0b74Schristos   oc = & lm32_cgen_insn_opcode_table[0];
83575fd0b74Schristos   insns = (CGEN_INSN *) cd->insn_table.init_entries;
83675fd0b74Schristos   for (i = 0; i < MAX_INSNS; ++i)
83775fd0b74Schristos     {
83875fd0b74Schristos       insns[i].opcode = &oc[i];
83975fd0b74Schristos       lm32_cgen_build_insn_regex (& insns[i]);
84075fd0b74Schristos     }
84175fd0b74Schristos 
84275fd0b74Schristos   cd->sizeof_fields = sizeof (CGEN_FIELDS);
84375fd0b74Schristos   cd->set_fields_bitsize = set_fields_bitsize;
84475fd0b74Schristos 
84575fd0b74Schristos   cd->asm_hash_p = asm_hash_insn_p;
84675fd0b74Schristos   cd->asm_hash = asm_hash_insn;
84775fd0b74Schristos   cd->asm_hash_size = CGEN_ASM_HASH_SIZE;
84875fd0b74Schristos 
84975fd0b74Schristos   cd->dis_hash_p = dis_hash_insn_p;
85075fd0b74Schristos   cd->dis_hash = dis_hash_insn;
85175fd0b74Schristos   cd->dis_hash_size = CGEN_DIS_HASH_SIZE;
85275fd0b74Schristos }
853