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