Home | History | Annotate | Line # | Download | only in m32r
      1   1.1  christos /* CPU family header for m32rxf.
      2   1.1  christos 
      3   1.1  christos THIS FILE IS MACHINE GENERATED WITH CGEN.
      4   1.1  christos 
      5  1.11  christos Copyright (C) 1996-2024 Free Software Foundation, Inc.
      6   1.1  christos 
      7   1.1  christos This file is part of the GNU simulators.
      8   1.1  christos 
      9   1.1  christos    This file is free software; you can redistribute it and/or modify
     10   1.1  christos    it under the terms of the GNU General Public License as published by
     11   1.1  christos    the Free Software Foundation; either version 3, or (at your option)
     12   1.1  christos    any later version.
     13   1.1  christos 
     14   1.1  christos    It is distributed in the hope that it will be useful, but WITHOUT
     15   1.1  christos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16   1.1  christos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     17   1.1  christos    License for more details.
     18   1.1  christos 
     19   1.1  christos    You should have received a copy of the GNU General Public License along
     20  1.11  christos    with this program; if not, write to the Free Software Foundation, Inc.,
     21  1.11  christos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     22   1.1  christos 
     23   1.1  christos */
     24   1.1  christos 
     25   1.1  christos #ifndef CPU_M32RXF_H
     26   1.1  christos #define CPU_M32RXF_H
     27   1.1  christos 
     28   1.1  christos /* Maximum number of instructions that are fetched at a time.
     29   1.1  christos    This is for LIW type instructions sets (e.g. m32r).  */
     30   1.1  christos #define MAX_LIW_INSNS 2
     31   1.1  christos 
     32   1.1  christos /* Maximum number of instructions that can be executed in parallel.  */
     33   1.1  christos #define MAX_PARALLEL_INSNS 2
     34   1.1  christos 
     35   1.1  christos /* The size of an "int" needed to hold an instruction word.
     36   1.1  christos    This is usually 32 bits, but some architectures needs 64 bits.  */
     37   1.1  christos typedef CGEN_INSN_INT CGEN_INSN_WORD;
     38   1.1  christos 
     39   1.1  christos #include "cgen-engine.h"
     40   1.1  christos 
     41   1.1  christos /* CPU state information.  */
     42   1.1  christos typedef struct {
     43   1.1  christos   /* Hardware elements.  */
     44   1.1  christos   struct {
     45   1.1  christos   /* program counter */
     46   1.1  christos   USI h_pc;
     47   1.1  christos #define GET_H_PC() CPU (h_pc)
     48   1.1  christos #define SET_H_PC(x) (CPU (h_pc) = (x))
     49   1.1  christos   /* general registers */
     50   1.1  christos   SI h_gr[16];
     51   1.1  christos #define GET_H_GR(a1) CPU (h_gr)[a1]
     52   1.1  christos #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
     53   1.1  christos   /* control registers */
     54   1.1  christos   USI h_cr[16];
     55   1.1  christos #define GET_H_CR(index) m32rxf_h_cr_get_handler (current_cpu, index)
     56   1.1  christos #define SET_H_CR(index, x) \
     57   1.1  christos do { \
     58   1.1  christos m32rxf_h_cr_set_handler (current_cpu, (index), (x));\
     59   1.1  christos ;} while (0)
     60   1.1  christos   /* accumulator */
     61   1.1  christos   DI h_accum;
     62   1.1  christos #define GET_H_ACCUM() m32rxf_h_accum_get_handler (current_cpu)
     63   1.1  christos #define SET_H_ACCUM(x) \
     64   1.1  christos do { \
     65   1.1  christos m32rxf_h_accum_set_handler (current_cpu, (x));\
     66   1.1  christos ;} while (0)
     67   1.1  christos   /* accumulators */
     68   1.1  christos   DI h_accums[2];
     69   1.1  christos #define GET_H_ACCUMS(index) m32rxf_h_accums_get_handler (current_cpu, index)
     70   1.1  christos #define SET_H_ACCUMS(index, x) \
     71   1.1  christos do { \
     72   1.1  christos m32rxf_h_accums_set_handler (current_cpu, (index), (x));\
     73   1.1  christos ;} while (0)
     74   1.1  christos   /* condition bit */
     75   1.1  christos   BI h_cond;
     76   1.1  christos #define GET_H_COND() CPU (h_cond)
     77   1.1  christos #define SET_H_COND(x) (CPU (h_cond) = (x))
     78   1.1  christos   /* psw part of psw */
     79   1.1  christos   UQI h_psw;
     80   1.1  christos #define GET_H_PSW() m32rxf_h_psw_get_handler (current_cpu)
     81   1.1  christos #define SET_H_PSW(x) \
     82   1.1  christos do { \
     83   1.1  christos m32rxf_h_psw_set_handler (current_cpu, (x));\
     84   1.1  christos ;} while (0)
     85   1.1  christos   /* backup psw */
     86   1.1  christos   UQI h_bpsw;
     87   1.1  christos #define GET_H_BPSW() CPU (h_bpsw)
     88   1.1  christos #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
     89   1.1  christos   /* backup bpsw */
     90   1.1  christos   UQI h_bbpsw;
     91   1.1  christos #define GET_H_BBPSW() CPU (h_bbpsw)
     92   1.1  christos #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
     93   1.1  christos   /* lock */
     94   1.1  christos   BI h_lock;
     95   1.1  christos #define GET_H_LOCK() CPU (h_lock)
     96   1.1  christos #define SET_H_LOCK(x) (CPU (h_lock) = (x))
     97   1.1  christos   } hardware;
     98  1.11  christos #define CPU_CGEN_HW(cpu) (& M32R_SIM_CPU (cpu)->cpu_data.hardware)
     99   1.1  christos } M32RXF_CPU_DATA;
    100   1.1  christos 
    101   1.1  christos /* Cover fns for register access.  */
    102   1.1  christos USI m32rxf_h_pc_get (SIM_CPU *);
    103   1.1  christos void m32rxf_h_pc_set (SIM_CPU *, USI);
    104   1.1  christos SI m32rxf_h_gr_get (SIM_CPU *, UINT);
    105   1.1  christos void m32rxf_h_gr_set (SIM_CPU *, UINT, SI);
    106   1.1  christos USI m32rxf_h_cr_get (SIM_CPU *, UINT);
    107   1.1  christos void m32rxf_h_cr_set (SIM_CPU *, UINT, USI);
    108   1.1  christos DI m32rxf_h_accum_get (SIM_CPU *);
    109   1.1  christos void m32rxf_h_accum_set (SIM_CPU *, DI);
    110   1.1  christos DI m32rxf_h_accums_get (SIM_CPU *, UINT);
    111   1.1  christos void m32rxf_h_accums_set (SIM_CPU *, UINT, DI);
    112   1.1  christos BI m32rxf_h_cond_get (SIM_CPU *);
    113   1.1  christos void m32rxf_h_cond_set (SIM_CPU *, BI);
    114   1.1  christos UQI m32rxf_h_psw_get (SIM_CPU *);
    115   1.1  christos void m32rxf_h_psw_set (SIM_CPU *, UQI);
    116   1.1  christos UQI m32rxf_h_bpsw_get (SIM_CPU *);
    117   1.1  christos void m32rxf_h_bpsw_set (SIM_CPU *, UQI);
    118   1.1  christos UQI m32rxf_h_bbpsw_get (SIM_CPU *);
    119   1.1  christos void m32rxf_h_bbpsw_set (SIM_CPU *, UQI);
    120   1.1  christos BI m32rxf_h_lock_get (SIM_CPU *);
    121   1.1  christos void m32rxf_h_lock_set (SIM_CPU *, BI);
    122   1.1  christos 
    123   1.1  christos /* These must be hand-written.  */
    124   1.1  christos extern CPUREG_FETCH_FN m32rxf_fetch_register;
    125   1.1  christos extern CPUREG_STORE_FN m32rxf_store_register;
    126   1.1  christos 
    127   1.1  christos typedef struct {
    128   1.1  christos   int empty;
    129   1.1  christos } MODEL_M32RX_DATA;
    130   1.1  christos 
    131   1.1  christos /* Instruction argument buffer.  */
    132   1.1  christos 
    133   1.1  christos union sem_fields {
    134   1.1  christos   struct { /* no operands */
    135   1.1  christos     int empty;
    136   1.1  christos   } sfmt_empty;
    137   1.1  christos   struct { /*  */
    138   1.1  christos     UINT f_uimm8;
    139   1.1  christos   } sfmt_clrpsw;
    140   1.1  christos   struct { /*  */
    141   1.1  christos     UINT f_uimm4;
    142   1.1  christos   } sfmt_trap;
    143   1.1  christos   struct { /*  */
    144   1.1  christos     IADDR i_disp24;
    145   1.1  christos     unsigned char out_h_gr_SI_14;
    146   1.1  christos   } sfmt_bl24;
    147   1.1  christos   struct { /*  */
    148   1.1  christos     IADDR i_disp8;
    149   1.1  christos     unsigned char out_h_gr_SI_14;
    150   1.1  christos   } sfmt_bl8;
    151   1.1  christos   struct { /*  */
    152   1.1  christos     SI f_imm1;
    153   1.1  christos     UINT f_accd;
    154   1.1  christos     UINT f_accs;
    155   1.1  christos   } sfmt_rac_dsi;
    156   1.1  christos   struct { /*  */
    157   1.1  christos     SI* i_dr;
    158   1.1  christos     UINT f_hi16;
    159   1.1  christos     UINT f_r1;
    160   1.1  christos     unsigned char out_dr;
    161   1.1  christos   } sfmt_seth;
    162   1.1  christos   struct { /*  */
    163   1.1  christos     SI* i_src1;
    164   1.1  christos     UINT f_accs;
    165   1.1  christos     UINT f_r1;
    166   1.1  christos     unsigned char in_src1;
    167   1.1  christos   } sfmt_mvtachi_a;
    168   1.1  christos   struct { /*  */
    169   1.1  christos     SI* i_dr;
    170   1.1  christos     UINT f_accs;
    171   1.1  christos     UINT f_r1;
    172   1.1  christos     unsigned char out_dr;
    173   1.1  christos   } sfmt_mvfachi_a;
    174   1.1  christos   struct { /*  */
    175   1.1  christos     ADDR i_uimm24;
    176   1.1  christos     SI* i_dr;
    177   1.1  christos     UINT f_r1;
    178   1.1  christos     unsigned char out_dr;
    179   1.1  christos   } sfmt_ld24;
    180   1.1  christos   struct { /*  */
    181   1.1  christos     SI* i_sr;
    182   1.1  christos     UINT f_r2;
    183   1.1  christos     unsigned char in_sr;
    184   1.1  christos     unsigned char out_h_gr_SI_14;
    185   1.1  christos   } sfmt_jl;
    186   1.1  christos   struct { /*  */
    187   1.1  christos     SI* i_sr;
    188   1.1  christos     INT f_simm16;
    189   1.1  christos     UINT f_r2;
    190   1.1  christos     UINT f_uimm3;
    191   1.1  christos     unsigned char in_sr;
    192   1.1  christos   } sfmt_bset;
    193   1.1  christos   struct { /*  */
    194   1.1  christos     SI* i_dr;
    195   1.1  christos     UINT f_r1;
    196   1.1  christos     UINT f_uimm5;
    197   1.1  christos     unsigned char in_dr;
    198   1.1  christos     unsigned char out_dr;
    199   1.1  christos   } sfmt_slli;
    200   1.1  christos   struct { /*  */
    201   1.1  christos     SI* i_dr;
    202   1.1  christos     INT f_simm8;
    203   1.1  christos     UINT f_r1;
    204   1.1  christos     unsigned char in_dr;
    205   1.1  christos     unsigned char out_dr;
    206   1.1  christos   } sfmt_addi;
    207   1.1  christos   struct { /*  */
    208   1.1  christos     SI* i_src1;
    209   1.1  christos     SI* i_src2;
    210   1.1  christos     UINT f_r1;
    211   1.1  christos     UINT f_r2;
    212   1.1  christos     unsigned char in_src1;
    213   1.1  christos     unsigned char in_src2;
    214   1.1  christos     unsigned char out_src2;
    215   1.1  christos   } sfmt_st_plus;
    216   1.1  christos   struct { /*  */
    217   1.1  christos     SI* i_src1;
    218   1.1  christos     SI* i_src2;
    219   1.1  christos     INT f_simm16;
    220   1.1  christos     UINT f_r1;
    221   1.1  christos     UINT f_r2;
    222   1.1  christos     unsigned char in_src1;
    223   1.1  christos     unsigned char in_src2;
    224   1.1  christos   } sfmt_st_d;
    225   1.1  christos   struct { /*  */
    226   1.1  christos     SI* i_src1;
    227   1.1  christos     SI* i_src2;
    228   1.1  christos     UINT f_acc;
    229   1.1  christos     UINT f_r1;
    230   1.1  christos     UINT f_r2;
    231   1.1  christos     unsigned char in_src1;
    232   1.1  christos     unsigned char in_src2;
    233   1.1  christos   } sfmt_machi_a;
    234   1.1  christos   struct { /*  */
    235   1.1  christos     SI* i_dr;
    236   1.1  christos     SI* i_sr;
    237   1.1  christos     UINT f_r1;
    238   1.1  christos     UINT f_r2;
    239   1.1  christos     unsigned char in_sr;
    240   1.1  christos     unsigned char out_dr;
    241   1.1  christos     unsigned char out_sr;
    242   1.1  christos   } sfmt_ld_plus;
    243   1.1  christos   struct { /*  */
    244   1.1  christos     IADDR i_disp16;
    245   1.1  christos     SI* i_src1;
    246   1.1  christos     SI* i_src2;
    247   1.1  christos     UINT f_r1;
    248   1.1  christos     UINT f_r2;
    249   1.1  christos     unsigned char in_src1;
    250   1.1  christos     unsigned char in_src2;
    251   1.1  christos   } sfmt_beq;
    252   1.1  christos   struct { /*  */
    253   1.1  christos     SI* i_dr;
    254   1.1  christos     SI* i_sr;
    255   1.1  christos     UINT f_r1;
    256   1.1  christos     UINT f_r2;
    257   1.1  christos     UINT f_uimm16;
    258   1.1  christos     unsigned char in_sr;
    259   1.1  christos     unsigned char out_dr;
    260   1.1  christos   } sfmt_and3;
    261   1.1  christos   struct { /*  */
    262   1.1  christos     SI* i_dr;
    263   1.1  christos     SI* i_sr;
    264   1.1  christos     INT f_simm16;
    265   1.1  christos     UINT f_r1;
    266   1.1  christos     UINT f_r2;
    267   1.1  christos     unsigned char in_sr;
    268   1.1  christos     unsigned char out_dr;
    269   1.1  christos   } sfmt_add3;
    270   1.1  christos   struct { /*  */
    271   1.1  christos     SI* i_dr;
    272   1.1  christos     SI* i_sr;
    273   1.1  christos     UINT f_r1;
    274   1.1  christos     UINT f_r2;
    275   1.1  christos     unsigned char in_dr;
    276   1.1  christos     unsigned char in_sr;
    277   1.1  christos     unsigned char out_dr;
    278   1.1  christos   } sfmt_add;
    279   1.1  christos #if WITH_SCACHE_PBB
    280   1.1  christos   /* Writeback handler.  */
    281   1.1  christos   struct {
    282   1.1  christos     /* Pointer to argbuf entry for insn whose results need writing back.  */
    283   1.1  christos     const struct argbuf *abuf;
    284   1.1  christos   } write;
    285   1.1  christos   /* x-before handler */
    286   1.1  christos   struct {
    287   1.1  christos     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
    288   1.1  christos     int first_p;
    289   1.1  christos   } before;
    290   1.1  christos   /* x-after handler */
    291   1.1  christos   struct {
    292   1.1  christos     int empty;
    293   1.1  christos   } after;
    294   1.1  christos   /* This entry is used to terminate each pbb.  */
    295   1.1  christos   struct {
    296   1.1  christos     /* Number of insns in pbb.  */
    297   1.1  christos     int insn_count;
    298   1.1  christos     /* Next pbb to execute.  */
    299   1.1  christos     SCACHE *next;
    300   1.1  christos     SCACHE *branch_target;
    301   1.1  christos   } chain;
    302   1.1  christos #endif
    303   1.1  christos };
    304   1.1  christos 
    305   1.1  christos /* The ARGBUF struct.  */
    306   1.1  christos struct argbuf {
    307   1.1  christos   /* These are the baseclass definitions.  */
    308   1.1  christos   IADDR addr;
    309   1.1  christos   const IDESC *idesc;
    310   1.1  christos   char trace_p;
    311   1.1  christos   char profile_p;
    312   1.1  christos   /* ??? Temporary hack for skip insns.  */
    313   1.1  christos   char skip_count;
    314   1.1  christos   char unused;
    315   1.1  christos   /* cpu specific data follows */
    316   1.1  christos   union sem semantic;
    317   1.1  christos   int written;
    318   1.1  christos   union sem_fields fields;
    319   1.1  christos };
    320   1.1  christos 
    321   1.1  christos /* A cached insn.
    322   1.1  christos 
    323   1.1  christos    ??? SCACHE used to contain more than just argbuf.  We could delete the
    324   1.1  christos    type entirely and always just use ARGBUF, but for future concerns and as
    325   1.1  christos    a level of abstraction it is left in.  */
    326   1.1  christos 
    327   1.1  christos struct scache {
    328   1.1  christos   struct argbuf argbuf;
    329   1.1  christos };
    330   1.1  christos 
    331   1.1  christos /* Macros to simplify extraction, reading and semantic code.
    332   1.1  christos    These define and assign the local vars that contain the insn's fields.  */
    333   1.1  christos 
    334   1.1  christos #define EXTRACT_IFMT_EMPTY_VARS \
    335   1.1  christos   unsigned int length;
    336   1.1  christos #define EXTRACT_IFMT_EMPTY_CODE \
    337   1.1  christos   length = 0; \
    338   1.1  christos 
    339   1.1  christos #define EXTRACT_IFMT_ADD_VARS \
    340   1.1  christos   UINT f_op1; \
    341   1.1  christos   UINT f_r1; \
    342   1.1  christos   UINT f_op2; \
    343   1.1  christos   UINT f_r2; \
    344   1.1  christos   unsigned int length;
    345   1.1  christos #define EXTRACT_IFMT_ADD_CODE \
    346   1.1  christos   length = 2; \
    347   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    348   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    349   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    350   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    351   1.1  christos 
    352   1.1  christos #define EXTRACT_IFMT_ADD3_VARS \
    353   1.1  christos   UINT f_op1; \
    354   1.1  christos   UINT f_r1; \
    355   1.1  christos   UINT f_op2; \
    356   1.1  christos   UINT f_r2; \
    357   1.1  christos   INT f_simm16; \
    358   1.1  christos   unsigned int length;
    359   1.1  christos #define EXTRACT_IFMT_ADD3_CODE \
    360   1.1  christos   length = 4; \
    361   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    362   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    363   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    364   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    365   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    366   1.1  christos 
    367   1.1  christos #define EXTRACT_IFMT_AND3_VARS \
    368   1.1  christos   UINT f_op1; \
    369   1.1  christos   UINT f_r1; \
    370   1.1  christos   UINT f_op2; \
    371   1.1  christos   UINT f_r2; \
    372   1.1  christos   UINT f_uimm16; \
    373   1.1  christos   unsigned int length;
    374   1.1  christos #define EXTRACT_IFMT_AND3_CODE \
    375   1.1  christos   length = 4; \
    376   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    377   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    378   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    379   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    380   1.1  christos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
    381   1.1  christos 
    382   1.1  christos #define EXTRACT_IFMT_OR3_VARS \
    383   1.1  christos   UINT f_op1; \
    384   1.1  christos   UINT f_r1; \
    385   1.1  christos   UINT f_op2; \
    386   1.1  christos   UINT f_r2; \
    387   1.1  christos   UINT f_uimm16; \
    388   1.1  christos   unsigned int length;
    389   1.1  christos #define EXTRACT_IFMT_OR3_CODE \
    390   1.1  christos   length = 4; \
    391   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    392   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    393   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    394   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    395   1.1  christos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
    396   1.1  christos 
    397   1.1  christos #define EXTRACT_IFMT_ADDI_VARS \
    398   1.1  christos   UINT f_op1; \
    399   1.1  christos   UINT f_r1; \
    400   1.1  christos   INT f_simm8; \
    401   1.1  christos   unsigned int length;
    402   1.1  christos #define EXTRACT_IFMT_ADDI_CODE \
    403   1.1  christos   length = 2; \
    404   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    405   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    406   1.1  christos   f_simm8 = EXTRACT_MSB0_SINT (insn, 16, 8, 8); \
    407   1.1  christos 
    408   1.1  christos #define EXTRACT_IFMT_ADDV3_VARS \
    409   1.1  christos   UINT f_op1; \
    410   1.1  christos   UINT f_r1; \
    411   1.1  christos   UINT f_op2; \
    412   1.1  christos   UINT f_r2; \
    413   1.1  christos   INT f_simm16; \
    414   1.1  christos   unsigned int length;
    415   1.1  christos #define EXTRACT_IFMT_ADDV3_CODE \
    416   1.1  christos   length = 4; \
    417   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    418   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    419   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    420   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    421   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    422   1.1  christos 
    423   1.1  christos #define EXTRACT_IFMT_BC8_VARS \
    424   1.1  christos   UINT f_op1; \
    425   1.1  christos   UINT f_r1; \
    426   1.1  christos   SI f_disp8; \
    427   1.1  christos   unsigned int length;
    428   1.1  christos #define EXTRACT_IFMT_BC8_CODE \
    429   1.1  christos   length = 2; \
    430   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    431   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    432  1.11  christos   f_disp8 = ((((EXTRACT_MSB0_SINT (insn, 16, 8, 8)) * (4))) + (((pc) & (-4)))); \
    433   1.1  christos 
    434   1.1  christos #define EXTRACT_IFMT_BC24_VARS \
    435   1.1  christos   UINT f_op1; \
    436   1.1  christos   UINT f_r1; \
    437   1.1  christos   SI f_disp24; \
    438   1.1  christos   unsigned int length;
    439   1.1  christos #define EXTRACT_IFMT_BC24_CODE \
    440   1.1  christos   length = 4; \
    441   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    442   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    443  1.11  christos   f_disp24 = ((((EXTRACT_MSB0_SINT (insn, 32, 8, 24)) * (4))) + (pc)); \
    444   1.1  christos 
    445   1.1  christos #define EXTRACT_IFMT_BEQ_VARS \
    446   1.1  christos   UINT f_op1; \
    447   1.1  christos   UINT f_r1; \
    448   1.1  christos   UINT f_op2; \
    449   1.1  christos   UINT f_r2; \
    450   1.1  christos   SI f_disp16; \
    451   1.1  christos   unsigned int length;
    452   1.1  christos #define EXTRACT_IFMT_BEQ_CODE \
    453   1.1  christos   length = 4; \
    454   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    455   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    456   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    457   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    458  1.11  christos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
    459   1.1  christos 
    460   1.1  christos #define EXTRACT_IFMT_BEQZ_VARS \
    461   1.1  christos   UINT f_op1; \
    462   1.1  christos   UINT f_r1; \
    463   1.1  christos   UINT f_op2; \
    464   1.1  christos   UINT f_r2; \
    465   1.1  christos   SI f_disp16; \
    466   1.1  christos   unsigned int length;
    467   1.1  christos #define EXTRACT_IFMT_BEQZ_CODE \
    468   1.1  christos   length = 4; \
    469   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    470   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    471   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    472   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    473  1.11  christos   f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) * (4))) + (pc)); \
    474   1.1  christos 
    475   1.1  christos #define EXTRACT_IFMT_CMP_VARS \
    476   1.1  christos   UINT f_op1; \
    477   1.1  christos   UINT f_r1; \
    478   1.1  christos   UINT f_op2; \
    479   1.1  christos   UINT f_r2; \
    480   1.1  christos   unsigned int length;
    481   1.1  christos #define EXTRACT_IFMT_CMP_CODE \
    482   1.1  christos   length = 2; \
    483   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    484   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    485   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    486   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    487   1.1  christos 
    488   1.1  christos #define EXTRACT_IFMT_CMPI_VARS \
    489   1.1  christos   UINT f_op1; \
    490   1.1  christos   UINT f_r1; \
    491   1.1  christos   UINT f_op2; \
    492   1.1  christos   UINT f_r2; \
    493   1.1  christos   INT f_simm16; \
    494   1.1  christos   unsigned int length;
    495   1.1  christos #define EXTRACT_IFMT_CMPI_CODE \
    496   1.1  christos   length = 4; \
    497   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    498   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    499   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    500   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    501   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    502   1.1  christos 
    503   1.1  christos #define EXTRACT_IFMT_CMPZ_VARS \
    504   1.1  christos   UINT f_op1; \
    505   1.1  christos   UINT f_r1; \
    506   1.1  christos   UINT f_op2; \
    507   1.1  christos   UINT f_r2; \
    508   1.1  christos   unsigned int length;
    509   1.1  christos #define EXTRACT_IFMT_CMPZ_CODE \
    510   1.1  christos   length = 2; \
    511   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    512   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    513   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    514   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    515   1.1  christos 
    516   1.1  christos #define EXTRACT_IFMT_DIV_VARS \
    517   1.1  christos   UINT f_op1; \
    518   1.1  christos   UINT f_r1; \
    519   1.1  christos   UINT f_op2; \
    520   1.1  christos   UINT f_r2; \
    521   1.1  christos   INT f_simm16; \
    522   1.1  christos   unsigned int length;
    523   1.1  christos #define EXTRACT_IFMT_DIV_CODE \
    524   1.1  christos   length = 4; \
    525   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    526   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    527   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    528   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    529   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    530   1.1  christos 
    531   1.1  christos #define EXTRACT_IFMT_JC_VARS \
    532   1.1  christos   UINT f_op1; \
    533   1.1  christos   UINT f_r1; \
    534   1.1  christos   UINT f_op2; \
    535   1.1  christos   UINT f_r2; \
    536   1.1  christos   unsigned int length;
    537   1.1  christos #define EXTRACT_IFMT_JC_CODE \
    538   1.1  christos   length = 2; \
    539   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    540   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    541   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    542   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    543   1.1  christos 
    544   1.1  christos #define EXTRACT_IFMT_LD24_VARS \
    545   1.1  christos   UINT f_op1; \
    546   1.1  christos   UINT f_r1; \
    547   1.1  christos   UINT f_uimm24; \
    548   1.1  christos   unsigned int length;
    549   1.1  christos #define EXTRACT_IFMT_LD24_CODE \
    550   1.1  christos   length = 4; \
    551   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    552   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    553   1.1  christos   f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
    554   1.1  christos 
    555   1.1  christos #define EXTRACT_IFMT_LDI16_VARS \
    556   1.1  christos   UINT f_op1; \
    557   1.1  christos   UINT f_r1; \
    558   1.1  christos   UINT f_op2; \
    559   1.1  christos   UINT f_r2; \
    560   1.1  christos   INT f_simm16; \
    561   1.1  christos   unsigned int length;
    562   1.1  christos #define EXTRACT_IFMT_LDI16_CODE \
    563   1.1  christos   length = 4; \
    564   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    565   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    566   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    567   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    568   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    569   1.1  christos 
    570   1.1  christos #define EXTRACT_IFMT_MACHI_A_VARS \
    571   1.1  christos   UINT f_op1; \
    572   1.1  christos   UINT f_r1; \
    573   1.1  christos   UINT f_acc; \
    574   1.1  christos   UINT f_op23; \
    575   1.1  christos   UINT f_r2; \
    576   1.1  christos   unsigned int length;
    577   1.1  christos #define EXTRACT_IFMT_MACHI_A_CODE \
    578   1.1  christos   length = 2; \
    579   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    580   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    581   1.1  christos   f_acc = EXTRACT_MSB0_UINT (insn, 16, 8, 1); \
    582   1.1  christos   f_op23 = EXTRACT_MSB0_UINT (insn, 16, 9, 3); \
    583   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    584   1.1  christos 
    585   1.1  christos #define EXTRACT_IFMT_MVFACHI_A_VARS \
    586   1.1  christos   UINT f_op1; \
    587   1.1  christos   UINT f_r1; \
    588   1.1  christos   UINT f_op2; \
    589   1.1  christos   UINT f_accs; \
    590   1.1  christos   UINT f_op3; \
    591   1.1  christos   unsigned int length;
    592   1.1  christos #define EXTRACT_IFMT_MVFACHI_A_CODE \
    593   1.1  christos   length = 2; \
    594   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    595   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    596   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    597   1.1  christos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
    598   1.1  christos   f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
    599   1.1  christos 
    600   1.1  christos #define EXTRACT_IFMT_MVFC_VARS \
    601   1.1  christos   UINT f_op1; \
    602   1.1  christos   UINT f_r1; \
    603   1.1  christos   UINT f_op2; \
    604   1.1  christos   UINT f_r2; \
    605   1.1  christos   unsigned int length;
    606   1.1  christos #define EXTRACT_IFMT_MVFC_CODE \
    607   1.1  christos   length = 2; \
    608   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    609   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    610   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    611   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    612   1.1  christos 
    613   1.1  christos #define EXTRACT_IFMT_MVTACHI_A_VARS \
    614   1.1  christos   UINT f_op1; \
    615   1.1  christos   UINT f_r1; \
    616   1.1  christos   UINT f_op2; \
    617   1.1  christos   UINT f_accs; \
    618   1.1  christos   UINT f_op3; \
    619   1.1  christos   unsigned int length;
    620   1.1  christos #define EXTRACT_IFMT_MVTACHI_A_CODE \
    621   1.1  christos   length = 2; \
    622   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    623   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    624   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    625   1.1  christos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
    626   1.1  christos   f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
    627   1.1  christos 
    628   1.1  christos #define EXTRACT_IFMT_MVTC_VARS \
    629   1.1  christos   UINT f_op1; \
    630   1.1  christos   UINT f_r1; \
    631   1.1  christos   UINT f_op2; \
    632   1.1  christos   UINT f_r2; \
    633   1.1  christos   unsigned int length;
    634   1.1  christos #define EXTRACT_IFMT_MVTC_CODE \
    635   1.1  christos   length = 2; \
    636   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    637   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    638   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    639   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    640   1.1  christos 
    641   1.1  christos #define EXTRACT_IFMT_NOP_VARS \
    642   1.1  christos   UINT f_op1; \
    643   1.1  christos   UINT f_r1; \
    644   1.1  christos   UINT f_op2; \
    645   1.1  christos   UINT f_r2; \
    646   1.1  christos   unsigned int length;
    647   1.1  christos #define EXTRACT_IFMT_NOP_CODE \
    648   1.1  christos   length = 2; \
    649   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    650   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    651   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    652   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    653   1.1  christos 
    654   1.1  christos #define EXTRACT_IFMT_RAC_DSI_VARS \
    655   1.1  christos   UINT f_op1; \
    656   1.1  christos   UINT f_accd; \
    657   1.1  christos   UINT f_bits67; \
    658   1.1  christos   UINT f_op2; \
    659   1.1  christos   UINT f_accs; \
    660   1.1  christos   UINT f_bit14; \
    661   1.1  christos   SI f_imm1; \
    662   1.1  christos   unsigned int length;
    663   1.1  christos #define EXTRACT_IFMT_RAC_DSI_CODE \
    664   1.1  christos   length = 2; \
    665   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    666   1.1  christos   f_accd = EXTRACT_MSB0_UINT (insn, 16, 4, 2); \
    667   1.1  christos   f_bits67 = EXTRACT_MSB0_UINT (insn, 16, 6, 2); \
    668   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    669   1.1  christos   f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
    670   1.1  christos   f_bit14 = EXTRACT_MSB0_UINT (insn, 16, 14, 1); \
    671   1.1  christos   f_imm1 = ((EXTRACT_MSB0_UINT (insn, 16, 15, 1)) + (1)); \
    672   1.1  christos 
    673   1.1  christos #define EXTRACT_IFMT_SETH_VARS \
    674   1.1  christos   UINT f_op1; \
    675   1.1  christos   UINT f_r1; \
    676   1.1  christos   UINT f_op2; \
    677   1.1  christos   UINT f_r2; \
    678   1.1  christos   UINT f_hi16; \
    679   1.1  christos   unsigned int length;
    680   1.1  christos #define EXTRACT_IFMT_SETH_CODE \
    681   1.1  christos   length = 4; \
    682   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    683   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    684   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    685   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    686   1.1  christos   f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
    687   1.1  christos 
    688   1.1  christos #define EXTRACT_IFMT_SLLI_VARS \
    689   1.1  christos   UINT f_op1; \
    690   1.1  christos   UINT f_r1; \
    691   1.1  christos   UINT f_shift_op2; \
    692   1.1  christos   UINT f_uimm5; \
    693   1.1  christos   unsigned int length;
    694   1.1  christos #define EXTRACT_IFMT_SLLI_CODE \
    695   1.1  christos   length = 2; \
    696   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    697   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    698   1.1  christos   f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
    699   1.1  christos   f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
    700   1.1  christos 
    701   1.1  christos #define EXTRACT_IFMT_ST_D_VARS \
    702   1.1  christos   UINT f_op1; \
    703   1.1  christos   UINT f_r1; \
    704   1.1  christos   UINT f_op2; \
    705   1.1  christos   UINT f_r2; \
    706   1.1  christos   INT f_simm16; \
    707   1.1  christos   unsigned int length;
    708   1.1  christos #define EXTRACT_IFMT_ST_D_CODE \
    709   1.1  christos   length = 4; \
    710   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    711   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    712   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    713   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    714   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    715   1.1  christos 
    716   1.1  christos #define EXTRACT_IFMT_TRAP_VARS \
    717   1.1  christos   UINT f_op1; \
    718   1.1  christos   UINT f_r1; \
    719   1.1  christos   UINT f_op2; \
    720   1.1  christos   UINT f_uimm4; \
    721   1.1  christos   unsigned int length;
    722   1.1  christos #define EXTRACT_IFMT_TRAP_CODE \
    723   1.1  christos   length = 2; \
    724   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    725   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    726   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    727   1.1  christos   f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    728   1.1  christos 
    729   1.1  christos #define EXTRACT_IFMT_SATB_VARS \
    730   1.1  christos   UINT f_op1; \
    731   1.1  christos   UINT f_r1; \
    732   1.1  christos   UINT f_op2; \
    733   1.1  christos   UINT f_r2; \
    734   1.1  christos   UINT f_uimm16; \
    735   1.1  christos   unsigned int length;
    736   1.1  christos #define EXTRACT_IFMT_SATB_CODE \
    737   1.1  christos   length = 4; \
    738   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    739   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
    740   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    741   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    742   1.1  christos   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
    743   1.1  christos 
    744   1.1  christos #define EXTRACT_IFMT_CLRPSW_VARS \
    745   1.1  christos   UINT f_op1; \
    746   1.1  christos   UINT f_r1; \
    747   1.1  christos   UINT f_uimm8; \
    748   1.1  christos   unsigned int length;
    749   1.1  christos #define EXTRACT_IFMT_CLRPSW_CODE \
    750   1.1  christos   length = 2; \
    751   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    752   1.1  christos   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
    753   1.1  christos   f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
    754   1.1  christos 
    755   1.1  christos #define EXTRACT_IFMT_BSET_VARS \
    756   1.1  christos   UINT f_op1; \
    757   1.1  christos   UINT f_bit4; \
    758   1.1  christos   UINT f_uimm3; \
    759   1.1  christos   UINT f_op2; \
    760   1.1  christos   UINT f_r2; \
    761   1.1  christos   INT f_simm16; \
    762   1.1  christos   unsigned int length;
    763   1.1  christos #define EXTRACT_IFMT_BSET_CODE \
    764   1.1  christos   length = 4; \
    765   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
    766   1.1  christos   f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
    767   1.1  christos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
    768   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
    769   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
    770   1.1  christos   f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \
    771   1.1  christos 
    772   1.1  christos #define EXTRACT_IFMT_BTST_VARS \
    773   1.1  christos   UINT f_op1; \
    774   1.1  christos   UINT f_bit4; \
    775   1.1  christos   UINT f_uimm3; \
    776   1.1  christos   UINT f_op2; \
    777   1.1  christos   UINT f_r2; \
    778   1.1  christos   unsigned int length;
    779   1.1  christos #define EXTRACT_IFMT_BTST_CODE \
    780   1.1  christos   length = 2; \
    781   1.1  christos   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
    782   1.1  christos   f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
    783   1.1  christos   f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
    784   1.1  christos   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
    785   1.1  christos   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
    786   1.1  christos 
    787   1.1  christos /* Queued output values of an instruction.  */
    788   1.1  christos 
    789   1.1  christos struct parexec {
    790   1.1  christos   union {
    791   1.1  christos     struct { /* empty sformat for unspecified field list */
    792   1.1  christos       int empty;
    793   1.1  christos     } sfmt_empty;
    794   1.1  christos     struct { /* e.g. add $dr,$sr */
    795   1.1  christos       SI dr;
    796   1.1  christos     } sfmt_add;
    797   1.1  christos     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
    798   1.1  christos       SI dr;
    799   1.1  christos     } sfmt_add3;
    800   1.1  christos     struct { /* e.g. and3 $dr,$sr,$uimm16 */
    801   1.1  christos       SI dr;
    802   1.1  christos     } sfmt_and3;
    803   1.1  christos     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
    804   1.1  christos       SI dr;
    805   1.1  christos     } sfmt_or3;
    806   1.1  christos     struct { /* e.g. addi $dr,$simm8 */
    807   1.1  christos       SI dr;
    808   1.1  christos     } sfmt_addi;
    809   1.1  christos     struct { /* e.g. addv $dr,$sr */
    810   1.1  christos       BI condbit;
    811   1.1  christos       SI dr;
    812   1.1  christos     } sfmt_addv;
    813   1.1  christos     struct { /* e.g. addv3 $dr,$sr,$simm16 */
    814   1.1  christos       BI condbit;
    815   1.1  christos       SI dr;
    816   1.1  christos     } sfmt_addv3;
    817   1.1  christos     struct { /* e.g. addx $dr,$sr */
    818   1.1  christos       BI condbit;
    819   1.1  christos       SI dr;
    820   1.1  christos     } sfmt_addx;
    821   1.1  christos     struct { /* e.g. bc.s $disp8 */
    822   1.1  christos       USI pc;
    823   1.1  christos     } sfmt_bc8;
    824   1.1  christos     struct { /* e.g. bc.l $disp24 */
    825   1.1  christos       USI pc;
    826   1.1  christos     } sfmt_bc24;
    827   1.1  christos     struct { /* e.g. beq $src1,$src2,$disp16 */
    828   1.1  christos       USI pc;
    829   1.1  christos     } sfmt_beq;
    830   1.1  christos     struct { /* e.g. beqz $src2,$disp16 */
    831   1.1  christos       USI pc;
    832   1.1  christos     } sfmt_beqz;
    833   1.1  christos     struct { /* e.g. bl.s $disp8 */
    834   1.1  christos       SI h_gr_SI_14;
    835   1.1  christos       USI pc;
    836   1.1  christos     } sfmt_bl8;
    837   1.1  christos     struct { /* e.g. bl.l $disp24 */
    838   1.1  christos       SI h_gr_SI_14;
    839   1.1  christos       USI pc;
    840   1.1  christos     } sfmt_bl24;
    841   1.1  christos     struct { /* e.g. bcl.s $disp8 */
    842   1.1  christos       SI h_gr_SI_14;
    843   1.1  christos       USI pc;
    844   1.1  christos     } sfmt_bcl8;
    845   1.1  christos     struct { /* e.g. bcl.l $disp24 */
    846   1.1  christos       SI h_gr_SI_14;
    847   1.1  christos       USI pc;
    848   1.1  christos     } sfmt_bcl24;
    849   1.1  christos     struct { /* e.g. bra.s $disp8 */
    850   1.1  christos       USI pc;
    851   1.1  christos     } sfmt_bra8;
    852   1.1  christos     struct { /* e.g. bra.l $disp24 */
    853   1.1  christos       USI pc;
    854   1.1  christos     } sfmt_bra24;
    855   1.1  christos     struct { /* e.g. cmp $src1,$src2 */
    856   1.1  christos       BI condbit;
    857   1.1  christos     } sfmt_cmp;
    858   1.1  christos     struct { /* e.g. cmpi $src2,$simm16 */
    859   1.1  christos       BI condbit;
    860   1.1  christos     } sfmt_cmpi;
    861   1.1  christos     struct { /* e.g. cmpz $src2 */
    862   1.1  christos       BI condbit;
    863   1.1  christos     } sfmt_cmpz;
    864   1.1  christos     struct { /* e.g. div $dr,$sr */
    865   1.1  christos       SI dr;
    866   1.1  christos     } sfmt_div;
    867   1.1  christos     struct { /* e.g. jc $sr */
    868   1.1  christos       USI pc;
    869   1.1  christos     } sfmt_jc;
    870   1.1  christos     struct { /* e.g. jl $sr */
    871   1.1  christos       SI h_gr_SI_14;
    872   1.1  christos       USI pc;
    873   1.1  christos     } sfmt_jl;
    874   1.1  christos     struct { /* e.g. jmp $sr */
    875   1.1  christos       USI pc;
    876   1.1  christos     } sfmt_jmp;
    877   1.1  christos     struct { /* e.g. ld $dr,@$sr */
    878   1.1  christos       SI dr;
    879   1.1  christos     } sfmt_ld;
    880   1.1  christos     struct { /* e.g. ld $dr,@($slo16,$sr) */
    881   1.1  christos       SI dr;
    882   1.1  christos     } sfmt_ld_d;
    883   1.1  christos     struct { /* e.g. ldb $dr,@$sr */
    884   1.1  christos       SI dr;
    885   1.1  christos     } sfmt_ldb;
    886   1.1  christos     struct { /* e.g. ldb $dr,@($slo16,$sr) */
    887   1.1  christos       SI dr;
    888   1.1  christos     } sfmt_ldb_d;
    889   1.1  christos     struct { /* e.g. ldh $dr,@$sr */
    890   1.1  christos       SI dr;
    891   1.1  christos     } sfmt_ldh;
    892   1.1  christos     struct { /* e.g. ldh $dr,@($slo16,$sr) */
    893   1.1  christos       SI dr;
    894   1.1  christos     } sfmt_ldh_d;
    895   1.1  christos     struct { /* e.g. ld $dr,@$sr+ */
    896   1.1  christos       SI dr;
    897   1.1  christos       SI sr;
    898   1.1  christos     } sfmt_ld_plus;
    899   1.1  christos     struct { /* e.g. ld24 $dr,$uimm24 */
    900   1.1  christos       SI dr;
    901   1.1  christos     } sfmt_ld24;
    902   1.1  christos     struct { /* e.g. ldi8 $dr,$simm8 */
    903   1.1  christos       SI dr;
    904   1.1  christos     } sfmt_ldi8;
    905   1.1  christos     struct { /* e.g. ldi16 $dr,$hash$slo16 */
    906   1.1  christos       SI dr;
    907   1.1  christos     } sfmt_ldi16;
    908   1.1  christos     struct { /* e.g. lock $dr,@$sr */
    909   1.1  christos       SI dr;
    910   1.1  christos       BI h_lock_BI;
    911   1.1  christos     } sfmt_lock;
    912   1.1  christos     struct { /* e.g. machi $src1,$src2,$acc */
    913   1.1  christos       DI acc;
    914   1.1  christos     } sfmt_machi_a;
    915   1.1  christos     struct { /* e.g. mulhi $src1,$src2,$acc */
    916   1.1  christos       DI acc;
    917   1.1  christos     } sfmt_mulhi_a;
    918   1.1  christos     struct { /* e.g. mv $dr,$sr */
    919   1.1  christos       SI dr;
    920   1.1  christos     } sfmt_mv;
    921   1.1  christos     struct { /* e.g. mvfachi $dr,$accs */
    922   1.1  christos       SI dr;
    923   1.1  christos     } sfmt_mvfachi_a;
    924   1.1  christos     struct { /* e.g. mvfc $dr,$scr */
    925   1.1  christos       SI dr;
    926   1.1  christos     } sfmt_mvfc;
    927   1.1  christos     struct { /* e.g. mvtachi $src1,$accs */
    928   1.1  christos       DI accs;
    929   1.1  christos     } sfmt_mvtachi_a;
    930   1.1  christos     struct { /* e.g. mvtc $sr,$dcr */
    931   1.1  christos       USI dcr;
    932   1.1  christos     } sfmt_mvtc;
    933   1.1  christos     struct { /* e.g. nop */
    934   1.1  christos       int empty;
    935   1.1  christos     } sfmt_nop;
    936   1.1  christos     struct { /* e.g. rac $accd,$accs,$imm1 */
    937   1.1  christos       DI accd;
    938   1.1  christos     } sfmt_rac_dsi;
    939   1.1  christos     struct { /* e.g. rte */
    940   1.1  christos       UQI h_bpsw_UQI;
    941   1.1  christos       USI h_cr_USI_6;
    942   1.1  christos       UQI h_psw_UQI;
    943   1.1  christos       USI pc;
    944   1.1  christos     } sfmt_rte;
    945   1.1  christos     struct { /* e.g. seth $dr,$hash$hi16 */
    946   1.1  christos       SI dr;
    947   1.1  christos     } sfmt_seth;
    948   1.1  christos     struct { /* e.g. sll3 $dr,$sr,$simm16 */
    949   1.1  christos       SI dr;
    950   1.1  christos     } sfmt_sll3;
    951   1.1  christos     struct { /* e.g. slli $dr,$uimm5 */
    952   1.1  christos       SI dr;
    953   1.1  christos     } sfmt_slli;
    954   1.1  christos     struct { /* e.g. st $src1,@$src2 */
    955   1.1  christos       SI h_memory_SI_src2;
    956   1.1  christos       USI h_memory_SI_src2_idx;
    957   1.1  christos     } sfmt_st;
    958   1.1  christos     struct { /* e.g. st $src1,@($slo16,$src2) */
    959   1.1  christos       SI h_memory_SI_add__SI_src2_slo16;
    960   1.1  christos       USI h_memory_SI_add__SI_src2_slo16_idx;
    961   1.1  christos     } sfmt_st_d;
    962   1.1  christos     struct { /* e.g. stb $src1,@$src2 */
    963   1.1  christos       QI h_memory_QI_src2;
    964   1.1  christos       USI h_memory_QI_src2_idx;
    965   1.1  christos     } sfmt_stb;
    966   1.1  christos     struct { /* e.g. stb $src1,@($slo16,$src2) */
    967   1.1  christos       QI h_memory_QI_add__SI_src2_slo16;
    968   1.1  christos       USI h_memory_QI_add__SI_src2_slo16_idx;
    969   1.1  christos     } sfmt_stb_d;
    970   1.1  christos     struct { /* e.g. sth $src1,@$src2 */
    971   1.1  christos       HI h_memory_HI_src2;
    972   1.1  christos       USI h_memory_HI_src2_idx;
    973   1.1  christos     } sfmt_sth;
    974   1.1  christos     struct { /* e.g. sth $src1,@($slo16,$src2) */
    975   1.1  christos       HI h_memory_HI_add__SI_src2_slo16;
    976   1.1  christos       USI h_memory_HI_add__SI_src2_slo16_idx;
    977   1.1  christos     } sfmt_sth_d;
    978   1.1  christos     struct { /* e.g. st $src1,@+$src2 */
    979   1.1  christos       SI h_memory_SI_new_src2;
    980   1.1  christos       USI h_memory_SI_new_src2_idx;
    981   1.1  christos       SI src2;
    982   1.1  christos     } sfmt_st_plus;
    983   1.1  christos     struct { /* e.g. sth $src1,@$src2+ */
    984   1.1  christos       HI h_memory_HI_new_src2;
    985   1.1  christos       USI h_memory_HI_new_src2_idx;
    986   1.1  christos       SI src2;
    987   1.1  christos     } sfmt_sth_plus;
    988   1.1  christos     struct { /* e.g. stb $src1,@$src2+ */
    989   1.1  christos       QI h_memory_QI_new_src2;
    990   1.1  christos       USI h_memory_QI_new_src2_idx;
    991   1.1  christos       SI src2;
    992   1.1  christos     } sfmt_stb_plus;
    993   1.1  christos     struct { /* e.g. trap $uimm4 */
    994   1.1  christos       UQI h_bbpsw_UQI;
    995   1.1  christos       UQI h_bpsw_UQI;
    996   1.1  christos       USI h_cr_USI_14;
    997   1.1  christos       USI h_cr_USI_6;
    998   1.1  christos       UQI h_psw_UQI;
    999   1.1  christos       USI pc;
   1000   1.1  christos     } sfmt_trap;
   1001   1.1  christos     struct { /* e.g. unlock $src1,@$src2 */
   1002   1.1  christos       BI h_lock_BI;
   1003   1.1  christos       SI h_memory_SI_src2;
   1004   1.1  christos       USI h_memory_SI_src2_idx;
   1005   1.1  christos     } sfmt_unlock;
   1006   1.1  christos     struct { /* e.g. satb $dr,$sr */
   1007   1.1  christos       SI dr;
   1008   1.1  christos     } sfmt_satb;
   1009   1.1  christos     struct { /* e.g. sat $dr,$sr */
   1010   1.1  christos       SI dr;
   1011   1.1  christos     } sfmt_sat;
   1012   1.1  christos     struct { /* e.g. sadd */
   1013   1.1  christos       DI h_accums_DI_0;
   1014   1.1  christos     } sfmt_sadd;
   1015   1.1  christos     struct { /* e.g. macwu1 $src1,$src2 */
   1016   1.1  christos       DI h_accums_DI_1;
   1017   1.1  christos     } sfmt_macwu1;
   1018   1.1  christos     struct { /* e.g. msblo $src1,$src2 */
   1019   1.1  christos       DI accum;
   1020   1.1  christos     } sfmt_msblo;
   1021   1.1  christos     struct { /* e.g. mulwu1 $src1,$src2 */
   1022   1.1  christos       DI h_accums_DI_1;
   1023   1.1  christos     } sfmt_mulwu1;
   1024   1.1  christos     struct { /* e.g. sc */
   1025   1.1  christos       int empty;
   1026   1.1  christos     } sfmt_sc;
   1027   1.1  christos     struct { /* e.g. clrpsw $uimm8 */
   1028   1.1  christos       USI h_cr_USI_0;
   1029   1.1  christos     } sfmt_clrpsw;
   1030   1.1  christos     struct { /* e.g. setpsw $uimm8 */
   1031   1.1  christos       USI h_cr_USI_0;
   1032   1.1  christos     } sfmt_setpsw;
   1033   1.1  christos     struct { /* e.g. bset $uimm3,@($slo16,$sr) */
   1034   1.1  christos       QI h_memory_QI_add__SI_sr_slo16;
   1035   1.1  christos       USI h_memory_QI_add__SI_sr_slo16_idx;
   1036   1.1  christos     } sfmt_bset;
   1037   1.1  christos     struct { /* e.g. btst $uimm3,$sr */
   1038   1.1  christos       BI condbit;
   1039   1.1  christos     } sfmt_btst;
   1040   1.1  christos   } operands;
   1041   1.1  christos   /* For conditionally written operands, bitmask of which ones were.  */
   1042   1.1  christos   int written;
   1043   1.1  christos };
   1044   1.1  christos 
   1045   1.1  christos /* Collection of various things for the trace handler to use.  */
   1046   1.1  christos 
   1047   1.1  christos typedef struct trace_record {
   1048   1.1  christos   IADDR pc;
   1049   1.1  christos   /* FIXME:wip */
   1050   1.1  christos } TRACE_RECORD;
   1051   1.1  christos 
   1052   1.1  christos #endif /* CPU_M32RXF_H */
   1053