xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32r/cpu.h (revision 05fa08567a80471fd0eb3843a238392874f2577c)
14e98e3e1Schristos /* CPU family header for m32rbf.
24e98e3e1Schristos 
34e98e3e1Schristos THIS FILE IS MACHINE GENERATED WITH CGEN.
44e98e3e1Schristos 
5*05fa0856Schristos 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*05fa0856Schristos    with this program; if not, write to the Free Software Foundation, Inc.,
21*05fa0856Schristos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
224e98e3e1Schristos 
234e98e3e1Schristos */
244e98e3e1Schristos 
254e98e3e1Schristos #ifndef CPU_M32RBF_H
264e98e3e1Schristos #define CPU_M32RBF_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 2
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 registers */
504e98e3e1Schristos   SI h_gr[16];
514e98e3e1Schristos #define GET_H_GR(a1) CPU (h_gr)[a1]
524e98e3e1Schristos #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
534e98e3e1Schristos   /* control registers */
544e98e3e1Schristos   USI h_cr[16];
554e98e3e1Schristos #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index)
564e98e3e1Schristos #define SET_H_CR(index, x) \
574e98e3e1Schristos do { \
584e98e3e1Schristos m32rbf_h_cr_set_handler (current_cpu, (index), (x));\
594e98e3e1Schristos ;} while (0)
604e98e3e1Schristos   /* accumulator */
614e98e3e1Schristos   DI h_accum;
624e98e3e1Schristos #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu)
634e98e3e1Schristos #define SET_H_ACCUM(x) \
644e98e3e1Schristos do { \
654e98e3e1Schristos m32rbf_h_accum_set_handler (current_cpu, (x));\
664e98e3e1Schristos ;} while (0)
674e98e3e1Schristos   /* condition bit */
684e98e3e1Schristos   BI h_cond;
694e98e3e1Schristos #define GET_H_COND() CPU (h_cond)
704e98e3e1Schristos #define SET_H_COND(x) (CPU (h_cond) = (x))
714e98e3e1Schristos   /* psw part of psw */
724e98e3e1Schristos   UQI h_psw;
734e98e3e1Schristos #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu)
744e98e3e1Schristos #define SET_H_PSW(x) \
754e98e3e1Schristos do { \
764e98e3e1Schristos m32rbf_h_psw_set_handler (current_cpu, (x));\
774e98e3e1Schristos ;} while (0)
784e98e3e1Schristos   /* backup psw */
794e98e3e1Schristos   UQI h_bpsw;
804e98e3e1Schristos #define GET_H_BPSW() CPU (h_bpsw)
814e98e3e1Schristos #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
824e98e3e1Schristos   /* backup bpsw */
834e98e3e1Schristos   UQI h_bbpsw;
844e98e3e1Schristos #define GET_H_BBPSW() CPU (h_bbpsw)
854e98e3e1Schristos #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
864e98e3e1Schristos   /* lock */
874e98e3e1Schristos   BI h_lock;
884e98e3e1Schristos #define GET_H_LOCK() CPU (h_lock)
894e98e3e1Schristos #define SET_H_LOCK(x) (CPU (h_lock) = (x))
904e98e3e1Schristos   } hardware;
91*05fa0856Schristos #define CPU_CGEN_HW(cpu) (& M32R_SIM_CPU (cpu)->cpu_data.hardware)
924e98e3e1Schristos } M32RBF_CPU_DATA;
934e98e3e1Schristos 
944e98e3e1Schristos /* Cover fns for register access.  */
954e98e3e1Schristos USI m32rbf_h_pc_get (SIM_CPU *);
964e98e3e1Schristos void m32rbf_h_pc_set (SIM_CPU *, USI);
974e98e3e1Schristos SI m32rbf_h_gr_get (SIM_CPU *, UINT);
984e98e3e1Schristos void m32rbf_h_gr_set (SIM_CPU *, UINT, SI);
994e98e3e1Schristos USI m32rbf_h_cr_get (SIM_CPU *, UINT);
1004e98e3e1Schristos void m32rbf_h_cr_set (SIM_CPU *, UINT, USI);
1014e98e3e1Schristos DI m32rbf_h_accum_get (SIM_CPU *);
1024e98e3e1Schristos void m32rbf_h_accum_set (SIM_CPU *, DI);
1034e98e3e1Schristos BI m32rbf_h_cond_get (SIM_CPU *);
1044e98e3e1Schristos void m32rbf_h_cond_set (SIM_CPU *, BI);
1054e98e3e1Schristos UQI m32rbf_h_psw_get (SIM_CPU *);
1064e98e3e1Schristos void m32rbf_h_psw_set (SIM_CPU *, UQI);
1074e98e3e1Schristos UQI m32rbf_h_bpsw_get (SIM_CPU *);
1084e98e3e1Schristos void m32rbf_h_bpsw_set (SIM_CPU *, UQI);
1094e98e3e1Schristos UQI m32rbf_h_bbpsw_get (SIM_CPU *);
1104e98e3e1Schristos void m32rbf_h_bbpsw_set (SIM_CPU *, UQI);
1114e98e3e1Schristos BI m32rbf_h_lock_get (SIM_CPU *);
1124e98e3e1Schristos void m32rbf_h_lock_set (SIM_CPU *, BI);
1134e98e3e1Schristos 
1144e98e3e1Schristos /* These must be hand-written.  */
1154e98e3e1Schristos extern CPUREG_FETCH_FN m32rbf_fetch_register;
1164e98e3e1Schristos extern CPUREG_STORE_FN m32rbf_store_register;
1174e98e3e1Schristos 
1184e98e3e1Schristos typedef struct {
1194e98e3e1Schristos   UINT h_gr;
1204e98e3e1Schristos } MODEL_M32R_D_DATA;
1214e98e3e1Schristos 
1224e98e3e1Schristos typedef struct {
1234e98e3e1Schristos   int empty;
1244e98e3e1Schristos } MODEL_TEST_DATA;
1254e98e3e1Schristos 
1264e98e3e1Schristos /* Instruction argument buffer.  */
1274e98e3e1Schristos 
1284e98e3e1Schristos union sem_fields {
1294e98e3e1Schristos   struct { /* no operands */
1304e98e3e1Schristos     int empty;
1314e98e3e1Schristos   } sfmt_empty;
1324e98e3e1Schristos   struct { /*  */
1334e98e3e1Schristos     UINT f_uimm8;
1344e98e3e1Schristos   } sfmt_clrpsw;
1354e98e3e1Schristos   struct { /*  */
1364e98e3e1Schristos     UINT f_uimm4;
1374e98e3e1Schristos   } sfmt_trap;
1384e98e3e1Schristos   struct { /*  */
1394e98e3e1Schristos     IADDR i_disp24;
1404e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1414e98e3e1Schristos   } sfmt_bl24;
1424e98e3e1Schristos   struct { /*  */
1434e98e3e1Schristos     IADDR i_disp8;
1444e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1454e98e3e1Schristos   } sfmt_bl8;
1464e98e3e1Schristos   struct { /*  */
1474e98e3e1Schristos     SI* i_dr;
1484e98e3e1Schristos     UINT f_hi16;
1494e98e3e1Schristos     UINT f_r1;
1504e98e3e1Schristos     unsigned char out_dr;
1514e98e3e1Schristos   } sfmt_seth;
1524e98e3e1Schristos   struct { /*  */
1534e98e3e1Schristos     ADDR i_uimm24;
1544e98e3e1Schristos     SI* i_dr;
1554e98e3e1Schristos     UINT f_r1;
1564e98e3e1Schristos     unsigned char out_dr;
1574e98e3e1Schristos   } sfmt_ld24;
1584e98e3e1Schristos   struct { /*  */
1594e98e3e1Schristos     SI* i_sr;
1604e98e3e1Schristos     UINT f_r2;
1614e98e3e1Schristos     unsigned char in_sr;
1624e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1634e98e3e1Schristos   } sfmt_jl;
1644e98e3e1Schristos   struct { /*  */
1654e98e3e1Schristos     SI* i_sr;
1664e98e3e1Schristos     INT f_simm16;
1674e98e3e1Schristos     UINT f_r2;
1684e98e3e1Schristos     UINT f_uimm3;
1694e98e3e1Schristos     unsigned char in_sr;
1704e98e3e1Schristos   } sfmt_bset;
1714e98e3e1Schristos   struct { /*  */
1724e98e3e1Schristos     SI* i_dr;
1734e98e3e1Schristos     UINT f_r1;
1744e98e3e1Schristos     UINT f_uimm5;
1754e98e3e1Schristos     unsigned char in_dr;
1764e98e3e1Schristos     unsigned char out_dr;
1774e98e3e1Schristos   } sfmt_slli;
1784e98e3e1Schristos   struct { /*  */
1794e98e3e1Schristos     SI* i_dr;
1804e98e3e1Schristos     INT f_simm8;
1814e98e3e1Schristos     UINT f_r1;
1824e98e3e1Schristos     unsigned char in_dr;
1834e98e3e1Schristos     unsigned char out_dr;
1844e98e3e1Schristos   } sfmt_addi;
1854e98e3e1Schristos   struct { /*  */
1864e98e3e1Schristos     SI* i_src1;
1874e98e3e1Schristos     SI* i_src2;
1884e98e3e1Schristos     UINT f_r1;
1894e98e3e1Schristos     UINT f_r2;
1904e98e3e1Schristos     unsigned char in_src1;
1914e98e3e1Schristos     unsigned char in_src2;
1924e98e3e1Schristos     unsigned char out_src2;
1934e98e3e1Schristos   } sfmt_st_plus;
1944e98e3e1Schristos   struct { /*  */
1954e98e3e1Schristos     SI* i_src1;
1964e98e3e1Schristos     SI* i_src2;
1974e98e3e1Schristos     INT f_simm16;
1984e98e3e1Schristos     UINT f_r1;
1994e98e3e1Schristos     UINT f_r2;
2004e98e3e1Schristos     unsigned char in_src1;
2014e98e3e1Schristos     unsigned char in_src2;
2024e98e3e1Schristos   } sfmt_st_d;
2034e98e3e1Schristos   struct { /*  */
2044e98e3e1Schristos     SI* i_dr;
2054e98e3e1Schristos     SI* i_sr;
2064e98e3e1Schristos     UINT f_r1;
2074e98e3e1Schristos     UINT f_r2;
2084e98e3e1Schristos     unsigned char in_sr;
2094e98e3e1Schristos     unsigned char out_dr;
2104e98e3e1Schristos     unsigned char out_sr;
2114e98e3e1Schristos   } sfmt_ld_plus;
2124e98e3e1Schristos   struct { /*  */
2134e98e3e1Schristos     IADDR i_disp16;
2144e98e3e1Schristos     SI* i_src1;
2154e98e3e1Schristos     SI* i_src2;
2164e98e3e1Schristos     UINT f_r1;
2174e98e3e1Schristos     UINT f_r2;
2184e98e3e1Schristos     unsigned char in_src1;
2194e98e3e1Schristos     unsigned char in_src2;
2204e98e3e1Schristos   } sfmt_beq;
2214e98e3e1Schristos   struct { /*  */
2224e98e3e1Schristos     SI* i_dr;
2234e98e3e1Schristos     SI* i_sr;
2244e98e3e1Schristos     UINT f_r1;
2254e98e3e1Schristos     UINT f_r2;
2264e98e3e1Schristos     UINT f_uimm16;
2274e98e3e1Schristos     unsigned char in_sr;
2284e98e3e1Schristos     unsigned char out_dr;
2294e98e3e1Schristos   } sfmt_and3;
2304e98e3e1Schristos   struct { /*  */
2314e98e3e1Schristos     SI* i_dr;
2324e98e3e1Schristos     SI* i_sr;
2334e98e3e1Schristos     INT f_simm16;
2344e98e3e1Schristos     UINT f_r1;
2354e98e3e1Schristos     UINT f_r2;
2364e98e3e1Schristos     unsigned char in_sr;
2374e98e3e1Schristos     unsigned char out_dr;
2384e98e3e1Schristos   } sfmt_add3;
2394e98e3e1Schristos   struct { /*  */
2404e98e3e1Schristos     SI* i_dr;
2414e98e3e1Schristos     SI* i_sr;
2424e98e3e1Schristos     UINT f_r1;
2434e98e3e1Schristos     UINT f_r2;
2444e98e3e1Schristos     unsigned char in_dr;
2454e98e3e1Schristos     unsigned char in_sr;
2464e98e3e1Schristos     unsigned char out_dr;
2474e98e3e1Schristos   } sfmt_add;
2484e98e3e1Schristos #if WITH_SCACHE_PBB
2494e98e3e1Schristos   /* Writeback handler.  */
2504e98e3e1Schristos   struct {
2514e98e3e1Schristos     /* Pointer to argbuf entry for insn whose results need writing back.  */
2524e98e3e1Schristos     const struct argbuf *abuf;
2534e98e3e1Schristos   } write;
2544e98e3e1Schristos   /* x-before handler */
2554e98e3e1Schristos   struct {
2564e98e3e1Schristos     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
2574e98e3e1Schristos     int first_p;
2584e98e3e1Schristos   } before;
2594e98e3e1Schristos   /* x-after handler */
2604e98e3e1Schristos   struct {
2614e98e3e1Schristos     int empty;
2624e98e3e1Schristos   } after;
2634e98e3e1Schristos   /* This entry is used to terminate each pbb.  */
2644e98e3e1Schristos   struct {
2654e98e3e1Schristos     /* Number of insns in pbb.  */
2664e98e3e1Schristos     int insn_count;
2674e98e3e1Schristos     /* Next pbb to execute.  */
2684e98e3e1Schristos     SCACHE *next;
2694e98e3e1Schristos     SCACHE *branch_target;
2704e98e3e1Schristos   } chain;
2714e98e3e1Schristos #endif
2724e98e3e1Schristos };
2734e98e3e1Schristos 
2744e98e3e1Schristos /* The ARGBUF struct.  */
2754e98e3e1Schristos struct argbuf {
2764e98e3e1Schristos   /* These are the baseclass definitions.  */
2774e98e3e1Schristos   IADDR addr;
2784e98e3e1Schristos   const IDESC *idesc;
2794e98e3e1Schristos   char trace_p;
2804e98e3e1Schristos   char profile_p;
2814e98e3e1Schristos   /* ??? Temporary hack for skip insns.  */
2824e98e3e1Schristos   char skip_count;
2834e98e3e1Schristos   char unused;
2844e98e3e1Schristos   /* cpu specific data follows */
2854e98e3e1Schristos   union sem semantic;
2864e98e3e1Schristos   int written;
2874e98e3e1Schristos   union sem_fields fields;
2884e98e3e1Schristos };
2894e98e3e1Schristos 
2904e98e3e1Schristos /* A cached insn.
2914e98e3e1Schristos 
2924e98e3e1Schristos    ??? SCACHE used to contain more than just argbuf.  We could delete the
2934e98e3e1Schristos    type entirely and always just use ARGBUF, but for future concerns and as
2944e98e3e1Schristos    a level of abstraction it is left in.  */
2954e98e3e1Schristos 
2964e98e3e1Schristos struct scache {
2974e98e3e1Schristos   struct argbuf argbuf;
2984e98e3e1Schristos };
2994e98e3e1Schristos 
3004e98e3e1Schristos /* Macros to simplify extraction, reading and semantic code.
3014e98e3e1Schristos    These define and assign the local vars that contain the insn's fields.  */
3024e98e3e1Schristos 
3034e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_VARS \
3044e98e3e1Schristos   unsigned int length;
3054e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_CODE \
3064e98e3e1Schristos   length = 0; \
3074e98e3e1Schristos 
3084e98e3e1Schristos #define EXTRACT_IFMT_ADD_VARS \
3094e98e3e1Schristos   UINT f_op1; \
3104e98e3e1Schristos   UINT f_r1; \
3114e98e3e1Schristos   UINT f_op2; \
3124e98e3e1Schristos   UINT f_r2; \
3134e98e3e1Schristos   unsigned int length;
3144e98e3e1Schristos #define EXTRACT_IFMT_ADD_CODE \
3154e98e3e1Schristos   length = 2; \
3164e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
3174e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
3184e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
3194e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
3204e98e3e1Schristos 
3214e98e3e1Schristos #define EXTRACT_IFMT_ADD3_VARS \
3224e98e3e1Schristos   UINT f_op1; \
3234e98e3e1Schristos   UINT f_r1; \
3244e98e3e1Schristos   UINT f_op2; \
3254e98e3e1Schristos   UINT f_r2; \
3264e98e3e1Schristos   INT f_simm16; \
3274e98e3e1Schristos   unsigned int length;
3284e98e3e1Schristos #define EXTRACT_IFMT_ADD3_CODE \
3294e98e3e1Schristos   length = 4; \
3304e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3314e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3324e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3334e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3344e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
3354e98e3e1Schristos 
3364e98e3e1Schristos #define EXTRACT_IFMT_AND3_VARS \
3374e98e3e1Schristos   UINT f_op1; \
3384e98e3e1Schristos   UINT f_r1; \
3394e98e3e1Schristos   UINT f_op2; \
3404e98e3e1Schristos   UINT f_r2; \
3414e98e3e1Schristos   UINT f_uimm16; \
3424e98e3e1Schristos   unsigned int length;
3434e98e3e1Schristos #define EXTRACT_IFMT_AND3_CODE \
3444e98e3e1Schristos   length = 4; \
3454e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3464e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3474e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3484e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3494e98e3e1Schristos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
3504e98e3e1Schristos 
3514e98e3e1Schristos #define EXTRACT_IFMT_OR3_VARS \
3524e98e3e1Schristos   UINT f_op1; \
3534e98e3e1Schristos   UINT f_r1; \
3544e98e3e1Schristos   UINT f_op2; \
3554e98e3e1Schristos   UINT f_r2; \
3564e98e3e1Schristos   UINT f_uimm16; \
3574e98e3e1Schristos   unsigned int length;
3584e98e3e1Schristos #define EXTRACT_IFMT_OR3_CODE \
3594e98e3e1Schristos   length = 4; \
3604e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3614e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3624e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3634e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3644e98e3e1Schristos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
3654e98e3e1Schristos 
3664e98e3e1Schristos #define EXTRACT_IFMT_ADDI_VARS \
3674e98e3e1Schristos   UINT f_op1; \
3684e98e3e1Schristos   UINT f_r1; \
3694e98e3e1Schristos   INT f_simm8; \
3704e98e3e1Schristos   unsigned int length;
3714e98e3e1Schristos #define EXTRACT_IFMT_ADDI_CODE \
3724e98e3e1Schristos   length = 2; \
3734e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
3744e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
3754e98e3e1Schristos   f_simm8 = EXTRACT_MSB0_SINT (insn, 16, 8, 8); \
3764e98e3e1Schristos 
3774e98e3e1Schristos #define EXTRACT_IFMT_ADDV3_VARS \
3784e98e3e1Schristos   UINT f_op1; \
3794e98e3e1Schristos   UINT f_r1; \
3804e98e3e1Schristos   UINT f_op2; \
3814e98e3e1Schristos   UINT f_r2; \
3824e98e3e1Schristos   INT f_simm16; \
3834e98e3e1Schristos   unsigned int length;
3844e98e3e1Schristos #define EXTRACT_IFMT_ADDV3_CODE \
3854e98e3e1Schristos   length = 4; \
3864e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3874e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3884e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3894e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3904e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
3914e98e3e1Schristos 
3924e98e3e1Schristos #define EXTRACT_IFMT_BC8_VARS \
3934e98e3e1Schristos   UINT f_op1; \
3944e98e3e1Schristos   UINT f_r1; \
3954e98e3e1Schristos   SI f_disp8; \
3964e98e3e1Schristos   unsigned int length;
3974e98e3e1Schristos #define EXTRACT_IFMT_BC8_CODE \
3984e98e3e1Schristos   length = 2; \
3994e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4004e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
401*05fa0856Schristos   f_disp8 = ((((EXTRACT_MSB0_SINT (insn, 16, 8, 8)) * (4))) + (((pc) & (-4)))); \
4024e98e3e1Schristos 
4034e98e3e1Schristos #define EXTRACT_IFMT_BC24_VARS \
4044e98e3e1Schristos   UINT f_op1; \
4054e98e3e1Schristos   UINT f_r1; \
4064e98e3e1Schristos   SI f_disp24; \
4074e98e3e1Schristos   unsigned int length;
4084e98e3e1Schristos #define EXTRACT_IFMT_BC24_CODE \
4094e98e3e1Schristos   length = 4; \
4104e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4114e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
412*05fa0856Schristos   f_disp24 = ((((EXTRACT_MSB0_SINT (insn, 32, 8, 24)) * (4))) + (pc)); \
4134e98e3e1Schristos 
4144e98e3e1Schristos #define EXTRACT_IFMT_BEQ_VARS \
4154e98e3e1Schristos   UINT f_op1; \
4164e98e3e1Schristos   UINT f_r1; \
4174e98e3e1Schristos   UINT f_op2; \
4184e98e3e1Schristos   UINT f_r2; \
4194e98e3e1Schristos   SI f_disp16; \
4204e98e3e1Schristos   unsigned int length;
4214e98e3e1Schristos #define EXTRACT_IFMT_BEQ_CODE \
4224e98e3e1Schristos   length = 4; \
4234e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4244e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4254e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4264e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
427*05fa0856Schristos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
4284e98e3e1Schristos 
4294e98e3e1Schristos #define EXTRACT_IFMT_BEQZ_VARS \
4304e98e3e1Schristos   UINT f_op1; \
4314e98e3e1Schristos   UINT f_r1; \
4324e98e3e1Schristos   UINT f_op2; \
4334e98e3e1Schristos   UINT f_r2; \
4344e98e3e1Schristos   SI f_disp16; \
4354e98e3e1Schristos   unsigned int length;
4364e98e3e1Schristos #define EXTRACT_IFMT_BEQZ_CODE \
4374e98e3e1Schristos   length = 4; \
4384e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4394e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4404e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4414e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
442*05fa0856Schristos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
4434e98e3e1Schristos 
4444e98e3e1Schristos #define EXTRACT_IFMT_CMP_VARS \
4454e98e3e1Schristos   UINT f_op1; \
4464e98e3e1Schristos   UINT f_r1; \
4474e98e3e1Schristos   UINT f_op2; \
4484e98e3e1Schristos   UINT f_r2; \
4494e98e3e1Schristos   unsigned int length;
4504e98e3e1Schristos #define EXTRACT_IFMT_CMP_CODE \
4514e98e3e1Schristos   length = 2; \
4524e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4534e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
4544e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
4554e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
4564e98e3e1Schristos 
4574e98e3e1Schristos #define EXTRACT_IFMT_CMPI_VARS \
4584e98e3e1Schristos   UINT f_op1; \
4594e98e3e1Schristos   UINT f_r1; \
4604e98e3e1Schristos   UINT f_op2; \
4614e98e3e1Schristos   UINT f_r2; \
4624e98e3e1Schristos   INT f_simm16; \
4634e98e3e1Schristos   unsigned int length;
4644e98e3e1Schristos #define EXTRACT_IFMT_CMPI_CODE \
4654e98e3e1Schristos   length = 4; \
4664e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4674e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4684e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4694e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
4704e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
4714e98e3e1Schristos 
4724e98e3e1Schristos #define EXTRACT_IFMT_DIV_VARS \
4734e98e3e1Schristos   UINT f_op1; \
4744e98e3e1Schristos   UINT f_r1; \
4754e98e3e1Schristos   UINT f_op2; \
4764e98e3e1Schristos   UINT f_r2; \
4774e98e3e1Schristos   INT f_simm16; \
4784e98e3e1Schristos   unsigned int length;
4794e98e3e1Schristos #define EXTRACT_IFMT_DIV_CODE \
4804e98e3e1Schristos   length = 4; \
4814e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4824e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4834e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4844e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
4854e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
4864e98e3e1Schristos 
4874e98e3e1Schristos #define EXTRACT_IFMT_JL_VARS \
4884e98e3e1Schristos   UINT f_op1; \
4894e98e3e1Schristos   UINT f_r1; \
4904e98e3e1Schristos   UINT f_op2; \
4914e98e3e1Schristos   UINT f_r2; \
4924e98e3e1Schristos   unsigned int length;
4934e98e3e1Schristos #define EXTRACT_IFMT_JL_CODE \
4944e98e3e1Schristos   length = 2; \
4954e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4964e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
4974e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
4984e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
4994e98e3e1Schristos 
5004e98e3e1Schristos #define EXTRACT_IFMT_LD24_VARS \
5014e98e3e1Schristos   UINT f_op1; \
5024e98e3e1Schristos   UINT f_r1; \
5034e98e3e1Schristos   UINT f_uimm24; \
5044e98e3e1Schristos   unsigned int length;
5054e98e3e1Schristos #define EXTRACT_IFMT_LD24_CODE \
5064e98e3e1Schristos   length = 4; \
5074e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
5084e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
5094e98e3e1Schristos   f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
5104e98e3e1Schristos 
5114e98e3e1Schristos #define EXTRACT_IFMT_LDI16_VARS \
5124e98e3e1Schristos   UINT f_op1; \
5134e98e3e1Schristos   UINT f_r1; \
5144e98e3e1Schristos   UINT f_op2; \
5154e98e3e1Schristos   UINT f_r2; \
5164e98e3e1Schristos   INT f_simm16; \
5174e98e3e1Schristos   unsigned int length;
5184e98e3e1Schristos #define EXTRACT_IFMT_LDI16_CODE \
5194e98e3e1Schristos   length = 4; \
5204e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
5214e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
5224e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
5234e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
5244e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
5254e98e3e1Schristos 
5264e98e3e1Schristos #define EXTRACT_IFMT_MVFACHI_VARS \
5274e98e3e1Schristos   UINT f_op1; \
5284e98e3e1Schristos   UINT f_r1; \
5294e98e3e1Schristos   UINT f_op2; \
5304e98e3e1Schristos   UINT f_r2; \
5314e98e3e1Schristos   unsigned int length;
5324e98e3e1Schristos #define EXTRACT_IFMT_MVFACHI_CODE \
5334e98e3e1Schristos   length = 2; \
5344e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5354e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5364e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5374e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5384e98e3e1Schristos 
5394e98e3e1Schristos #define EXTRACT_IFMT_MVFC_VARS \
5404e98e3e1Schristos   UINT f_op1; \
5414e98e3e1Schristos   UINT f_r1; \
5424e98e3e1Schristos   UINT f_op2; \
5434e98e3e1Schristos   UINT f_r2; \
5444e98e3e1Schristos   unsigned int length;
5454e98e3e1Schristos #define EXTRACT_IFMT_MVFC_CODE \
5464e98e3e1Schristos   length = 2; \
5474e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5484e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5494e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5504e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5514e98e3e1Schristos 
5524e98e3e1Schristos #define EXTRACT_IFMT_MVTACHI_VARS \
5534e98e3e1Schristos   UINT f_op1; \
5544e98e3e1Schristos   UINT f_r1; \
5554e98e3e1Schristos   UINT f_op2; \
5564e98e3e1Schristos   UINT f_r2; \
5574e98e3e1Schristos   unsigned int length;
5584e98e3e1Schristos #define EXTRACT_IFMT_MVTACHI_CODE \
5594e98e3e1Schristos   length = 2; \
5604e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5614e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5624e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5634e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5644e98e3e1Schristos 
5654e98e3e1Schristos #define EXTRACT_IFMT_MVTC_VARS \
5664e98e3e1Schristos   UINT f_op1; \
5674e98e3e1Schristos   UINT f_r1; \
5684e98e3e1Schristos   UINT f_op2; \
5694e98e3e1Schristos   UINT f_r2; \
5704e98e3e1Schristos   unsigned int length;
5714e98e3e1Schristos #define EXTRACT_IFMT_MVTC_CODE \
5724e98e3e1Schristos   length = 2; \
5734e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5744e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5754e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5764e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5774e98e3e1Schristos 
5784e98e3e1Schristos #define EXTRACT_IFMT_NOP_VARS \
5794e98e3e1Schristos   UINT f_op1; \
5804e98e3e1Schristos   UINT f_r1; \
5814e98e3e1Schristos   UINT f_op2; \
5824e98e3e1Schristos   UINT f_r2; \
5834e98e3e1Schristos   unsigned int length;
5844e98e3e1Schristos #define EXTRACT_IFMT_NOP_CODE \
5854e98e3e1Schristos   length = 2; \
5864e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5874e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5884e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5894e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5904e98e3e1Schristos 
5914e98e3e1Schristos #define EXTRACT_IFMT_SETH_VARS \
5924e98e3e1Schristos   UINT f_op1; \
5934e98e3e1Schristos   UINT f_r1; \
5944e98e3e1Schristos   UINT f_op2; \
5954e98e3e1Schristos   UINT f_r2; \
5964e98e3e1Schristos   UINT f_hi16; \
5974e98e3e1Schristos   unsigned int length;
5984e98e3e1Schristos #define EXTRACT_IFMT_SETH_CODE \
5994e98e3e1Schristos   length = 4; \
6004e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
6014e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
6024e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
6034e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
6044e98e3e1Schristos   f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
6054e98e3e1Schristos 
6064e98e3e1Schristos #define EXTRACT_IFMT_SLLI_VARS \
6074e98e3e1Schristos   UINT f_op1; \
6084e98e3e1Schristos   UINT f_r1; \
6094e98e3e1Schristos   UINT f_shift_op2; \
6104e98e3e1Schristos   UINT f_uimm5; \
6114e98e3e1Schristos   unsigned int length;
6124e98e3e1Schristos #define EXTRACT_IFMT_SLLI_CODE \
6134e98e3e1Schristos   length = 2; \
6144e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6154e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6164e98e3e1Schristos   f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
6174e98e3e1Schristos   f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
6184e98e3e1Schristos 
6194e98e3e1Schristos #define EXTRACT_IFMT_ST_D_VARS \
6204e98e3e1Schristos   UINT f_op1; \
6214e98e3e1Schristos   UINT f_r1; \
6224e98e3e1Schristos   UINT f_op2; \
6234e98e3e1Schristos   UINT f_r2; \
6244e98e3e1Schristos   INT f_simm16; \
6254e98e3e1Schristos   unsigned int length;
6264e98e3e1Schristos #define EXTRACT_IFMT_ST_D_CODE \
6274e98e3e1Schristos   length = 4; \
6284e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
6294e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
6304e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
6314e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
6324e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
6334e98e3e1Schristos 
6344e98e3e1Schristos #define EXTRACT_IFMT_TRAP_VARS \
6354e98e3e1Schristos   UINT f_op1; \
6364e98e3e1Schristos   UINT f_r1; \
6374e98e3e1Schristos   UINT f_op2; \
6384e98e3e1Schristos   UINT f_uimm4; \
6394e98e3e1Schristos   unsigned int length;
6404e98e3e1Schristos #define EXTRACT_IFMT_TRAP_CODE \
6414e98e3e1Schristos   length = 2; \
6424e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6434e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6444e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6454e98e3e1Schristos   f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
6464e98e3e1Schristos 
6474e98e3e1Schristos #define EXTRACT_IFMT_CLRPSW_VARS \
6484e98e3e1Schristos   UINT f_op1; \
6494e98e3e1Schristos   UINT f_r1; \
6504e98e3e1Schristos   UINT f_uimm8; \
6514e98e3e1Schristos   unsigned int length;
6524e98e3e1Schristos #define EXTRACT_IFMT_CLRPSW_CODE \
6534e98e3e1Schristos   length = 2; \
6544e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6554e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6564e98e3e1Schristos   f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
6574e98e3e1Schristos 
6584e98e3e1Schristos #define EXTRACT_IFMT_BSET_VARS \
6594e98e3e1Schristos   UINT f_op1; \
6604e98e3e1Schristos   UINT f_bit4; \
6614e98e3e1Schristos   UINT f_uimm3; \
6624e98e3e1Schristos   UINT f_op2; \
6634e98e3e1Schristos   UINT f_r2; \
6644e98e3e1Schristos   INT f_simm16; \
6654e98e3e1Schristos   unsigned int length;
6664e98e3e1Schristos #define EXTRACT_IFMT_BSET_CODE \
6674e98e3e1Schristos   length = 4; \
6684e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
6694e98e3e1Schristos   f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
6704e98e3e1Schristos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
6714e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
6724e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
6734e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
6744e98e3e1Schristos 
6754e98e3e1Schristos #define EXTRACT_IFMT_BTST_VARS \
6764e98e3e1Schristos   UINT f_op1; \
6774e98e3e1Schristos   UINT f_bit4; \
6784e98e3e1Schristos   UINT f_uimm3; \
6794e98e3e1Schristos   UINT f_op2; \
6804e98e3e1Schristos   UINT f_r2; \
6814e98e3e1Schristos   unsigned int length;
6824e98e3e1Schristos #define EXTRACT_IFMT_BTST_CODE \
6834e98e3e1Schristos   length = 2; \
6844e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6854e98e3e1Schristos   f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
6864e98e3e1Schristos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
6874e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6884e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
6894e98e3e1Schristos 
6904e98e3e1Schristos /* Collection of various things for the trace handler to use.  */
6914e98e3e1Schristos 
6924e98e3e1Schristos typedef struct trace_record {
6934e98e3e1Schristos   IADDR pc;
6944e98e3e1Schristos   /* FIXME:wip */
6954e98e3e1Schristos } TRACE_RECORD;
6964e98e3e1Schristos 
6974e98e3e1Schristos #endif /* CPU_M32RBF_H */
698