1ede78133Schristos /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
275fd0b74Schristos /* CPU data 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 <stdio.h>
2875fd0b74Schristos #include <stdarg.h>
29*e992f068Schristos #include <stdlib.h>
3075fd0b74Schristos #include "ansidecl.h"
3175fd0b74Schristos #include "bfd.h"
3275fd0b74Schristos #include "symcat.h"
3375fd0b74Schristos #include "lm32-desc.h"
3475fd0b74Schristos #include "lm32-opc.h"
3575fd0b74Schristos #include "opintl.h"
3675fd0b74Schristos #include "libiberty.h"
3775fd0b74Schristos #include "xregex.h"
3875fd0b74Schristos
3975fd0b74Schristos /* Attributes. */
4075fd0b74Schristos
4175fd0b74Schristos static const CGEN_ATTR_ENTRY bool_attr[] =
4275fd0b74Schristos {
4375fd0b74Schristos { "#f", 0 },
4475fd0b74Schristos { "#t", 1 },
4575fd0b74Schristos { 0, 0 }
4675fd0b74Schristos };
4775fd0b74Schristos
4875fd0b74Schristos static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
4975fd0b74Schristos {
5075fd0b74Schristos { "base", MACH_BASE },
5175fd0b74Schristos { "lm32", MACH_LM32 },
5275fd0b74Schristos { "max", MACH_MAX },
5375fd0b74Schristos { 0, 0 }
5475fd0b74Schristos };
5575fd0b74Schristos
5675fd0b74Schristos static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
5775fd0b74Schristos {
5875fd0b74Schristos { "lm32", ISA_LM32 },
5975fd0b74Schristos { "max", ISA_MAX },
6075fd0b74Schristos { 0, 0 }
6175fd0b74Schristos };
6275fd0b74Schristos
6375fd0b74Schristos const CGEN_ATTR_TABLE lm32_cgen_ifield_attr_table[] =
6475fd0b74Schristos {
6575fd0b74Schristos { "MACH", & MACH_attr[0], & MACH_attr[0] },
6675fd0b74Schristos { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
6775fd0b74Schristos { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
6875fd0b74Schristos { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
6975fd0b74Schristos { "RESERVED", &bool_attr[0], &bool_attr[0] },
7075fd0b74Schristos { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
7175fd0b74Schristos { "SIGNED", &bool_attr[0], &bool_attr[0] },
7275fd0b74Schristos { 0, 0, 0 }
7375fd0b74Schristos };
7475fd0b74Schristos
7575fd0b74Schristos const CGEN_ATTR_TABLE lm32_cgen_hardware_attr_table[] =
7675fd0b74Schristos {
7775fd0b74Schristos { "MACH", & MACH_attr[0], & MACH_attr[0] },
7875fd0b74Schristos { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
7975fd0b74Schristos { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
8075fd0b74Schristos { "PC", &bool_attr[0], &bool_attr[0] },
8175fd0b74Schristos { "PROFILE", &bool_attr[0], &bool_attr[0] },
8275fd0b74Schristos { 0, 0, 0 }
8375fd0b74Schristos };
8475fd0b74Schristos
8575fd0b74Schristos const CGEN_ATTR_TABLE lm32_cgen_operand_attr_table[] =
8675fd0b74Schristos {
8775fd0b74Schristos { "MACH", & MACH_attr[0], & MACH_attr[0] },
8875fd0b74Schristos { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
8975fd0b74Schristos { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
9075fd0b74Schristos { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
9175fd0b74Schristos { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
9275fd0b74Schristos { "SIGNED", &bool_attr[0], &bool_attr[0] },
9375fd0b74Schristos { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
9475fd0b74Schristos { "RELAX", &bool_attr[0], &bool_attr[0] },
9575fd0b74Schristos { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
9675fd0b74Schristos { 0, 0, 0 }
9775fd0b74Schristos };
9875fd0b74Schristos
9975fd0b74Schristos const CGEN_ATTR_TABLE lm32_cgen_insn_attr_table[] =
10075fd0b74Schristos {
10175fd0b74Schristos { "MACH", & MACH_attr[0], & MACH_attr[0] },
10275fd0b74Schristos { "ALIAS", &bool_attr[0], &bool_attr[0] },
10375fd0b74Schristos { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
10475fd0b74Schristos { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
10575fd0b74Schristos { "COND-CTI", &bool_attr[0], &bool_attr[0] },
10675fd0b74Schristos { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
10775fd0b74Schristos { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
10875fd0b74Schristos { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
10975fd0b74Schristos { "RELAXED", &bool_attr[0], &bool_attr[0] },
11075fd0b74Schristos { "NO-DIS", &bool_attr[0], &bool_attr[0] },
11175fd0b74Schristos { "PBB", &bool_attr[0], &bool_attr[0] },
11275fd0b74Schristos { 0, 0, 0 }
11375fd0b74Schristos };
11475fd0b74Schristos
11575fd0b74Schristos /* Instruction set variants. */
11675fd0b74Schristos
11775fd0b74Schristos static const CGEN_ISA lm32_cgen_isa_table[] = {
11875fd0b74Schristos { "lm32", 32, 32, 32, 32 },
11975fd0b74Schristos { 0, 0, 0, 0, 0 }
12075fd0b74Schristos };
12175fd0b74Schristos
12275fd0b74Schristos /* Machine variants. */
12375fd0b74Schristos
12475fd0b74Schristos static const CGEN_MACH lm32_cgen_mach_table[] = {
12575fd0b74Schristos { "lm32", "lm32", MACH_LM32, 0 },
12675fd0b74Schristos { 0, 0, 0, 0 }
12775fd0b74Schristos };
12875fd0b74Schristos
12975fd0b74Schristos static CGEN_KEYWORD_ENTRY lm32_cgen_opval_h_gr_entries[] =
13075fd0b74Schristos {
13175fd0b74Schristos { "gp", 26, {0, {{{0, 0}}}}, 0, 0 },
13275fd0b74Schristos { "fp", 27, {0, {{{0, 0}}}}, 0, 0 },
13375fd0b74Schristos { "sp", 28, {0, {{{0, 0}}}}, 0, 0 },
13475fd0b74Schristos { "ra", 29, {0, {{{0, 0}}}}, 0, 0 },
13575fd0b74Schristos { "ea", 30, {0, {{{0, 0}}}}, 0, 0 },
13675fd0b74Schristos { "ba", 31, {0, {{{0, 0}}}}, 0, 0 },
13775fd0b74Schristos { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
13875fd0b74Schristos { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
13975fd0b74Schristos { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
14075fd0b74Schristos { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
14175fd0b74Schristos { "r4", 4, {0, {{{0, 0}}}}, 0, 0 },
14275fd0b74Schristos { "r5", 5, {0, {{{0, 0}}}}, 0, 0 },
14375fd0b74Schristos { "r6", 6, {0, {{{0, 0}}}}, 0, 0 },
14475fd0b74Schristos { "r7", 7, {0, {{{0, 0}}}}, 0, 0 },
14575fd0b74Schristos { "r8", 8, {0, {{{0, 0}}}}, 0, 0 },
14675fd0b74Schristos { "r9", 9, {0, {{{0, 0}}}}, 0, 0 },
14775fd0b74Schristos { "r10", 10, {0, {{{0, 0}}}}, 0, 0 },
14875fd0b74Schristos { "r11", 11, {0, {{{0, 0}}}}, 0, 0 },
14975fd0b74Schristos { "r12", 12, {0, {{{0, 0}}}}, 0, 0 },
15075fd0b74Schristos { "r13", 13, {0, {{{0, 0}}}}, 0, 0 },
15175fd0b74Schristos { "r14", 14, {0, {{{0, 0}}}}, 0, 0 },
15275fd0b74Schristos { "r15", 15, {0, {{{0, 0}}}}, 0, 0 },
15375fd0b74Schristos { "r16", 16, {0, {{{0, 0}}}}, 0, 0 },
15475fd0b74Schristos { "r17", 17, {0, {{{0, 0}}}}, 0, 0 },
15575fd0b74Schristos { "r18", 18, {0, {{{0, 0}}}}, 0, 0 },
15675fd0b74Schristos { "r19", 19, {0, {{{0, 0}}}}, 0, 0 },
15775fd0b74Schristos { "r20", 20, {0, {{{0, 0}}}}, 0, 0 },
15875fd0b74Schristos { "r21", 21, {0, {{{0, 0}}}}, 0, 0 },
15975fd0b74Schristos { "r22", 22, {0, {{{0, 0}}}}, 0, 0 },
16075fd0b74Schristos { "r23", 23, {0, {{{0, 0}}}}, 0, 0 },
16175fd0b74Schristos { "r24", 24, {0, {{{0, 0}}}}, 0, 0 },
16275fd0b74Schristos { "r25", 25, {0, {{{0, 0}}}}, 0, 0 },
16375fd0b74Schristos { "r26", 26, {0, {{{0, 0}}}}, 0, 0 },
16475fd0b74Schristos { "r27", 27, {0, {{{0, 0}}}}, 0, 0 },
16575fd0b74Schristos { "r28", 28, {0, {{{0, 0}}}}, 0, 0 },
16675fd0b74Schristos { "r29", 29, {0, {{{0, 0}}}}, 0, 0 },
16775fd0b74Schristos { "r30", 30, {0, {{{0, 0}}}}, 0, 0 },
16875fd0b74Schristos { "r31", 31, {0, {{{0, 0}}}}, 0, 0 }
16975fd0b74Schristos };
17075fd0b74Schristos
17175fd0b74Schristos CGEN_KEYWORD lm32_cgen_opval_h_gr =
17275fd0b74Schristos {
17375fd0b74Schristos & lm32_cgen_opval_h_gr_entries[0],
17475fd0b74Schristos 38,
17575fd0b74Schristos 0, 0, 0, 0, ""
17675fd0b74Schristos };
17775fd0b74Schristos
17875fd0b74Schristos static CGEN_KEYWORD_ENTRY lm32_cgen_opval_h_csr_entries[] =
17975fd0b74Schristos {
18075fd0b74Schristos { "IE", 0, {0, {{{0, 0}}}}, 0, 0 },
18175fd0b74Schristos { "IM", 1, {0, {{{0, 0}}}}, 0, 0 },
18275fd0b74Schristos { "IP", 2, {0, {{{0, 0}}}}, 0, 0 },
18375fd0b74Schristos { "ICC", 3, {0, {{{0, 0}}}}, 0, 0 },
18475fd0b74Schristos { "DCC", 4, {0, {{{0, 0}}}}, 0, 0 },
18575fd0b74Schristos { "CC", 5, {0, {{{0, 0}}}}, 0, 0 },
18675fd0b74Schristos { "CFG", 6, {0, {{{0, 0}}}}, 0, 0 },
18775fd0b74Schristos { "EBA", 7, {0, {{{0, 0}}}}, 0, 0 },
18875fd0b74Schristos { "DC", 8, {0, {{{0, 0}}}}, 0, 0 },
18975fd0b74Schristos { "DEBA", 9, {0, {{{0, 0}}}}, 0, 0 },
19075fd0b74Schristos { "CFG2", 10, {0, {{{0, 0}}}}, 0, 0 },
19175fd0b74Schristos { "JTX", 14, {0, {{{0, 0}}}}, 0, 0 },
19275fd0b74Schristos { "JRX", 15, {0, {{{0, 0}}}}, 0, 0 },
19375fd0b74Schristos { "BP0", 16, {0, {{{0, 0}}}}, 0, 0 },
19475fd0b74Schristos { "BP1", 17, {0, {{{0, 0}}}}, 0, 0 },
19575fd0b74Schristos { "BP2", 18, {0, {{{0, 0}}}}, 0, 0 },
19675fd0b74Schristos { "BP3", 19, {0, {{{0, 0}}}}, 0, 0 },
19775fd0b74Schristos { "WP0", 24, {0, {{{0, 0}}}}, 0, 0 },
19875fd0b74Schristos { "WP1", 25, {0, {{{0, 0}}}}, 0, 0 },
19975fd0b74Schristos { "WP2", 26, {0, {{{0, 0}}}}, 0, 0 },
20075fd0b74Schristos { "WP3", 27, {0, {{{0, 0}}}}, 0, 0 },
20175fd0b74Schristos { "PSW", 29, {0, {{{0, 0}}}}, 0, 0 },
20275fd0b74Schristos { "TLBVADDR", 30, {0, {{{0, 0}}}}, 0, 0 },
20375fd0b74Schristos { "TLBPADDR", 31, {0, {{{0, 0}}}}, 0, 0 },
20475fd0b74Schristos { "TLBBADVADDR", 31, {0, {{{0, 0}}}}, 0, 0 }
20575fd0b74Schristos };
20675fd0b74Schristos
20775fd0b74Schristos CGEN_KEYWORD lm32_cgen_opval_h_csr =
20875fd0b74Schristos {
20975fd0b74Schristos & lm32_cgen_opval_h_csr_entries[0],
21075fd0b74Schristos 25,
21175fd0b74Schristos 0, 0, 0, 0, ""
21275fd0b74Schristos };
21375fd0b74Schristos
21475fd0b74Schristos
21575fd0b74Schristos /* The hardware table. */
21675fd0b74Schristos
21775fd0b74Schristos #define A(a) (1 << CGEN_HW_##a)
21875fd0b74Schristos
21975fd0b74Schristos const CGEN_HW_ENTRY lm32_cgen_hw_table[] =
22075fd0b74Schristos {
22175fd0b74Schristos { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22275fd0b74Schristos { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22375fd0b74Schristos { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22475fd0b74Schristos { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22575fd0b74Schristos { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22675fd0b74Schristos { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
227*e992f068Schristos { "h-gr", HW_H_GR, CGEN_ASM_KEYWORD, & lm32_cgen_opval_h_gr, { 0, { { { (1<<MACH_BASE), 0 } } } } },
228*e992f068Schristos { "h-csr", HW_H_CSR, CGEN_ASM_KEYWORD, & lm32_cgen_opval_h_csr, { 0, { { { (1<<MACH_BASE), 0 } } } } },
22975fd0b74Schristos { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
23075fd0b74Schristos };
23175fd0b74Schristos
23275fd0b74Schristos #undef A
23375fd0b74Schristos
23475fd0b74Schristos
23575fd0b74Schristos /* The instruction field table. */
23675fd0b74Schristos
23775fd0b74Schristos #define A(a) (1 << CGEN_IFLD_##a)
23875fd0b74Schristos
23975fd0b74Schristos const CGEN_IFLD lm32_cgen_ifld_table[] =
24075fd0b74Schristos {
24175fd0b74Schristos { LM32_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24275fd0b74Schristos { LM32_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24375fd0b74Schristos { LM32_F_OPCODE, "f-opcode", 0, 32, 31, 6, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24475fd0b74Schristos { LM32_F_R0, "f-r0", 0, 32, 25, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24575fd0b74Schristos { LM32_F_R1, "f-r1", 0, 32, 20, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24675fd0b74Schristos { LM32_F_R2, "f-r2", 0, 32, 15, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24775fd0b74Schristos { LM32_F_RESV0, "f-resv0", 0, 32, 10, 11, { 0|A(RESERVED), { { { (1<<MACH_BASE), 0 } } } } },
24875fd0b74Schristos { LM32_F_SHIFT, "f-shift", 0, 32, 4, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
24975fd0b74Schristos { LM32_F_IMM, "f-imm", 0, 32, 15, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } },
25075fd0b74Schristos { LM32_F_UIMM, "f-uimm", 0, 32, 15, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } },
25175fd0b74Schristos { LM32_F_CSR, "f-csr", 0, 32, 25, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } },
25275fd0b74Schristos { LM32_F_USER, "f-user", 0, 32, 10, 11, { 0, { { { (1<<MACH_BASE), 0 } } } } },
25375fd0b74Schristos { LM32_F_EXCEPTION, "f-exception", 0, 32, 25, 26, { 0, { { { (1<<MACH_BASE), 0 } } } } },
25475fd0b74Schristos { LM32_F_BRANCH, "f-branch", 0, 32, 15, 16, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
25575fd0b74Schristos { LM32_F_CALL, "f-call", 0, 32, 25, 26, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
25675fd0b74Schristos { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
25775fd0b74Schristos };
25875fd0b74Schristos
25975fd0b74Schristos #undef A
26075fd0b74Schristos
26175fd0b74Schristos
26275fd0b74Schristos
26375fd0b74Schristos /* multi ifield declarations */
26475fd0b74Schristos
26575fd0b74Schristos
26675fd0b74Schristos
26775fd0b74Schristos /* multi ifield definitions */
26875fd0b74Schristos
26975fd0b74Schristos
27075fd0b74Schristos /* The operand table. */
27175fd0b74Schristos
27275fd0b74Schristos #define A(a) (1 << CGEN_OPERAND_##a)
27375fd0b74Schristos #define OPERAND(op) LM32_OPERAND_##op
27475fd0b74Schristos
27575fd0b74Schristos const CGEN_OPERAND lm32_cgen_operand_table[] =
27675fd0b74Schristos {
27775fd0b74Schristos /* pc: program counter */
27875fd0b74Schristos { "pc", LM32_OPERAND_PC, HW_H_PC, 0, 0,
279*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_NIL] } },
28075fd0b74Schristos { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } },
28175fd0b74Schristos /* r0: register 0 */
28275fd0b74Schristos { "r0", LM32_OPERAND_R0, HW_H_GR, 25, 5,
283*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_R0] } },
28475fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
28575fd0b74Schristos /* r1: register 1 */
28675fd0b74Schristos { "r1", LM32_OPERAND_R1, HW_H_GR, 20, 5,
287*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_R1] } },
28875fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
28975fd0b74Schristos /* r2: register 2 */
29075fd0b74Schristos { "r2", LM32_OPERAND_R2, HW_H_GR, 15, 5,
291*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_R2] } },
29275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
29375fd0b74Schristos /* shift: shift amout */
29475fd0b74Schristos { "shift", LM32_OPERAND_SHIFT, HW_H_UINT, 4, 5,
295*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_SHIFT] } },
29675fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
29775fd0b74Schristos /* imm: signed immediate */
29875fd0b74Schristos { "imm", LM32_OPERAND_IMM, HW_H_SINT, 15, 16,
299*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_IMM] } },
30075fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
30175fd0b74Schristos /* uimm: unsigned immediate */
30275fd0b74Schristos { "uimm", LM32_OPERAND_UIMM, HW_H_UINT, 15, 16,
303*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_UIMM] } },
30475fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
30575fd0b74Schristos /* branch: branch offset */
30675fd0b74Schristos { "branch", LM32_OPERAND_BRANCH, HW_H_IADDR, 15, 16,
307*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_BRANCH] } },
30875fd0b74Schristos { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
30975fd0b74Schristos /* call: call offset */
31075fd0b74Schristos { "call", LM32_OPERAND_CALL, HW_H_IADDR, 25, 26,
311*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_CALL] } },
31275fd0b74Schristos { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } },
31375fd0b74Schristos /* csr: csr */
31475fd0b74Schristos { "csr", LM32_OPERAND_CSR, HW_H_CSR, 25, 5,
315*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_CSR] } },
31675fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
31775fd0b74Schristos /* user: user */
31875fd0b74Schristos { "user", LM32_OPERAND_USER, HW_H_UINT, 10, 11,
319*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_USER] } },
32075fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
32175fd0b74Schristos /* exception: exception */
32275fd0b74Schristos { "exception", LM32_OPERAND_EXCEPTION, HW_H_UINT, 25, 26,
323*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_EXCEPTION] } },
32475fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
32575fd0b74Schristos /* hi16: high 16-bit immediate */
32675fd0b74Schristos { "hi16", LM32_OPERAND_HI16, HW_H_UINT, 15, 16,
327*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_UIMM] } },
32875fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
32975fd0b74Schristos /* lo16: low 16-bit immediate */
33075fd0b74Schristos { "lo16", LM32_OPERAND_LO16, HW_H_UINT, 15, 16,
331*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_UIMM] } },
33275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
33375fd0b74Schristos /* gp16: gp relative 16-bit immediate */
33475fd0b74Schristos { "gp16", LM32_OPERAND_GP16, HW_H_SINT, 15, 16,
335*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_IMM] } },
33675fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
33775fd0b74Schristos /* got16: got 16-bit immediate */
33875fd0b74Schristos { "got16", LM32_OPERAND_GOT16, HW_H_SINT, 15, 16,
339*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_IMM] } },
34075fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
34175fd0b74Schristos /* gotoffhi16: got offset high 16-bit immediate */
34275fd0b74Schristos { "gotoffhi16", LM32_OPERAND_GOTOFFHI16, HW_H_SINT, 15, 16,
343*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_IMM] } },
34475fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
34575fd0b74Schristos /* gotofflo16: got offset low 16-bit immediate */
34675fd0b74Schristos { "gotofflo16", LM32_OPERAND_GOTOFFLO16, HW_H_SINT, 15, 16,
347*e992f068Schristos { 0, { &lm32_cgen_ifld_table[LM32_F_IMM] } },
34875fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } },
34975fd0b74Schristos /* sentinel */
35075fd0b74Schristos { 0, 0, 0, 0, 0,
351*e992f068Schristos { 0, { 0 } },
35275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } } }
35375fd0b74Schristos };
35475fd0b74Schristos
35575fd0b74Schristos #undef A
35675fd0b74Schristos
35775fd0b74Schristos
35875fd0b74Schristos /* The instruction table. */
35975fd0b74Schristos
36075fd0b74Schristos #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
36175fd0b74Schristos #define A(a) (1 << CGEN_INSN_##a)
36275fd0b74Schristos
36375fd0b74Schristos static const CGEN_IBASE lm32_cgen_insn_table[MAX_INSNS] =
36475fd0b74Schristos {
36575fd0b74Schristos /* Special null first entry.
36675fd0b74Schristos A `num' value of zero is thus invalid.
36775fd0b74Schristos Also, the special `invalid' insn resides here. */
36875fd0b74Schristos { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
36975fd0b74Schristos /* add $r2,$r0,$r1 */
37075fd0b74Schristos {
37175fd0b74Schristos LM32_INSN_ADD, "add", "add", 32,
37275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
37375fd0b74Schristos },
37475fd0b74Schristos /* addi $r1,$r0,$imm */
37575fd0b74Schristos {
37675fd0b74Schristos LM32_INSN_ADDI, "addi", "addi", 32,
37775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
37875fd0b74Schristos },
37975fd0b74Schristos /* and $r2,$r0,$r1 */
38075fd0b74Schristos {
38175fd0b74Schristos LM32_INSN_AND, "and", "and", 32,
38275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
38375fd0b74Schristos },
38475fd0b74Schristos /* andi $r1,$r0,$uimm */
38575fd0b74Schristos {
38675fd0b74Schristos LM32_INSN_ANDI, "andi", "andi", 32,
38775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
38875fd0b74Schristos },
38975fd0b74Schristos /* andhi $r1,$r0,$hi16 */
39075fd0b74Schristos {
39175fd0b74Schristos LM32_INSN_ANDHII, "andhii", "andhi", 32,
39275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
39375fd0b74Schristos },
39475fd0b74Schristos /* b $r0 */
39575fd0b74Schristos {
39675fd0b74Schristos LM32_INSN_B, "b", "b", 32,
39775fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
39875fd0b74Schristos },
39975fd0b74Schristos /* bi $call */
40075fd0b74Schristos {
40175fd0b74Schristos LM32_INSN_BI, "bi", "bi", 32,
40275fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
40375fd0b74Schristos },
40475fd0b74Schristos /* be $r0,$r1,$branch */
40575fd0b74Schristos {
40675fd0b74Schristos LM32_INSN_BE, "be", "be", 32,
40775fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
40875fd0b74Schristos },
40975fd0b74Schristos /* bg $r0,$r1,$branch */
41075fd0b74Schristos {
41175fd0b74Schristos LM32_INSN_BG, "bg", "bg", 32,
41275fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
41375fd0b74Schristos },
41475fd0b74Schristos /* bge $r0,$r1,$branch */
41575fd0b74Schristos {
41675fd0b74Schristos LM32_INSN_BGE, "bge", "bge", 32,
41775fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
41875fd0b74Schristos },
41975fd0b74Schristos /* bgeu $r0,$r1,$branch */
42075fd0b74Schristos {
42175fd0b74Schristos LM32_INSN_BGEU, "bgeu", "bgeu", 32,
42275fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
42375fd0b74Schristos },
42475fd0b74Schristos /* bgu $r0,$r1,$branch */
42575fd0b74Schristos {
42675fd0b74Schristos LM32_INSN_BGU, "bgu", "bgu", 32,
42775fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
42875fd0b74Schristos },
42975fd0b74Schristos /* bne $r0,$r1,$branch */
43075fd0b74Schristos {
43175fd0b74Schristos LM32_INSN_BNE, "bne", "bne", 32,
43275fd0b74Schristos { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } } } }
43375fd0b74Schristos },
43475fd0b74Schristos /* call $r0 */
43575fd0b74Schristos {
43675fd0b74Schristos LM32_INSN_CALL, "call", "call", 32,
43775fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
43875fd0b74Schristos },
43975fd0b74Schristos /* calli $call */
44075fd0b74Schristos {
44175fd0b74Schristos LM32_INSN_CALLI, "calli", "calli", 32,
44275fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
44375fd0b74Schristos },
44475fd0b74Schristos /* cmpe $r2,$r0,$r1 */
44575fd0b74Schristos {
44675fd0b74Schristos LM32_INSN_CMPE, "cmpe", "cmpe", 32,
44775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
44875fd0b74Schristos },
44975fd0b74Schristos /* cmpei $r1,$r0,$imm */
45075fd0b74Schristos {
45175fd0b74Schristos LM32_INSN_CMPEI, "cmpei", "cmpei", 32,
45275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
45375fd0b74Schristos },
45475fd0b74Schristos /* cmpg $r2,$r0,$r1 */
45575fd0b74Schristos {
45675fd0b74Schristos LM32_INSN_CMPG, "cmpg", "cmpg", 32,
45775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
45875fd0b74Schristos },
45975fd0b74Schristos /* cmpgi $r1,$r0,$imm */
46075fd0b74Schristos {
46175fd0b74Schristos LM32_INSN_CMPGI, "cmpgi", "cmpgi", 32,
46275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
46375fd0b74Schristos },
46475fd0b74Schristos /* cmpge $r2,$r0,$r1 */
46575fd0b74Schristos {
46675fd0b74Schristos LM32_INSN_CMPGE, "cmpge", "cmpge", 32,
46775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
46875fd0b74Schristos },
46975fd0b74Schristos /* cmpgei $r1,$r0,$imm */
47075fd0b74Schristos {
47175fd0b74Schristos LM32_INSN_CMPGEI, "cmpgei", "cmpgei", 32,
47275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
47375fd0b74Schristos },
47475fd0b74Schristos /* cmpgeu $r2,$r0,$r1 */
47575fd0b74Schristos {
47675fd0b74Schristos LM32_INSN_CMPGEU, "cmpgeu", "cmpgeu", 32,
47775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
47875fd0b74Schristos },
47975fd0b74Schristos /* cmpgeui $r1,$r0,$uimm */
48075fd0b74Schristos {
48175fd0b74Schristos LM32_INSN_CMPGEUI, "cmpgeui", "cmpgeui", 32,
48275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
48375fd0b74Schristos },
48475fd0b74Schristos /* cmpgu $r2,$r0,$r1 */
48575fd0b74Schristos {
48675fd0b74Schristos LM32_INSN_CMPGU, "cmpgu", "cmpgu", 32,
48775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
48875fd0b74Schristos },
48975fd0b74Schristos /* cmpgui $r1,$r0,$uimm */
49075fd0b74Schristos {
49175fd0b74Schristos LM32_INSN_CMPGUI, "cmpgui", "cmpgui", 32,
49275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
49375fd0b74Schristos },
49475fd0b74Schristos /* cmpne $r2,$r0,$r1 */
49575fd0b74Schristos {
49675fd0b74Schristos LM32_INSN_CMPNE, "cmpne", "cmpne", 32,
49775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
49875fd0b74Schristos },
49975fd0b74Schristos /* cmpnei $r1,$r0,$imm */
50075fd0b74Schristos {
50175fd0b74Schristos LM32_INSN_CMPNEI, "cmpnei", "cmpnei", 32,
50275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
50375fd0b74Schristos },
50475fd0b74Schristos /* divu $r2,$r0,$r1 */
50575fd0b74Schristos {
50675fd0b74Schristos LM32_INSN_DIVU, "divu", "divu", 32,
50775fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
50875fd0b74Schristos },
50975fd0b74Schristos /* lb $r1,($r0+$imm) */
51075fd0b74Schristos {
51175fd0b74Schristos LM32_INSN_LB, "lb", "lb", 32,
51275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
51375fd0b74Schristos },
51475fd0b74Schristos /* lbu $r1,($r0+$imm) */
51575fd0b74Schristos {
51675fd0b74Schristos LM32_INSN_LBU, "lbu", "lbu", 32,
51775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
51875fd0b74Schristos },
51975fd0b74Schristos /* lh $r1,($r0+$imm) */
52075fd0b74Schristos {
52175fd0b74Schristos LM32_INSN_LH, "lh", "lh", 32,
52275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
52375fd0b74Schristos },
52475fd0b74Schristos /* lhu $r1,($r0+$imm) */
52575fd0b74Schristos {
52675fd0b74Schristos LM32_INSN_LHU, "lhu", "lhu", 32,
52775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
52875fd0b74Schristos },
52975fd0b74Schristos /* lw $r1,($r0+$imm) */
53075fd0b74Schristos {
53175fd0b74Schristos LM32_INSN_LW, "lw", "lw", 32,
53275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
53375fd0b74Schristos },
53475fd0b74Schristos /* modu $r2,$r0,$r1 */
53575fd0b74Schristos {
53675fd0b74Schristos LM32_INSN_MODU, "modu", "modu", 32,
53775fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
53875fd0b74Schristos },
53975fd0b74Schristos /* mul $r2,$r0,$r1 */
54075fd0b74Schristos {
54175fd0b74Schristos LM32_INSN_MUL, "mul", "mul", 32,
54275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
54375fd0b74Schristos },
54475fd0b74Schristos /* muli $r1,$r0,$imm */
54575fd0b74Schristos {
54675fd0b74Schristos LM32_INSN_MULI, "muli", "muli", 32,
54775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
54875fd0b74Schristos },
54975fd0b74Schristos /* nor $r2,$r0,$r1 */
55075fd0b74Schristos {
55175fd0b74Schristos LM32_INSN_NOR, "nor", "nor", 32,
55275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
55375fd0b74Schristos },
55475fd0b74Schristos /* nori $r1,$r0,$uimm */
55575fd0b74Schristos {
55675fd0b74Schristos LM32_INSN_NORI, "nori", "nori", 32,
55775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
55875fd0b74Schristos },
55975fd0b74Schristos /* or $r2,$r0,$r1 */
56075fd0b74Schristos {
56175fd0b74Schristos LM32_INSN_OR, "or", "or", 32,
56275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
56375fd0b74Schristos },
56475fd0b74Schristos /* ori $r1,$r0,$lo16 */
56575fd0b74Schristos {
56675fd0b74Schristos LM32_INSN_ORI, "ori", "ori", 32,
56775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
56875fd0b74Schristos },
56975fd0b74Schristos /* orhi $r1,$r0,$hi16 */
57075fd0b74Schristos {
57175fd0b74Schristos LM32_INSN_ORHII, "orhii", "orhi", 32,
57275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
57375fd0b74Schristos },
57475fd0b74Schristos /* rcsr $r2,$csr */
57575fd0b74Schristos {
57675fd0b74Schristos LM32_INSN_RCSR, "rcsr", "rcsr", 32,
57775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
57875fd0b74Schristos },
57975fd0b74Schristos /* sb ($r0+$imm),$r1 */
58075fd0b74Schristos {
58175fd0b74Schristos LM32_INSN_SB, "sb", "sb", 32,
58275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
58375fd0b74Schristos },
58475fd0b74Schristos /* sextb $r2,$r0 */
58575fd0b74Schristos {
58675fd0b74Schristos LM32_INSN_SEXTB, "sextb", "sextb", 32,
58775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
58875fd0b74Schristos },
58975fd0b74Schristos /* sexth $r2,$r0 */
59075fd0b74Schristos {
59175fd0b74Schristos LM32_INSN_SEXTH, "sexth", "sexth", 32,
59275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
59375fd0b74Schristos },
59475fd0b74Schristos /* sh ($r0+$imm),$r1 */
59575fd0b74Schristos {
59675fd0b74Schristos LM32_INSN_SH, "sh", "sh", 32,
59775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
59875fd0b74Schristos },
59975fd0b74Schristos /* sl $r2,$r0,$r1 */
60075fd0b74Schristos {
60175fd0b74Schristos LM32_INSN_SL, "sl", "sl", 32,
60275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
60375fd0b74Schristos },
60475fd0b74Schristos /* sli $r1,$r0,$imm */
60575fd0b74Schristos {
60675fd0b74Schristos LM32_INSN_SLI, "sli", "sli", 32,
60775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
60875fd0b74Schristos },
60975fd0b74Schristos /* sr $r2,$r0,$r1 */
61075fd0b74Schristos {
61175fd0b74Schristos LM32_INSN_SR, "sr", "sr", 32,
61275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
61375fd0b74Schristos },
61475fd0b74Schristos /* sri $r1,$r0,$imm */
61575fd0b74Schristos {
61675fd0b74Schristos LM32_INSN_SRI, "sri", "sri", 32,
61775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
61875fd0b74Schristos },
61975fd0b74Schristos /* sru $r2,$r0,$r1 */
62075fd0b74Schristos {
62175fd0b74Schristos LM32_INSN_SRU, "sru", "sru", 32,
62275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
62375fd0b74Schristos },
62475fd0b74Schristos /* srui $r1,$r0,$imm */
62575fd0b74Schristos {
62675fd0b74Schristos LM32_INSN_SRUI, "srui", "srui", 32,
62775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
62875fd0b74Schristos },
62975fd0b74Schristos /* sub $r2,$r0,$r1 */
63075fd0b74Schristos {
63175fd0b74Schristos LM32_INSN_SUB, "sub", "sub", 32,
63275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
63375fd0b74Schristos },
63475fd0b74Schristos /* sw ($r0+$imm),$r1 */
63575fd0b74Schristos {
63675fd0b74Schristos LM32_INSN_SW, "sw", "sw", 32,
63775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
63875fd0b74Schristos },
63975fd0b74Schristos /* user $r2,$r0,$r1,$user */
64075fd0b74Schristos {
64175fd0b74Schristos LM32_INSN_USER, "user", "user", 32,
64275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
64375fd0b74Schristos },
64475fd0b74Schristos /* wcsr $csr,$r1 */
64575fd0b74Schristos {
64675fd0b74Schristos LM32_INSN_WCSR, "wcsr", "wcsr", 32,
64775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
64875fd0b74Schristos },
64975fd0b74Schristos /* xor $r2,$r0,$r1 */
65075fd0b74Schristos {
65175fd0b74Schristos LM32_INSN_XOR, "xor", "xor", 32,
65275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
65375fd0b74Schristos },
65475fd0b74Schristos /* xori $r1,$r0,$uimm */
65575fd0b74Schristos {
65675fd0b74Schristos LM32_INSN_XORI, "xori", "xori", 32,
65775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
65875fd0b74Schristos },
65975fd0b74Schristos /* xnor $r2,$r0,$r1 */
66075fd0b74Schristos {
66175fd0b74Schristos LM32_INSN_XNOR, "xnor", "xnor", 32,
66275fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
66375fd0b74Schristos },
66475fd0b74Schristos /* xnori $r1,$r0,$uimm */
66575fd0b74Schristos {
66675fd0b74Schristos LM32_INSN_XNORI, "xnori", "xnori", 32,
66775fd0b74Schristos { 0, { { { (1<<MACH_BASE), 0 } } } }
66875fd0b74Schristos },
66975fd0b74Schristos /* break */
67075fd0b74Schristos {
67175fd0b74Schristos LM32_INSN_BREAK, "break", "break", 32,
67275fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
67375fd0b74Schristos },
67475fd0b74Schristos /* scall */
67575fd0b74Schristos {
67675fd0b74Schristos LM32_INSN_SCALL, "scall", "scall", 32,
67775fd0b74Schristos { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
67875fd0b74Schristos },
67975fd0b74Schristos /* bret */
68075fd0b74Schristos {
68175fd0b74Schristos -1, "bret", "bret", 32,
68275fd0b74Schristos { 0|A(ALIAS)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
68375fd0b74Schristos },
68475fd0b74Schristos /* eret */
68575fd0b74Schristos {
68675fd0b74Schristos -1, "eret", "eret", 32,
68775fd0b74Schristos { 0|A(ALIAS)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
68875fd0b74Schristos },
68975fd0b74Schristos /* ret */
69075fd0b74Schristos {
69175fd0b74Schristos -1, "ret", "ret", 32,
69275fd0b74Schristos { 0|A(ALIAS)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } } } }
69375fd0b74Schristos },
69475fd0b74Schristos /* mv $r2,$r0 */
69575fd0b74Schristos {
69675fd0b74Schristos -1, "mv", "mv", 32,
69775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
69875fd0b74Schristos },
69975fd0b74Schristos /* mvi $r1,$imm */
70075fd0b74Schristos {
70175fd0b74Schristos -1, "mvi", "mvi", 32,
70275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
70375fd0b74Schristos },
70475fd0b74Schristos /* mvu $r1,$lo16 */
70575fd0b74Schristos {
70675fd0b74Schristos -1, "mvui", "mvu", 32,
70775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
70875fd0b74Schristos },
70975fd0b74Schristos /* mvhi $r1,$hi16 */
71075fd0b74Schristos {
71175fd0b74Schristos -1, "mvhi", "mvhi", 32,
71275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
71375fd0b74Schristos },
71475fd0b74Schristos /* mva $r1,$gp16 */
71575fd0b74Schristos {
71675fd0b74Schristos -1, "mva", "mva", 32,
71775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
71875fd0b74Schristos },
71975fd0b74Schristos /* not $r2,$r0 */
72075fd0b74Schristos {
72175fd0b74Schristos -1, "not", "not", 32,
72275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
72375fd0b74Schristos },
72475fd0b74Schristos /* nop */
72575fd0b74Schristos {
72675fd0b74Schristos -1, "nop", "nop", 32,
72775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
72875fd0b74Schristos },
72975fd0b74Schristos /* lb $r1,$gp16 */
73075fd0b74Schristos {
73175fd0b74Schristos -1, "lbgprel", "lb", 32,
73275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
73375fd0b74Schristos },
73475fd0b74Schristos /* lbu $r1,$gp16 */
73575fd0b74Schristos {
73675fd0b74Schristos -1, "lbugprel", "lbu", 32,
73775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
73875fd0b74Schristos },
73975fd0b74Schristos /* lh $r1,$gp16 */
74075fd0b74Schristos {
74175fd0b74Schristos -1, "lhgprel", "lh", 32,
74275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
74375fd0b74Schristos },
74475fd0b74Schristos /* lhu $r1,$gp16 */
74575fd0b74Schristos {
74675fd0b74Schristos -1, "lhugprel", "lhu", 32,
74775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
74875fd0b74Schristos },
74975fd0b74Schristos /* lw $r1,$gp16 */
75075fd0b74Schristos {
75175fd0b74Schristos -1, "lwgprel", "lw", 32,
75275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
75375fd0b74Schristos },
75475fd0b74Schristos /* sb $gp16,$r1 */
75575fd0b74Schristos {
75675fd0b74Schristos -1, "sbgprel", "sb", 32,
75775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
75875fd0b74Schristos },
75975fd0b74Schristos /* sh $gp16,$r1 */
76075fd0b74Schristos {
76175fd0b74Schristos -1, "shgprel", "sh", 32,
76275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
76375fd0b74Schristos },
76475fd0b74Schristos /* sw $gp16,$r1 */
76575fd0b74Schristos {
76675fd0b74Schristos -1, "swgprel", "sw", 32,
76775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
76875fd0b74Schristos },
76975fd0b74Schristos /* lw $r1,(gp+$got16) */
77075fd0b74Schristos {
77175fd0b74Schristos -1, "lwgotrel", "lw", 32,
77275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
77375fd0b74Schristos },
77475fd0b74Schristos /* orhi $r1,$r0,$gotoffhi16 */
77575fd0b74Schristos {
77675fd0b74Schristos -1, "orhigotoffi", "orhi", 32,
77775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
77875fd0b74Schristos },
77975fd0b74Schristos /* addi $r1,$r0,$gotofflo16 */
78075fd0b74Schristos {
78175fd0b74Schristos -1, "addgotoff", "addi", 32,
78275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
78375fd0b74Schristos },
78475fd0b74Schristos /* sw ($r0+$gotofflo16),$r1 */
78575fd0b74Schristos {
78675fd0b74Schristos -1, "swgotoff", "sw", 32,
78775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
78875fd0b74Schristos },
78975fd0b74Schristos /* lw $r1,($r0+$gotofflo16) */
79075fd0b74Schristos {
79175fd0b74Schristos -1, "lwgotoff", "lw", 32,
79275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
79375fd0b74Schristos },
79475fd0b74Schristos /* sh ($r0+$gotofflo16),$r1 */
79575fd0b74Schristos {
79675fd0b74Schristos -1, "shgotoff", "sh", 32,
79775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
79875fd0b74Schristos },
79975fd0b74Schristos /* lh $r1,($r0+$gotofflo16) */
80075fd0b74Schristos {
80175fd0b74Schristos -1, "lhgotoff", "lh", 32,
80275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
80375fd0b74Schristos },
80475fd0b74Schristos /* lhu $r1,($r0+$gotofflo16) */
80575fd0b74Schristos {
80675fd0b74Schristos -1, "lhugotoff", "lhu", 32,
80775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
80875fd0b74Schristos },
80975fd0b74Schristos /* sb ($r0+$gotofflo16),$r1 */
81075fd0b74Schristos {
81175fd0b74Schristos -1, "sbgotoff", "sb", 32,
81275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
81375fd0b74Schristos },
81475fd0b74Schristos /* lb $r1,($r0+$gotofflo16) */
81575fd0b74Schristos {
81675fd0b74Schristos -1, "lbgotoff", "lb", 32,
81775fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
81875fd0b74Schristos },
81975fd0b74Schristos /* lbu $r1,($r0+$gotofflo16) */
82075fd0b74Schristos {
82175fd0b74Schristos -1, "lbugotoff", "lbu", 32,
82275fd0b74Schristos { 0|A(ALIAS), { { { (1<<MACH_BASE), 0 } } } }
82375fd0b74Schristos },
82475fd0b74Schristos };
82575fd0b74Schristos
82675fd0b74Schristos #undef OP
82775fd0b74Schristos #undef A
82875fd0b74Schristos
82975fd0b74Schristos /* Initialize anything needed to be done once, before any cpu_open call. */
83075fd0b74Schristos
83175fd0b74Schristos static void
init_tables(void)83275fd0b74Schristos init_tables (void)
83375fd0b74Schristos {
83475fd0b74Schristos }
83575fd0b74Schristos
836ede78133Schristos #ifndef opcodes_error_handler
837ede78133Schristos #define opcodes_error_handler(...) \
838ede78133Schristos fprintf (stderr, __VA_ARGS__); fputc ('\n', stderr)
839ede78133Schristos #endif
840ede78133Schristos
84175fd0b74Schristos static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
84275fd0b74Schristos static void build_hw_table (CGEN_CPU_TABLE *);
84375fd0b74Schristos static void build_ifield_table (CGEN_CPU_TABLE *);
84475fd0b74Schristos static void build_operand_table (CGEN_CPU_TABLE *);
84575fd0b74Schristos static void build_insn_table (CGEN_CPU_TABLE *);
84675fd0b74Schristos static void lm32_cgen_rebuild_tables (CGEN_CPU_TABLE *);
84775fd0b74Schristos
84875fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to look up a mach via its bfd name. */
84975fd0b74Schristos
85075fd0b74Schristos static const CGEN_MACH *
lookup_mach_via_bfd_name(const CGEN_MACH * table,const char * name)85175fd0b74Schristos lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
85275fd0b74Schristos {
85375fd0b74Schristos while (table->name)
85475fd0b74Schristos {
85575fd0b74Schristos if (strcmp (name, table->bfd_name) == 0)
85675fd0b74Schristos return table;
85775fd0b74Schristos ++table;
85875fd0b74Schristos }
859ede78133Schristos return NULL;
86075fd0b74Schristos }
86175fd0b74Schristos
86275fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to build the hardware table. */
86375fd0b74Schristos
86475fd0b74Schristos static void
build_hw_table(CGEN_CPU_TABLE * cd)86575fd0b74Schristos build_hw_table (CGEN_CPU_TABLE *cd)
86675fd0b74Schristos {
86775fd0b74Schristos int i;
86875fd0b74Schristos int machs = cd->machs;
86975fd0b74Schristos const CGEN_HW_ENTRY *init = & lm32_cgen_hw_table[0];
87075fd0b74Schristos /* MAX_HW is only an upper bound on the number of selected entries.
87175fd0b74Schristos However each entry is indexed by it's enum so there can be holes in
87275fd0b74Schristos the table. */
87375fd0b74Schristos const CGEN_HW_ENTRY **selected =
87475fd0b74Schristos (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
87575fd0b74Schristos
87675fd0b74Schristos cd->hw_table.init_entries = init;
87775fd0b74Schristos cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
87875fd0b74Schristos memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
87975fd0b74Schristos /* ??? For now we just use machs to determine which ones we want. */
88075fd0b74Schristos for (i = 0; init[i].name != NULL; ++i)
88175fd0b74Schristos if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
88275fd0b74Schristos & machs)
88375fd0b74Schristos selected[init[i].type] = &init[i];
88475fd0b74Schristos cd->hw_table.entries = selected;
88575fd0b74Schristos cd->hw_table.num_entries = MAX_HW;
88675fd0b74Schristos }
88775fd0b74Schristos
88875fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to build the hardware table. */
88975fd0b74Schristos
89075fd0b74Schristos static void
build_ifield_table(CGEN_CPU_TABLE * cd)89175fd0b74Schristos build_ifield_table (CGEN_CPU_TABLE *cd)
89275fd0b74Schristos {
89375fd0b74Schristos cd->ifld_table = & lm32_cgen_ifld_table[0];
89475fd0b74Schristos }
89575fd0b74Schristos
89675fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to build the hardware table. */
89775fd0b74Schristos
89875fd0b74Schristos static void
build_operand_table(CGEN_CPU_TABLE * cd)89975fd0b74Schristos build_operand_table (CGEN_CPU_TABLE *cd)
90075fd0b74Schristos {
90175fd0b74Schristos int i;
90275fd0b74Schristos int machs = cd->machs;
90375fd0b74Schristos const CGEN_OPERAND *init = & lm32_cgen_operand_table[0];
90475fd0b74Schristos /* MAX_OPERANDS is only an upper bound on the number of selected entries.
90575fd0b74Schristos However each entry is indexed by it's enum so there can be holes in
90675fd0b74Schristos the table. */
90775fd0b74Schristos const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
90875fd0b74Schristos
90975fd0b74Schristos cd->operand_table.init_entries = init;
91075fd0b74Schristos cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
91175fd0b74Schristos memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
91275fd0b74Schristos /* ??? For now we just use mach to determine which ones we want. */
91375fd0b74Schristos for (i = 0; init[i].name != NULL; ++i)
91475fd0b74Schristos if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
91575fd0b74Schristos & machs)
91675fd0b74Schristos selected[init[i].type] = &init[i];
91775fd0b74Schristos cd->operand_table.entries = selected;
91875fd0b74Schristos cd->operand_table.num_entries = MAX_OPERANDS;
91975fd0b74Schristos }
92075fd0b74Schristos
92175fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to build the hardware table.
92275fd0b74Schristos ??? This could leave out insns not supported by the specified mach/isa,
92375fd0b74Schristos but that would cause errors like "foo only supported by bar" to become
92475fd0b74Schristos "unknown insn", so for now we include all insns and require the app to
92575fd0b74Schristos do the checking later.
92675fd0b74Schristos ??? On the other hand, parsing of such insns may require their hardware or
92775fd0b74Schristos operand elements to be in the table [which they mightn't be]. */
92875fd0b74Schristos
92975fd0b74Schristos static void
build_insn_table(CGEN_CPU_TABLE * cd)93075fd0b74Schristos build_insn_table (CGEN_CPU_TABLE *cd)
93175fd0b74Schristos {
93275fd0b74Schristos int i;
93375fd0b74Schristos const CGEN_IBASE *ib = & lm32_cgen_insn_table[0];
93475fd0b74Schristos CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
93575fd0b74Schristos
93675fd0b74Schristos memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
93775fd0b74Schristos for (i = 0; i < MAX_INSNS; ++i)
93875fd0b74Schristos insns[i].base = &ib[i];
93975fd0b74Schristos cd->insn_table.init_entries = insns;
94075fd0b74Schristos cd->insn_table.entry_size = sizeof (CGEN_IBASE);
94175fd0b74Schristos cd->insn_table.num_init_entries = MAX_INSNS;
94275fd0b74Schristos }
94375fd0b74Schristos
94475fd0b74Schristos /* Subroutine of lm32_cgen_cpu_open to rebuild the tables. */
94575fd0b74Schristos
94675fd0b74Schristos static void
lm32_cgen_rebuild_tables(CGEN_CPU_TABLE * cd)94775fd0b74Schristos lm32_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
94875fd0b74Schristos {
94975fd0b74Schristos int i;
95075fd0b74Schristos CGEN_BITSET *isas = cd->isas;
95175fd0b74Schristos unsigned int machs = cd->machs;
95275fd0b74Schristos
95375fd0b74Schristos cd->int_insn_p = CGEN_INT_INSN_P;
95475fd0b74Schristos
95575fd0b74Schristos /* Data derived from the isa spec. */
95675fd0b74Schristos #define UNSET (CGEN_SIZE_UNKNOWN + 1)
95775fd0b74Schristos cd->default_insn_bitsize = UNSET;
95875fd0b74Schristos cd->base_insn_bitsize = UNSET;
95975fd0b74Schristos cd->min_insn_bitsize = 65535; /* Some ridiculously big number. */
96075fd0b74Schristos cd->max_insn_bitsize = 0;
96175fd0b74Schristos for (i = 0; i < MAX_ISAS; ++i)
96275fd0b74Schristos if (cgen_bitset_contains (isas, i))
96375fd0b74Schristos {
96475fd0b74Schristos const CGEN_ISA *isa = & lm32_cgen_isa_table[i];
96575fd0b74Schristos
96675fd0b74Schristos /* Default insn sizes of all selected isas must be
96775fd0b74Schristos equal or we set the result to 0, meaning "unknown". */
96875fd0b74Schristos if (cd->default_insn_bitsize == UNSET)
96975fd0b74Schristos cd->default_insn_bitsize = isa->default_insn_bitsize;
97075fd0b74Schristos else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
97175fd0b74Schristos ; /* This is ok. */
97275fd0b74Schristos else
97375fd0b74Schristos cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
97475fd0b74Schristos
97575fd0b74Schristos /* Base insn sizes of all selected isas must be equal
97675fd0b74Schristos or we set the result to 0, meaning "unknown". */
97775fd0b74Schristos if (cd->base_insn_bitsize == UNSET)
97875fd0b74Schristos cd->base_insn_bitsize = isa->base_insn_bitsize;
97975fd0b74Schristos else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
98075fd0b74Schristos ; /* This is ok. */
98175fd0b74Schristos else
98275fd0b74Schristos cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
98375fd0b74Schristos
98475fd0b74Schristos /* Set min,max insn sizes. */
98575fd0b74Schristos if (isa->min_insn_bitsize < cd->min_insn_bitsize)
98675fd0b74Schristos cd->min_insn_bitsize = isa->min_insn_bitsize;
98775fd0b74Schristos if (isa->max_insn_bitsize > cd->max_insn_bitsize)
98875fd0b74Schristos cd->max_insn_bitsize = isa->max_insn_bitsize;
98975fd0b74Schristos }
99075fd0b74Schristos
99175fd0b74Schristos /* Data derived from the mach spec. */
99275fd0b74Schristos for (i = 0; i < MAX_MACHS; ++i)
99375fd0b74Schristos if (((1 << i) & machs) != 0)
99475fd0b74Schristos {
99575fd0b74Schristos const CGEN_MACH *mach = & lm32_cgen_mach_table[i];
99675fd0b74Schristos
99775fd0b74Schristos if (mach->insn_chunk_bitsize != 0)
99875fd0b74Schristos {
99975fd0b74Schristos if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
100075fd0b74Schristos {
1001ede78133Schristos opcodes_error_handler
1002ede78133Schristos (/* xgettext:c-format */
1003ede78133Schristos _("internal error: lm32_cgen_rebuild_tables: "
1004ede78133Schristos "conflicting insn-chunk-bitsize values: `%d' vs. `%d'"),
100575fd0b74Schristos cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
100675fd0b74Schristos abort ();
100775fd0b74Schristos }
100875fd0b74Schristos
100975fd0b74Schristos cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
101075fd0b74Schristos }
101175fd0b74Schristos }
101275fd0b74Schristos
101375fd0b74Schristos /* Determine which hw elements are used by MACH. */
101475fd0b74Schristos build_hw_table (cd);
101575fd0b74Schristos
101675fd0b74Schristos /* Build the ifield table. */
101775fd0b74Schristos build_ifield_table (cd);
101875fd0b74Schristos
101975fd0b74Schristos /* Determine which operands are used by MACH/ISA. */
102075fd0b74Schristos build_operand_table (cd);
102175fd0b74Schristos
102275fd0b74Schristos /* Build the instruction table. */
102375fd0b74Schristos build_insn_table (cd);
102475fd0b74Schristos }
102575fd0b74Schristos
102675fd0b74Schristos /* Initialize a cpu table and return a descriptor.
102775fd0b74Schristos It's much like opening a file, and must be the first function called.
102875fd0b74Schristos The arguments are a set of (type/value) pairs, terminated with
102975fd0b74Schristos CGEN_CPU_OPEN_END.
103075fd0b74Schristos
103175fd0b74Schristos Currently supported values:
103275fd0b74Schristos CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr
103375fd0b74Schristos CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr
103475fd0b74Schristos CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
103575fd0b74Schristos CGEN_CPU_OPEN_ENDIAN: specify endian choice
1036*e992f068Schristos CGEN_CPU_OPEN_INSN_ENDIAN: specify instruction endian choice
103775fd0b74Schristos CGEN_CPU_OPEN_END: terminates arguments
103875fd0b74Schristos
103975fd0b74Schristos ??? Simultaneous multiple isas might not make sense, but it's not (yet)
104075fd0b74Schristos precluded. */
104175fd0b74Schristos
104275fd0b74Schristos CGEN_CPU_DESC
lm32_cgen_cpu_open(enum cgen_cpu_open_arg arg_type,...)104375fd0b74Schristos lm32_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
104475fd0b74Schristos {
104575fd0b74Schristos CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
104675fd0b74Schristos static int init_p;
104775fd0b74Schristos CGEN_BITSET *isas = 0; /* 0 = "unspecified" */
104875fd0b74Schristos unsigned int machs = 0; /* 0 = "unspecified" */
104975fd0b74Schristos enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
1050*e992f068Schristos enum cgen_endian insn_endian = CGEN_ENDIAN_UNKNOWN;
105175fd0b74Schristos va_list ap;
105275fd0b74Schristos
105375fd0b74Schristos if (! init_p)
105475fd0b74Schristos {
105575fd0b74Schristos init_tables ();
105675fd0b74Schristos init_p = 1;
105775fd0b74Schristos }
105875fd0b74Schristos
105975fd0b74Schristos memset (cd, 0, sizeof (*cd));
106075fd0b74Schristos
106175fd0b74Schristos va_start (ap, arg_type);
106275fd0b74Schristos while (arg_type != CGEN_CPU_OPEN_END)
106375fd0b74Schristos {
106475fd0b74Schristos switch (arg_type)
106575fd0b74Schristos {
106675fd0b74Schristos case CGEN_CPU_OPEN_ISAS :
106775fd0b74Schristos isas = va_arg (ap, CGEN_BITSET *);
106875fd0b74Schristos break;
106975fd0b74Schristos case CGEN_CPU_OPEN_MACHS :
107075fd0b74Schristos machs = va_arg (ap, unsigned int);
107175fd0b74Schristos break;
107275fd0b74Schristos case CGEN_CPU_OPEN_BFDMACH :
107375fd0b74Schristos {
107475fd0b74Schristos const char *name = va_arg (ap, const char *);
107575fd0b74Schristos const CGEN_MACH *mach =
107675fd0b74Schristos lookup_mach_via_bfd_name (lm32_cgen_mach_table, name);
107775fd0b74Schristos
1078ede78133Schristos if (mach != NULL)
107975fd0b74Schristos machs |= 1 << mach->num;
108075fd0b74Schristos break;
108175fd0b74Schristos }
108275fd0b74Schristos case CGEN_CPU_OPEN_ENDIAN :
108375fd0b74Schristos endian = va_arg (ap, enum cgen_endian);
108475fd0b74Schristos break;
1085*e992f068Schristos case CGEN_CPU_OPEN_INSN_ENDIAN :
1086*e992f068Schristos insn_endian = va_arg (ap, enum cgen_endian);
1087*e992f068Schristos break;
108875fd0b74Schristos default :
1089ede78133Schristos opcodes_error_handler
1090ede78133Schristos (/* xgettext:c-format */
1091ede78133Schristos _("internal error: lm32_cgen_cpu_open: "
1092ede78133Schristos "unsupported argument `%d'"),
109375fd0b74Schristos arg_type);
109475fd0b74Schristos abort (); /* ??? return NULL? */
109575fd0b74Schristos }
109675fd0b74Schristos arg_type = va_arg (ap, enum cgen_cpu_open_arg);
109775fd0b74Schristos }
109875fd0b74Schristos va_end (ap);
109975fd0b74Schristos
110075fd0b74Schristos /* Mach unspecified means "all". */
110175fd0b74Schristos if (machs == 0)
110275fd0b74Schristos machs = (1 << MAX_MACHS) - 1;
110375fd0b74Schristos /* Base mach is always selected. */
110475fd0b74Schristos machs |= 1;
110575fd0b74Schristos if (endian == CGEN_ENDIAN_UNKNOWN)
110675fd0b74Schristos {
110775fd0b74Schristos /* ??? If target has only one, could have a default. */
1108ede78133Schristos opcodes_error_handler
1109ede78133Schristos (/* xgettext:c-format */
1110ede78133Schristos _("internal error: lm32_cgen_cpu_open: no endianness specified"));
111175fd0b74Schristos abort ();
111275fd0b74Schristos }
111375fd0b74Schristos
111475fd0b74Schristos cd->isas = cgen_bitset_copy (isas);
111575fd0b74Schristos cd->machs = machs;
111675fd0b74Schristos cd->endian = endian;
1117*e992f068Schristos cd->insn_endian
1118*e992f068Schristos = (insn_endian == CGEN_ENDIAN_UNKNOWN ? endian : insn_endian);
111975fd0b74Schristos
112075fd0b74Schristos /* Table (re)builder. */
112175fd0b74Schristos cd->rebuild_tables = lm32_cgen_rebuild_tables;
112275fd0b74Schristos lm32_cgen_rebuild_tables (cd);
112375fd0b74Schristos
112475fd0b74Schristos /* Default to not allowing signed overflow. */
112575fd0b74Schristos cd->signed_overflow_ok_p = 0;
112675fd0b74Schristos
112775fd0b74Schristos return (CGEN_CPU_DESC) cd;
112875fd0b74Schristos }
112975fd0b74Schristos
113075fd0b74Schristos /* Cover fn to lm32_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
113175fd0b74Schristos MACH_NAME is the bfd name of the mach. */
113275fd0b74Schristos
113375fd0b74Schristos CGEN_CPU_DESC
lm32_cgen_cpu_open_1(const char * mach_name,enum cgen_endian endian)113475fd0b74Schristos lm32_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
113575fd0b74Schristos {
113675fd0b74Schristos return lm32_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
113775fd0b74Schristos CGEN_CPU_OPEN_ENDIAN, endian,
113875fd0b74Schristos CGEN_CPU_OPEN_END);
113975fd0b74Schristos }
114075fd0b74Schristos
114175fd0b74Schristos /* Close a cpu table.
114275fd0b74Schristos ??? This can live in a machine independent file, but there's currently
114375fd0b74Schristos no place to put this file (there's no libcgen). libopcodes is the wrong
114475fd0b74Schristos place as some simulator ports use this but they don't use libopcodes. */
114575fd0b74Schristos
114675fd0b74Schristos void
lm32_cgen_cpu_close(CGEN_CPU_DESC cd)114775fd0b74Schristos lm32_cgen_cpu_close (CGEN_CPU_DESC cd)
114875fd0b74Schristos {
114975fd0b74Schristos unsigned int i;
115075fd0b74Schristos const CGEN_INSN *insns;
115175fd0b74Schristos
115275fd0b74Schristos if (cd->macro_insn_table.init_entries)
115375fd0b74Schristos {
115475fd0b74Schristos insns = cd->macro_insn_table.init_entries;
115575fd0b74Schristos for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
115675fd0b74Schristos if (CGEN_INSN_RX ((insns)))
115775fd0b74Schristos regfree (CGEN_INSN_RX (insns));
115875fd0b74Schristos }
115975fd0b74Schristos
116075fd0b74Schristos if (cd->insn_table.init_entries)
116175fd0b74Schristos {
116275fd0b74Schristos insns = cd->insn_table.init_entries;
116375fd0b74Schristos for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
116475fd0b74Schristos if (CGEN_INSN_RX (insns))
116575fd0b74Schristos regfree (CGEN_INSN_RX (insns));
116675fd0b74Schristos }
116775fd0b74Schristos
116875fd0b74Schristos free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
116975fd0b74Schristos free ((CGEN_INSN *) cd->insn_table.init_entries);
117075fd0b74Schristos free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
117175fd0b74Schristos free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
117275fd0b74Schristos free (cd);
117375fd0b74Schristos }
117475fd0b74Schristos
1175