123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- /* CPU family header for lm32bf.
- THIS FILE IS MACHINE GENERATED WITH CGEN.
- Copyright 1996-2015 Free Software Foundation, Inc.
- This file is part of the GNU simulators.
- This file is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- It is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- License for more details.
- You should have received a copy of the GNU General Public License along
- with this program; if not, see <http://www.gnu.org/licenses/>.
- */
- #ifndef CPU_LM32BF_H
- #define CPU_LM32BF_H
- /* Maximum number of instructions that are fetched at a time.
- This is for LIW type instructions sets (e.g. m32r). */
- #define MAX_LIW_INSNS 1
- /* Maximum number of instructions that can be executed in parallel. */
- #define MAX_PARALLEL_INSNS 1
- /* The size of an "int" needed to hold an instruction word.
- This is usually 32 bits, but some architectures needs 64 bits. */
- typedef CGEN_INSN_INT CGEN_INSN_WORD;
- #include "cgen-engine.h"
- /* CPU state information. */
- typedef struct {
- /* Hardware elements. */
- struct {
- /* Program counter */
- USI h_pc;
- #define GET_H_PC() CPU (h_pc)
- #define SET_H_PC(x) (CPU (h_pc) = (x))
- /* General purpose registers */
- SI h_gr[32];
- #define GET_H_GR(a1) CPU (h_gr)[a1]
- #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
- /* Control and status registers */
- SI h_csr[32];
- #define GET_H_CSR(a1) CPU (h_csr)[a1]
- #define SET_H_CSR(a1, x) (CPU (h_csr)[a1] = (x))
- } hardware;
- #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
- } LM32BF_CPU_DATA;
- /* Cover fns for register access. */
- USI lm32bf_h_pc_get (SIM_CPU *);
- void lm32bf_h_pc_set (SIM_CPU *, USI);
- SI lm32bf_h_gr_get (SIM_CPU *, UINT);
- void lm32bf_h_gr_set (SIM_CPU *, UINT, SI);
- SI lm32bf_h_csr_get (SIM_CPU *, UINT);
- void lm32bf_h_csr_set (SIM_CPU *, UINT, SI);
- /* These must be hand-written. */
- extern CPUREG_FETCH_FN lm32bf_fetch_register;
- extern CPUREG_STORE_FN lm32bf_store_register;
- typedef struct {
- int empty;
- } MODEL_LM32_DATA;
- /* Instruction argument buffer. */
- union sem_fields {
- struct { /* no operands */
- int empty;
- } sfmt_empty;
- struct { /* */
- IADDR i_call;
- } sfmt_bi;
- struct { /* */
- UINT f_csr;
- UINT f_r1;
- } sfmt_wcsr;
- struct { /* */
- UINT f_csr;
- UINT f_r2;
- } sfmt_rcsr;
- struct { /* */
- IADDR i_branch;
- UINT f_r0;
- UINT f_r1;
- } sfmt_be;
- struct { /* */
- UINT f_r0;
- UINT f_r1;
- UINT f_uimm;
- } sfmt_andi;
- struct { /* */
- INT f_imm;
- UINT f_r0;
- UINT f_r1;
- } sfmt_addi;
- struct { /* */
- UINT f_r0;
- UINT f_r1;
- UINT f_r2;
- UINT f_user;
- } sfmt_user;
- #if WITH_SCACHE_PBB
- /* Writeback handler. */
- struct {
- /* Pointer to argbuf entry for insn whose results need writing back. */
- const struct argbuf *abuf;
- } write;
- /* x-before handler */
- struct {
- /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
- int first_p;
- } before;
- /* x-after handler */
- struct {
- int empty;
- } after;
- /* This entry is used to terminate each pbb. */
- struct {
- /* Number of insns in pbb. */
- int insn_count;
- /* Next pbb to execute. */
- SCACHE *next;
- SCACHE *branch_target;
- } chain;
- #endif
- };
- /* The ARGBUF struct. */
- struct argbuf {
- /* These are the baseclass definitions. */
- IADDR addr;
- const IDESC *idesc;
- char trace_p;
- char profile_p;
- /* ??? Temporary hack for skip insns. */
- char skip_count;
- char unused;
- /* cpu specific data follows */
- union sem semantic;
- int written;
- union sem_fields fields;
- };
- /* A cached insn.
- ??? SCACHE used to contain more than just argbuf. We could delete the
- type entirely and always just use ARGBUF, but for future concerns and as
- a level of abstraction it is left in. */
- struct scache {
- struct argbuf argbuf;
- };
- /* Macros to simplify extraction, reading and semantic code.
- These define and assign the local vars that contain the insn's fields. */
- #define EXTRACT_IFMT_EMPTY_VARS \
- unsigned int length;
- #define EXTRACT_IFMT_EMPTY_CODE \
- length = 0; \
- #define EXTRACT_IFMT_ADD_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_resv0; \
- unsigned int length;
- #define EXTRACT_IFMT_ADD_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_ADDI_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- INT f_imm; \
- unsigned int length;
- #define EXTRACT_IFMT_ADDI_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); \
- #define EXTRACT_IFMT_ANDI_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_uimm; \
- unsigned int length;
- #define EXTRACT_IFMT_ANDI_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
- #define EXTRACT_IFMT_ANDHII_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_uimm; \
- unsigned int length;
- #define EXTRACT_IFMT_ANDHII_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
- #define EXTRACT_IFMT_B_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_resv0; \
- unsigned int length;
- #define EXTRACT_IFMT_B_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_BI_VARS \
- UINT f_opcode; \
- SI f_call; \
- unsigned int length;
- #define EXTRACT_IFMT_BI_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4)))); \
- #define EXTRACT_IFMT_BE_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- SI f_branch; \
- unsigned int length;
- #define EXTRACT_IFMT_BE_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_branch = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (16))) >> (14)))); \
- #define EXTRACT_IFMT_ORI_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_uimm; \
- unsigned int length;
- #define EXTRACT_IFMT_ORI_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
- #define EXTRACT_IFMT_RCSR_VARS \
- UINT f_opcode; \
- UINT f_csr; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_resv0; \
- unsigned int length;
- #define EXTRACT_IFMT_RCSR_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_SEXTB_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_resv0; \
- unsigned int length;
- #define EXTRACT_IFMT_SEXTB_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_USER_VARS \
- UINT f_opcode; \
- UINT f_r0; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_user; \
- unsigned int length;
- #define EXTRACT_IFMT_USER_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_user = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_WCSR_VARS \
- UINT f_opcode; \
- UINT f_csr; \
- UINT f_r1; \
- UINT f_r2; \
- UINT f_resv0; \
- unsigned int length;
- #define EXTRACT_IFMT_WCSR_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
- f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
- f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
- f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
- #define EXTRACT_IFMT_BREAK_VARS \
- UINT f_opcode; \
- UINT f_exception; \
- unsigned int length;
- #define EXTRACT_IFMT_BREAK_CODE \
- length = 4; \
- f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
- f_exception = EXTRACT_LSB0_UINT (insn, 32, 25, 26); \
- /* Collection of various things for the trace handler to use. */
- typedef struct trace_record {
- IADDR pc;
- /* FIXME:wip */
- } TRACE_RECORD;
- #endif /* CPU_LM32BF_H */
|