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