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