1 /* CPU family header for m32rbf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1996-2024 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, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
28 /* Maximum number of instructions that are fetched at a time.
29 This is for LIW type instructions sets (e.g. m32r). */
30 #define MAX_LIW_INSNS 2
32 /* Maximum number of instructions that can be executed in parallel. */
33 #define MAX_PARALLEL_INSNS 1
35 /* The size of an "int" needed to hold an instruction word.
36 This is usually 32 bits, but some architectures needs 64 bits. */
37 typedef CGEN_INSN_INT CGEN_INSN_WORD
;
39 #include "cgen-engine.h"
41 /* CPU state information. */
43 /* Hardware elements. */
47 #define GET_H_PC() CPU (h_pc)
48 #define SET_H_PC(x) (CPU (h_pc) = (x))
49 /* general registers */
51 #define GET_H_GR(a1) CPU (h_gr)[a1]
52 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
53 /* control registers */
55 #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index)
56 #define SET_H_CR(index, x) \
58 m32rbf_h_cr_set_handler (current_cpu, (index), (x));\
62 #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu)
63 #define SET_H_ACCUM(x) \
65 m32rbf_h_accum_set_handler (current_cpu, (x));\
69 #define GET_H_COND() CPU (h_cond)
70 #define SET_H_COND(x) (CPU (h_cond) = (x))
73 #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu)
74 #define SET_H_PSW(x) \
76 m32rbf_h_psw_set_handler (current_cpu, (x));\
80 #define GET_H_BPSW() CPU (h_bpsw)
81 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
84 #define GET_H_BBPSW() CPU (h_bbpsw)
85 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
88 #define GET_H_LOCK() CPU (h_lock)
89 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
91 #define CPU_CGEN_HW(cpu) (& M32R_SIM_CPU (cpu)->cpu_data.hardware)
94 /* Cover fns for register access. */
95 USI
m32rbf_h_pc_get (SIM_CPU
*);
96 void m32rbf_h_pc_set (SIM_CPU
*, USI
);
97 SI
m32rbf_h_gr_get (SIM_CPU
*, UINT
);
98 void m32rbf_h_gr_set (SIM_CPU
*, UINT
, SI
);
99 USI
m32rbf_h_cr_get (SIM_CPU
*, UINT
);
100 void m32rbf_h_cr_set (SIM_CPU
*, UINT
, USI
);
101 DI
m32rbf_h_accum_get (SIM_CPU
*);
102 void m32rbf_h_accum_set (SIM_CPU
*, DI
);
103 BI
m32rbf_h_cond_get (SIM_CPU
*);
104 void m32rbf_h_cond_set (SIM_CPU
*, BI
);
105 UQI
m32rbf_h_psw_get (SIM_CPU
*);
106 void m32rbf_h_psw_set (SIM_CPU
*, UQI
);
107 UQI
m32rbf_h_bpsw_get (SIM_CPU
*);
108 void m32rbf_h_bpsw_set (SIM_CPU
*, UQI
);
109 UQI
m32rbf_h_bbpsw_get (SIM_CPU
*);
110 void m32rbf_h_bbpsw_set (SIM_CPU
*, UQI
);
111 BI
m32rbf_h_lock_get (SIM_CPU
*);
112 void m32rbf_h_lock_set (SIM_CPU
*, BI
);
114 /* These must be hand-written. */
115 extern CPUREG_FETCH_FN m32rbf_fetch_register
;
116 extern CPUREG_STORE_FN m32rbf_store_register
;
126 /* Instruction argument buffer. */
129 struct { /* no operands */
140 unsigned char out_h_gr_SI_14
;
144 unsigned char out_h_gr_SI_14
;
150 unsigned char out_dr
;
156 unsigned char out_dr
;
162 unsigned char out_h_gr_SI_14
;
176 unsigned char out_dr
;
183 unsigned char out_dr
;
190 unsigned char in_src1
;
191 unsigned char in_src2
;
192 unsigned char out_src2
;
200 unsigned char in_src1
;
201 unsigned char in_src2
;
209 unsigned char out_dr
;
210 unsigned char out_sr
;
218 unsigned char in_src1
;
219 unsigned char in_src2
;
228 unsigned char out_dr
;
237 unsigned char out_dr
;
246 unsigned char out_dr
;
249 /* Writeback handler. */
251 /* Pointer to argbuf entry for insn whose results need writing back. */
252 const struct argbuf
*abuf
;
254 /* x-before handler */
256 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
259 /* x-after handler */
263 /* This entry is used to terminate each pbb. */
265 /* Number of insns in pbb. */
267 /* Next pbb to execute. */
269 SCACHE
*branch_target
;
274 /* The ARGBUF struct. */
276 /* These are the baseclass definitions. */
281 /* ??? Temporary hack for skip insns. */
284 /* cpu specific data follows */
287 union sem_fields fields
;
292 ??? SCACHE used to contain more than just argbuf. We could delete the
293 type entirely and always just use ARGBUF, but for future concerns and as
294 a level of abstraction it is left in. */
297 struct argbuf argbuf
;
300 /* Macros to simplify extraction, reading and semantic code.
301 These define and assign the local vars that contain the insn's fields. */
303 #define EXTRACT_IFMT_EMPTY_VARS \
305 #define EXTRACT_IFMT_EMPTY_CODE \
308 #define EXTRACT_IFMT_ADD_VARS \
314 #define EXTRACT_IFMT_ADD_CODE \
316 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
317 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
318 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
319 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
321 #define EXTRACT_IFMT_ADD3_VARS \
328 #define EXTRACT_IFMT_ADD3_CODE \
330 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
331 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
332 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
333 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
334 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
336 #define EXTRACT_IFMT_AND3_VARS \
343 #define EXTRACT_IFMT_AND3_CODE \
345 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
346 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
347 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
348 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
349 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
351 #define EXTRACT_IFMT_OR3_VARS \
358 #define EXTRACT_IFMT_OR3_CODE \
360 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
361 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
362 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
363 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
364 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
366 #define EXTRACT_IFMT_ADDI_VARS \
371 #define EXTRACT_IFMT_ADDI_CODE \
373 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
374 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
375 f_simm8 = EXTRACT_MSB0_SINT (insn, 16, 8, 8); \
377 #define EXTRACT_IFMT_ADDV3_VARS \
384 #define EXTRACT_IFMT_ADDV3_CODE \
386 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
387 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
388 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
389 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
390 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
392 #define EXTRACT_IFMT_BC8_VARS \
397 #define EXTRACT_IFMT_BC8_CODE \
399 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
400 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
401 f_disp8 = ((((EXTRACT_MSB0_SINT (insn, 16, 8, 8)) * (4))) + (((pc) & (-4)))); \
403 #define EXTRACT_IFMT_BC24_VARS \
408 #define EXTRACT_IFMT_BC24_CODE \
410 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
411 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
412 f_disp24 = ((((EXTRACT_MSB0_SINT (insn, 32, 8, 24)) * (4))) + (pc)); \
414 #define EXTRACT_IFMT_BEQ_VARS \
421 #define EXTRACT_IFMT_BEQ_CODE \
423 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
424 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
425 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
426 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
427 f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
429 #define EXTRACT_IFMT_BEQZ_VARS \
436 #define EXTRACT_IFMT_BEQZ_CODE \
438 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
439 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
440 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
441 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
442 f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
444 #define EXTRACT_IFMT_CMP_VARS \
450 #define EXTRACT_IFMT_CMP_CODE \
452 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
453 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
454 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
455 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
457 #define EXTRACT_IFMT_CMPI_VARS \
464 #define EXTRACT_IFMT_CMPI_CODE \
466 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
467 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
468 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
469 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
470 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
472 #define EXTRACT_IFMT_DIV_VARS \
479 #define EXTRACT_IFMT_DIV_CODE \
481 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
482 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
483 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
484 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
485 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
487 #define EXTRACT_IFMT_JL_VARS \
493 #define EXTRACT_IFMT_JL_CODE \
495 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
496 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
497 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
498 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
500 #define EXTRACT_IFMT_LD24_VARS \
505 #define EXTRACT_IFMT_LD24_CODE \
507 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
508 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
509 f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
511 #define EXTRACT_IFMT_LDI16_VARS \
518 #define EXTRACT_IFMT_LDI16_CODE \
520 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
521 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
522 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
523 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
524 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
526 #define EXTRACT_IFMT_MVFACHI_VARS \
532 #define EXTRACT_IFMT_MVFACHI_CODE \
534 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
535 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
536 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
537 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
539 #define EXTRACT_IFMT_MVFC_VARS \
545 #define EXTRACT_IFMT_MVFC_CODE \
547 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
548 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
549 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
550 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
552 #define EXTRACT_IFMT_MVTACHI_VARS \
558 #define EXTRACT_IFMT_MVTACHI_CODE \
560 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
561 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
562 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
563 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
565 #define EXTRACT_IFMT_MVTC_VARS \
571 #define EXTRACT_IFMT_MVTC_CODE \
573 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
574 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
575 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
576 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
578 #define EXTRACT_IFMT_NOP_VARS \
584 #define EXTRACT_IFMT_NOP_CODE \
586 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
587 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
588 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
589 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
591 #define EXTRACT_IFMT_SETH_VARS \
598 #define EXTRACT_IFMT_SETH_CODE \
600 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
601 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
602 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
603 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
604 f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
606 #define EXTRACT_IFMT_SLLI_VARS \
612 #define EXTRACT_IFMT_SLLI_CODE \
614 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
615 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
616 f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
617 f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
619 #define EXTRACT_IFMT_ST_D_VARS \
626 #define EXTRACT_IFMT_ST_D_CODE \
628 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
629 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
630 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
631 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
632 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
634 #define EXTRACT_IFMT_TRAP_VARS \
640 #define EXTRACT_IFMT_TRAP_CODE \
642 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
643 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
644 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
645 f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
647 #define EXTRACT_IFMT_CLRPSW_VARS \
652 #define EXTRACT_IFMT_CLRPSW_CODE \
654 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
655 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
656 f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
658 #define EXTRACT_IFMT_BSET_VARS \
666 #define EXTRACT_IFMT_BSET_CODE \
668 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
669 f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
670 f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
671 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
672 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
673 f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
675 #define EXTRACT_IFMT_BTST_VARS \
682 #define EXTRACT_IFMT_BTST_CODE \
684 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
685 f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
686 f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
687 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
688 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
690 /* Collection of various things for the trace handler to use. */
692 typedef struct trace_record
{
697 #endif /* CPU_M32RBF_H */