xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32r/cpu2.h (revision 05fa08567a80471fd0eb3843a238392874f2577c)
14e98e3e1Schristos /* CPU family header for m32r2f.
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_M32R2F_H
264e98e3e1Schristos #define CPU_M32R2F_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 2
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) m32r2f_h_cr_get_handler (current_cpu, index)
564e98e3e1Schristos #define SET_H_CR(index, x) \
574e98e3e1Schristos do { \
584e98e3e1Schristos m32r2f_h_cr_set_handler (current_cpu, (index), (x));\
594e98e3e1Schristos ;} while (0)
604e98e3e1Schristos   /* accumulator */
614e98e3e1Schristos   DI h_accum;
624e98e3e1Schristos #define GET_H_ACCUM() m32r2f_h_accum_get_handler (current_cpu)
634e98e3e1Schristos #define SET_H_ACCUM(x) \
644e98e3e1Schristos do { \
654e98e3e1Schristos m32r2f_h_accum_set_handler (current_cpu, (x));\
664e98e3e1Schristos ;} while (0)
674e98e3e1Schristos   /* accumulators */
684e98e3e1Schristos   DI h_accums[2];
694e98e3e1Schristos #define GET_H_ACCUMS(index) m32r2f_h_accums_get_handler (current_cpu, index)
704e98e3e1Schristos #define SET_H_ACCUMS(index, x) \
714e98e3e1Schristos do { \
724e98e3e1Schristos m32r2f_h_accums_set_handler (current_cpu, (index), (x));\
734e98e3e1Schristos ;} while (0)
744e98e3e1Schristos   /* condition bit */
754e98e3e1Schristos   BI h_cond;
764e98e3e1Schristos #define GET_H_COND() CPU (h_cond)
774e98e3e1Schristos #define SET_H_COND(x) (CPU (h_cond) = (x))
784e98e3e1Schristos   /* psw part of psw */
794e98e3e1Schristos   UQI h_psw;
804e98e3e1Schristos #define GET_H_PSW() m32r2f_h_psw_get_handler (current_cpu)
814e98e3e1Schristos #define SET_H_PSW(x) \
824e98e3e1Schristos do { \
834e98e3e1Schristos m32r2f_h_psw_set_handler (current_cpu, (x));\
844e98e3e1Schristos ;} while (0)
854e98e3e1Schristos   /* backup psw */
864e98e3e1Schristos   UQI h_bpsw;
874e98e3e1Schristos #define GET_H_BPSW() CPU (h_bpsw)
884e98e3e1Schristos #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
894e98e3e1Schristos   /* backup bpsw */
904e98e3e1Schristos   UQI h_bbpsw;
914e98e3e1Schristos #define GET_H_BBPSW() CPU (h_bbpsw)
924e98e3e1Schristos #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
934e98e3e1Schristos   /* lock */
944e98e3e1Schristos   BI h_lock;
954e98e3e1Schristos #define GET_H_LOCK() CPU (h_lock)
964e98e3e1Schristos #define SET_H_LOCK(x) (CPU (h_lock) = (x))
974e98e3e1Schristos   } hardware;
98*05fa0856Schristos #define CPU_CGEN_HW(cpu) (& M32R_SIM_CPU (cpu)->cpu_data.hardware)
994e98e3e1Schristos } M32R2F_CPU_DATA;
1004e98e3e1Schristos 
1014e98e3e1Schristos /* Cover fns for register access.  */
1024e98e3e1Schristos USI m32r2f_h_pc_get (SIM_CPU *);
1034e98e3e1Schristos void m32r2f_h_pc_set (SIM_CPU *, USI);
1044e98e3e1Schristos SI m32r2f_h_gr_get (SIM_CPU *, UINT);
1054e98e3e1Schristos void m32r2f_h_gr_set (SIM_CPU *, UINT, SI);
1064e98e3e1Schristos USI m32r2f_h_cr_get (SIM_CPU *, UINT);
1074e98e3e1Schristos void m32r2f_h_cr_set (SIM_CPU *, UINT, USI);
1084e98e3e1Schristos DI m32r2f_h_accum_get (SIM_CPU *);
1094e98e3e1Schristos void m32r2f_h_accum_set (SIM_CPU *, DI);
1104e98e3e1Schristos DI m32r2f_h_accums_get (SIM_CPU *, UINT);
1114e98e3e1Schristos void m32r2f_h_accums_set (SIM_CPU *, UINT, DI);
1124e98e3e1Schristos BI m32r2f_h_cond_get (SIM_CPU *);
1134e98e3e1Schristos void m32r2f_h_cond_set (SIM_CPU *, BI);
1144e98e3e1Schristos UQI m32r2f_h_psw_get (SIM_CPU *);
1154e98e3e1Schristos void m32r2f_h_psw_set (SIM_CPU *, UQI);
1164e98e3e1Schristos UQI m32r2f_h_bpsw_get (SIM_CPU *);
1174e98e3e1Schristos void m32r2f_h_bpsw_set (SIM_CPU *, UQI);
1184e98e3e1Schristos UQI m32r2f_h_bbpsw_get (SIM_CPU *);
1194e98e3e1Schristos void m32r2f_h_bbpsw_set (SIM_CPU *, UQI);
1204e98e3e1Schristos BI m32r2f_h_lock_get (SIM_CPU *);
1214e98e3e1Schristos void m32r2f_h_lock_set (SIM_CPU *, BI);
1224e98e3e1Schristos 
1234e98e3e1Schristos /* These must be hand-written.  */
1244e98e3e1Schristos extern CPUREG_FETCH_FN m32r2f_fetch_register;
1254e98e3e1Schristos extern CPUREG_STORE_FN m32r2f_store_register;
1264e98e3e1Schristos 
1274e98e3e1Schristos typedef struct {
1284e98e3e1Schristos   int empty;
1294e98e3e1Schristos } MODEL_M32R2_DATA;
1304e98e3e1Schristos 
1314e98e3e1Schristos /* Instruction argument buffer.  */
1324e98e3e1Schristos 
1334e98e3e1Schristos union sem_fields {
1344e98e3e1Schristos   struct { /* no operands */
1354e98e3e1Schristos     int empty;
1364e98e3e1Schristos   } sfmt_empty;
1374e98e3e1Schristos   struct { /*  */
1384e98e3e1Schristos     UINT f_uimm8;
1394e98e3e1Schristos   } sfmt_clrpsw;
1404e98e3e1Schristos   struct { /*  */
1414e98e3e1Schristos     UINT f_uimm4;
1424e98e3e1Schristos   } sfmt_trap;
1434e98e3e1Schristos   struct { /*  */
1444e98e3e1Schristos     IADDR i_disp24;
1454e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1464e98e3e1Schristos   } sfmt_bl24;
1474e98e3e1Schristos   struct { /*  */
1484e98e3e1Schristos     IADDR i_disp8;
1494e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1504e98e3e1Schristos   } sfmt_bl8;
1514e98e3e1Schristos   struct { /*  */
1524e98e3e1Schristos     SI f_imm1;
1534e98e3e1Schristos     UINT f_accd;
1544e98e3e1Schristos     UINT f_accs;
1554e98e3e1Schristos   } sfmt_rac_dsi;
1564e98e3e1Schristos   struct { /*  */
1574e98e3e1Schristos     SI* i_dr;
1584e98e3e1Schristos     UINT f_hi16;
1594e98e3e1Schristos     UINT f_r1;
1604e98e3e1Schristos     unsigned char out_dr;
1614e98e3e1Schristos   } sfmt_seth;
1624e98e3e1Schristos   struct { /*  */
1634e98e3e1Schristos     SI* i_src1;
1644e98e3e1Schristos     UINT f_accs;
1654e98e3e1Schristos     UINT f_r1;
1664e98e3e1Schristos     unsigned char in_src1;
1674e98e3e1Schristos   } sfmt_mvtachi_a;
1684e98e3e1Schristos   struct { /*  */
1694e98e3e1Schristos     SI* i_dr;
1704e98e3e1Schristos     UINT f_accs;
1714e98e3e1Schristos     UINT f_r1;
1724e98e3e1Schristos     unsigned char out_dr;
1734e98e3e1Schristos   } sfmt_mvfachi_a;
1744e98e3e1Schristos   struct { /*  */
1754e98e3e1Schristos     ADDR i_uimm24;
1764e98e3e1Schristos     SI* i_dr;
1774e98e3e1Schristos     UINT f_r1;
1784e98e3e1Schristos     unsigned char out_dr;
1794e98e3e1Schristos   } sfmt_ld24;
1804e98e3e1Schristos   struct { /*  */
1814e98e3e1Schristos     SI* i_sr;
1824e98e3e1Schristos     UINT f_r2;
1834e98e3e1Schristos     unsigned char in_sr;
1844e98e3e1Schristos     unsigned char out_h_gr_SI_14;
1854e98e3e1Schristos   } sfmt_jl;
1864e98e3e1Schristos   struct { /*  */
1874e98e3e1Schristos     SI* i_sr;
1884e98e3e1Schristos     INT f_simm16;
1894e98e3e1Schristos     UINT f_r2;
1904e98e3e1Schristos     UINT f_uimm3;
1914e98e3e1Schristos     unsigned char in_sr;
1924e98e3e1Schristos   } sfmt_bset;
1934e98e3e1Schristos   struct { /*  */
1944e98e3e1Schristos     SI* i_dr;
1954e98e3e1Schristos     UINT f_r1;
1964e98e3e1Schristos     UINT f_uimm5;
1974e98e3e1Schristos     unsigned char in_dr;
1984e98e3e1Schristos     unsigned char out_dr;
1994e98e3e1Schristos   } sfmt_slli;
2004e98e3e1Schristos   struct { /*  */
2014e98e3e1Schristos     SI* i_dr;
2024e98e3e1Schristos     INT f_simm8;
2034e98e3e1Schristos     UINT f_r1;
2044e98e3e1Schristos     unsigned char in_dr;
2054e98e3e1Schristos     unsigned char out_dr;
2064e98e3e1Schristos   } sfmt_addi;
2074e98e3e1Schristos   struct { /*  */
2084e98e3e1Schristos     SI* i_src1;
2094e98e3e1Schristos     SI* i_src2;
2104e98e3e1Schristos     UINT f_r1;
2114e98e3e1Schristos     UINT f_r2;
2124e98e3e1Schristos     unsigned char in_src1;
2134e98e3e1Schristos     unsigned char in_src2;
2144e98e3e1Schristos     unsigned char out_src2;
2154e98e3e1Schristos   } sfmt_st_plus;
2164e98e3e1Schristos   struct { /*  */
2174e98e3e1Schristos     SI* i_src1;
2184e98e3e1Schristos     SI* i_src2;
2194e98e3e1Schristos     INT f_simm16;
2204e98e3e1Schristos     UINT f_r1;
2214e98e3e1Schristos     UINT f_r2;
2224e98e3e1Schristos     unsigned char in_src1;
2234e98e3e1Schristos     unsigned char in_src2;
2244e98e3e1Schristos   } sfmt_st_d;
2254e98e3e1Schristos   struct { /*  */
2264e98e3e1Schristos     SI* i_src1;
2274e98e3e1Schristos     SI* i_src2;
2284e98e3e1Schristos     UINT f_acc;
2294e98e3e1Schristos     UINT f_r1;
2304e98e3e1Schristos     UINT f_r2;
2314e98e3e1Schristos     unsigned char in_src1;
2324e98e3e1Schristos     unsigned char in_src2;
2334e98e3e1Schristos   } sfmt_machi_a;
2344e98e3e1Schristos   struct { /*  */
2354e98e3e1Schristos     SI* i_dr;
2364e98e3e1Schristos     SI* i_sr;
2374e98e3e1Schristos     UINT f_r1;
2384e98e3e1Schristos     UINT f_r2;
2394e98e3e1Schristos     unsigned char in_sr;
2404e98e3e1Schristos     unsigned char out_dr;
2414e98e3e1Schristos     unsigned char out_sr;
2424e98e3e1Schristos   } sfmt_ld_plus;
2434e98e3e1Schristos   struct { /*  */
2444e98e3e1Schristos     IADDR i_disp16;
2454e98e3e1Schristos     SI* i_src1;
2464e98e3e1Schristos     SI* i_src2;
2474e98e3e1Schristos     UINT f_r1;
2484e98e3e1Schristos     UINT f_r2;
2494e98e3e1Schristos     unsigned char in_src1;
2504e98e3e1Schristos     unsigned char in_src2;
2514e98e3e1Schristos   } sfmt_beq;
2524e98e3e1Schristos   struct { /*  */
2534e98e3e1Schristos     SI* i_dr;
2544e98e3e1Schristos     SI* i_sr;
2554e98e3e1Schristos     UINT f_r1;
2564e98e3e1Schristos     UINT f_r2;
2574e98e3e1Schristos     UINT f_uimm16;
2584e98e3e1Schristos     unsigned char in_sr;
2594e98e3e1Schristos     unsigned char out_dr;
2604e98e3e1Schristos   } sfmt_and3;
2614e98e3e1Schristos   struct { /*  */
2624e98e3e1Schristos     SI* i_dr;
2634e98e3e1Schristos     SI* i_sr;
2644e98e3e1Schristos     INT f_simm16;
2654e98e3e1Schristos     UINT f_r1;
2664e98e3e1Schristos     UINT f_r2;
2674e98e3e1Schristos     unsigned char in_sr;
2684e98e3e1Schristos     unsigned char out_dr;
2694e98e3e1Schristos   } sfmt_add3;
2704e98e3e1Schristos   struct { /*  */
2714e98e3e1Schristos     SI* i_dr;
2724e98e3e1Schristos     SI* i_sr;
2734e98e3e1Schristos     UINT f_r1;
2744e98e3e1Schristos     UINT f_r2;
2754e98e3e1Schristos     unsigned char in_dr;
2764e98e3e1Schristos     unsigned char in_sr;
2774e98e3e1Schristos     unsigned char out_dr;
2784e98e3e1Schristos   } sfmt_add;
2794e98e3e1Schristos #if WITH_SCACHE_PBB
2804e98e3e1Schristos   /* Writeback handler.  */
2814e98e3e1Schristos   struct {
2824e98e3e1Schristos     /* Pointer to argbuf entry for insn whose results need writing back.  */
2834e98e3e1Schristos     const struct argbuf *abuf;
2844e98e3e1Schristos   } write;
2854e98e3e1Schristos   /* x-before handler */
2864e98e3e1Schristos   struct {
2874e98e3e1Schristos     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
2884e98e3e1Schristos     int first_p;
2894e98e3e1Schristos   } before;
2904e98e3e1Schristos   /* x-after handler */
2914e98e3e1Schristos   struct {
2924e98e3e1Schristos     int empty;
2934e98e3e1Schristos   } after;
2944e98e3e1Schristos   /* This entry is used to terminate each pbb.  */
2954e98e3e1Schristos   struct {
2964e98e3e1Schristos     /* Number of insns in pbb.  */
2974e98e3e1Schristos     int insn_count;
2984e98e3e1Schristos     /* Next pbb to execute.  */
2994e98e3e1Schristos     SCACHE *next;
3004e98e3e1Schristos     SCACHE *branch_target;
3014e98e3e1Schristos   } chain;
3024e98e3e1Schristos #endif
3034e98e3e1Schristos };
3044e98e3e1Schristos 
3054e98e3e1Schristos /* The ARGBUF struct.  */
3064e98e3e1Schristos struct argbuf {
3074e98e3e1Schristos   /* These are the baseclass definitions.  */
3084e98e3e1Schristos   IADDR addr;
3094e98e3e1Schristos   const IDESC *idesc;
3104e98e3e1Schristos   char trace_p;
3114e98e3e1Schristos   char profile_p;
3124e98e3e1Schristos   /* ??? Temporary hack for skip insns.  */
3134e98e3e1Schristos   char skip_count;
3144e98e3e1Schristos   char unused;
3154e98e3e1Schristos   /* cpu specific data follows */
3164e98e3e1Schristos   union sem semantic;
3174e98e3e1Schristos   int written;
3184e98e3e1Schristos   union sem_fields fields;
3194e98e3e1Schristos };
3204e98e3e1Schristos 
3214e98e3e1Schristos /* A cached insn.
3224e98e3e1Schristos 
3234e98e3e1Schristos    ??? SCACHE used to contain more than just argbuf.  We could delete the
3244e98e3e1Schristos    type entirely and always just use ARGBUF, but for future concerns and as
3254e98e3e1Schristos    a level of abstraction it is left in.  */
3264e98e3e1Schristos 
3274e98e3e1Schristos struct scache {
3284e98e3e1Schristos   struct argbuf argbuf;
3294e98e3e1Schristos };
3304e98e3e1Schristos 
3314e98e3e1Schristos /* Macros to simplify extraction, reading and semantic code.
3324e98e3e1Schristos    These define and assign the local vars that contain the insn's fields.  */
3334e98e3e1Schristos 
3344e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_VARS \
3354e98e3e1Schristos   unsigned int length;
3364e98e3e1Schristos #define EXTRACT_IFMT_EMPTY_CODE \
3374e98e3e1Schristos   length = 0; \
3384e98e3e1Schristos 
3394e98e3e1Schristos #define EXTRACT_IFMT_ADD_VARS \
3404e98e3e1Schristos   UINT f_op1; \
3414e98e3e1Schristos   UINT f_r1; \
3424e98e3e1Schristos   UINT f_op2; \
3434e98e3e1Schristos   UINT f_r2; \
3444e98e3e1Schristos   unsigned int length;
3454e98e3e1Schristos #define EXTRACT_IFMT_ADD_CODE \
3464e98e3e1Schristos   length = 2; \
3474e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
3484e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
3494e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
3504e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
3514e98e3e1Schristos 
3524e98e3e1Schristos #define EXTRACT_IFMT_ADD3_VARS \
3534e98e3e1Schristos   UINT f_op1; \
3544e98e3e1Schristos   UINT f_r1; \
3554e98e3e1Schristos   UINT f_op2; \
3564e98e3e1Schristos   UINT f_r2; \
3574e98e3e1Schristos   INT f_simm16; \
3584e98e3e1Schristos   unsigned int length;
3594e98e3e1Schristos #define EXTRACT_IFMT_ADD3_CODE \
3604e98e3e1Schristos   length = 4; \
3614e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3624e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3634e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3644e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3654e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
3664e98e3e1Schristos 
3674e98e3e1Schristos #define EXTRACT_IFMT_AND3_VARS \
3684e98e3e1Schristos   UINT f_op1; \
3694e98e3e1Schristos   UINT f_r1; \
3704e98e3e1Schristos   UINT f_op2; \
3714e98e3e1Schristos   UINT f_r2; \
3724e98e3e1Schristos   UINT f_uimm16; \
3734e98e3e1Schristos   unsigned int length;
3744e98e3e1Schristos #define EXTRACT_IFMT_AND3_CODE \
3754e98e3e1Schristos   length = 4; \
3764e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3774e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3784e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3794e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3804e98e3e1Schristos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
3814e98e3e1Schristos 
3824e98e3e1Schristos #define EXTRACT_IFMT_OR3_VARS \
3834e98e3e1Schristos   UINT f_op1; \
3844e98e3e1Schristos   UINT f_r1; \
3854e98e3e1Schristos   UINT f_op2; \
3864e98e3e1Schristos   UINT f_r2; \
3874e98e3e1Schristos   UINT f_uimm16; \
3884e98e3e1Schristos   unsigned int length;
3894e98e3e1Schristos #define EXTRACT_IFMT_OR3_CODE \
3904e98e3e1Schristos   length = 4; \
3914e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
3924e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
3934e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
3944e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
3954e98e3e1Schristos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
3964e98e3e1Schristos 
3974e98e3e1Schristos #define EXTRACT_IFMT_ADDI_VARS \
3984e98e3e1Schristos   UINT f_op1; \
3994e98e3e1Schristos   UINT f_r1; \
4004e98e3e1Schristos   INT f_simm8; \
4014e98e3e1Schristos   unsigned int length;
4024e98e3e1Schristos #define EXTRACT_IFMT_ADDI_CODE \
4034e98e3e1Schristos   length = 2; \
4044e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4054e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
4064e98e3e1Schristos   f_simm8 = EXTRACT_MSB0_SINT (insn, 16, 8, 8); \
4074e98e3e1Schristos 
4084e98e3e1Schristos #define EXTRACT_IFMT_ADDV3_VARS \
4094e98e3e1Schristos   UINT f_op1; \
4104e98e3e1Schristos   UINT f_r1; \
4114e98e3e1Schristos   UINT f_op2; \
4124e98e3e1Schristos   UINT f_r2; \
4134e98e3e1Schristos   INT f_simm16; \
4144e98e3e1Schristos   unsigned int length;
4154e98e3e1Schristos #define EXTRACT_IFMT_ADDV3_CODE \
4164e98e3e1Schristos   length = 4; \
4174e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4184e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4194e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4204e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
4214e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
4224e98e3e1Schristos 
4234e98e3e1Schristos #define EXTRACT_IFMT_BC8_VARS \
4244e98e3e1Schristos   UINT f_op1; \
4254e98e3e1Schristos   UINT f_r1; \
4264e98e3e1Schristos   SI f_disp8; \
4274e98e3e1Schristos   unsigned int length;
4284e98e3e1Schristos #define EXTRACT_IFMT_BC8_CODE \
4294e98e3e1Schristos   length = 2; \
4304e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4314e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
432*05fa0856Schristos   f_disp8 = ((((EXTRACT_MSB0_SINT (insn, 16, 8, 8)) * (4))) + (((pc) & (-4)))); \
4334e98e3e1Schristos 
4344e98e3e1Schristos #define EXTRACT_IFMT_BC24_VARS \
4354e98e3e1Schristos   UINT f_op1; \
4364e98e3e1Schristos   UINT f_r1; \
4374e98e3e1Schristos   SI f_disp24; \
4384e98e3e1Schristos   unsigned int length;
4394e98e3e1Schristos #define EXTRACT_IFMT_BC24_CODE \
4404e98e3e1Schristos   length = 4; \
4414e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4424e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
443*05fa0856Schristos   f_disp24 = ((((EXTRACT_MSB0_SINT (insn, 32, 8, 24)) * (4))) + (pc)); \
4444e98e3e1Schristos 
4454e98e3e1Schristos #define EXTRACT_IFMT_BEQ_VARS \
4464e98e3e1Schristos   UINT f_op1; \
4474e98e3e1Schristos   UINT f_r1; \
4484e98e3e1Schristos   UINT f_op2; \
4494e98e3e1Schristos   UINT f_r2; \
4504e98e3e1Schristos   SI f_disp16; \
4514e98e3e1Schristos   unsigned int length;
4524e98e3e1Schristos #define EXTRACT_IFMT_BEQ_CODE \
4534e98e3e1Schristos   length = 4; \
4544e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4554e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4564e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4574e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
458*05fa0856Schristos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
4594e98e3e1Schristos 
4604e98e3e1Schristos #define EXTRACT_IFMT_BEQZ_VARS \
4614e98e3e1Schristos   UINT f_op1; \
4624e98e3e1Schristos   UINT f_r1; \
4634e98e3e1Schristos   UINT f_op2; \
4644e98e3e1Schristos   UINT f_r2; \
4654e98e3e1Schristos   SI f_disp16; \
4664e98e3e1Schristos   unsigned int length;
4674e98e3e1Schristos #define EXTRACT_IFMT_BEQZ_CODE \
4684e98e3e1Schristos   length = 4; \
4694e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4704e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4714e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
4724e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
473*05fa0856Schristos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
4744e98e3e1Schristos 
4754e98e3e1Schristos #define EXTRACT_IFMT_CMP_VARS \
4764e98e3e1Schristos   UINT f_op1; \
4774e98e3e1Schristos   UINT f_r1; \
4784e98e3e1Schristos   UINT f_op2; \
4794e98e3e1Schristos   UINT f_r2; \
4804e98e3e1Schristos   unsigned int length;
4814e98e3e1Schristos #define EXTRACT_IFMT_CMP_CODE \
4824e98e3e1Schristos   length = 2; \
4834e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
4844e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
4854e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
4864e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
4874e98e3e1Schristos 
4884e98e3e1Schristos #define EXTRACT_IFMT_CMPI_VARS \
4894e98e3e1Schristos   UINT f_op1; \
4904e98e3e1Schristos   UINT f_r1; \
4914e98e3e1Schristos   UINT f_op2; \
4924e98e3e1Schristos   UINT f_r2; \
4934e98e3e1Schristos   INT f_simm16; \
4944e98e3e1Schristos   unsigned int length;
4954e98e3e1Schristos #define EXTRACT_IFMT_CMPI_CODE \
4964e98e3e1Schristos   length = 4; \
4974e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
4984e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
4994e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
5004e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
5014e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
5024e98e3e1Schristos 
5034e98e3e1Schristos #define EXTRACT_IFMT_CMPZ_VARS \
5044e98e3e1Schristos   UINT f_op1; \
5054e98e3e1Schristos   UINT f_r1; \
5064e98e3e1Schristos   UINT f_op2; \
5074e98e3e1Schristos   UINT f_r2; \
5084e98e3e1Schristos   unsigned int length;
5094e98e3e1Schristos #define EXTRACT_IFMT_CMPZ_CODE \
5104e98e3e1Schristos   length = 2; \
5114e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5124e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5134e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5144e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5154e98e3e1Schristos 
5164e98e3e1Schristos #define EXTRACT_IFMT_DIV_VARS \
5174e98e3e1Schristos   UINT f_op1; \
5184e98e3e1Schristos   UINT f_r1; \
5194e98e3e1Schristos   UINT f_op2; \
5204e98e3e1Schristos   UINT f_r2; \
5214e98e3e1Schristos   INT f_simm16; \
5224e98e3e1Schristos   unsigned int length;
5234e98e3e1Schristos #define EXTRACT_IFMT_DIV_CODE \
5244e98e3e1Schristos   length = 4; \
5254e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
5264e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
5274e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
5284e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
5294e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
5304e98e3e1Schristos 
5314e98e3e1Schristos #define EXTRACT_IFMT_JC_VARS \
5324e98e3e1Schristos   UINT f_op1; \
5334e98e3e1Schristos   UINT f_r1; \
5344e98e3e1Schristos   UINT f_op2; \
5354e98e3e1Schristos   UINT f_r2; \
5364e98e3e1Schristos   unsigned int length;
5374e98e3e1Schristos #define EXTRACT_IFMT_JC_CODE \
5384e98e3e1Schristos   length = 2; \
5394e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5404e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5414e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5424e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5434e98e3e1Schristos 
5444e98e3e1Schristos #define EXTRACT_IFMT_LD24_VARS \
5454e98e3e1Schristos   UINT f_op1; \
5464e98e3e1Schristos   UINT f_r1; \
5474e98e3e1Schristos   UINT f_uimm24; \
5484e98e3e1Schristos   unsigned int length;
5494e98e3e1Schristos #define EXTRACT_IFMT_LD24_CODE \
5504e98e3e1Schristos   length = 4; \
5514e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
5524e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
5534e98e3e1Schristos   f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
5544e98e3e1Schristos 
5554e98e3e1Schristos #define EXTRACT_IFMT_LDI16_VARS \
5564e98e3e1Schristos   UINT f_op1; \
5574e98e3e1Schristos   UINT f_r1; \
5584e98e3e1Schristos   UINT f_op2; \
5594e98e3e1Schristos   UINT f_r2; \
5604e98e3e1Schristos   INT f_simm16; \
5614e98e3e1Schristos   unsigned int length;
5624e98e3e1Schristos #define EXTRACT_IFMT_LDI16_CODE \
5634e98e3e1Schristos   length = 4; \
5644e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
5654e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
5664e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
5674e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
5684e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
5694e98e3e1Schristos 
5704e98e3e1Schristos #define EXTRACT_IFMT_MACHI_A_VARS \
5714e98e3e1Schristos   UINT f_op1; \
5724e98e3e1Schristos   UINT f_r1; \
5734e98e3e1Schristos   UINT f_acc; \
5744e98e3e1Schristos   UINT f_op23; \
5754e98e3e1Schristos   UINT f_r2; \
5764e98e3e1Schristos   unsigned int length;
5774e98e3e1Schristos #define EXTRACT_IFMT_MACHI_A_CODE \
5784e98e3e1Schristos   length = 2; \
5794e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5804e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5814e98e3e1Schristos   f_acc = EXTRACT_MSB0_UINT (insn, 16, 8, 1); \
5824e98e3e1Schristos   f_op23 = EXTRACT_MSB0_UINT (insn, 16, 9, 3); \
5834e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
5844e98e3e1Schristos 
5854e98e3e1Schristos #define EXTRACT_IFMT_MVFACHI_A_VARS \
5864e98e3e1Schristos   UINT f_op1; \
5874e98e3e1Schristos   UINT f_r1; \
5884e98e3e1Schristos   UINT f_op2; \
5894e98e3e1Schristos   UINT f_accs; \
5904e98e3e1Schristos   UINT f_op3; \
5914e98e3e1Schristos   unsigned int length;
5924e98e3e1Schristos #define EXTRACT_IFMT_MVFACHI_A_CODE \
5934e98e3e1Schristos   length = 2; \
5944e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
5954e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
5964e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
5974e98e3e1Schristos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
5984e98e3e1Schristos   f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
5994e98e3e1Schristos 
6004e98e3e1Schristos #define EXTRACT_IFMT_MVFC_VARS \
6014e98e3e1Schristos   UINT f_op1; \
6024e98e3e1Schristos   UINT f_r1; \
6034e98e3e1Schristos   UINT f_op2; \
6044e98e3e1Schristos   UINT f_r2; \
6054e98e3e1Schristos   unsigned int length;
6064e98e3e1Schristos #define EXTRACT_IFMT_MVFC_CODE \
6074e98e3e1Schristos   length = 2; \
6084e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6094e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6104e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6114e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
6124e98e3e1Schristos 
6134e98e3e1Schristos #define EXTRACT_IFMT_MVTACHI_A_VARS \
6144e98e3e1Schristos   UINT f_op1; \
6154e98e3e1Schristos   UINT f_r1; \
6164e98e3e1Schristos   UINT f_op2; \
6174e98e3e1Schristos   UINT f_accs; \
6184e98e3e1Schristos   UINT f_op3; \
6194e98e3e1Schristos   unsigned int length;
6204e98e3e1Schristos #define EXTRACT_IFMT_MVTACHI_A_CODE \
6214e98e3e1Schristos   length = 2; \
6224e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6234e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6244e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6254e98e3e1Schristos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
6264e98e3e1Schristos   f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
6274e98e3e1Schristos 
6284e98e3e1Schristos #define EXTRACT_IFMT_MVTC_VARS \
6294e98e3e1Schristos   UINT f_op1; \
6304e98e3e1Schristos   UINT f_r1; \
6314e98e3e1Schristos   UINT f_op2; \
6324e98e3e1Schristos   UINT f_r2; \
6334e98e3e1Schristos   unsigned int length;
6344e98e3e1Schristos #define EXTRACT_IFMT_MVTC_CODE \
6354e98e3e1Schristos   length = 2; \
6364e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6374e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6384e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6394e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
6404e98e3e1Schristos 
6414e98e3e1Schristos #define EXTRACT_IFMT_NOP_VARS \
6424e98e3e1Schristos   UINT f_op1; \
6434e98e3e1Schristos   UINT f_r1; \
6444e98e3e1Schristos   UINT f_op2; \
6454e98e3e1Schristos   UINT f_r2; \
6464e98e3e1Schristos   unsigned int length;
6474e98e3e1Schristos #define EXTRACT_IFMT_NOP_CODE \
6484e98e3e1Schristos   length = 2; \
6494e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6504e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6514e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6524e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
6534e98e3e1Schristos 
6544e98e3e1Schristos #define EXTRACT_IFMT_RAC_DSI_VARS \
6554e98e3e1Schristos   UINT f_op1; \
6564e98e3e1Schristos   UINT f_accd; \
6574e98e3e1Schristos   UINT f_bits67; \
6584e98e3e1Schristos   UINT f_op2; \
6594e98e3e1Schristos   UINT f_accs; \
6604e98e3e1Schristos   UINT f_bit14; \
6614e98e3e1Schristos   SI f_imm1; \
6624e98e3e1Schristos   unsigned int length;
6634e98e3e1Schristos #define EXTRACT_IFMT_RAC_DSI_CODE \
6644e98e3e1Schristos   length = 2; \
6654e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6664e98e3e1Schristos   f_accd = EXTRACT_MSB0_UINT (insn, 16, 4, 2); \
6674e98e3e1Schristos   f_bits67 = EXTRACT_MSB0_UINT (insn, 16, 6, 2); \
6684e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
6694e98e3e1Schristos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
6704e98e3e1Schristos   f_bit14 = EXTRACT_MSB0_UINT (insn, 16, 14, 1); \
6714e98e3e1Schristos   f_imm1 = ((EXTRACT_MSB0_UINT (insn, 16, 15, 1)) + (1)); \
6724e98e3e1Schristos 
6734e98e3e1Schristos #define EXTRACT_IFMT_SETH_VARS \
6744e98e3e1Schristos   UINT f_op1; \
6754e98e3e1Schristos   UINT f_r1; \
6764e98e3e1Schristos   UINT f_op2; \
6774e98e3e1Schristos   UINT f_r2; \
6784e98e3e1Schristos   UINT f_hi16; \
6794e98e3e1Schristos   unsigned int length;
6804e98e3e1Schristos #define EXTRACT_IFMT_SETH_CODE \
6814e98e3e1Schristos   length = 4; \
6824e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
6834e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
6844e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
6854e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
6864e98e3e1Schristos   f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
6874e98e3e1Schristos 
6884e98e3e1Schristos #define EXTRACT_IFMT_SLLI_VARS \
6894e98e3e1Schristos   UINT f_op1; \
6904e98e3e1Schristos   UINT f_r1; \
6914e98e3e1Schristos   UINT f_shift_op2; \
6924e98e3e1Schristos   UINT f_uimm5; \
6934e98e3e1Schristos   unsigned int length;
6944e98e3e1Schristos #define EXTRACT_IFMT_SLLI_CODE \
6954e98e3e1Schristos   length = 2; \
6964e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
6974e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
6984e98e3e1Schristos   f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
6994e98e3e1Schristos   f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
7004e98e3e1Schristos 
7014e98e3e1Schristos #define EXTRACT_IFMT_ST_D_VARS \
7024e98e3e1Schristos   UINT f_op1; \
7034e98e3e1Schristos   UINT f_r1; \
7044e98e3e1Schristos   UINT f_op2; \
7054e98e3e1Schristos   UINT f_r2; \
7064e98e3e1Schristos   INT f_simm16; \
7074e98e3e1Schristos   unsigned int length;
7084e98e3e1Schristos #define EXTRACT_IFMT_ST_D_CODE \
7094e98e3e1Schristos   length = 4; \
7104e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
7114e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
7124e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
7134e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
7144e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
7154e98e3e1Schristos 
7164e98e3e1Schristos #define EXTRACT_IFMT_TRAP_VARS \
7174e98e3e1Schristos   UINT f_op1; \
7184e98e3e1Schristos   UINT f_r1; \
7194e98e3e1Schristos   UINT f_op2; \
7204e98e3e1Schristos   UINT f_uimm4; \
7214e98e3e1Schristos   unsigned int length;
7224e98e3e1Schristos #define EXTRACT_IFMT_TRAP_CODE \
7234e98e3e1Schristos   length = 2; \
7244e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
7254e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
7264e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
7274e98e3e1Schristos   f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
7284e98e3e1Schristos 
7294e98e3e1Schristos #define EXTRACT_IFMT_SATB_VARS \
7304e98e3e1Schristos   UINT f_op1; \
7314e98e3e1Schristos   UINT f_r1; \
7324e98e3e1Schristos   UINT f_op2; \
7334e98e3e1Schristos   UINT f_r2; \
7344e98e3e1Schristos   UINT f_uimm16; \
7354e98e3e1Schristos   unsigned int length;
7364e98e3e1Schristos #define EXTRACT_IFMT_SATB_CODE \
7374e98e3e1Schristos   length = 4; \
7384e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
7394e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
7404e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
7414e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
7424e98e3e1Schristos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
7434e98e3e1Schristos 
7444e98e3e1Schristos #define EXTRACT_IFMT_CLRPSW_VARS \
7454e98e3e1Schristos   UINT f_op1; \
7464e98e3e1Schristos   UINT f_r1; \
7474e98e3e1Schristos   UINT f_uimm8; \
7484e98e3e1Schristos   unsigned int length;
7494e98e3e1Schristos #define EXTRACT_IFMT_CLRPSW_CODE \
7504e98e3e1Schristos   length = 2; \
7514e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
7524e98e3e1Schristos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
7534e98e3e1Schristos   f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
7544e98e3e1Schristos 
7554e98e3e1Schristos #define EXTRACT_IFMT_BSET_VARS \
7564e98e3e1Schristos   UINT f_op1; \
7574e98e3e1Schristos   UINT f_bit4; \
7584e98e3e1Schristos   UINT f_uimm3; \
7594e98e3e1Schristos   UINT f_op2; \
7604e98e3e1Schristos   UINT f_r2; \
7614e98e3e1Schristos   INT f_simm16; \
7624e98e3e1Schristos   unsigned int length;
7634e98e3e1Schristos #define EXTRACT_IFMT_BSET_CODE \
7644e98e3e1Schristos   length = 4; \
7654e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
7664e98e3e1Schristos   f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
7674e98e3e1Schristos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
7684e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
7694e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
7704e98e3e1Schristos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
7714e98e3e1Schristos 
7724e98e3e1Schristos #define EXTRACT_IFMT_BTST_VARS \
7734e98e3e1Schristos   UINT f_op1; \
7744e98e3e1Schristos   UINT f_bit4; \
7754e98e3e1Schristos   UINT f_uimm3; \
7764e98e3e1Schristos   UINT f_op2; \
7774e98e3e1Schristos   UINT f_r2; \
7784e98e3e1Schristos   unsigned int length;
7794e98e3e1Schristos #define EXTRACT_IFMT_BTST_CODE \
7804e98e3e1Schristos   length = 2; \
7814e98e3e1Schristos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
7824e98e3e1Schristos   f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
7834e98e3e1Schristos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
7844e98e3e1Schristos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
7854e98e3e1Schristos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
7864e98e3e1Schristos 
7874e98e3e1Schristos /* Queued output values of an instruction.  */
7884e98e3e1Schristos 
7894e98e3e1Schristos struct parexec {
7904e98e3e1Schristos   union {
7914e98e3e1Schristos     struct { /* empty sformat for unspecified field list */
7924e98e3e1Schristos       int empty;
7934e98e3e1Schristos     } sfmt_empty;
7944e98e3e1Schristos     struct { /* e.g. add $dr,$sr */
7954e98e3e1Schristos       SI dr;
7964e98e3e1Schristos     } sfmt_add;
7974e98e3e1Schristos     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
7984e98e3e1Schristos       SI dr;
7994e98e3e1Schristos     } sfmt_add3;
8004e98e3e1Schristos     struct { /* e.g. and3 $dr,$sr,$uimm16 */
8014e98e3e1Schristos       SI dr;
8024e98e3e1Schristos     } sfmt_and3;
8034e98e3e1Schristos     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
8044e98e3e1Schristos       SI dr;
8054e98e3e1Schristos     } sfmt_or3;
8064e98e3e1Schristos     struct { /* e.g. addi $dr,$simm8 */
8074e98e3e1Schristos       SI dr;
8084e98e3e1Schristos     } sfmt_addi;
8094e98e3e1Schristos     struct { /* e.g. addv $dr,$sr */
8104e98e3e1Schristos       BI condbit;
8114e98e3e1Schristos       SI dr;
8124e98e3e1Schristos     } sfmt_addv;
8134e98e3e1Schristos     struct { /* e.g. addv3 $dr,$sr,$simm16 */
8144e98e3e1Schristos       BI condbit;
8154e98e3e1Schristos       SI dr;
8164e98e3e1Schristos     } sfmt_addv3;
8174e98e3e1Schristos     struct { /* e.g. addx $dr,$sr */
8184e98e3e1Schristos       BI condbit;
8194e98e3e1Schristos       SI dr;
8204e98e3e1Schristos     } sfmt_addx;
8214e98e3e1Schristos     struct { /* e.g. bc.s $disp8 */
8224e98e3e1Schristos       USI pc;
8234e98e3e1Schristos     } sfmt_bc8;
8244e98e3e1Schristos     struct { /* e.g. bc.l $disp24 */
8254e98e3e1Schristos       USI pc;
8264e98e3e1Schristos     } sfmt_bc24;
8274e98e3e1Schristos     struct { /* e.g. beq $src1,$src2,$disp16 */
8284e98e3e1Schristos       USI pc;
8294e98e3e1Schristos     } sfmt_beq;
8304e98e3e1Schristos     struct { /* e.g. beqz $src2,$disp16 */
8314e98e3e1Schristos       USI pc;
8324e98e3e1Schristos     } sfmt_beqz;
8334e98e3e1Schristos     struct { /* e.g. bl.s $disp8 */
8344e98e3e1Schristos       SI h_gr_SI_14;
8354e98e3e1Schristos       USI pc;
8364e98e3e1Schristos     } sfmt_bl8;
8374e98e3e1Schristos     struct { /* e.g. bl.l $disp24 */
8384e98e3e1Schristos       SI h_gr_SI_14;
8394e98e3e1Schristos       USI pc;
8404e98e3e1Schristos     } sfmt_bl24;
8414e98e3e1Schristos     struct { /* e.g. bcl.s $disp8 */
8424e98e3e1Schristos       SI h_gr_SI_14;
8434e98e3e1Schristos       USI pc;
8444e98e3e1Schristos     } sfmt_bcl8;
8454e98e3e1Schristos     struct { /* e.g. bcl.l $disp24 */
8464e98e3e1Schristos       SI h_gr_SI_14;
8474e98e3e1Schristos       USI pc;
8484e98e3e1Schristos     } sfmt_bcl24;
8494e98e3e1Schristos     struct { /* e.g. bra.s $disp8 */
8504e98e3e1Schristos       USI pc;
8514e98e3e1Schristos     } sfmt_bra8;
8524e98e3e1Schristos     struct { /* e.g. bra.l $disp24 */
8534e98e3e1Schristos       USI pc;
8544e98e3e1Schristos     } sfmt_bra24;
8554e98e3e1Schristos     struct { /* e.g. cmp $src1,$src2 */
8564e98e3e1Schristos       BI condbit;
8574e98e3e1Schristos     } sfmt_cmp;
8584e98e3e1Schristos     struct { /* e.g. cmpi $src2,$simm16 */
8594e98e3e1Schristos       BI condbit;
8604e98e3e1Schristos     } sfmt_cmpi;
8614e98e3e1Schristos     struct { /* e.g. cmpz $src2 */
8624e98e3e1Schristos       BI condbit;
8634e98e3e1Schristos     } sfmt_cmpz;
8644e98e3e1Schristos     struct { /* e.g. div $dr,$sr */
8654e98e3e1Schristos       SI dr;
8664e98e3e1Schristos     } sfmt_div;
8674e98e3e1Schristos     struct { /* e.g. jc $sr */
8684e98e3e1Schristos       USI pc;
8694e98e3e1Schristos     } sfmt_jc;
8704e98e3e1Schristos     struct { /* e.g. jl $sr */
8714e98e3e1Schristos       SI h_gr_SI_14;
8724e98e3e1Schristos       USI pc;
8734e98e3e1Schristos     } sfmt_jl;
8744e98e3e1Schristos     struct { /* e.g. jmp $sr */
8754e98e3e1Schristos       USI pc;
8764e98e3e1Schristos     } sfmt_jmp;
8774e98e3e1Schristos     struct { /* e.g. ld $dr,@$sr */
8784e98e3e1Schristos       SI dr;
8794e98e3e1Schristos     } sfmt_ld;
8804e98e3e1Schristos     struct { /* e.g. ld $dr,@($slo16,$sr) */
8814e98e3e1Schristos       SI dr;
8824e98e3e1Schristos     } sfmt_ld_d;
8834e98e3e1Schristos     struct { /* e.g. ldb $dr,@$sr */
8844e98e3e1Schristos       SI dr;
8854e98e3e1Schristos     } sfmt_ldb;
8864e98e3e1Schristos     struct { /* e.g. ldb $dr,@($slo16,$sr) */
8874e98e3e1Schristos       SI dr;
8884e98e3e1Schristos     } sfmt_ldb_d;
8894e98e3e1Schristos     struct { /* e.g. ldh $dr,@$sr */
8904e98e3e1Schristos       SI dr;
8914e98e3e1Schristos     } sfmt_ldh;
8924e98e3e1Schristos     struct { /* e.g. ldh $dr,@($slo16,$sr) */
8934e98e3e1Schristos       SI dr;
8944e98e3e1Schristos     } sfmt_ldh_d;
8954e98e3e1Schristos     struct { /* e.g. ld $dr,@$sr+ */
8964e98e3e1Schristos       SI dr;
8974e98e3e1Schristos       SI sr;
8984e98e3e1Schristos     } sfmt_ld_plus;
8994e98e3e1Schristos     struct { /* e.g. ld24 $dr,$uimm24 */
9004e98e3e1Schristos       SI dr;
9014e98e3e1Schristos     } sfmt_ld24;
9024e98e3e1Schristos     struct { /* e.g. ldi8 $dr,$simm8 */
9034e98e3e1Schristos       SI dr;
9044e98e3e1Schristos     } sfmt_ldi8;
9054e98e3e1Schristos     struct { /* e.g. ldi16 $dr,$hash$slo16 */
9064e98e3e1Schristos       SI dr;
9074e98e3e1Schristos     } sfmt_ldi16;
9084e98e3e1Schristos     struct { /* e.g. lock $dr,@$sr */
9094e98e3e1Schristos       SI dr;
9104e98e3e1Schristos       BI h_lock_BI;
9114e98e3e1Schristos     } sfmt_lock;
9124e98e3e1Schristos     struct { /* e.g. machi $src1,$src2,$acc */
9134e98e3e1Schristos       DI acc;
9144e98e3e1Schristos     } sfmt_machi_a;
9154e98e3e1Schristos     struct { /* e.g. mulhi $src1,$src2,$acc */
9164e98e3e1Schristos       DI acc;
9174e98e3e1Schristos     } sfmt_mulhi_a;
9184e98e3e1Schristos     struct { /* e.g. mv $dr,$sr */
9194e98e3e1Schristos       SI dr;
9204e98e3e1Schristos     } sfmt_mv;
9214e98e3e1Schristos     struct { /* e.g. mvfachi $dr,$accs */
9224e98e3e1Schristos       SI dr;
9234e98e3e1Schristos     } sfmt_mvfachi_a;
9244e98e3e1Schristos     struct { /* e.g. mvfc $dr,$scr */
9254e98e3e1Schristos       SI dr;
9264e98e3e1Schristos     } sfmt_mvfc;
9274e98e3e1Schristos     struct { /* e.g. mvtachi $src1,$accs */
9284e98e3e1Schristos       DI accs;
9294e98e3e1Schristos     } sfmt_mvtachi_a;
9304e98e3e1Schristos     struct { /* e.g. mvtc $sr,$dcr */
9314e98e3e1Schristos       USI dcr;
9324e98e3e1Schristos     } sfmt_mvtc;
9334e98e3e1Schristos     struct { /* e.g. nop */
9344e98e3e1Schristos       int empty;
9354e98e3e1Schristos     } sfmt_nop;
9364e98e3e1Schristos     struct { /* e.g. rac $accd,$accs,$imm1 */
9374e98e3e1Schristos       DI accd;
9384e98e3e1Schristos     } sfmt_rac_dsi;
9394e98e3e1Schristos     struct { /* e.g. rte */
9404e98e3e1Schristos       UQI h_bpsw_UQI;
9414e98e3e1Schristos       USI h_cr_USI_6;
9424e98e3e1Schristos       UQI h_psw_UQI;
9434e98e3e1Schristos       USI pc;
9444e98e3e1Schristos     } sfmt_rte;
9454e98e3e1Schristos     struct { /* e.g. seth $dr,$hash$hi16 */
9464e98e3e1Schristos       SI dr;
9474e98e3e1Schristos     } sfmt_seth;
9484e98e3e1Schristos     struct { /* e.g. sll3 $dr,$sr,$simm16 */
9494e98e3e1Schristos       SI dr;
9504e98e3e1Schristos     } sfmt_sll3;
9514e98e3e1Schristos     struct { /* e.g. slli $dr,$uimm5 */
9524e98e3e1Schristos       SI dr;
9534e98e3e1Schristos     } sfmt_slli;
9544e98e3e1Schristos     struct { /* e.g. st $src1,@$src2 */
9554e98e3e1Schristos       SI h_memory_SI_src2;
9564e98e3e1Schristos       USI h_memory_SI_src2_idx;
9574e98e3e1Schristos     } sfmt_st;
9584e98e3e1Schristos     struct { /* e.g. st $src1,@($slo16,$src2) */
9594e98e3e1Schristos       SI h_memory_SI_add__SI_src2_slo16;
9604e98e3e1Schristos       USI h_memory_SI_add__SI_src2_slo16_idx;
9614e98e3e1Schristos     } sfmt_st_d;
9624e98e3e1Schristos     struct { /* e.g. stb $src1,@$src2 */
9634e98e3e1Schristos       QI h_memory_QI_src2;
9644e98e3e1Schristos       USI h_memory_QI_src2_idx;
9654e98e3e1Schristos     } sfmt_stb;
9664e98e3e1Schristos     struct { /* e.g. stb $src1,@($slo16,$src2) */
9674e98e3e1Schristos       QI h_memory_QI_add__SI_src2_slo16;
9684e98e3e1Schristos       USI h_memory_QI_add__SI_src2_slo16_idx;
9694e98e3e1Schristos     } sfmt_stb_d;
9704e98e3e1Schristos     struct { /* e.g. sth $src1,@$src2 */
9714e98e3e1Schristos       HI h_memory_HI_src2;
9724e98e3e1Schristos       USI h_memory_HI_src2_idx;
9734e98e3e1Schristos     } sfmt_sth;
9744e98e3e1Schristos     struct { /* e.g. sth $src1,@($slo16,$src2) */
9754e98e3e1Schristos       HI h_memory_HI_add__SI_src2_slo16;
9764e98e3e1Schristos       USI h_memory_HI_add__SI_src2_slo16_idx;
9774e98e3e1Schristos     } sfmt_sth_d;
9784e98e3e1Schristos     struct { /* e.g. st $src1,@+$src2 */
9794e98e3e1Schristos       SI h_memory_SI_new_src2;
9804e98e3e1Schristos       USI h_memory_SI_new_src2_idx;
9814e98e3e1Schristos       SI src2;
9824e98e3e1Schristos     } sfmt_st_plus;
9834e98e3e1Schristos     struct { /* e.g. sth $src1,@$src2+ */
9844e98e3e1Schristos       HI h_memory_HI_new_src2;
9854e98e3e1Schristos       USI h_memory_HI_new_src2_idx;
9864e98e3e1Schristos       SI src2;
9874e98e3e1Schristos     } sfmt_sth_plus;
9884e98e3e1Schristos     struct { /* e.g. stb $src1,@$src2+ */
9894e98e3e1Schristos       QI h_memory_QI_new_src2;
9904e98e3e1Schristos       USI h_memory_QI_new_src2_idx;
9914e98e3e1Schristos       SI src2;
9924e98e3e1Schristos     } sfmt_stb_plus;
9934e98e3e1Schristos     struct { /* e.g. trap $uimm4 */
9944e98e3e1Schristos       UQI h_bbpsw_UQI;
9954e98e3e1Schristos       UQI h_bpsw_UQI;
9964e98e3e1Schristos       USI h_cr_USI_14;
9974e98e3e1Schristos       USI h_cr_USI_6;
9984e98e3e1Schristos       UQI h_psw_UQI;
9994e98e3e1Schristos       USI pc;
10004e98e3e1Schristos     } sfmt_trap;
10014e98e3e1Schristos     struct { /* e.g. unlock $src1,@$src2 */
10024e98e3e1Schristos       BI h_lock_BI;
10034e98e3e1Schristos       SI h_memory_SI_src2;
10044e98e3e1Schristos       USI h_memory_SI_src2_idx;
10054e98e3e1Schristos     } sfmt_unlock;
10064e98e3e1Schristos     struct { /* e.g. satb $dr,$sr */
10074e98e3e1Schristos       SI dr;
10084e98e3e1Schristos     } sfmt_satb;
10094e98e3e1Schristos     struct { /* e.g. sat $dr,$sr */
10104e98e3e1Schristos       SI dr;
10114e98e3e1Schristos     } sfmt_sat;
10124e98e3e1Schristos     struct { /* e.g. sadd */
10134e98e3e1Schristos       DI h_accums_DI_0;
10144e98e3e1Schristos     } sfmt_sadd;
10154e98e3e1Schristos     struct { /* e.g. macwu1 $src1,$src2 */
10164e98e3e1Schristos       DI h_accums_DI_1;
10174e98e3e1Schristos     } sfmt_macwu1;
10184e98e3e1Schristos     struct { /* e.g. msblo $src1,$src2 */
10194e98e3e1Schristos       DI accum;
10204e98e3e1Schristos     } sfmt_msblo;
10214e98e3e1Schristos     struct { /* e.g. mulwu1 $src1,$src2 */
10224e98e3e1Schristos       DI h_accums_DI_1;
10234e98e3e1Schristos     } sfmt_mulwu1;
10244e98e3e1Schristos     struct { /* e.g. sc */
10254e98e3e1Schristos       int empty;
10264e98e3e1Schristos     } sfmt_sc;
10274e98e3e1Schristos     struct { /* e.g. clrpsw $uimm8 */
10284e98e3e1Schristos       USI h_cr_USI_0;
10294e98e3e1Schristos     } sfmt_clrpsw;
10304e98e3e1Schristos     struct { /* e.g. setpsw $uimm8 */
10314e98e3e1Schristos       USI h_cr_USI_0;
10324e98e3e1Schristos     } sfmt_setpsw;
10334e98e3e1Schristos     struct { /* e.g. bset $uimm3,@($slo16,$sr) */
10344e98e3e1Schristos       QI h_memory_QI_add__SI_sr_slo16;
10354e98e3e1Schristos       USI h_memory_QI_add__SI_sr_slo16_idx;
10364e98e3e1Schristos     } sfmt_bset;
10374e98e3e1Schristos     struct { /* e.g. btst $uimm3,$sr */
10384e98e3e1Schristos       BI condbit;
10394e98e3e1Schristos     } sfmt_btst;
10404e98e3e1Schristos   } operands;
10414e98e3e1Schristos   /* For conditionally written operands, bitmask of which ones were.  */
10424e98e3e1Schristos   int written;
10434e98e3e1Schristos };
10444e98e3e1Schristos 
10454e98e3e1Schristos /* Collection of various things for the trace handler to use.  */
10464e98e3e1Schristos 
10474e98e3e1Schristos typedef struct trace_record {
10484e98e3e1Schristos   IADDR pc;
10494e98e3e1Schristos   /* FIXME:wip */
10504e98e3e1Schristos } TRACE_RECORD;
10514e98e3e1Schristos 
10524e98e3e1Schristos #endif /* CPU_M32R2F_H */
1053