xref: /netbsd-src/external/gpl3/gdb/dist/sim/lm32/cpu.h (revision 88241920d21b339bf319c0e979ffda80c49a2936)
14e98e3e1Schristos /* CPU family header for lm32bf.
24e98e3e1Schristos 
34e98e3e1Schristos THIS FILE IS MACHINE GENERATED WITH CGEN.
44e98e3e1Schristos 
5*88241920Schristos Copyright (C) 1996-2024 Free Software Foundation, Inc.
64e98e3e1Schristos 
74e98e3e1Schristos This file is part of the GNU simulators.
84e98e3e1Schristos 
94e98e3e1Schristos    This file is free software; you can redistribute it and/or modify
104e98e3e1Schristos    it under the terms of the GNU General Public License as published by
114e98e3e1Schristos    the Free Software Foundation; either version 3, or (at your option)
124e98e3e1Schristos    any later version.
134e98e3e1Schristos 
144e98e3e1Schristos    It is distributed in the hope that it will be useful, but WITHOUT
154e98e3e1Schristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
164e98e3e1Schristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
174e98e3e1Schristos    License for more details.
184e98e3e1Schristos 
194e98e3e1Schristos    You should have received a copy of the GNU General Public License along
20*88241920Schristos    with this program; if not, write to the Free Software Foundation, Inc.,
21*88241920Schristos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
224e98e3e1Schristos 
234e98e3e1Schristos */
244e98e3e1Schristos 
254e98e3e1Schristos #ifndef CPU_LM32BF_H
264e98e3e1Schristos #define CPU_LM32BF_H
274e98e3e1Schristos 
284e98e3e1Schristos /* Maximum number of instructions that are fetched at a time.
294e98e3e1Schristos    This is for LIW type instructions sets (e.g. m32r).  */
304e98e3e1Schristos #define MAX_LIW_INSNS 1
314e98e3e1Schristos 
324e98e3e1Schristos /* Maximum number of instructions that can be executed in parallel.  */
334e98e3e1Schristos #define MAX_PARALLEL_INSNS 1
344e98e3e1Schristos 
354e98e3e1Schristos /* The size of an "int" needed to hold an instruction word.
364e98e3e1Schristos    This is usually 32 bits, but some architectures needs 64 bits.  */
374e98e3e1Schristos typedef CGEN_INSN_INT CGEN_INSN_WORD;
384e98e3e1Schristos 
394e98e3e1Schristos #include "cgen-engine.h"
404e98e3e1Schristos 
414e98e3e1Schristos /* CPU state information.  */
424e98e3e1Schristos typedef struct {
434e98e3e1Schristos   /* Hardware elements.  */
444e98e3e1Schristos   struct {
454e98e3e1Schristos   /* Program counter */
464e98e3e1Schristos   USI h_pc;
474e98e3e1Schristos #define GET_H_PC() CPU (h_pc)
484e98e3e1Schristos #define SET_H_PC(x) (CPU (h_pc) = (x))
494e98e3e1Schristos   /* General purpose registers */
504e98e3e1Schristos   SI h_gr[32];
514e98e3e1Schristos #define GET_H_GR(a1) CPU (h_gr)[a1]
524e98e3e1Schristos #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
534e98e3e1Schristos   /* Control and status registers */
544e98e3e1Schristos   SI h_csr[32];
554e98e3e1Schristos #define GET_H_CSR(a1) CPU (h_csr)[a1]
564e98e3e1Schristos #define SET_H_CSR(a1, x) (CPU (h_csr)[a1] = (x))
574e98e3e1Schristos   } hardware;
58*88241920Schristos #define CPU_CGEN_HW(cpu) (& LM32_SIM_CPU (cpu)->cpu_data.hardware)
594e98e3e1Schristos } LM32BF_CPU_DATA;
604e98e3e1Schristos 
614e98e3e1Schristos /* Cover fns for register access.  */
624e98e3e1Schristos USI lm32bf_h_pc_get (SIM_CPU *);
634e98e3e1Schristos void lm32bf_h_pc_set (SIM_CPU *, USI);
644e98e3e1Schristos SI lm32bf_h_gr_get (SIM_CPU *, UINT);
654e98e3e1Schristos void lm32bf_h_gr_set (SIM_CPU *, UINT, SI);
664e98e3e1Schristos SI lm32bf_h_csr_get (SIM_CPU *, UINT);
674e98e3e1Schristos void lm32bf_h_csr_set (SIM_CPU *, UINT, SI);
684e98e3e1Schristos 
694e98e3e1Schristos /* These must be hand-written.  */
704e98e3e1Schristos extern CPUREG_FETCH_FN lm32bf_fetch_register;
714e98e3e1Schristos extern CPUREG_STORE_FN lm32bf_store_register;
724e98e3e1Schristos 
734e98e3e1Schristos typedef struct {
744e98e3e1Schristos   int empty;
754e98e3e1Schristos } MODEL_LM32_DATA;
764e98e3e1Schristos 
774e98e3e1Schristos /* Instruction argument buffer.  */
784e98e3e1Schristos 
794e98e3e1Schristos union sem_fields {
804e98e3e1Schristos   struct { /* no operands */
814e98e3e1Schristos     int empty;
824e98e3e1Schristos   } sfmt_empty;
834e98e3e1Schristos   struct { /*  */
844e98e3e1Schristos     IADDR i_call;
854e98e3e1Schristos   } sfmt_bi;
864e98e3e1Schristos   struct { /*  */
874e98e3e1Schristos     UINT f_csr;
884e98e3e1Schristos     UINT f_r1;
894e98e3e1Schristos   } sfmt_wcsr;
904e98e3e1Schristos   struct { /*  */
914e98e3e1Schristos     UINT f_csr;
924e98e3e1Schristos     UINT f_r2;
934e98e3e1Schristos   } sfmt_rcsr;
944e98e3e1Schristos   struct { /*  */
954e98e3e1Schristos     IADDR i_branch;
964e98e3e1Schristos     UINT f_r0;
974e98e3e1Schristos     UINT f_r1;
984e98e3e1Schristos   } sfmt_be;
994e98e3e1Schristos   struct { /*  */
1004e98e3e1Schristos     UINT f_r0;
1014e98e3e1Schristos     UINT f_r1;
1024e98e3e1Schristos     UINT f_uimm;
1034e98e3e1Schristos   } sfmt_andi;
1044e98e3e1Schristos   struct { /*  */
1054e98e3e1Schristos     INT f_imm;
1064e98e3e1Schristos     UINT f_r0;
1074e98e3e1Schristos     UINT f_r1;
1084e98e3e1Schristos   } sfmt_addi;
1094e98e3e1Schristos   struct { /*  */
1104e98e3e1Schristos     UINT f_r0;
1114e98e3e1Schristos     UINT f_r1;
1124e98e3e1Schristos     UINT f_r2;
1134e98e3e1Schristos     UINT f_user;
1144e98e3e1Schristos   } sfmt_user;
1154e98e3e1Schristos #if WITH_SCACHE_PBB
1164e98e3e1Schristos   /* Writeback handler.  */
1174e98e3e1Schristos   struct {
1184e98e3e1Schristos     /* Pointer to argbuf entry for insn whose results need writing back.  */
1194e98e3e1Schristos     const struct argbuf *abuf;
1204e98e3e1Schristos   } write;
1214e98e3e1Schristos   /* x-before handler */
1224e98e3e1Schristos   struct {
1234e98e3e1Schristos     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
1244e98e3e1Schristos     int first_p;
1254e98e3e1Schristos   } before;
1264e98e3e1Schristos   /* x-after handler */
1274e98e3e1Schristos   struct {
1284e98e3e1Schristos     int empty;
1294e98e3e1Schristos   } after;
1304e98e3e1Schristos   /* This entry is used to terminate each pbb.  */
1314e98e3e1Schristos   struct {
1324e98e3e1Schristos     /* Number of insns in pbb.  */
1334e98e3e1Schristos     int insn_count;
1344e98e3e1Schristos     /* Next pbb to execute.  */
1354e98e3e1Schristos     SCACHE *next;
1364e98e3e1Schristos     SCACHE *branch_target;
1374e98e3e1Schristos   } chain;
1384e98e3e1Schristos #endif
1394e98e3e1Schristos };
1404e98e3e1Schristos 
1414e98e3e1Schristos /* The ARGBUF struct.  */
1424e98e3e1Schristos struct argbuf {
1434e98e3e1Schristos   /* These are the baseclass definitions.  */
1444e98e3e1Schristos   IADDR addr;
1454e98e3e1Schristos   const IDESC *idesc;
1464e98e3e1Schristos   char trace_p;
1474e98e3e1Schristos   char profile_p;
1484e98e3e1Schristos   /* ??? Temporary hack for skip insns.  */
1494e98e3e1Schristos   char skip_count;
1504e98e3e1Schristos   char unused;
1514e98e3e1Schristos   /* cpu specific data follows */
1524e98e3e1Schristos   union sem semantic;
1534e98e3e1Schristos   int written;
1544e98e3e1Schristos   union sem_fields fields;
1554e98e3e1Schristos };
1564e98e3e1Schristos 
1574e98e3e1Schristos /* A cached insn.
1584e98e3e1Schristos 
1594e98e3e1Schristos    ??? SCACHE used to contain more than just argbuf.  We could delete the
1604e98e3e1Schristos    type entirely and always just use ARGBUF, but for future concerns and as
1614e98e3e1Schristos    a level of abstraction it is left in.  */
1624e98e3e1Schristos 
1634e98e3e1Schristos struct scache {
1644e98e3e1Schristos   struct argbuf argbuf;
1654e98e3e1Schristos };
1664e98e3e1Schristos 
1674e98e3e1Schristos /* Macros to simplify extraction, reading and semantic code.
1684e98e3e1Schristos    These define and assign the local vars that contain the insn's fields.  */
1694e98e3e1Schristos 
1704e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_VARS \
1714e98e3e1Schristos   unsigned int length;
1724e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_CODE \
1734e98e3e1Schristos   length = 0; \
1744e98e3e1Schristos 
1754e98e3e1Schristos #define EXTRACT_IFMT_ADD_VARS \
1764e98e3e1Schristos   UINT f_opcode; \
1774e98e3e1Schristos   UINT f_r0; \
1784e98e3e1Schristos   UINT f_r1; \
1794e98e3e1Schristos   UINT f_r2; \
1804e98e3e1Schristos   UINT f_resv0; \
1814e98e3e1Schristos   unsigned int length;
1824e98e3e1Schristos #define EXTRACT_IFMT_ADD_CODE \
1834e98e3e1Schristos   length = 4; \
1844e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
1854e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
1864e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
1874e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
1884e98e3e1Schristos   f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
1894e98e3e1Schristos 
1904e98e3e1Schristos #define EXTRACT_IFMT_ADDI_VARS \
1914e98e3e1Schristos   UINT f_opcode; \
1924e98e3e1Schristos   UINT f_r0; \
1934e98e3e1Schristos   UINT f_r1; \
1944e98e3e1Schristos   INT f_imm; \
1954e98e3e1Schristos   unsigned int length;
1964e98e3e1Schristos #define EXTRACT_IFMT_ADDI_CODE \
1974e98e3e1Schristos   length = 4; \
1984e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
1994e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2004e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2014e98e3e1Schristos   f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); \
2024e98e3e1Schristos 
2034e98e3e1Schristos #define EXTRACT_IFMT_ANDI_VARS \
2044e98e3e1Schristos   UINT f_opcode; \
2054e98e3e1Schristos   UINT f_r0; \
2064e98e3e1Schristos   UINT f_r1; \
2074e98e3e1Schristos   UINT f_uimm; \
2084e98e3e1Schristos   unsigned int length;
2094e98e3e1Schristos #define EXTRACT_IFMT_ANDI_CODE \
2104e98e3e1Schristos   length = 4; \
2114e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2124e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2134e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2144e98e3e1Schristos   f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
2154e98e3e1Schristos 
2164e98e3e1Schristos #define EXTRACT_IFMT_ANDHII_VARS \
2174e98e3e1Schristos   UINT f_opcode; \
2184e98e3e1Schristos   UINT f_r0; \
2194e98e3e1Schristos   UINT f_r1; \
2204e98e3e1Schristos   UINT f_uimm; \
2214e98e3e1Schristos   unsigned int length;
2224e98e3e1Schristos #define EXTRACT_IFMT_ANDHII_CODE \
2234e98e3e1Schristos   length = 4; \
2244e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2254e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2264e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2274e98e3e1Schristos   f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
2284e98e3e1Schristos 
2294e98e3e1Schristos #define EXTRACT_IFMT_B_VARS \
2304e98e3e1Schristos   UINT f_opcode; \
2314e98e3e1Schristos   UINT f_r0; \
2324e98e3e1Schristos   UINT f_r1; \
2334e98e3e1Schristos   UINT f_r2; \
2344e98e3e1Schristos   UINT f_resv0; \
2354e98e3e1Schristos   unsigned int length;
2364e98e3e1Schristos #define EXTRACT_IFMT_B_CODE \
2374e98e3e1Schristos   length = 4; \
2384e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2394e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2404e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2414e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
2424e98e3e1Schristos   f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
2434e98e3e1Schristos 
2444e98e3e1Schristos #define EXTRACT_IFMT_BI_VARS \
2454e98e3e1Schristos   UINT f_opcode; \
2464e98e3e1Schristos   SI f_call; \
2474e98e3e1Schristos   unsigned int length;
2484e98e3e1Schristos #define EXTRACT_IFMT_BI_CODE \
2494e98e3e1Schristos   length = 4; \
2504e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
251*88241920Schristos   f_call = ((pc) + (((((((((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) & (67108863))) << (2))) ^ (134217728))) - (134217728)))); \
2524e98e3e1Schristos 
2534e98e3e1Schristos #define EXTRACT_IFMT_BE_VARS \
2544e98e3e1Schristos   UINT f_opcode; \
2554e98e3e1Schristos   UINT f_r0; \
2564e98e3e1Schristos   UINT f_r1; \
2574e98e3e1Schristos   SI f_branch; \
2584e98e3e1Schristos   unsigned int length;
2594e98e3e1Schristos #define EXTRACT_IFMT_BE_CODE \
2604e98e3e1Schristos   length = 4; \
2614e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2624e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2634e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
264*88241920Schristos   f_branch = ((pc) + (((((((((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) & (65535))) << (2))) ^ (131072))) - (131072)))); \
2654e98e3e1Schristos 
2664e98e3e1Schristos #define EXTRACT_IFMT_ORI_VARS \
2674e98e3e1Schristos   UINT f_opcode; \
2684e98e3e1Schristos   UINT f_r0; \
2694e98e3e1Schristos   UINT f_r1; \
2704e98e3e1Schristos   UINT f_uimm; \
2714e98e3e1Schristos   unsigned int length;
2724e98e3e1Schristos #define EXTRACT_IFMT_ORI_CODE \
2734e98e3e1Schristos   length = 4; \
2744e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2754e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2764e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2774e98e3e1Schristos   f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
2784e98e3e1Schristos 
2794e98e3e1Schristos #define EXTRACT_IFMT_RCSR_VARS \
2804e98e3e1Schristos   UINT f_opcode; \
2814e98e3e1Schristos   UINT f_csr; \
2824e98e3e1Schristos   UINT f_r1; \
2834e98e3e1Schristos   UINT f_r2; \
2844e98e3e1Schristos   UINT f_resv0; \
2854e98e3e1Schristos   unsigned int length;
2864e98e3e1Schristos #define EXTRACT_IFMT_RCSR_CODE \
2874e98e3e1Schristos   length = 4; \
2884e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
2894e98e3e1Schristos   f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
2904e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
2914e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
2924e98e3e1Schristos   f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
2934e98e3e1Schristos 
2944e98e3e1Schristos #define EXTRACT_IFMT_SEXTB_VARS \
2954e98e3e1Schristos   UINT f_opcode; \
2964e98e3e1Schristos   UINT f_r0; \
2974e98e3e1Schristos   UINT f_r1; \
2984e98e3e1Schristos   UINT f_r2; \
2994e98e3e1Schristos   UINT f_resv0; \
3004e98e3e1Schristos   unsigned int length;
3014e98e3e1Schristos #define EXTRACT_IFMT_SEXTB_CODE \
3024e98e3e1Schristos   length = 4; \
3034e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
3044e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
3054e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
3064e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
3074e98e3e1Schristos   f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
3084e98e3e1Schristos 
3094e98e3e1Schristos #define EXTRACT_IFMT_USER_VARS \
3104e98e3e1Schristos   UINT f_opcode; \
3114e98e3e1Schristos   UINT f_r0; \
3124e98e3e1Schristos   UINT f_r1; \
3134e98e3e1Schristos   UINT f_r2; \
3144e98e3e1Schristos   UINT f_user; \
3154e98e3e1Schristos   unsigned int length;
3164e98e3e1Schristos #define EXTRACT_IFMT_USER_CODE \
3174e98e3e1Schristos   length = 4; \
3184e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
3194e98e3e1Schristos   f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
3204e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
3214e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
3224e98e3e1Schristos   f_user = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
3234e98e3e1Schristos 
3244e98e3e1Schristos #define EXTRACT_IFMT_WCSR_VARS \
3254e98e3e1Schristos   UINT f_opcode; \
3264e98e3e1Schristos   UINT f_csr; \
3274e98e3e1Schristos   UINT f_r1; \
3284e98e3e1Schristos   UINT f_r2; \
3294e98e3e1Schristos   UINT f_resv0; \
3304e98e3e1Schristos   unsigned int length;
3314e98e3e1Schristos #define EXTRACT_IFMT_WCSR_CODE \
3324e98e3e1Schristos   length = 4; \
3334e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
3344e98e3e1Schristos   f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
3354e98e3e1Schristos   f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
3364e98e3e1Schristos   f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
3374e98e3e1Schristos   f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
3384e98e3e1Schristos 
3394e98e3e1Schristos #define EXTRACT_IFMT_BREAK_VARS \
3404e98e3e1Schristos   UINT f_opcode; \
3414e98e3e1Schristos   UINT f_exception; \
3424e98e3e1Schristos   unsigned int length;
3434e98e3e1Schristos #define EXTRACT_IFMT_BREAK_CODE \
3444e98e3e1Schristos   length = 4; \
3454e98e3e1Schristos   f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
3464e98e3e1Schristos   f_exception = EXTRACT_LSB0_UINT (insn, 32, 25, 26); \
3474e98e3e1Schristos 
3484e98e3e1Schristos /* Collection of various things for the trace handler to use.  */
3494e98e3e1Schristos 
3504e98e3e1Schristos typedef struct trace_record {
3514e98e3e1Schristos   IADDR pc;
3524e98e3e1Schristos   /* FIXME:wip */
3534e98e3e1Schristos } TRACE_RECORD;
3544e98e3e1Schristos 
3554e98e3e1Schristos #endif /* CPU_LM32BF_H */
356