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