1 /* CPU family header for m32rbf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
7 This file is part of the GNU Simulators.
9 This program 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 2, or (at your option)
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public 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 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 /* CPU state information. */
37 /* Hardware elements. */
41 #define GET_H_PC() CPU (h_pc)
42 #define SET_H_PC(x) (CPU (h_pc) = (x))
43 /* general registers */
45 #define GET_H_GR(a1) CPU (h_gr)[a1]
46 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
47 /* control registers */
49 /* GET_H_CR macro user-written */
50 /* SET_H_CR macro user-written */
53 /* GET_H_ACCUM macro user-written */
54 /* SET_H_ACCUM macro user-written */
55 /* start-sanitize-m32rx */
58 /* end-sanitize-m32rx */
59 /* start-sanitize-m32rx */
60 /* GET_H_ACCUMS macro user-written */
61 /* SET_H_ACCUMS macro user-written */
62 /* end-sanitize-m32rx */
65 #define GET_H_COND() CPU (h_cond)
66 #define SET_H_COND(x) (CPU (h_cond) = (x))
69 /* GET_H_PSW macro user-written */
70 /* SET_H_PSW macro user-written */
73 #define GET_H_BPSW() CPU (h_bpsw)
74 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
77 #define GET_H_BBPSW() CPU (h_bbpsw)
78 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
81 #define GET_H_LOCK() CPU (h_lock)
82 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
84 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
87 /* Cover fns for register access. */
88 USI
m32rbf_h_pc_get (SIM_CPU
*);
89 void m32rbf_h_pc_set (SIM_CPU
*, USI
);
90 SI
m32rbf_h_gr_get (SIM_CPU
*, UINT
);
91 void m32rbf_h_gr_set (SIM_CPU
*, UINT
, SI
);
92 USI
m32rbf_h_cr_get (SIM_CPU
*, UINT
);
93 void m32rbf_h_cr_set (SIM_CPU
*, UINT
, USI
);
94 DI
m32rbf_h_accum_get (SIM_CPU
*);
95 void m32rbf_h_accum_set (SIM_CPU
*, DI
);
96 DI
m32rbf_h_accums_get (SIM_CPU
*, UINT
);
97 void m32rbf_h_accums_set (SIM_CPU
*, UINT
, DI
);
98 BI
m32rbf_h_cond_get (SIM_CPU
*);
99 void m32rbf_h_cond_set (SIM_CPU
*, BI
);
100 UQI
m32rbf_h_psw_get (SIM_CPU
*);
101 void m32rbf_h_psw_set (SIM_CPU
*, UQI
);
102 UQI
m32rbf_h_bpsw_get (SIM_CPU
*);
103 void m32rbf_h_bpsw_set (SIM_CPU
*, UQI
);
104 UQI
m32rbf_h_bbpsw_get (SIM_CPU
*);
105 void m32rbf_h_bbpsw_set (SIM_CPU
*, UQI
);
106 BI
m32rbf_h_lock_get (SIM_CPU
*);
107 void m32rbf_h_lock_set (SIM_CPU
*, BI
);
109 /* These must be hand-written. */
110 extern CPUREG_FETCH_FN m32rbf_fetch_register
;
111 extern CPUREG_STORE_FN m32rbf_store_register
;
122 struct { /* empty sformat for unspecified field list */
125 struct { /* e.g. add $dr,$sr */
130 unsigned char out_dr
;
132 struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
137 unsigned char out_dr
;
139 struct { /* e.g. and3 $dr,$sr,$uimm16 */
144 unsigned char out_dr
;
146 struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
151 unsigned char out_dr
;
153 struct { /* e.g. addi $dr,$simm8 */
157 unsigned char out_dr
;
159 struct { /* e.g. addv $dr,$sr */
164 unsigned char out_dr
;
166 struct { /* e.g. addv3 $dr,$sr,$simm16 */
171 unsigned char out_dr
;
173 struct { /* e.g. addx $dr,$sr */
178 unsigned char out_dr
;
180 struct { /* e.g. cmp $src1,$src2 */
183 unsigned char in_src1
;
184 unsigned char in_src2
;
186 struct { /* e.g. cmpi $src2,$simm16 */
189 unsigned char in_src2
;
191 struct { /* e.g. div $dr,$sr */
196 unsigned char out_dr
;
198 struct { /* e.g. ld $dr,@$sr */
202 unsigned char out_dr
;
204 struct { /* e.g. ld $dr,@($slo16,$sr) */
209 unsigned char out_dr
;
211 struct { /* e.g. ldb $dr,@$sr */
215 unsigned char out_dr
;
217 struct { /* e.g. ldb $dr,@($slo16,$sr) */
222 unsigned char out_dr
;
224 struct { /* e.g. ldh $dr,@$sr */
228 unsigned char out_dr
;
230 struct { /* e.g. ldh $dr,@($slo16,$sr) */
235 unsigned char out_dr
;
237 struct { /* e.g. ld $dr,@$sr+ */
241 unsigned char out_dr
;
242 unsigned char out_sr
;
244 struct { /* e.g. ld24 $dr,$uimm24 */
247 unsigned char out_dr
;
249 struct { /* e.g. ldi8 $dr,$simm8 */
252 unsigned char out_dr
;
254 struct { /* e.g. ldi16 $dr,$hash$slo16 */
257 unsigned char out_dr
;
259 struct { /* e.g. lock $dr,@$sr */
263 unsigned char out_dr
;
265 struct { /* e.g. machi $src1,$src2 */
268 unsigned char in_src1
;
269 unsigned char in_src2
;
271 struct { /* e.g. mulhi $src1,$src2 */
274 unsigned char in_src1
;
275 unsigned char in_src2
;
277 struct { /* e.g. mv $dr,$sr */
281 unsigned char out_dr
;
283 struct { /* e.g. mvfachi $dr */
285 unsigned char out_dr
;
287 struct { /* e.g. mvfc $dr,$scr */
290 unsigned char out_dr
;
292 struct { /* e.g. mvtachi $src1 */
294 unsigned char in_src1
;
296 struct { /* e.g. mvtc $sr,$dcr */
301 struct { /* e.g. nop */
304 struct { /* e.g. rac */
307 struct { /* e.g. seth $dr,$hash$hi16 */
310 unsigned char out_dr
;
312 struct { /* e.g. sll3 $dr,$sr,$simm16 */
317 unsigned char out_dr
;
319 struct { /* e.g. slli $dr,$uimm5 */
323 unsigned char out_dr
;
325 struct { /* e.g. st $src1,@$src2 */
328 unsigned char in_src1
;
329 unsigned char in_src2
;
331 struct { /* e.g. st $src1,@($slo16,$src2) */
335 unsigned char in_src1
;
336 unsigned char in_src2
;
338 struct { /* e.g. stb $src1,@$src2 */
341 unsigned char in_src1
;
342 unsigned char in_src2
;
344 struct { /* e.g. stb $src1,@($slo16,$src2) */
348 unsigned char in_src1
;
349 unsigned char in_src2
;
351 struct { /* e.g. sth $src1,@$src2 */
354 unsigned char in_src1
;
355 unsigned char in_src2
;
357 struct { /* e.g. sth $src1,@($slo16,$src2) */
361 unsigned char in_src1
;
362 unsigned char in_src2
;
364 struct { /* e.g. st $src1,@+$src2 */
367 unsigned char in_src1
;
368 unsigned char in_src2
;
369 unsigned char out_src2
;
371 struct { /* e.g. unlock $src1,@$src2 */
374 unsigned char in_src1
;
375 unsigned char in_src2
;
377 /* cti insns, kept separately so addr_cache is in fixed place */
380 struct { /* e.g. bc.s $disp8 */
383 struct { /* e.g. bc.l $disp24 */
386 struct { /* e.g. beq $src1,$src2,$disp16 */
390 unsigned char in_src1
;
391 unsigned char in_src2
;
393 struct { /* e.g. beqz $src2,$disp16 */
396 unsigned char in_src2
;
398 struct { /* e.g. bl.s $disp8 */
400 unsigned char out_h_gr_14
;
402 struct { /* e.g. bl.l $disp24 */
404 unsigned char out_h_gr_14
;
406 struct { /* e.g. bra.s $disp8 */
409 struct { /* e.g. bra.l $disp24 */
412 struct { /* e.g. jl $sr */
415 unsigned char out_h_gr_14
;
417 struct { /* e.g. jmp $sr */
421 struct { /* e.g. rte */
424 struct { /* e.g. trap $uimm4 */
433 /* Writeback handler. */
435 /* Pointer to argbuf entry for insn whose results need writing back. */
436 const struct argbuf
*abuf
;
438 /* x-before handler */
440 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
443 /* x-after handler */
447 /* This entry is used to terminate each pbb. */
449 /* Number of insns in pbb. */
451 /* Next pbb to execute. */
457 /* The ARGBUF struct. */
459 /* These are the baseclass definitions. */
464 /* cpu specific data follows */
467 union sem_fields fields
;
472 ??? SCACHE used to contain more than just argbuf. We could delete the
473 type entirely and always just use ARGBUF, but for future concerns and as
474 a level of abstraction it is left in. */
477 struct argbuf argbuf
;
480 /* Macros to simplify extraction, reading and semantic code.
481 These define and assign the local vars that contain the insn's fields. */
483 #define EXTRACT_IFMT_EMPTY_VARS \
484 /* Instruction fields. */ \
486 #define EXTRACT_IFMT_EMPTY_CODE \
489 #define EXTRACT_IFMT_ADD_VARS \
490 /* Instruction fields. */ \
496 #define EXTRACT_IFMT_ADD_CODE \
498 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
499 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
500 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
501 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
503 #define EXTRACT_IFMT_ADD3_VARS \
504 /* Instruction fields. */ \
511 #define EXTRACT_IFMT_ADD3_CODE \
513 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
514 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
515 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
516 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
517 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
519 #define EXTRACT_IFMT_AND3_VARS \
520 /* Instruction fields. */ \
527 #define EXTRACT_IFMT_AND3_CODE \
529 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
530 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
531 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
532 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
533 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
535 #define EXTRACT_IFMT_OR3_VARS \
536 /* Instruction fields. */ \
543 #define EXTRACT_IFMT_OR3_CODE \
545 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
546 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
547 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
548 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
549 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
551 #define EXTRACT_IFMT_ADDI_VARS \
552 /* Instruction fields. */ \
557 #define EXTRACT_IFMT_ADDI_CODE \
559 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
560 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
561 f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
563 #define EXTRACT_IFMT_ADDV3_VARS \
564 /* Instruction fields. */ \
571 #define EXTRACT_IFMT_ADDV3_CODE \
573 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
574 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
575 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
576 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
577 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
579 #define EXTRACT_IFMT_BC8_VARS \
580 /* Instruction fields. */ \
585 #define EXTRACT_IFMT_BC8_CODE \
587 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
588 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
589 f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
591 #define EXTRACT_IFMT_BC24_VARS \
592 /* Instruction fields. */ \
597 #define EXTRACT_IFMT_BC24_CODE \
599 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
600 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
601 f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
603 #define EXTRACT_IFMT_BEQ_VARS \
604 /* Instruction fields. */ \
611 #define EXTRACT_IFMT_BEQ_CODE \
613 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
614 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
615 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
616 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
617 f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
619 #define EXTRACT_IFMT_BEQZ_VARS \
620 /* Instruction fields. */ \
627 #define EXTRACT_IFMT_BEQZ_CODE \
629 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
630 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
631 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
632 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
633 f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
635 #define EXTRACT_IFMT_CMP_VARS \
636 /* Instruction fields. */ \
642 #define EXTRACT_IFMT_CMP_CODE \
644 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
645 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
646 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
647 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
649 #define EXTRACT_IFMT_CMPI_VARS \
650 /* Instruction fields. */ \
657 #define EXTRACT_IFMT_CMPI_CODE \
659 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
660 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
661 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
662 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
663 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
665 #define EXTRACT_IFMT_DIV_VARS \
666 /* Instruction fields. */ \
673 #define EXTRACT_IFMT_DIV_CODE \
675 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
676 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
677 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
678 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
679 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
681 #define EXTRACT_IFMT_JL_VARS \
682 /* Instruction fields. */ \
688 #define EXTRACT_IFMT_JL_CODE \
690 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
691 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
692 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
693 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
695 #define EXTRACT_IFMT_LD24_VARS \
696 /* Instruction fields. */ \
701 #define EXTRACT_IFMT_LD24_CODE \
703 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
704 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
705 f_uimm24 = EXTRACT_UINT (insn, 32, 8, 24); \
707 #define EXTRACT_IFMT_LDI16_VARS \
708 /* Instruction fields. */ \
715 #define EXTRACT_IFMT_LDI16_CODE \
717 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
718 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
719 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
720 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
721 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
723 #define EXTRACT_IFMT_MVFACHI_VARS \
724 /* Instruction fields. */ \
730 #define EXTRACT_IFMT_MVFACHI_CODE \
732 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
733 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
734 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
735 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
737 #define EXTRACT_IFMT_MVFC_VARS \
738 /* Instruction fields. */ \
744 #define EXTRACT_IFMT_MVFC_CODE \
746 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
747 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
748 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
749 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
751 #define EXTRACT_IFMT_MVTACHI_VARS \
752 /* Instruction fields. */ \
758 #define EXTRACT_IFMT_MVTACHI_CODE \
760 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
761 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
762 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
763 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
765 #define EXTRACT_IFMT_MVTC_VARS \
766 /* Instruction fields. */ \
772 #define EXTRACT_IFMT_MVTC_CODE \
774 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
775 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
776 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
777 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
779 #define EXTRACT_IFMT_NOP_VARS \
780 /* Instruction fields. */ \
786 #define EXTRACT_IFMT_NOP_CODE \
788 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
789 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
790 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
791 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
793 #define EXTRACT_IFMT_SETH_VARS \
794 /* Instruction fields. */ \
801 #define EXTRACT_IFMT_SETH_CODE \
803 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
804 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
805 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
806 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
807 f_hi16 = EXTRACT_UINT (insn, 32, 16, 16); \
809 #define EXTRACT_IFMT_SLLI_VARS \
810 /* Instruction fields. */ \
816 #define EXTRACT_IFMT_SLLI_CODE \
818 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
819 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
820 f_shift_op2 = EXTRACT_UINT (insn, 16, 8, 3); \
821 f_uimm5 = EXTRACT_UINT (insn, 16, 11, 5); \
823 #define EXTRACT_IFMT_ST_D_VARS \
824 /* Instruction fields. */ \
831 #define EXTRACT_IFMT_ST_D_CODE \
833 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
834 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
835 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
836 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
837 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
839 #define EXTRACT_IFMT_TRAP_VARS \
840 /* Instruction fields. */ \
846 #define EXTRACT_IFMT_TRAP_CODE \
848 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
849 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
850 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
851 f_uimm4 = EXTRACT_UINT (insn, 16, 12, 4); \
853 /* Collection of various things for the trace handler to use. */
855 typedef struct trace_record
{
860 #endif /* CPU_M32RBF_H */