* configure.in: Call SIM_AC_OPTION_INLINE.
[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 (C) 1996, 1997, 1998 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(a1) CPU (h_cr)[a1]
50 #define SET_H_CR(a1, x) (CPU (h_cr)[a1] = (x))
51   /* accumulator */
52   DI h_accum;
53 #define GET_H_ACCUM() CPU (h_accum)
54 #define SET_H_ACCUM(x) (CPU (h_accum) = (x))
55 /* start-sanitize-m32rx */
56   /* accumulators */
57   DI h_accums[2];
58 /* end-sanitize-m32rx */
59 #define GET_H_ACCUMS(a1) CPU (h_accums)[a1]
60 #define SET_H_ACCUMS(a1, x) (CPU (h_accums)[a1] = (x))
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() CPU (h_psw)
68 #define SET_H_PSW(x) (CPU (h_psw) = (x))
69   /* backup psw */
70   UQI h_bpsw;
71 #define GET_H_BPSW() CPU (h_bpsw)
72 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
73   /* backup bpsw */
74   UQI h_bbpsw;
75 #define GET_H_BBPSW() CPU (h_bbpsw)
76 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
77   /* lock */
78   BI h_lock;
79 #define GET_H_LOCK() CPU (h_lock)
80 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
81   } hardware;
82 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
83 } M32RBF_CPU_DATA;
84
85 /* Cover fns for register access.  */
86 USI m32rbf_h_pc_get (SIM_CPU *);
87 void m32rbf_h_pc_set (SIM_CPU *, USI);
88 SI m32rbf_h_gr_get (SIM_CPU *, UINT);
89 void m32rbf_h_gr_set (SIM_CPU *, UINT, SI);
90 USI m32rbf_h_cr_get (SIM_CPU *, UINT);
91 void m32rbf_h_cr_set (SIM_CPU *, UINT, USI);
92 DI m32rbf_h_accum_get (SIM_CPU *);
93 void m32rbf_h_accum_set (SIM_CPU *, DI);
94 DI m32rbf_h_accums_get (SIM_CPU *, UINT);
95 void m32rbf_h_accums_set (SIM_CPU *, UINT, 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 /* The ARGBUF struct.  */
120 struct argbuf {
121   /* These are the baseclass definitions.  */
122   PCADDR addr;
123   const IDESC *idesc;
124   char trace_p;
125   char profile_p;
126   /* cpu specific data follows */
127   union sem semantic;
128   int written;
129   union {
130     struct { /* e.g. add $dr,$sr */
131       SI * i_dr;
132       SI * i_sr;
133       unsigned char in_dr;
134       unsigned char in_sr;
135       unsigned char out_dr;
136     } fmt_add;
137     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
138       SI * i_sr;
139       HI f_simm16;
140       SI * i_dr;
141       unsigned char in_sr;
142       unsigned char out_dr;
143     } fmt_add3;
144     struct { /* e.g. and3 $dr,$sr,$uimm16 */
145       SI * i_sr;
146       USI f_uimm16;
147       SI * i_dr;
148       unsigned char in_sr;
149       unsigned char out_dr;
150     } fmt_and3;
151     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
152       SI * i_sr;
153       UHI f_uimm16;
154       SI * i_dr;
155       unsigned char in_sr;
156       unsigned char out_dr;
157     } fmt_or3;
158     struct { /* e.g. addi $dr,$simm8 */
159       SI * i_dr;
160       SI f_simm8;
161       unsigned char in_dr;
162       unsigned char out_dr;
163     } fmt_addi;
164     struct { /* e.g. addv $dr,$sr */
165       SI * i_dr;
166       SI * i_sr;
167       unsigned char in_dr;
168       unsigned char in_sr;
169       unsigned char out_dr;
170     } fmt_addv;
171     struct { /* e.g. addv3 $dr,$sr,$simm16 */
172       SI * i_sr;
173       SI f_simm16;
174       SI * i_dr;
175       unsigned char in_sr;
176       unsigned char out_dr;
177     } fmt_addv3;
178     struct { /* e.g. addx $dr,$sr */
179       SI * i_dr;
180       SI * i_sr;
181       unsigned char in_dr;
182       unsigned char in_sr;
183       unsigned char out_dr;
184     } fmt_addx;
185     struct { /* e.g. cmp $src1,$src2 */
186       SI * i_src1;
187       SI * i_src2;
188       unsigned char in_src1;
189       unsigned char in_src2;
190     } fmt_cmp;
191     struct { /* e.g. cmpi $src2,$simm16 */
192       SI * i_src2;
193       SI f_simm16;
194       unsigned char in_src2;
195     } fmt_cmpi;
196     struct { /* e.g. div $dr,$sr */
197       SI * i_sr;
198       SI * i_dr;
199       unsigned char in_sr;
200       unsigned char in_dr;
201       unsigned char out_dr;
202     } fmt_div;
203     struct { /* e.g. ld $dr,@$sr */
204       SI * i_sr;
205       SI * i_dr;
206       unsigned char in_sr;
207       unsigned char out_dr;
208     } fmt_ld;
209     struct { /* e.g. ld $dr,@($slo16,$sr) */
210       SI * i_sr;
211       HI f_simm16;
212       SI * i_dr;
213       unsigned char in_sr;
214       unsigned char out_dr;
215     } fmt_ld_d;
216     struct { /* e.g. ldb $dr,@$sr */
217       SI * i_sr;
218       SI * i_dr;
219       unsigned char in_sr;
220       unsigned char out_dr;
221     } fmt_ldb;
222     struct { /* e.g. ldb $dr,@($slo16,$sr) */
223       SI * i_sr;
224       HI f_simm16;
225       SI * i_dr;
226       unsigned char in_sr;
227       unsigned char out_dr;
228     } fmt_ldb_d;
229     struct { /* e.g. ldh $dr,@$sr */
230       SI * i_sr;
231       SI * i_dr;
232       unsigned char in_sr;
233       unsigned char out_dr;
234     } fmt_ldh;
235     struct { /* e.g. ldh $dr,@($slo16,$sr) */
236       SI * i_sr;
237       HI f_simm16;
238       SI * i_dr;
239       unsigned char in_sr;
240       unsigned char out_dr;
241     } fmt_ldh_d;
242     struct { /* e.g. ld $dr,@$sr+ */
243       SI * i_sr;
244       SI * i_dr;
245       unsigned char in_sr;
246       unsigned char out_dr;
247       unsigned char out_sr;
248     } fmt_ld_plus;
249     struct { /* e.g. ld24 $dr,$uimm24 */
250       ADDR f_uimm24;
251       SI * i_dr;
252       unsigned char out_dr;
253     } fmt_ld24;
254     struct { /* e.g. ldi8 $dr,$simm8 */
255       SI f_simm8;
256       SI * i_dr;
257       unsigned char out_dr;
258     } fmt_ldi8;
259     struct { /* e.g. ldi16 $dr,$hash$slo16 */
260       HI f_simm16;
261       SI * i_dr;
262       unsigned char out_dr;
263     } fmt_ldi16;
264     struct { /* e.g. lock $dr,@$sr */
265       SI * i_sr;
266       SI * i_dr;
267       unsigned char in_sr;
268       unsigned char out_dr;
269     } fmt_lock;
270     struct { /* e.g. machi $src1,$src2 */
271       SI * i_src1;
272       SI * i_src2;
273       unsigned char in_src1;
274       unsigned char in_src2;
275     } fmt_machi;
276     struct { /* e.g. mulhi $src1,$src2 */
277       SI * i_src1;
278       SI * i_src2;
279       unsigned char in_src1;
280       unsigned char in_src2;
281     } fmt_mulhi;
282     struct { /* e.g. mv $dr,$sr */
283       SI * i_sr;
284       SI * i_dr;
285       unsigned char in_sr;
286       unsigned char out_dr;
287     } fmt_mv;
288     struct { /* e.g. mvfachi $dr */
289       SI * i_dr;
290       unsigned char out_dr;
291     } fmt_mvfachi;
292     struct { /* e.g. mvfc $dr,$scr */
293       UINT f_r2;
294       SI * i_dr;
295       unsigned char out_dr;
296     } fmt_mvfc;
297     struct { /* e.g. mvtachi $src1 */
298       SI * i_src1;
299       unsigned char in_src1;
300     } fmt_mvtachi;
301     struct { /* e.g. mvtc $sr,$dcr */
302       SI * i_sr;
303       UINT f_r1;
304       unsigned char in_sr;
305     } fmt_mvtc;
306     struct { /* e.g. nop */
307       int empty;
308     } fmt_nop;
309     struct { /* e.g. rac */
310       int empty;
311     } fmt_rac;
312     struct { /* e.g. seth $dr,$hash$hi16 */
313       UHI f_hi16;
314       SI * i_dr;
315       unsigned char out_dr;
316     } fmt_seth;
317     struct { /* e.g. sll3 $dr,$sr,$simm16 */
318       SI * i_sr;
319       SI f_simm16;
320       SI * i_dr;
321       unsigned char in_sr;
322       unsigned char out_dr;
323     } fmt_sll3;
324     struct { /* e.g. slli $dr,$uimm5 */
325       SI * i_dr;
326       USI f_uimm5;
327       unsigned char in_dr;
328       unsigned char out_dr;
329     } fmt_slli;
330     struct { /* e.g. st $src1,@$src2 */
331       SI * i_src2;
332       SI * i_src1;
333       unsigned char in_src2;
334       unsigned char in_src1;
335     } fmt_st;
336     struct { /* e.g. st $src1,@($slo16,$src2) */
337       SI * i_src2;
338       HI f_simm16;
339       SI * i_src1;
340       unsigned char in_src2;
341       unsigned char in_src1;
342     } fmt_st_d;
343     struct { /* e.g. stb $src1,@$src2 */
344       SI * i_src2;
345       SI * i_src1;
346       unsigned char in_src2;
347       unsigned char in_src1;
348     } fmt_stb;
349     struct { /* e.g. stb $src1,@($slo16,$src2) */
350       SI * i_src2;
351       HI f_simm16;
352       SI * i_src1;
353       unsigned char in_src2;
354       unsigned char in_src1;
355     } fmt_stb_d;
356     struct { /* e.g. sth $src1,@$src2 */
357       SI * i_src2;
358       SI * i_src1;
359       unsigned char in_src2;
360       unsigned char in_src1;
361     } fmt_sth;
362     struct { /* e.g. sth $src1,@($slo16,$src2) */
363       SI * i_src2;
364       HI f_simm16;
365       SI * i_src1;
366       unsigned char in_src2;
367       unsigned char in_src1;
368     } fmt_sth_d;
369     struct { /* e.g. st $src1,@+$src2 */
370       SI * i_src2;
371       SI * i_src1;
372       unsigned char in_src2;
373       unsigned char in_src1;
374       unsigned char out_src2;
375     } fmt_st_plus;
376     struct { /* e.g. unlock $src1,@$src2 */
377       SI * i_src2;
378       SI * i_src1;
379       unsigned char in_src2;
380       unsigned char in_src1;
381     } fmt_unlock;
382   /* cti insns, kept separately so addr_cache is in fixed place */
383   struct {
384     union {
385     struct { /* e.g. bc.s $disp8 */
386       IADDR f_disp8;
387     } fmt_bc8;
388     struct { /* e.g. bc.l $disp24 */
389       IADDR f_disp24;
390     } fmt_bc24;
391     struct { /* e.g. beq $src1,$src2,$disp16 */
392       SI * i_src1;
393       SI * i_src2;
394       IADDR f_disp16;
395       unsigned char in_src1;
396       unsigned char in_src2;
397     } fmt_beq;
398     struct { /* e.g. beqz $src2,$disp16 */
399       SI * i_src2;
400       IADDR f_disp16;
401       unsigned char in_src2;
402     } fmt_beqz;
403     struct { /* e.g. bl.s $disp8 */
404       IADDR f_disp8;
405       unsigned char out_h_gr_14;
406     } fmt_bl8;
407     struct { /* e.g. bl.l $disp24 */
408       IADDR f_disp24;
409       unsigned char out_h_gr_14;
410     } fmt_bl24;
411     struct { /* e.g. bra.s $disp8 */
412       IADDR f_disp8;
413     } fmt_bra8;
414     struct { /* e.g. bra.l $disp24 */
415       IADDR f_disp24;
416     } fmt_bra24;
417     struct { /* e.g. jl $sr */
418       SI * i_sr;
419       unsigned char in_sr;
420       unsigned char out_h_gr_14;
421     } fmt_jl;
422     struct { /* e.g. jmp $sr */
423       SI * i_sr;
424       unsigned char in_sr;
425     } fmt_jmp;
426     struct { /* e.g. rte */
427       int empty;
428     } fmt_rte;
429     struct { /* e.g. trap $uimm4 */
430       USI f_uimm4;
431     } fmt_trap;
432     } fields;
433 #if WITH_SCACHE_PBB_M32RBF
434     SEM_PC addr_cache;
435 #endif
436   } cti;
437 #if WITH_SCACHE_PBB_M32RBF
438     /* Writeback handler.  */
439     struct {
440       /* Pointer to argbuf entry for insn whose results need writing back.  */
441       const struct argbuf *abuf;
442     } write;
443     /* x-before handler */
444     struct {
445       /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
446       int first_p;
447     } before;
448     /* x-after handler */
449     struct {
450       int empty;
451     } after;
452     /* This entry is used to terminate each pbb.  */
453     struct {
454       /* Number of insns in pbb.  */
455       int insn_count;
456       /* Next pbb to execute.  */
457       SCACHE *next;
458     } chain;
459 #endif
460   } fields;
461 };
462
463 /* A cached insn.
464
465    ??? SCACHE used to contain more than just argbuf.  We could delete the
466    type entirely and always just use ARGBUF, but for future concerns and as
467    a level of abstraction it is left in.  */
468
469 struct scache {
470   struct argbuf argbuf;
471 };
472
473 /* Macros to simplify extraction, reading and semantic code.
474    These define and assign the local vars that contain the insn's fields.  */
475
476 #define EXTRACT_FMT_ADD_VARS \
477   /* Instruction fields.  */ \
478   UINT f_op1; \
479   UINT f_r1; \
480   UINT f_op2; \
481   UINT f_r2; \
482   unsigned int length;
483 #define EXTRACT_FMT_ADD_CODE \
484   length = 2; \
485   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
486   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
487   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
488   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
489
490 #define EXTRACT_FMT_ADD3_VARS \
491   /* Instruction fields.  */ \
492   UINT f_op1; \
493   UINT f_r1; \
494   UINT f_op2; \
495   UINT f_r2; \
496   INT f_simm16; \
497   unsigned int length;
498 #define EXTRACT_FMT_ADD3_CODE \
499   length = 4; \
500   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
501   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
502   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
503   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
504   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
505
506 #define EXTRACT_FMT_AND3_VARS \
507   /* Instruction fields.  */ \
508   UINT f_op1; \
509   UINT f_r1; \
510   UINT f_op2; \
511   UINT f_r2; \
512   UINT f_uimm16; \
513   unsigned int length;
514 #define EXTRACT_FMT_AND3_CODE \
515   length = 4; \
516   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
517   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
518   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
519   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
520   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
521
522 #define EXTRACT_FMT_OR3_VARS \
523   /* Instruction fields.  */ \
524   UINT f_op1; \
525   UINT f_r1; \
526   UINT f_op2; \
527   UINT f_r2; \
528   UINT f_uimm16; \
529   unsigned int length;
530 #define EXTRACT_FMT_OR3_CODE \
531   length = 4; \
532   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
533   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
534   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
535   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
536   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
537
538 #define EXTRACT_FMT_ADDI_VARS \
539   /* Instruction fields.  */ \
540   UINT f_op1; \
541   UINT f_r1; \
542   INT f_simm8; \
543   unsigned int length;
544 #define EXTRACT_FMT_ADDI_CODE \
545   length = 2; \
546   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
547   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
548   f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
549
550 #define EXTRACT_FMT_ADDV_VARS \
551   /* Instruction fields.  */ \
552   UINT f_op1; \
553   UINT f_r1; \
554   UINT f_op2; \
555   UINT f_r2; \
556   unsigned int length;
557 #define EXTRACT_FMT_ADDV_CODE \
558   length = 2; \
559   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
560   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
561   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
562   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
563
564 #define EXTRACT_FMT_ADDV3_VARS \
565   /* Instruction fields.  */ \
566   UINT f_op1; \
567   UINT f_r1; \
568   UINT f_op2; \
569   UINT f_r2; \
570   INT f_simm16; \
571   unsigned int length;
572 #define EXTRACT_FMT_ADDV3_CODE \
573   length = 4; \
574   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
575   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
576   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
577   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
578   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
579
580 #define EXTRACT_FMT_ADDX_VARS \
581   /* Instruction fields.  */ \
582   UINT f_op1; \
583   UINT f_r1; \
584   UINT f_op2; \
585   UINT f_r2; \
586   unsigned int length;
587 #define EXTRACT_FMT_ADDX_CODE \
588   length = 2; \
589   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
590   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
591   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
592   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
593
594 #define EXTRACT_FMT_BC8_VARS \
595   /* Instruction fields.  */ \
596   UINT f_op1; \
597   UINT f_r1; \
598   INT f_disp8; \
599   unsigned int length;
600 #define EXTRACT_FMT_BC8_CODE \
601   length = 2; \
602   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
603   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
604   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
605
606 #define EXTRACT_FMT_BC24_VARS \
607   /* Instruction fields.  */ \
608   UINT f_op1; \
609   UINT f_r1; \
610   INT f_disp24; \
611   unsigned int length;
612 #define EXTRACT_FMT_BC24_CODE \
613   length = 4; \
614   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
615   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
616   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
617
618 #define EXTRACT_FMT_BEQ_VARS \
619   /* Instruction fields.  */ \
620   UINT f_op1; \
621   UINT f_r1; \
622   UINT f_op2; \
623   UINT f_r2; \
624   INT f_disp16; \
625   unsigned int length;
626 #define EXTRACT_FMT_BEQ_CODE \
627   length = 4; \
628   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
629   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
630   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
631   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
632   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
633
634 #define EXTRACT_FMT_BEQZ_VARS \
635   /* Instruction fields.  */ \
636   UINT f_op1; \
637   UINT f_r1; \
638   UINT f_op2; \
639   UINT f_r2; \
640   INT f_disp16; \
641   unsigned int length;
642 #define EXTRACT_FMT_BEQZ_CODE \
643   length = 4; \
644   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
645   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
646   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
647   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
648   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
649
650 #define EXTRACT_FMT_BL8_VARS \
651   /* Instruction fields.  */ \
652   UINT f_op1; \
653   UINT f_r1; \
654   INT f_disp8; \
655   unsigned int length;
656 #define EXTRACT_FMT_BL8_CODE \
657   length = 2; \
658   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
659   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
660   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
661
662 #define EXTRACT_FMT_BL24_VARS \
663   /* Instruction fields.  */ \
664   UINT f_op1; \
665   UINT f_r1; \
666   INT f_disp24; \
667   unsigned int length;
668 #define EXTRACT_FMT_BL24_CODE \
669   length = 4; \
670   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
671   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
672   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
673
674 #define EXTRACT_FMT_BRA8_VARS \
675   /* Instruction fields.  */ \
676   UINT f_op1; \
677   UINT f_r1; \
678   INT f_disp8; \
679   unsigned int length;
680 #define EXTRACT_FMT_BRA8_CODE \
681   length = 2; \
682   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
683   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
684   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
685
686 #define EXTRACT_FMT_BRA24_VARS \
687   /* Instruction fields.  */ \
688   UINT f_op1; \
689   UINT f_r1; \
690   INT f_disp24; \
691   unsigned int length;
692 #define EXTRACT_FMT_BRA24_CODE \
693   length = 4; \
694   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
695   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
696   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
697
698 #define EXTRACT_FMT_CMP_VARS \
699   /* Instruction fields.  */ \
700   UINT f_op1; \
701   UINT f_r1; \
702   UINT f_op2; \
703   UINT f_r2; \
704   unsigned int length;
705 #define EXTRACT_FMT_CMP_CODE \
706   length = 2; \
707   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
708   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
709   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
710   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
711
712 #define EXTRACT_FMT_CMPI_VARS \
713   /* Instruction fields.  */ \
714   UINT f_op1; \
715   UINT f_r1; \
716   UINT f_op2; \
717   UINT f_r2; \
718   INT f_simm16; \
719   unsigned int length;
720 #define EXTRACT_FMT_CMPI_CODE \
721   length = 4; \
722   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
723   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
724   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
725   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
726   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
727
728 #define EXTRACT_FMT_DIV_VARS \
729   /* Instruction fields.  */ \
730   UINT f_op1; \
731   UINT f_r1; \
732   UINT f_op2; \
733   UINT f_r2; \
734   INT f_simm16; \
735   unsigned int length;
736 #define EXTRACT_FMT_DIV_CODE \
737   length = 4; \
738   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
739   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
740   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
741   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
742   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
743
744 #define EXTRACT_FMT_JL_VARS \
745   /* Instruction fields.  */ \
746   UINT f_op1; \
747   UINT f_r1; \
748   UINT f_op2; \
749   UINT f_r2; \
750   unsigned int length;
751 #define EXTRACT_FMT_JL_CODE \
752   length = 2; \
753   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
754   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
755   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
756   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
757
758 #define EXTRACT_FMT_JMP_VARS \
759   /* Instruction fields.  */ \
760   UINT f_op1; \
761   UINT f_r1; \
762   UINT f_op2; \
763   UINT f_r2; \
764   unsigned int length;
765 #define EXTRACT_FMT_JMP_CODE \
766   length = 2; \
767   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
768   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
769   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
770   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
771
772 #define EXTRACT_FMT_LD_VARS \
773   /* Instruction fields.  */ \
774   UINT f_op1; \
775   UINT f_r1; \
776   UINT f_op2; \
777   UINT f_r2; \
778   unsigned int length;
779 #define EXTRACT_FMT_LD_CODE \
780   length = 2; \
781   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
782   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
783   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
784   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
785
786 #define EXTRACT_FMT_LD_D_VARS \
787   /* Instruction fields.  */ \
788   UINT f_op1; \
789   UINT f_r1; \
790   UINT f_op2; \
791   UINT f_r2; \
792   INT f_simm16; \
793   unsigned int length;
794 #define EXTRACT_FMT_LD_D_CODE \
795   length = 4; \
796   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
797   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
798   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
799   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
800   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
801
802 #define EXTRACT_FMT_LDB_VARS \
803   /* Instruction fields.  */ \
804   UINT f_op1; \
805   UINT f_r1; \
806   UINT f_op2; \
807   UINT f_r2; \
808   unsigned int length;
809 #define EXTRACT_FMT_LDB_CODE \
810   length = 2; \
811   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
812   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
813   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
814   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
815
816 #define EXTRACT_FMT_LDB_D_VARS \
817   /* Instruction fields.  */ \
818   UINT f_op1; \
819   UINT f_r1; \
820   UINT f_op2; \
821   UINT f_r2; \
822   INT f_simm16; \
823   unsigned int length;
824 #define EXTRACT_FMT_LDB_D_CODE \
825   length = 4; \
826   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
827   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
828   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
829   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
830   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
831
832 #define EXTRACT_FMT_LDH_VARS \
833   /* Instruction fields.  */ \
834   UINT f_op1; \
835   UINT f_r1; \
836   UINT f_op2; \
837   UINT f_r2; \
838   unsigned int length;
839 #define EXTRACT_FMT_LDH_CODE \
840   length = 2; \
841   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
842   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
843   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
844   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
845
846 #define EXTRACT_FMT_LDH_D_VARS \
847   /* Instruction fields.  */ \
848   UINT f_op1; \
849   UINT f_r1; \
850   UINT f_op2; \
851   UINT f_r2; \
852   INT f_simm16; \
853   unsigned int length;
854 #define EXTRACT_FMT_LDH_D_CODE \
855   length = 4; \
856   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
857   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
858   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
859   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
860   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
861
862 #define EXTRACT_FMT_LD_PLUS_VARS \
863   /* Instruction fields.  */ \
864   UINT f_op1; \
865   UINT f_r1; \
866   UINT f_op2; \
867   UINT f_r2; \
868   unsigned int length;
869 #define EXTRACT_FMT_LD_PLUS_CODE \
870   length = 2; \
871   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
872   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
873   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
874   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
875
876 #define EXTRACT_FMT_LD24_VARS \
877   /* Instruction fields.  */ \
878   UINT f_op1; \
879   UINT f_r1; \
880   UINT f_uimm24; \
881   unsigned int length;
882 #define EXTRACT_FMT_LD24_CODE \
883   length = 4; \
884   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
885   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
886   f_uimm24 = EXTRACT_UINT (insn, 32, 8, 24); \
887
888 #define EXTRACT_FMT_LDI8_VARS \
889   /* Instruction fields.  */ \
890   UINT f_op1; \
891   UINT f_r1; \
892   INT f_simm8; \
893   unsigned int length;
894 #define EXTRACT_FMT_LDI8_CODE \
895   length = 2; \
896   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
897   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
898   f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
899
900 #define EXTRACT_FMT_LDI16_VARS \
901   /* Instruction fields.  */ \
902   UINT f_op1; \
903   UINT f_r1; \
904   UINT f_op2; \
905   UINT f_r2; \
906   INT f_simm16; \
907   unsigned int length;
908 #define EXTRACT_FMT_LDI16_CODE \
909   length = 4; \
910   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
911   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
912   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
913   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
914   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
915
916 #define EXTRACT_FMT_LOCK_VARS \
917   /* Instruction fields.  */ \
918   UINT f_op1; \
919   UINT f_r1; \
920   UINT f_op2; \
921   UINT f_r2; \
922   unsigned int length;
923 #define EXTRACT_FMT_LOCK_CODE \
924   length = 2; \
925   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
926   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
927   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
928   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
929
930 #define EXTRACT_FMT_MACHI_VARS \
931   /* Instruction fields.  */ \
932   UINT f_op1; \
933   UINT f_r1; \
934   UINT f_op2; \
935   UINT f_r2; \
936   unsigned int length;
937 #define EXTRACT_FMT_MACHI_CODE \
938   length = 2; \
939   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
940   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
941   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
942   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
943
944 #define EXTRACT_FMT_MULHI_VARS \
945   /* Instruction fields.  */ \
946   UINT f_op1; \
947   UINT f_r1; \
948   UINT f_op2; \
949   UINT f_r2; \
950   unsigned int length;
951 #define EXTRACT_FMT_MULHI_CODE \
952   length = 2; \
953   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
954   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
955   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
956   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
957
958 #define EXTRACT_FMT_MV_VARS \
959   /* Instruction fields.  */ \
960   UINT f_op1; \
961   UINT f_r1; \
962   UINT f_op2; \
963   UINT f_r2; \
964   unsigned int length;
965 #define EXTRACT_FMT_MV_CODE \
966   length = 2; \
967   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
968   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
969   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
970   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
971
972 #define EXTRACT_FMT_MVFACHI_VARS \
973   /* Instruction fields.  */ \
974   UINT f_op1; \
975   UINT f_r1; \
976   UINT f_op2; \
977   UINT f_r2; \
978   unsigned int length;
979 #define EXTRACT_FMT_MVFACHI_CODE \
980   length = 2; \
981   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
982   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
983   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
984   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
985
986 #define EXTRACT_FMT_MVFC_VARS \
987   /* Instruction fields.  */ \
988   UINT f_op1; \
989   UINT f_r1; \
990   UINT f_op2; \
991   UINT f_r2; \
992   unsigned int length;
993 #define EXTRACT_FMT_MVFC_CODE \
994   length = 2; \
995   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
996   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
997   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
998   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
999
1000 #define EXTRACT_FMT_MVTACHI_VARS \
1001   /* Instruction fields.  */ \
1002   UINT f_op1; \
1003   UINT f_r1; \
1004   UINT f_op2; \
1005   UINT f_r2; \
1006   unsigned int length;
1007 #define EXTRACT_FMT_MVTACHI_CODE \
1008   length = 2; \
1009   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1010   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1011   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1012   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1013
1014 #define EXTRACT_FMT_MVTC_VARS \
1015   /* Instruction fields.  */ \
1016   UINT f_op1; \
1017   UINT f_r1; \
1018   UINT f_op2; \
1019   UINT f_r2; \
1020   unsigned int length;
1021 #define EXTRACT_FMT_MVTC_CODE \
1022   length = 2; \
1023   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1024   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1025   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1026   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1027
1028 #define EXTRACT_FMT_NOP_VARS \
1029   /* Instruction fields.  */ \
1030   UINT f_op1; \
1031   UINT f_r1; \
1032   UINT f_op2; \
1033   UINT f_r2; \
1034   unsigned int length;
1035 #define EXTRACT_FMT_NOP_CODE \
1036   length = 2; \
1037   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1038   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1039   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1040   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1041
1042 #define EXTRACT_FMT_RAC_VARS \
1043   /* Instruction fields.  */ \
1044   UINT f_op1; \
1045   UINT f_r1; \
1046   UINT f_op2; \
1047   UINT f_r2; \
1048   unsigned int length;
1049 #define EXTRACT_FMT_RAC_CODE \
1050   length = 2; \
1051   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1052   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1053   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1054   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1055
1056 #define EXTRACT_FMT_RTE_VARS \
1057   /* Instruction fields.  */ \
1058   UINT f_op1; \
1059   UINT f_r1; \
1060   UINT f_op2; \
1061   UINT f_r2; \
1062   unsigned int length;
1063 #define EXTRACT_FMT_RTE_CODE \
1064   length = 2; \
1065   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1066   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1067   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1068   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1069
1070 #define EXTRACT_FMT_SETH_VARS \
1071   /* Instruction fields.  */ \
1072   UINT f_op1; \
1073   UINT f_r1; \
1074   UINT f_op2; \
1075   UINT f_r2; \
1076   UINT f_hi16; \
1077   unsigned int length;
1078 #define EXTRACT_FMT_SETH_CODE \
1079   length = 4; \
1080   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1081   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1082   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1083   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1084   f_hi16 = EXTRACT_UINT (insn, 32, 16, 16); \
1085
1086 #define EXTRACT_FMT_SLL3_VARS \
1087   /* Instruction fields.  */ \
1088   UINT f_op1; \
1089   UINT f_r1; \
1090   UINT f_op2; \
1091   UINT f_r2; \
1092   INT f_simm16; \
1093   unsigned int length;
1094 #define EXTRACT_FMT_SLL3_CODE \
1095   length = 4; \
1096   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1097   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1098   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1099   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1100   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1101
1102 #define EXTRACT_FMT_SLLI_VARS \
1103   /* Instruction fields.  */ \
1104   UINT f_op1; \
1105   UINT f_r1; \
1106   UINT f_shift_op2; \
1107   UINT f_uimm5; \
1108   unsigned int length;
1109 #define EXTRACT_FMT_SLLI_CODE \
1110   length = 2; \
1111   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1112   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1113   f_shift_op2 = EXTRACT_UINT (insn, 16, 8, 3); \
1114   f_uimm5 = EXTRACT_UINT (insn, 16, 11, 5); \
1115
1116 #define EXTRACT_FMT_ST_VARS \
1117   /* Instruction fields.  */ \
1118   UINT f_op1; \
1119   UINT f_r1; \
1120   UINT f_op2; \
1121   UINT f_r2; \
1122   unsigned int length;
1123 #define EXTRACT_FMT_ST_CODE \
1124   length = 2; \
1125   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1126   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1127   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1128   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1129
1130 #define EXTRACT_FMT_ST_D_VARS \
1131   /* Instruction fields.  */ \
1132   UINT f_op1; \
1133   UINT f_r1; \
1134   UINT f_op2; \
1135   UINT f_r2; \
1136   INT f_simm16; \
1137   unsigned int length;
1138 #define EXTRACT_FMT_ST_D_CODE \
1139   length = 4; \
1140   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1141   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1142   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1143   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1144   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1145
1146 #define EXTRACT_FMT_STB_VARS \
1147   /* Instruction fields.  */ \
1148   UINT f_op1; \
1149   UINT f_r1; \
1150   UINT f_op2; \
1151   UINT f_r2; \
1152   unsigned int length;
1153 #define EXTRACT_FMT_STB_CODE \
1154   length = 2; \
1155   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1156   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1157   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1158   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1159
1160 #define EXTRACT_FMT_STB_D_VARS \
1161   /* Instruction fields.  */ \
1162   UINT f_op1; \
1163   UINT f_r1; \
1164   UINT f_op2; \
1165   UINT f_r2; \
1166   INT f_simm16; \
1167   unsigned int length;
1168 #define EXTRACT_FMT_STB_D_CODE \
1169   length = 4; \
1170   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1171   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1172   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1173   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1174   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1175
1176 #define EXTRACT_FMT_STH_VARS \
1177   /* Instruction fields.  */ \
1178   UINT f_op1; \
1179   UINT f_r1; \
1180   UINT f_op2; \
1181   UINT f_r2; \
1182   unsigned int length;
1183 #define EXTRACT_FMT_STH_CODE \
1184   length = 2; \
1185   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1186   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1187   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1188   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1189
1190 #define EXTRACT_FMT_STH_D_VARS \
1191   /* Instruction fields.  */ \
1192   UINT f_op1; \
1193   UINT f_r1; \
1194   UINT f_op2; \
1195   UINT f_r2; \
1196   INT f_simm16; \
1197   unsigned int length;
1198 #define EXTRACT_FMT_STH_D_CODE \
1199   length = 4; \
1200   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1201   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1202   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1203   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1204   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1205
1206 #define EXTRACT_FMT_ST_PLUS_VARS \
1207   /* Instruction fields.  */ \
1208   UINT f_op1; \
1209   UINT f_r1; \
1210   UINT f_op2; \
1211   UINT f_r2; \
1212   unsigned int length;
1213 #define EXTRACT_FMT_ST_PLUS_CODE \
1214   length = 2; \
1215   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1216   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1217   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1218   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1219
1220 #define EXTRACT_FMT_TRAP_VARS \
1221   /* Instruction fields.  */ \
1222   UINT f_op1; \
1223   UINT f_r1; \
1224   UINT f_op2; \
1225   UINT f_uimm4; \
1226   unsigned int length;
1227 #define EXTRACT_FMT_TRAP_CODE \
1228   length = 2; \
1229   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1230   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1231   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1232   f_uimm4 = EXTRACT_UINT (insn, 16, 12, 4); \
1233
1234 #define EXTRACT_FMT_UNLOCK_VARS \
1235   /* Instruction fields.  */ \
1236   UINT f_op1; \
1237   UINT f_r1; \
1238   UINT f_op2; \
1239   UINT f_r2; \
1240   unsigned int length;
1241 #define EXTRACT_FMT_UNLOCK_CODE \
1242   length = 2; \
1243   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1244   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1245   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1246   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1247
1248 /* Collection of various things for the trace handler to use.  */
1249
1250 typedef struct trace_record {
1251   PCADDR pc;
1252   /* FIXME:wip */
1253 } TRACE_RECORD;
1254
1255 #endif /* CPU_M32RBF_H */