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 #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index)
50 #define SET_H_CR(index, x) \
52 m32rbf_h_cr_set_handler (current_cpu, (index), (x));\
56 #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu)
57 #define SET_H_ACCUM(x) \
59 m32rbf_h_accum_set_handler (current_cpu, (x));\
63 #define GET_H_COND() CPU (h_cond)
64 #define SET_H_COND(x) (CPU (h_cond) = (x))
67 #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu)
68 #define SET_H_PSW(x) \
70 m32rbf_h_psw_set_handler (current_cpu, (x));\
74 #define GET_H_BPSW() CPU (h_bpsw)
75 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
78 #define GET_H_BBPSW() CPU (h_bbpsw)
79 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
82 #define GET_H_LOCK() CPU (h_lock)
83 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
85 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
88 /* Cover fns for register access. */
89 USI
m32rbf_h_pc_get (SIM_CPU
*);
90 void m32rbf_h_pc_set (SIM_CPU
*, USI
);
91 SI
m32rbf_h_gr_get (SIM_CPU
*, UINT
);
92 void m32rbf_h_gr_set (SIM_CPU
*, UINT
, SI
);
93 USI
m32rbf_h_cr_get (SIM_CPU
*, UINT
);
94 void m32rbf_h_cr_set (SIM_CPU
*, UINT
, USI
);
95 DI
m32rbf_h_accum_get (SIM_CPU
*);
96 void m32rbf_h_accum_set (SIM_CPU
*, DI
);
97 BI
m32rbf_h_cond_get (SIM_CPU
*);
98 void m32rbf_h_cond_set (SIM_CPU
*, BI
);
99 UQI
m32rbf_h_psw_get (SIM_CPU
*);
100 void m32rbf_h_psw_set (SIM_CPU
*, UQI
);
101 UQI
m32rbf_h_bpsw_get (SIM_CPU
*);
102 void m32rbf_h_bpsw_set (SIM_CPU
*, UQI
);
103 UQI
m32rbf_h_bbpsw_get (SIM_CPU
*);
104 void m32rbf_h_bbpsw_set (SIM_CPU
*, UQI
);
105 BI
m32rbf_h_lock_get (SIM_CPU
*);
106 void m32rbf_h_lock_set (SIM_CPU
*, BI
);
108 /* These must be hand-written. */
109 extern CPUREG_FETCH_FN m32rbf_fetch_register
;
110 extern CPUREG_STORE_FN m32rbf_store_register
;
120 /* Instruction argument buffer. */
123 struct { /* no operands */
131 unsigned char out_h_gr_14
;
135 unsigned char out_h_gr_14
;
140 unsigned char out_dr
;
150 unsigned char out_dr
;
155 unsigned char out_dr
;
160 unsigned char out_h_gr_14
;
166 unsigned char out_dr
;
172 unsigned char out_dr
;
177 unsigned char in_src1
;
178 unsigned char in_src2
;
179 unsigned char out_src2
;
185 unsigned char in_src1
;
186 unsigned char in_src2
;
192 unsigned char out_dr
;
193 unsigned char out_sr
;
199 unsigned char in_src1
;
200 unsigned char in_src2
;
207 unsigned char out_dr
;
214 unsigned char out_dr
;
221 unsigned char out_dr
;
224 /* Writeback handler. */
226 /* Pointer to argbuf entry for insn whose results need writing back. */
227 const struct argbuf
*abuf
;
229 /* x-before handler */
231 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
234 /* x-after handler */
238 /* This entry is used to terminate each pbb. */
240 /* Number of insns in pbb. */
242 /* Next pbb to execute. */
244 SCACHE
*branch_target
;
249 /* The ARGBUF struct. */
251 /* These are the baseclass definitions. */
256 /* ??? Temporary hack for skip insns. */
259 /* cpu specific data follows */
262 union sem_fields fields
;
267 ??? SCACHE used to contain more than just argbuf. We could delete the
268 type entirely and always just use ARGBUF, but for future concerns and as
269 a level of abstraction it is left in. */
272 struct argbuf argbuf
;
275 /* Macros to simplify extraction, reading and semantic code.
276 These define and assign the local vars that contain the insn's fields. */
278 #define EXTRACT_IFMT_EMPTY_VARS \
280 #define EXTRACT_IFMT_EMPTY_CODE \
283 #define EXTRACT_IFMT_ADD_VARS \
289 #define EXTRACT_IFMT_ADD_CODE \
291 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
292 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
293 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
294 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
296 #define EXTRACT_IFMT_ADD3_VARS \
303 #define EXTRACT_IFMT_ADD3_CODE \
305 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
306 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
307 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
308 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
309 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
311 #define EXTRACT_IFMT_AND3_VARS \
318 #define EXTRACT_IFMT_AND3_CODE \
320 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
321 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
322 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
323 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
324 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
326 #define EXTRACT_IFMT_OR3_VARS \
333 #define EXTRACT_IFMT_OR3_CODE \
335 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
336 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
337 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
338 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
339 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
341 #define EXTRACT_IFMT_ADDI_VARS \
346 #define EXTRACT_IFMT_ADDI_CODE \
348 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
349 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
350 f_simm8 = EXTRACT_MSB0_INT (insn, 16, 8, 8); \
352 #define EXTRACT_IFMT_ADDV3_VARS \
359 #define EXTRACT_IFMT_ADDV3_CODE \
361 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
362 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
363 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
364 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
365 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
367 #define EXTRACT_IFMT_BC8_VARS \
372 #define EXTRACT_IFMT_BC8_CODE \
374 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
375 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
376 f_disp8 = ((((EXTRACT_MSB0_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
378 #define EXTRACT_IFMT_BC24_VARS \
383 #define EXTRACT_IFMT_BC24_CODE \
385 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
386 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
387 f_disp24 = ((((EXTRACT_MSB0_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
389 #define EXTRACT_IFMT_BEQ_VARS \
396 #define EXTRACT_IFMT_BEQ_CODE \
398 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
399 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
400 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
401 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
402 f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
404 #define EXTRACT_IFMT_BEQZ_VARS \
411 #define EXTRACT_IFMT_BEQZ_CODE \
413 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
414 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
415 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
416 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
417 f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
419 #define EXTRACT_IFMT_CMP_VARS \
425 #define EXTRACT_IFMT_CMP_CODE \
427 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
428 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
429 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
430 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
432 #define EXTRACT_IFMT_CMPI_VARS \
439 #define EXTRACT_IFMT_CMPI_CODE \
441 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
442 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
443 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
444 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
445 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
447 #define EXTRACT_IFMT_DIV_VARS \
454 #define EXTRACT_IFMT_DIV_CODE \
456 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
457 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
458 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
459 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
460 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
462 #define EXTRACT_IFMT_JL_VARS \
468 #define EXTRACT_IFMT_JL_CODE \
470 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
471 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
472 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
473 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
475 #define EXTRACT_IFMT_LD24_VARS \
480 #define EXTRACT_IFMT_LD24_CODE \
482 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
483 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
484 f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
486 #define EXTRACT_IFMT_LDI16_VARS \
493 #define EXTRACT_IFMT_LDI16_CODE \
495 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
496 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
497 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
498 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
499 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
501 #define EXTRACT_IFMT_MVFACHI_VARS \
507 #define EXTRACT_IFMT_MVFACHI_CODE \
509 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
510 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
511 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
512 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
514 #define EXTRACT_IFMT_MVFC_VARS \
520 #define EXTRACT_IFMT_MVFC_CODE \
522 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
523 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
524 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
525 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
527 #define EXTRACT_IFMT_MVTACHI_VARS \
533 #define EXTRACT_IFMT_MVTACHI_CODE \
535 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
536 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
537 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
538 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
540 #define EXTRACT_IFMT_MVTC_VARS \
546 #define EXTRACT_IFMT_MVTC_CODE \
548 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
549 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
550 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
551 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
553 #define EXTRACT_IFMT_NOP_VARS \
559 #define EXTRACT_IFMT_NOP_CODE \
561 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
562 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
563 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
564 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
566 #define EXTRACT_IFMT_SETH_VARS \
573 #define EXTRACT_IFMT_SETH_CODE \
575 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
576 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
577 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
578 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
579 f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
581 #define EXTRACT_IFMT_SLLI_VARS \
587 #define EXTRACT_IFMT_SLLI_CODE \
589 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
590 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
591 f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
592 f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
594 #define EXTRACT_IFMT_ST_D_VARS \
601 #define EXTRACT_IFMT_ST_D_CODE \
603 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
604 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
605 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
606 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
607 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
609 #define EXTRACT_IFMT_TRAP_VARS \
615 #define EXTRACT_IFMT_TRAP_CODE \
617 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
618 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
619 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
620 f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
622 /* Collection of various things for the trace handler to use. */
624 typedef struct trace_record
{
629 #endif /* CPU_M32RBF_H */