Switch the license of all files explicitly copyright the FSF
[external/binutils.git] / sim / m32r / cpu.h
1 /* CPU family header for m32rbf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 */
23
24 #ifndef CPU_M32RBF_H
25 #define CPU_M32RBF_H
26
27 /* Maximum number of instructions that are fetched at a time.
28    This is for LIW type instructions sets (e.g. m32r).  */
29 #define MAX_LIW_INSNS 2
30
31 /* Maximum number of instructions that can be executed in parallel.  */
32 #define MAX_PARALLEL_INSNS 1
33
34 /* CPU state information.  */
35 typedef struct {
36   /* Hardware elements.  */
37   struct {
38   /* program counter */
39   USI h_pc;
40 #define GET_H_PC() CPU (h_pc)
41 #define SET_H_PC(x) (CPU (h_pc) = (x))
42   /* general registers */
43   SI h_gr[16];
44 #define GET_H_GR(a1) CPU (h_gr)[a1]
45 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
46   /* control registers */
47   USI h_cr[16];
48 #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index)
49 #define SET_H_CR(index, x) \
50 do { \
51 m32rbf_h_cr_set_handler (current_cpu, (index), (x));\
52 ;} while (0)
53   /* accumulator */
54   DI h_accum;
55 #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu)
56 #define SET_H_ACCUM(x) \
57 do { \
58 m32rbf_h_accum_set_handler (current_cpu, (x));\
59 ;} while (0)
60   /* condition bit */
61   BI h_cond;
62 #define GET_H_COND() CPU (h_cond)
63 #define SET_H_COND(x) (CPU (h_cond) = (x))
64   /* psw part of psw */
65   UQI h_psw;
66 #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu)
67 #define SET_H_PSW(x) \
68 do { \
69 m32rbf_h_psw_set_handler (current_cpu, (x));\
70 ;} while (0)
71   /* backup psw */
72   UQI h_bpsw;
73 #define GET_H_BPSW() CPU (h_bpsw)
74 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
75   /* backup bpsw */
76   UQI h_bbpsw;
77 #define GET_H_BBPSW() CPU (h_bbpsw)
78 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
79   /* lock */
80   BI h_lock;
81 #define GET_H_LOCK() CPU (h_lock)
82 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
83   } hardware;
84 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
85 } M32RBF_CPU_DATA;
86
87 /* Cover fns for register access.  */
88 USI m32rbf_h_pc_get (SIM_CPU *);
89 void m32rbf_h_pc_set (SIM_CPU *, USI);
90 SI m32rbf_h_gr_get (SIM_CPU *, UINT);
91 void m32rbf_h_gr_set (SIM_CPU *, UINT, SI);
92 USI m32rbf_h_cr_get (SIM_CPU *, UINT);
93 void m32rbf_h_cr_set (SIM_CPU *, UINT, USI);
94 DI m32rbf_h_accum_get (SIM_CPU *);
95 void m32rbf_h_accum_set (SIM_CPU *, DI);
96 BI m32rbf_h_cond_get (SIM_CPU *);
97 void m32rbf_h_cond_set (SIM_CPU *, BI);
98 UQI m32rbf_h_psw_get (SIM_CPU *);
99 void m32rbf_h_psw_set (SIM_CPU *, UQI);
100 UQI m32rbf_h_bpsw_get (SIM_CPU *);
101 void m32rbf_h_bpsw_set (SIM_CPU *, UQI);
102 UQI m32rbf_h_bbpsw_get (SIM_CPU *);
103 void m32rbf_h_bbpsw_set (SIM_CPU *, UQI);
104 BI m32rbf_h_lock_get (SIM_CPU *);
105 void m32rbf_h_lock_set (SIM_CPU *, BI);
106
107 /* These must be hand-written.  */
108 extern CPUREG_FETCH_FN m32rbf_fetch_register;
109 extern CPUREG_STORE_FN m32rbf_store_register;
110
111 typedef struct {
112   UINT h_gr;
113 } MODEL_M32R_D_DATA;
114
115 typedef struct {
116   int empty;
117 } MODEL_TEST_DATA;
118
119 /* Instruction argument buffer.  */
120
121 union sem_fields {
122   struct { /* no operands */
123     int empty;
124   } fmt_empty;
125   struct { /*  */
126     UINT f_uimm8;
127   } sfmt_clrpsw;
128   struct { /*  */
129     UINT f_uimm4;
130   } sfmt_trap;
131   struct { /*  */
132     IADDR i_disp24;
133     unsigned char out_h_gr_SI_14;
134   } sfmt_bl24;
135   struct { /*  */
136     IADDR i_disp8;
137     unsigned char out_h_gr_SI_14;
138   } sfmt_bl8;
139   struct { /*  */
140     SI* i_dr;
141     UINT f_hi16;
142     UINT f_r1;
143     unsigned char out_dr;
144   } sfmt_seth;
145   struct { /*  */
146     ADDR i_uimm24;
147     SI* i_dr;
148     UINT f_r1;
149     unsigned char out_dr;
150   } sfmt_ld24;
151   struct { /*  */
152     SI* i_sr;
153     UINT f_r2;
154     unsigned char in_sr;
155     unsigned char out_h_gr_SI_14;
156   } sfmt_jl;
157   struct { /*  */
158     SI* i_sr;
159     INT f_simm16;
160     UINT f_r2;
161     UINT f_uimm3;
162     unsigned char in_sr;
163   } sfmt_bset;
164   struct { /*  */
165     SI* i_dr;
166     UINT f_r1;
167     UINT f_uimm5;
168     unsigned char in_dr;
169     unsigned char out_dr;
170   } sfmt_slli;
171   struct { /*  */
172     SI* i_dr;
173     INT f_simm8;
174     UINT f_r1;
175     unsigned char in_dr;
176     unsigned char out_dr;
177   } sfmt_addi;
178   struct { /*  */
179     SI* i_src1;
180     SI* i_src2;
181     UINT f_r1;
182     UINT f_r2;
183     unsigned char in_src1;
184     unsigned char in_src2;
185     unsigned char out_src2;
186   } sfmt_st_plus;
187   struct { /*  */
188     SI* i_src1;
189     SI* i_src2;
190     INT f_simm16;
191     UINT f_r1;
192     UINT f_r2;
193     unsigned char in_src1;
194     unsigned char in_src2;
195   } sfmt_st_d;
196   struct { /*  */
197     SI* i_dr;
198     SI* i_sr;
199     UINT f_r1;
200     UINT f_r2;
201     unsigned char in_sr;
202     unsigned char out_dr;
203     unsigned char out_sr;
204   } sfmt_ld_plus;
205   struct { /*  */
206     IADDR i_disp16;
207     SI* i_src1;
208     SI* i_src2;
209     UINT f_r1;
210     UINT f_r2;
211     unsigned char in_src1;
212     unsigned char in_src2;
213   } sfmt_beq;
214   struct { /*  */
215     SI* i_dr;
216     SI* i_sr;
217     UINT f_r1;
218     UINT f_r2;
219     UINT f_uimm16;
220     unsigned char in_sr;
221     unsigned char out_dr;
222   } sfmt_and3;
223   struct { /*  */
224     SI* i_dr;
225     SI* i_sr;
226     INT f_simm16;
227     UINT f_r1;
228     UINT f_r2;
229     unsigned char in_sr;
230     unsigned char out_dr;
231   } sfmt_add3;
232   struct { /*  */
233     SI* i_dr;
234     SI* i_sr;
235     UINT f_r1;
236     UINT f_r2;
237     unsigned char in_dr;
238     unsigned char in_sr;
239     unsigned char out_dr;
240   } sfmt_add;
241 #if WITH_SCACHE_PBB
242   /* Writeback handler.  */
243   struct {
244     /* Pointer to argbuf entry for insn whose results need writing back.  */
245     const struct argbuf *abuf;
246   } write;
247   /* x-before handler */
248   struct {
249     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
250     int first_p;
251   } before;
252   /* x-after handler */
253   struct {
254     int empty;
255   } after;
256   /* This entry is used to terminate each pbb.  */
257   struct {
258     /* Number of insns in pbb.  */
259     int insn_count;
260     /* Next pbb to execute.  */
261     SCACHE *next;
262     SCACHE *branch_target;
263   } chain;
264 #endif
265 };
266
267 /* The ARGBUF struct.  */
268 struct argbuf {
269   /* These are the baseclass definitions.  */
270   IADDR addr;
271   const IDESC *idesc;
272   char trace_p;
273   char profile_p;
274   /* ??? Temporary hack for skip insns.  */
275   char skip_count;
276   char unused;
277   /* cpu specific data follows */
278   union sem semantic;
279   int written;
280   union sem_fields fields;
281 };
282
283 /* A cached insn.
284
285    ??? SCACHE used to contain more than just argbuf.  We could delete the
286    type entirely and always just use ARGBUF, but for future concerns and as
287    a level of abstraction it is left in.  */
288
289 struct scache {
290   struct argbuf argbuf;
291 };
292
293 /* Macros to simplify extraction, reading and semantic code.
294    These define and assign the local vars that contain the insn's fields.  */
295
296 #define EXTRACT_IFMT_EMPTY_VARS \
297   unsigned int length;
298 #define EXTRACT_IFMT_EMPTY_CODE \
299   length = 0; \
300
301 #define EXTRACT_IFMT_ADD_VARS \
302   UINT f_op1; \
303   UINT f_r1; \
304   UINT f_op2; \
305   UINT f_r2; \
306   unsigned int length;
307 #define EXTRACT_IFMT_ADD_CODE \
308   length = 2; \
309   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
310   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
311   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
312   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
313
314 #define EXTRACT_IFMT_ADD3_VARS \
315   UINT f_op1; \
316   UINT f_r1; \
317   UINT f_op2; \
318   UINT f_r2; \
319   INT f_simm16; \
320   unsigned int length;
321 #define EXTRACT_IFMT_ADD3_CODE \
322   length = 4; \
323   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
324   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
325   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
326   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
327   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
328
329 #define EXTRACT_IFMT_AND3_VARS \
330   UINT f_op1; \
331   UINT f_r1; \
332   UINT f_op2; \
333   UINT f_r2; \
334   UINT f_uimm16; \
335   unsigned int length;
336 #define EXTRACT_IFMT_AND3_CODE \
337   length = 4; \
338   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
339   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
340   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
341   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
342   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
343
344 #define EXTRACT_IFMT_OR3_VARS \
345   UINT f_op1; \
346   UINT f_r1; \
347   UINT f_op2; \
348   UINT f_r2; \
349   UINT f_uimm16; \
350   unsigned int length;
351 #define EXTRACT_IFMT_OR3_CODE \
352   length = 4; \
353   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
354   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
355   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
356   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
357   f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
358
359 #define EXTRACT_IFMT_ADDI_VARS \
360   UINT f_op1; \
361   UINT f_r1; \
362   INT f_simm8; \
363   unsigned int length;
364 #define EXTRACT_IFMT_ADDI_CODE \
365   length = 2; \
366   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
367   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
368   f_simm8 = EXTRACT_MSB0_INT (insn, 16, 8, 8); \
369
370 #define EXTRACT_IFMT_ADDV3_VARS \
371   UINT f_op1; \
372   UINT f_r1; \
373   UINT f_op2; \
374   UINT f_r2; \
375   INT f_simm16; \
376   unsigned int length;
377 #define EXTRACT_IFMT_ADDV3_CODE \
378   length = 4; \
379   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
380   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
381   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
382   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
383   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
384
385 #define EXTRACT_IFMT_BC8_VARS \
386   UINT f_op1; \
387   UINT f_r1; \
388   SI f_disp8; \
389   unsigned int length;
390 #define EXTRACT_IFMT_BC8_CODE \
391   length = 2; \
392   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
393   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
394   f_disp8 = ((((EXTRACT_MSB0_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
395
396 #define EXTRACT_IFMT_BC24_VARS \
397   UINT f_op1; \
398   UINT f_r1; \
399   SI f_disp24; \
400   unsigned int length;
401 #define EXTRACT_IFMT_BC24_CODE \
402   length = 4; \
403   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
404   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
405   f_disp24 = ((((EXTRACT_MSB0_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
406
407 #define EXTRACT_IFMT_BEQ_VARS \
408   UINT f_op1; \
409   UINT f_r1; \
410   UINT f_op2; \
411   UINT f_r2; \
412   SI f_disp16; \
413   unsigned int length;
414 #define EXTRACT_IFMT_BEQ_CODE \
415   length = 4; \
416   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
417   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
418   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
419   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
420   f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
421
422 #define EXTRACT_IFMT_BEQZ_VARS \
423   UINT f_op1; \
424   UINT f_r1; \
425   UINT f_op2; \
426   UINT f_r2; \
427   SI f_disp16; \
428   unsigned int length;
429 #define EXTRACT_IFMT_BEQZ_CODE \
430   length = 4; \
431   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
432   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
433   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
434   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
435   f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
436
437 #define EXTRACT_IFMT_CMP_VARS \
438   UINT f_op1; \
439   UINT f_r1; \
440   UINT f_op2; \
441   UINT f_r2; \
442   unsigned int length;
443 #define EXTRACT_IFMT_CMP_CODE \
444   length = 2; \
445   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
446   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
447   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
448   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
449
450 #define EXTRACT_IFMT_CMPI_VARS \
451   UINT f_op1; \
452   UINT f_r1; \
453   UINT f_op2; \
454   UINT f_r2; \
455   INT f_simm16; \
456   unsigned int length;
457 #define EXTRACT_IFMT_CMPI_CODE \
458   length = 4; \
459   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
460   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
461   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
462   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
463   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
464
465 #define EXTRACT_IFMT_DIV_VARS \
466   UINT f_op1; \
467   UINT f_r1; \
468   UINT f_op2; \
469   UINT f_r2; \
470   INT f_simm16; \
471   unsigned int length;
472 #define EXTRACT_IFMT_DIV_CODE \
473   length = 4; \
474   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
475   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
476   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
477   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
478   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
479
480 #define EXTRACT_IFMT_JL_VARS \
481   UINT f_op1; \
482   UINT f_r1; \
483   UINT f_op2; \
484   UINT f_r2; \
485   unsigned int length;
486 #define EXTRACT_IFMT_JL_CODE \
487   length = 2; \
488   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
489   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
490   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
491   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
492
493 #define EXTRACT_IFMT_LD24_VARS \
494   UINT f_op1; \
495   UINT f_r1; \
496   UINT f_uimm24; \
497   unsigned int length;
498 #define EXTRACT_IFMT_LD24_CODE \
499   length = 4; \
500   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
501   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
502   f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
503
504 #define EXTRACT_IFMT_LDI16_VARS \
505   UINT f_op1; \
506   UINT f_r1; \
507   UINT f_op2; \
508   UINT f_r2; \
509   INT f_simm16; \
510   unsigned int length;
511 #define EXTRACT_IFMT_LDI16_CODE \
512   length = 4; \
513   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
514   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
515   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
516   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
517   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
518
519 #define EXTRACT_IFMT_MVFACHI_VARS \
520   UINT f_op1; \
521   UINT f_r1; \
522   UINT f_op2; \
523   UINT f_r2; \
524   unsigned int length;
525 #define EXTRACT_IFMT_MVFACHI_CODE \
526   length = 2; \
527   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
528   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
529   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
530   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
531
532 #define EXTRACT_IFMT_MVFC_VARS \
533   UINT f_op1; \
534   UINT f_r1; \
535   UINT f_op2; \
536   UINT f_r2; \
537   unsigned int length;
538 #define EXTRACT_IFMT_MVFC_CODE \
539   length = 2; \
540   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
541   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
542   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
543   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
544
545 #define EXTRACT_IFMT_MVTACHI_VARS \
546   UINT f_op1; \
547   UINT f_r1; \
548   UINT f_op2; \
549   UINT f_r2; \
550   unsigned int length;
551 #define EXTRACT_IFMT_MVTACHI_CODE \
552   length = 2; \
553   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
554   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
555   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
556   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
557
558 #define EXTRACT_IFMT_MVTC_VARS \
559   UINT f_op1; \
560   UINT f_r1; \
561   UINT f_op2; \
562   UINT f_r2; \
563   unsigned int length;
564 #define EXTRACT_IFMT_MVTC_CODE \
565   length = 2; \
566   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
567   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
568   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
569   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
570
571 #define EXTRACT_IFMT_NOP_VARS \
572   UINT f_op1; \
573   UINT f_r1; \
574   UINT f_op2; \
575   UINT f_r2; \
576   unsigned int length;
577 #define EXTRACT_IFMT_NOP_CODE \
578   length = 2; \
579   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
580   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
581   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
582   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
583
584 #define EXTRACT_IFMT_SETH_VARS \
585   UINT f_op1; \
586   UINT f_r1; \
587   UINT f_op2; \
588   UINT f_r2; \
589   UINT f_hi16; \
590   unsigned int length;
591 #define EXTRACT_IFMT_SETH_CODE \
592   length = 4; \
593   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
594   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
595   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
596   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
597   f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
598
599 #define EXTRACT_IFMT_SLLI_VARS \
600   UINT f_op1; \
601   UINT f_r1; \
602   UINT f_shift_op2; \
603   UINT f_uimm5; \
604   unsigned int length;
605 #define EXTRACT_IFMT_SLLI_CODE \
606   length = 2; \
607   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
608   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
609   f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
610   f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
611
612 #define EXTRACT_IFMT_ST_D_VARS \
613   UINT f_op1; \
614   UINT f_r1; \
615   UINT f_op2; \
616   UINT f_r2; \
617   INT f_simm16; \
618   unsigned int length;
619 #define EXTRACT_IFMT_ST_D_CODE \
620   length = 4; \
621   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
622   f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
623   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
624   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
625   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
626
627 #define EXTRACT_IFMT_TRAP_VARS \
628   UINT f_op1; \
629   UINT f_r1; \
630   UINT f_op2; \
631   UINT f_uimm4; \
632   unsigned int length;
633 #define EXTRACT_IFMT_TRAP_CODE \
634   length = 2; \
635   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
636   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
637   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
638   f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
639
640 #define EXTRACT_IFMT_CLRPSW_VARS \
641   UINT f_op1; \
642   UINT f_r1; \
643   UINT f_uimm8; \
644   unsigned int length;
645 #define EXTRACT_IFMT_CLRPSW_CODE \
646   length = 2; \
647   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
648   f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
649   f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
650
651 #define EXTRACT_IFMT_BSET_VARS \
652   UINT f_op1; \
653   UINT f_bit4; \
654   UINT f_uimm3; \
655   UINT f_op2; \
656   UINT f_r2; \
657   INT f_simm16; \
658   unsigned int length;
659 #define EXTRACT_IFMT_BSET_CODE \
660   length = 4; \
661   f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
662   f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
663   f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
664   f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
665   f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
666   f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
667
668 #define EXTRACT_IFMT_BTST_VARS \
669   UINT f_op1; \
670   UINT f_bit4; \
671   UINT f_uimm3; \
672   UINT f_op2; \
673   UINT f_r2; \
674   unsigned int length;
675 #define EXTRACT_IFMT_BTST_CODE \
676   length = 2; \
677   f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
678   f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
679   f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
680   f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
681   f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
682
683 /* Collection of various things for the trace handler to use.  */
684
685 typedef struct trace_record {
686   IADDR pc;
687   /* FIXME:wip */
688 } TRACE_RECORD;
689
690 #endif /* CPU_M32RBF_H */