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