1 /* CPU family header for lm32bf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright 1996-2022 Free Software Foundation, Inc.
7 This file is part of the GNU simulators.
9 This file is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, see <http://www.gnu.org/licenses/>.
27 /* Maximum number of instructions that are fetched at a time.
28 This is for LIW type instructions sets (e.g. m32r). */
29 #define MAX_LIW_INSNS 1
31 /* Maximum number of instructions that can be executed in parallel. */
32 #define MAX_PARALLEL_INSNS 1
34 /* The size of an "int" needed to hold an instruction word.
35 This is usually 32 bits, but some architectures needs 64 bits. */
36 typedef CGEN_INSN_INT CGEN_INSN_WORD
;
38 #include "cgen-engine.h"
40 /* CPU state information. */
42 /* Hardware elements. */
46 #define GET_H_PC() CPU (h_pc)
47 #define SET_H_PC(x) (CPU (h_pc) = (x))
48 /* General purpose registers */
50 #define GET_H_GR(a1) CPU (h_gr)[a1]
51 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
52 /* Control and status registers */
54 #define GET_H_CSR(a1) CPU (h_csr)[a1]
55 #define SET_H_CSR(a1, x) (CPU (h_csr)[a1] = (x))
57 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
60 /* Cover fns for register access. */
61 USI
lm32bf_h_pc_get (SIM_CPU
*);
62 void lm32bf_h_pc_set (SIM_CPU
*, USI
);
63 SI
lm32bf_h_gr_get (SIM_CPU
*, UINT
);
64 void lm32bf_h_gr_set (SIM_CPU
*, UINT
, SI
);
65 SI
lm32bf_h_csr_get (SIM_CPU
*, UINT
);
66 void lm32bf_h_csr_set (SIM_CPU
*, UINT
, SI
);
68 /* These must be hand-written. */
69 extern CPUREG_FETCH_FN lm32bf_fetch_register
;
70 extern CPUREG_STORE_FN lm32bf_store_register
;
76 /* Instruction argument buffer. */
79 struct { /* no operands */
115 /* Writeback handler. */
117 /* Pointer to argbuf entry for insn whose results need writing back. */
118 const struct argbuf
*abuf
;
120 /* x-before handler */
122 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
125 /* x-after handler */
129 /* This entry is used to terminate each pbb. */
131 /* Number of insns in pbb. */
133 /* Next pbb to execute. */
135 SCACHE
*branch_target
;
140 /* The ARGBUF struct. */
142 /* These are the baseclass definitions. */
147 /* ??? Temporary hack for skip insns. */
150 /* cpu specific data follows */
153 union sem_fields fields
;
158 ??? SCACHE used to contain more than just argbuf. We could delete the
159 type entirely and always just use ARGBUF, but for future concerns and as
160 a level of abstraction it is left in. */
163 struct argbuf argbuf
;
167 extern USI
lm32bf_b_insn (SIM_CPU
* current_cpu
, USI r0
, USI f_r0
);
168 extern USI
lm32bf_divu_insn (SIM_CPU
* current_cpu
, IADDR pc
, USI r0
, USI r1
, USI r2
);
169 extern USI
lm32bf_modu_insn (SIM_CPU
* current_cpu
, IADDR pc
, USI r0
, USI r1
, USI r2
);
170 extern void lm32bf_wcsr_insn (SIM_CPU
* current_cpu
, USI f_csr
, USI r1
);
171 extern USI
lm32bf_break_insn (SIM_CPU
* current_cpu
, IADDR pc
);
172 extern USI
lm32bf_scall_insn (SIM_CPU
* current_cpu
, IADDR pc
);
175 extern UINT
lm32bf_user_insn (SIM_CPU
* current_cpu
, INT r0
, INT r1
, UINT imm
);
177 /* Macros to simplify extraction, reading and semantic code.
178 These define and assign the local vars that contain the insn's fields. */
180 #define EXTRACT_IFMT_EMPTY_VARS \
182 #define EXTRACT_IFMT_EMPTY_CODE \
185 #define EXTRACT_IFMT_ADD_VARS \
192 #define EXTRACT_IFMT_ADD_CODE \
194 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
195 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
196 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
197 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
198 f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
200 #define EXTRACT_IFMT_ADDI_VARS \
206 #define EXTRACT_IFMT_ADDI_CODE \
208 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
209 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
210 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
211 f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); \
213 #define EXTRACT_IFMT_ANDI_VARS \
219 #define EXTRACT_IFMT_ANDI_CODE \
221 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
222 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
223 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
224 f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
226 #define EXTRACT_IFMT_ANDHII_VARS \
232 #define EXTRACT_IFMT_ANDHII_CODE \
234 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
235 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
236 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
237 f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
239 #define EXTRACT_IFMT_B_VARS \
246 #define EXTRACT_IFMT_B_CODE \
248 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
249 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
250 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
251 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
252 f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
254 #define EXTRACT_IFMT_BI_VARS \
258 #define EXTRACT_IFMT_BI_CODE \
260 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
261 f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4)))); \
263 #define EXTRACT_IFMT_BE_VARS \
269 #define EXTRACT_IFMT_BE_CODE \
271 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
272 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
273 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
274 f_branch = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (16))) >> (14)))); \
276 #define EXTRACT_IFMT_ORI_VARS \
282 #define EXTRACT_IFMT_ORI_CODE \
284 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
285 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
286 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
287 f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
289 #define EXTRACT_IFMT_RCSR_VARS \
296 #define EXTRACT_IFMT_RCSR_CODE \
298 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
299 f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
300 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
301 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
302 f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
304 #define EXTRACT_IFMT_SEXTB_VARS \
311 #define EXTRACT_IFMT_SEXTB_CODE \
313 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
314 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
315 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
316 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
317 f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
319 #define EXTRACT_IFMT_USER_VARS \
326 #define EXTRACT_IFMT_USER_CODE \
328 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
329 f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
330 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
331 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
332 f_user = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
334 #define EXTRACT_IFMT_WCSR_VARS \
341 #define EXTRACT_IFMT_WCSR_CODE \
343 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
344 f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
345 f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
346 f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
347 f_resv0 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
349 #define EXTRACT_IFMT_BREAK_VARS \
353 #define EXTRACT_IFMT_BREAK_CODE \
355 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
356 f_exception = EXTRACT_LSB0_UINT (insn, 32, 25, 26); \
358 /* Collection of various things for the trace handler to use. */
360 typedef struct trace_record
{
365 #endif /* CPU_LM32BF_H */