* cpu.h: Regenerate.
[external/binutils.git] / sim / m32r / cpux.h
1 /* CPU family header for m32rxf.
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_M32RXF_H
26 #define CPU_M32RXF_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 2
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 /* GET_H_CR macro user-written */
50 /* SET_H_CR macro user-written */
51   /* accumulator */
52   DI h_accum;
53 /* GET_H_ACCUM macro user-written */
54 /* SET_H_ACCUM macro user-written */
55 /* start-sanitize-m32rx */
56   /* accumulators */
57   DI h_accums[2];
58 /* end-sanitize-m32rx */
59 /* start-sanitize-m32rx */
60 /* GET_H_ACCUMS macro user-written */
61 /* SET_H_ACCUMS macro user-written */
62 /* end-sanitize-m32rx */
63   /* condition bit */
64   BI h_cond;
65 #define GET_H_COND() CPU (h_cond)
66 #define SET_H_COND(x) (CPU (h_cond) = (x))
67   /* psw part of psw */
68   UQI h_psw;
69 /* GET_H_PSW macro user-written */
70 /* SET_H_PSW macro user-written */
71   /* backup psw */
72   UQI h_bpsw;
73 #define GET_H_BPSW() CPU (h_bpsw)
74 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
75   /* backup bpsw */
76   UQI h_bbpsw;
77 #define GET_H_BBPSW() CPU (h_bbpsw)
78 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
79   /* lock */
80   BI h_lock;
81 #define GET_H_LOCK() CPU (h_lock)
82 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
83   } hardware;
84 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
85 } M32RXF_CPU_DATA;
86
87 /* Cover fns for register access.  */
88 USI m32rxf_h_pc_get (SIM_CPU *);
89 void m32rxf_h_pc_set (SIM_CPU *, USI);
90 SI m32rxf_h_gr_get (SIM_CPU *, UINT);
91 void m32rxf_h_gr_set (SIM_CPU *, UINT, SI);
92 USI m32rxf_h_cr_get (SIM_CPU *, UINT);
93 void m32rxf_h_cr_set (SIM_CPU *, UINT, USI);
94 DI m32rxf_h_accum_get (SIM_CPU *);
95 void m32rxf_h_accum_set (SIM_CPU *, DI);
96 DI m32rxf_h_accums_get (SIM_CPU *, UINT);
97 void m32rxf_h_accums_set (SIM_CPU *, UINT, DI);
98 BI m32rxf_h_cond_get (SIM_CPU *);
99 void m32rxf_h_cond_set (SIM_CPU *, BI);
100 UQI m32rxf_h_psw_get (SIM_CPU *);
101 void m32rxf_h_psw_set (SIM_CPU *, UQI);
102 UQI m32rxf_h_bpsw_get (SIM_CPU *);
103 void m32rxf_h_bpsw_set (SIM_CPU *, UQI);
104 UQI m32rxf_h_bbpsw_get (SIM_CPU *);
105 void m32rxf_h_bbpsw_set (SIM_CPU *, UQI);
106 BI m32rxf_h_lock_get (SIM_CPU *);
107 void m32rxf_h_lock_set (SIM_CPU *, BI);
108
109 /* These must be hand-written.  */
110 extern CPUREG_FETCH_FN m32rxf_fetch_register;
111 extern CPUREG_STORE_FN m32rxf_store_register;
112
113 typedef struct {
114   int empty;
115 } MODEL_M32RX_DATA;
116
117 /* The ARGBUF struct.  */
118 struct argbuf {
119   /* These are the baseclass definitions.  */
120   PCADDR addr;
121   const IDESC *idesc;
122   char trace_p;
123   char profile_p;
124   /* cpu specific data follows */
125   union sem semantic;
126   int written;
127   union {
128     struct { /* empty format for unspecified field list */
129       int empty;
130     } fmt_empty;
131     struct { /* e.g. add $dr,$sr */
132       SI * i_dr;
133       SI * i_sr;
134       unsigned char in_dr;
135       unsigned char in_sr;
136       unsigned char out_dr;
137     } fmt_add;
138     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
139       INT f_simm16;
140       SI * i_sr;
141       SI * i_dr;
142       unsigned char in_sr;
143       unsigned char out_dr;
144     } fmt_add3;
145     struct { /* e.g. and3 $dr,$sr,$uimm16 */
146       UINT f_uimm16;
147       SI * i_sr;
148       SI * i_dr;
149       unsigned char in_sr;
150       unsigned char out_dr;
151     } fmt_and3;
152     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
153       UINT f_uimm16;
154       SI * i_sr;
155       SI * i_dr;
156       unsigned char in_sr;
157       unsigned char out_dr;
158     } fmt_or3;
159     struct { /* e.g. addi $dr,$simm8 */
160       INT f_simm8;
161       SI * i_dr;
162       unsigned char in_dr;
163       unsigned char out_dr;
164     } fmt_addi;
165     struct { /* e.g. addv $dr,$sr */
166       SI * i_dr;
167       SI * i_sr;
168       unsigned char in_dr;
169       unsigned char in_sr;
170       unsigned char out_dr;
171     } fmt_addv;
172     struct { /* e.g. addv3 $dr,$sr,$simm16 */
173       INT f_simm16;
174       SI * i_sr;
175       SI * i_dr;
176       unsigned char in_sr;
177       unsigned char out_dr;
178     } fmt_addv3;
179     struct { /* e.g. addx $dr,$sr */
180       SI * i_dr;
181       SI * i_sr;
182       unsigned char in_dr;
183       unsigned char in_sr;
184       unsigned char out_dr;
185     } fmt_addx;
186     struct { /* e.g. cmp $src1,$src2 */
187       SI * i_src1;
188       SI * i_src2;
189       unsigned char in_src1;
190       unsigned char in_src2;
191     } fmt_cmp;
192     struct { /* e.g. cmpi $src2,$simm16 */
193       INT f_simm16;
194       SI * i_src2;
195       unsigned char in_src2;
196     } fmt_cmpi;
197     struct { /* e.g. cmpz $src2 */
198       SI * i_src2;
199       unsigned char in_src2;
200     } fmt_cmpz;
201     struct { /* e.g. div $dr,$sr */
202       SI * i_sr;
203       SI * i_dr;
204       unsigned char in_sr;
205       unsigned char in_dr;
206       unsigned char out_dr;
207     } fmt_div;
208     struct { /* e.g. ld $dr,@$sr */
209       SI * i_sr;
210       SI * i_dr;
211       unsigned char in_sr;
212       unsigned char out_dr;
213     } fmt_ld;
214     struct { /* e.g. ld $dr,@($slo16,$sr) */
215       INT f_simm16;
216       SI * i_sr;
217       SI * i_dr;
218       unsigned char in_sr;
219       unsigned char out_dr;
220     } fmt_ld_d;
221     struct { /* e.g. ldb $dr,@$sr */
222       SI * i_sr;
223       SI * i_dr;
224       unsigned char in_sr;
225       unsigned char out_dr;
226     } fmt_ldb;
227     struct { /* e.g. ldb $dr,@($slo16,$sr) */
228       INT f_simm16;
229       SI * i_sr;
230       SI * i_dr;
231       unsigned char in_sr;
232       unsigned char out_dr;
233     } fmt_ldb_d;
234     struct { /* e.g. ldh $dr,@$sr */
235       SI * i_sr;
236       SI * i_dr;
237       unsigned char in_sr;
238       unsigned char out_dr;
239     } fmt_ldh;
240     struct { /* e.g. ldh $dr,@($slo16,$sr) */
241       INT f_simm16;
242       SI * i_sr;
243       SI * i_dr;
244       unsigned char in_sr;
245       unsigned char out_dr;
246     } fmt_ldh_d;
247     struct { /* e.g. ld $dr,@$sr+ */
248       SI * i_sr;
249       SI * i_dr;
250       unsigned char in_sr;
251       unsigned char out_dr;
252       unsigned char out_sr;
253     } fmt_ld_plus;
254     struct { /* e.g. ld24 $dr,$uimm24 */
255       ADDR i_uimm24;
256       SI * i_dr;
257       unsigned char out_dr;
258     } fmt_ld24;
259     struct { /* e.g. ldi8 $dr,$simm8 */
260       INT f_simm8;
261       SI * i_dr;
262       unsigned char out_dr;
263     } fmt_ldi8;
264     struct { /* e.g. ldi16 $dr,$hash$slo16 */
265       INT f_simm16;
266       SI * i_dr;
267       unsigned char out_dr;
268     } fmt_ldi16;
269     struct { /* e.g. lock $dr,@$sr */
270       SI * i_sr;
271       SI * i_dr;
272       unsigned char in_sr;
273       unsigned char out_dr;
274     } fmt_lock;
275     struct { /* e.g. machi $src1,$src2,$acc */
276       UINT f_acc;
277       SI * i_src1;
278       SI * i_src2;
279       unsigned char in_src1;
280       unsigned char in_src2;
281     } fmt_machi_a;
282     struct { /* e.g. mulhi $src1,$src2,$acc */
283       UINT f_acc;
284       SI * i_src1;
285       SI * i_src2;
286       unsigned char in_src1;
287       unsigned char in_src2;
288     } fmt_mulhi_a;
289     struct { /* e.g. mv $dr,$sr */
290       SI * i_sr;
291       SI * i_dr;
292       unsigned char in_sr;
293       unsigned char out_dr;
294     } fmt_mv;
295     struct { /* e.g. mvfachi $dr,$accs */
296       UINT f_accs;
297       SI * i_dr;
298       unsigned char out_dr;
299     } fmt_mvfachi_a;
300     struct { /* e.g. mvfc $dr,$scr */
301       UINT f_r2;
302       SI * i_dr;
303       unsigned char out_dr;
304     } fmt_mvfc;
305     struct { /* e.g. mvtachi $src1,$accs */
306       UINT f_accs;
307       SI * i_src1;
308       unsigned char in_src1;
309     } fmt_mvtachi_a;
310     struct { /* e.g. mvtc $sr,$dcr */
311       UINT f_r1;
312       SI * i_sr;
313       unsigned char in_sr;
314     } fmt_mvtc;
315     struct { /* e.g. nop */
316       int empty;
317     } fmt_nop;
318     struct { /* e.g. rac $accd,$accs,$imm1 */
319       UINT f_accs;
320       SI f_imm1;
321       UINT f_accd;
322     } fmt_rac_dsi;
323     struct { /* e.g. seth $dr,$hash$hi16 */
324       UINT f_hi16;
325       SI * i_dr;
326       unsigned char out_dr;
327     } fmt_seth;
328     struct { /* e.g. sll3 $dr,$sr,$simm16 */
329       INT f_simm16;
330       SI * i_sr;
331       SI * i_dr;
332       unsigned char in_sr;
333       unsigned char out_dr;
334     } fmt_sll3;
335     struct { /* e.g. slli $dr,$uimm5 */
336       UINT f_uimm5;
337       SI * i_dr;
338       unsigned char in_dr;
339       unsigned char out_dr;
340     } fmt_slli;
341     struct { /* e.g. st $src1,@$src2 */
342       SI * i_src2;
343       SI * i_src1;
344       unsigned char in_src2;
345       unsigned char in_src1;
346     } fmt_st;
347     struct { /* e.g. st $src1,@($slo16,$src2) */
348       INT f_simm16;
349       SI * i_src2;
350       SI * i_src1;
351       unsigned char in_src2;
352       unsigned char in_src1;
353     } fmt_st_d;
354     struct { /* e.g. stb $src1,@$src2 */
355       SI * i_src2;
356       SI * i_src1;
357       unsigned char in_src2;
358       unsigned char in_src1;
359     } fmt_stb;
360     struct { /* e.g. stb $src1,@($slo16,$src2) */
361       INT f_simm16;
362       SI * i_src2;
363       SI * i_src1;
364       unsigned char in_src2;
365       unsigned char in_src1;
366     } fmt_stb_d;
367     struct { /* e.g. sth $src1,@$src2 */
368       SI * i_src2;
369       SI * i_src1;
370       unsigned char in_src2;
371       unsigned char in_src1;
372     } fmt_sth;
373     struct { /* e.g. sth $src1,@($slo16,$src2) */
374       INT f_simm16;
375       SI * i_src2;
376       SI * i_src1;
377       unsigned char in_src2;
378       unsigned char in_src1;
379     } fmt_sth_d;
380     struct { /* e.g. st $src1,@+$src2 */
381       SI * i_src2;
382       SI * i_src1;
383       unsigned char in_src2;
384       unsigned char in_src1;
385       unsigned char out_src2;
386     } fmt_st_plus;
387     struct { /* e.g. unlock $src1,@$src2 */
388       SI * i_src2;
389       SI * i_src1;
390       unsigned char in_src2;
391       unsigned char in_src1;
392     } fmt_unlock;
393     struct { /* e.g. satb $dr,$sr */
394       SI * i_sr;
395       SI * i_dr;
396       unsigned char in_sr;
397       unsigned char out_dr;
398     } fmt_satb;
399     struct { /* e.g. sat $dr,$sr */
400       SI * i_sr;
401       SI * i_dr;
402       unsigned char in_sr;
403       unsigned char out_dr;
404     } fmt_sat;
405     struct { /* e.g. sadd */
406       int empty;
407     } fmt_sadd;
408     struct { /* e.g. macwu1 $src1,$src2 */
409       SI * i_src1;
410       SI * i_src2;
411       unsigned char in_src1;
412       unsigned char in_src2;
413     } fmt_macwu1;
414     struct { /* e.g. msblo $src1,$src2 */
415       SI * i_src1;
416       SI * i_src2;
417       unsigned char in_src1;
418       unsigned char in_src2;
419     } fmt_msblo;
420     struct { /* e.g. mulwu1 $src1,$src2 */
421       SI * i_src1;
422       SI * i_src2;
423       unsigned char in_src1;
424       unsigned char in_src2;
425     } fmt_mulwu1;
426   /* cti insns, kept separately so addr_cache is in fixed place */
427   struct {
428     union {
429     struct { /* e.g. bc.s $disp8 */
430       IADDR i_disp8;
431     } fmt_bc8;
432     struct { /* e.g. bc.l $disp24 */
433       IADDR i_disp24;
434     } fmt_bc24;
435     struct { /* e.g. beq $src1,$src2,$disp16 */
436       SI * i_src1;
437       SI * i_src2;
438       IADDR i_disp16;
439       unsigned char in_src1;
440       unsigned char in_src2;
441     } fmt_beq;
442     struct { /* e.g. beqz $src2,$disp16 */
443       SI * i_src2;
444       IADDR i_disp16;
445       unsigned char in_src2;
446     } fmt_beqz;
447     struct { /* e.g. bl.s $disp8 */
448       IADDR i_disp8;
449       unsigned char out_h_gr_14;
450     } fmt_bl8;
451     struct { /* e.g. bl.l $disp24 */
452       IADDR i_disp24;
453       unsigned char out_h_gr_14;
454     } fmt_bl24;
455     struct { /* e.g. bcl.s $disp8 */
456       IADDR i_disp8;
457       unsigned char out_h_gr_14;
458     } fmt_bcl8;
459     struct { /* e.g. bcl.l $disp24 */
460       IADDR i_disp24;
461       unsigned char out_h_gr_14;
462     } fmt_bcl24;
463     struct { /* e.g. bra.s $disp8 */
464       IADDR i_disp8;
465     } fmt_bra8;
466     struct { /* e.g. bra.l $disp24 */
467       IADDR i_disp24;
468     } fmt_bra24;
469     struct { /* e.g. jc $sr */
470       SI * i_sr;
471       unsigned char in_sr;
472     } fmt_jc;
473     struct { /* e.g. jl $sr */
474       SI * i_sr;
475       unsigned char in_sr;
476       unsigned char out_h_gr_14;
477     } fmt_jl;
478     struct { /* e.g. jmp $sr */
479       SI * i_sr;
480       unsigned char in_sr;
481     } fmt_jmp;
482     struct { /* e.g. rte */
483       int empty;
484     } fmt_rte;
485     struct { /* e.g. trap $uimm4 */
486       UINT f_uimm4;
487     } fmt_trap;
488     struct { /* e.g. sc */
489       int empty;
490     } fmt_sc;
491     } fields;
492 #if WITH_SCACHE_PBB
493     SEM_PC addr_cache;
494 #endif
495   } cti;
496 #if WITH_SCACHE_PBB
497     /* Writeback handler.  */
498     struct {
499       /* Pointer to argbuf entry for insn whose results need writing back.  */
500       const struct argbuf *abuf;
501     } write;
502     /* x-before handler */
503     struct {
504       /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
505       int first_p;
506     } before;
507     /* x-after handler */
508     struct {
509       int empty;
510     } after;
511     /* This entry is used to terminate each pbb.  */
512     struct {
513       /* Number of insns in pbb.  */
514       int insn_count;
515       /* Next pbb to execute.  */
516       SCACHE *next;
517     } chain;
518 #endif
519   } fields;
520 };
521
522 /* A cached insn.
523
524    ??? SCACHE used to contain more than just argbuf.  We could delete the
525    type entirely and always just use ARGBUF, but for future concerns and as
526    a level of abstraction it is left in.  */
527
528 struct scache {
529   struct argbuf argbuf;
530 };
531
532 /* Macros to simplify extraction, reading and semantic code.
533    These define and assign the local vars that contain the insn's fields.  */
534
535 #define EXTRACT_FMT_EMPTY_VARS \
536   /* Instruction fields.  */ \
537   unsigned int length;
538 #define EXTRACT_FMT_EMPTY_CODE \
539   length = 0; \
540
541 #define EXTRACT_FMT_ADD_VARS \
542   /* Instruction fields.  */ \
543   UINT f_op1; \
544   UINT f_r1; \
545   UINT f_op2; \
546   UINT f_r2; \
547   unsigned int length;
548 #define EXTRACT_FMT_ADD_CODE \
549   length = 2; \
550   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
551   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
552   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
553   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
554
555 #define EXTRACT_FMT_ADD3_VARS \
556   /* Instruction fields.  */ \
557   UINT f_op1; \
558   UINT f_r1; \
559   UINT f_op2; \
560   UINT f_r2; \
561   INT f_simm16; \
562   unsigned int length;
563 #define EXTRACT_FMT_ADD3_CODE \
564   length = 4; \
565   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
566   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
567   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
568   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
569   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
570
571 #define EXTRACT_FMT_AND3_VARS \
572   /* Instruction fields.  */ \
573   UINT f_op1; \
574   UINT f_r1; \
575   UINT f_op2; \
576   UINT f_r2; \
577   UINT f_uimm16; \
578   unsigned int length;
579 #define EXTRACT_FMT_AND3_CODE \
580   length = 4; \
581   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
582   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
583   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
584   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
585   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
586
587 #define EXTRACT_FMT_OR3_VARS \
588   /* Instruction fields.  */ \
589   UINT f_op1; \
590   UINT f_r1; \
591   UINT f_op2; \
592   UINT f_r2; \
593   UINT f_uimm16; \
594   unsigned int length;
595 #define EXTRACT_FMT_OR3_CODE \
596   length = 4; \
597   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
598   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
599   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
600   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
601   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
602
603 #define EXTRACT_FMT_ADDI_VARS \
604   /* Instruction fields.  */ \
605   UINT f_op1; \
606   UINT f_r1; \
607   INT f_simm8; \
608   unsigned int length;
609 #define EXTRACT_FMT_ADDI_CODE \
610   length = 2; \
611   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
612   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
613   f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
614
615 #define EXTRACT_FMT_ADDV_VARS \
616   /* Instruction fields.  */ \
617   UINT f_op1; \
618   UINT f_r1; \
619   UINT f_op2; \
620   UINT f_r2; \
621   unsigned int length;
622 #define EXTRACT_FMT_ADDV_CODE \
623   length = 2; \
624   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
625   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
626   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
627   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
628
629 #define EXTRACT_FMT_ADDV3_VARS \
630   /* Instruction fields.  */ \
631   UINT f_op1; \
632   UINT f_r1; \
633   UINT f_op2; \
634   UINT f_r2; \
635   INT f_simm16; \
636   unsigned int length;
637 #define EXTRACT_FMT_ADDV3_CODE \
638   length = 4; \
639   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
640   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
641   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
642   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
643   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
644
645 #define EXTRACT_FMT_ADDX_VARS \
646   /* Instruction fields.  */ \
647   UINT f_op1; \
648   UINT f_r1; \
649   UINT f_op2; \
650   UINT f_r2; \
651   unsigned int length;
652 #define EXTRACT_FMT_ADDX_CODE \
653   length = 2; \
654   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
655   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
656   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
657   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
658
659 #define EXTRACT_FMT_BC8_VARS \
660   /* Instruction fields.  */ \
661   UINT f_op1; \
662   UINT f_r1; \
663   SI f_disp8; \
664   unsigned int length;
665 #define EXTRACT_FMT_BC8_CODE \
666   length = 2; \
667   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
668   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
669   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
670
671 #define EXTRACT_FMT_BC24_VARS \
672   /* Instruction fields.  */ \
673   UINT f_op1; \
674   UINT f_r1; \
675   SI f_disp24; \
676   unsigned int length;
677 #define EXTRACT_FMT_BC24_CODE \
678   length = 4; \
679   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
680   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
681   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
682
683 #define EXTRACT_FMT_BEQ_VARS \
684   /* Instruction fields.  */ \
685   UINT f_op1; \
686   UINT f_r1; \
687   UINT f_op2; \
688   UINT f_r2; \
689   SI f_disp16; \
690   unsigned int length;
691 #define EXTRACT_FMT_BEQ_CODE \
692   length = 4; \
693   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
694   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
695   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
696   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
697   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
698
699 #define EXTRACT_FMT_BEQZ_VARS \
700   /* Instruction fields.  */ \
701   UINT f_op1; \
702   UINT f_r1; \
703   UINT f_op2; \
704   UINT f_r2; \
705   SI f_disp16; \
706   unsigned int length;
707 #define EXTRACT_FMT_BEQZ_CODE \
708   length = 4; \
709   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
710   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
711   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
712   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
713   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
714
715 #define EXTRACT_FMT_BL8_VARS \
716   /* Instruction fields.  */ \
717   UINT f_op1; \
718   UINT f_r1; \
719   SI f_disp8; \
720   unsigned int length;
721 #define EXTRACT_FMT_BL8_CODE \
722   length = 2; \
723   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
724   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
725   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
726
727 #define EXTRACT_FMT_BL24_VARS \
728   /* Instruction fields.  */ \
729   UINT f_op1; \
730   UINT f_r1; \
731   SI f_disp24; \
732   unsigned int length;
733 #define EXTRACT_FMT_BL24_CODE \
734   length = 4; \
735   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
736   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
737   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
738
739 #define EXTRACT_FMT_BCL8_VARS \
740   /* Instruction fields.  */ \
741   UINT f_op1; \
742   UINT f_r1; \
743   SI f_disp8; \
744   unsigned int length;
745 #define EXTRACT_FMT_BCL8_CODE \
746   length = 2; \
747   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
748   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
749   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
750
751 #define EXTRACT_FMT_BCL24_VARS \
752   /* Instruction fields.  */ \
753   UINT f_op1; \
754   UINT f_r1; \
755   SI f_disp24; \
756   unsigned int length;
757 #define EXTRACT_FMT_BCL24_CODE \
758   length = 4; \
759   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
760   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
761   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
762
763 #define EXTRACT_FMT_BRA8_VARS \
764   /* Instruction fields.  */ \
765   UINT f_op1; \
766   UINT f_r1; \
767   SI f_disp8; \
768   unsigned int length;
769 #define EXTRACT_FMT_BRA8_CODE \
770   length = 2; \
771   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
772   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
773   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
774
775 #define EXTRACT_FMT_BRA24_VARS \
776   /* Instruction fields.  */ \
777   UINT f_op1; \
778   UINT f_r1; \
779   SI f_disp24; \
780   unsigned int length;
781 #define EXTRACT_FMT_BRA24_CODE \
782   length = 4; \
783   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
784   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
785   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
786
787 #define EXTRACT_FMT_CMP_VARS \
788   /* Instruction fields.  */ \
789   UINT f_op1; \
790   UINT f_r1; \
791   UINT f_op2; \
792   UINT f_r2; \
793   unsigned int length;
794 #define EXTRACT_FMT_CMP_CODE \
795   length = 2; \
796   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
797   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
798   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
799   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
800
801 #define EXTRACT_FMT_CMPI_VARS \
802   /* Instruction fields.  */ \
803   UINT f_op1; \
804   UINT f_r1; \
805   UINT f_op2; \
806   UINT f_r2; \
807   INT f_simm16; \
808   unsigned int length;
809 #define EXTRACT_FMT_CMPI_CODE \
810   length = 4; \
811   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
812   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
813   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
814   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
815   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
816
817 #define EXTRACT_FMT_CMPZ_VARS \
818   /* Instruction fields.  */ \
819   UINT f_op1; \
820   UINT f_r1; \
821   UINT f_op2; \
822   UINT f_r2; \
823   unsigned int length;
824 #define EXTRACT_FMT_CMPZ_CODE \
825   length = 2; \
826   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
827   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
828   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
829   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
830
831 #define EXTRACT_FMT_DIV_VARS \
832   /* Instruction fields.  */ \
833   UINT f_op1; \
834   UINT f_r1; \
835   UINT f_op2; \
836   UINT f_r2; \
837   INT f_simm16; \
838   unsigned int length;
839 #define EXTRACT_FMT_DIV_CODE \
840   length = 4; \
841   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
842   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
843   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
844   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
845   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
846
847 #define EXTRACT_FMT_JC_VARS \
848   /* Instruction fields.  */ \
849   UINT f_op1; \
850   UINT f_r1; \
851   UINT f_op2; \
852   UINT f_r2; \
853   unsigned int length;
854 #define EXTRACT_FMT_JC_CODE \
855   length = 2; \
856   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
857   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
858   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
859   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
860
861 #define EXTRACT_FMT_JL_VARS \
862   /* Instruction fields.  */ \
863   UINT f_op1; \
864   UINT f_r1; \
865   UINT f_op2; \
866   UINT f_r2; \
867   unsigned int length;
868 #define EXTRACT_FMT_JL_CODE \
869   length = 2; \
870   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
871   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
872   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
873   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
874
875 #define EXTRACT_FMT_JMP_VARS \
876   /* Instruction fields.  */ \
877   UINT f_op1; \
878   UINT f_r1; \
879   UINT f_op2; \
880   UINT f_r2; \
881   unsigned int length;
882 #define EXTRACT_FMT_JMP_CODE \
883   length = 2; \
884   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
885   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
886   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
887   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
888
889 #define EXTRACT_FMT_LD_VARS \
890   /* Instruction fields.  */ \
891   UINT f_op1; \
892   UINT f_r1; \
893   UINT f_op2; \
894   UINT f_r2; \
895   unsigned int length;
896 #define EXTRACT_FMT_LD_CODE \
897   length = 2; \
898   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
899   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
900   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
901   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
902
903 #define EXTRACT_FMT_LD_D_VARS \
904   /* Instruction fields.  */ \
905   UINT f_op1; \
906   UINT f_r1; \
907   UINT f_op2; \
908   UINT f_r2; \
909   INT f_simm16; \
910   unsigned int length;
911 #define EXTRACT_FMT_LD_D_CODE \
912   length = 4; \
913   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
914   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
915   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
916   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
917   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
918
919 #define EXTRACT_FMT_LDB_VARS \
920   /* Instruction fields.  */ \
921   UINT f_op1; \
922   UINT f_r1; \
923   UINT f_op2; \
924   UINT f_r2; \
925   unsigned int length;
926 #define EXTRACT_FMT_LDB_CODE \
927   length = 2; \
928   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
929   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
930   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
931   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
932
933 #define EXTRACT_FMT_LDB_D_VARS \
934   /* Instruction fields.  */ \
935   UINT f_op1; \
936   UINT f_r1; \
937   UINT f_op2; \
938   UINT f_r2; \
939   INT f_simm16; \
940   unsigned int length;
941 #define EXTRACT_FMT_LDB_D_CODE \
942   length = 4; \
943   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
944   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
945   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
946   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
947   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
948
949 #define EXTRACT_FMT_LDH_VARS \
950   /* Instruction fields.  */ \
951   UINT f_op1; \
952   UINT f_r1; \
953   UINT f_op2; \
954   UINT f_r2; \
955   unsigned int length;
956 #define EXTRACT_FMT_LDH_CODE \
957   length = 2; \
958   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
959   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
960   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
961   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
962
963 #define EXTRACT_FMT_LDH_D_VARS \
964   /* Instruction fields.  */ \
965   UINT f_op1; \
966   UINT f_r1; \
967   UINT f_op2; \
968   UINT f_r2; \
969   INT f_simm16; \
970   unsigned int length;
971 #define EXTRACT_FMT_LDH_D_CODE \
972   length = 4; \
973   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
974   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
975   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
976   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
977   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
978
979 #define EXTRACT_FMT_LD_PLUS_VARS \
980   /* Instruction fields.  */ \
981   UINT f_op1; \
982   UINT f_r1; \
983   UINT f_op2; \
984   UINT f_r2; \
985   unsigned int length;
986 #define EXTRACT_FMT_LD_PLUS_CODE \
987   length = 2; \
988   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
989   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
990   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
991   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
992
993 #define EXTRACT_FMT_LD24_VARS \
994   /* Instruction fields.  */ \
995   UINT f_op1; \
996   UINT f_r1; \
997   UINT f_uimm24; \
998   unsigned int length;
999 #define EXTRACT_FMT_LD24_CODE \
1000   length = 4; \
1001   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1002   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1003   f_uimm24 = EXTRACT_UINT (insn, 32, 8, 24); \
1004
1005 #define EXTRACT_FMT_LDI8_VARS \
1006   /* Instruction fields.  */ \
1007   UINT f_op1; \
1008   UINT f_r1; \
1009   INT f_simm8; \
1010   unsigned int length;
1011 #define EXTRACT_FMT_LDI8_CODE \
1012   length = 2; \
1013   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1014   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1015   f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
1016
1017 #define EXTRACT_FMT_LDI16_VARS \
1018   /* Instruction fields.  */ \
1019   UINT f_op1; \
1020   UINT f_r1; \
1021   UINT f_op2; \
1022   UINT f_r2; \
1023   INT f_simm16; \
1024   unsigned int length;
1025 #define EXTRACT_FMT_LDI16_CODE \
1026   length = 4; \
1027   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1028   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1029   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1030   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1031   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1032
1033 #define EXTRACT_FMT_LOCK_VARS \
1034   /* Instruction fields.  */ \
1035   UINT f_op1; \
1036   UINT f_r1; \
1037   UINT f_op2; \
1038   UINT f_r2; \
1039   unsigned int length;
1040 #define EXTRACT_FMT_LOCK_CODE \
1041   length = 2; \
1042   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1043   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1044   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1045   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1046
1047 #define EXTRACT_FMT_MACHI_A_VARS \
1048   /* Instruction fields.  */ \
1049   UINT f_op1; \
1050   UINT f_r1; \
1051   UINT f_acc; \
1052   UINT f_op23; \
1053   UINT f_r2; \
1054   unsigned int length;
1055 #define EXTRACT_FMT_MACHI_A_CODE \
1056   length = 2; \
1057   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1058   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1059   f_acc = EXTRACT_UINT (insn, 16, 8, 1); \
1060   f_op23 = EXTRACT_UINT (insn, 16, 9, 3); \
1061   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1062
1063 #define EXTRACT_FMT_MULHI_A_VARS \
1064   /* Instruction fields.  */ \
1065   UINT f_op1; \
1066   UINT f_r1; \
1067   UINT f_acc; \
1068   UINT f_op23; \
1069   UINT f_r2; \
1070   unsigned int length;
1071 #define EXTRACT_FMT_MULHI_A_CODE \
1072   length = 2; \
1073   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1074   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1075   f_acc = EXTRACT_UINT (insn, 16, 8, 1); \
1076   f_op23 = EXTRACT_UINT (insn, 16, 9, 3); \
1077   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1078
1079 #define EXTRACT_FMT_MV_VARS \
1080   /* Instruction fields.  */ \
1081   UINT f_op1; \
1082   UINT f_r1; \
1083   UINT f_op2; \
1084   UINT f_r2; \
1085   unsigned int length;
1086 #define EXTRACT_FMT_MV_CODE \
1087   length = 2; \
1088   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1089   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1090   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1091   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1092
1093 #define EXTRACT_FMT_MVFACHI_A_VARS \
1094   /* Instruction fields.  */ \
1095   UINT f_op1; \
1096   UINT f_r1; \
1097   UINT f_op2; \
1098   UINT f_accs; \
1099   UINT f_op3; \
1100   unsigned int length;
1101 #define EXTRACT_FMT_MVFACHI_A_CODE \
1102   length = 2; \
1103   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1104   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1105   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1106   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1107   f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
1108
1109 #define EXTRACT_FMT_MVFC_VARS \
1110   /* Instruction fields.  */ \
1111   UINT f_op1; \
1112   UINT f_r1; \
1113   UINT f_op2; \
1114   UINT f_r2; \
1115   unsigned int length;
1116 #define EXTRACT_FMT_MVFC_CODE \
1117   length = 2; \
1118   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1119   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1120   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1121   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1122
1123 #define EXTRACT_FMT_MVTACHI_A_VARS \
1124   /* Instruction fields.  */ \
1125   UINT f_op1; \
1126   UINT f_r1; \
1127   UINT f_op2; \
1128   UINT f_accs; \
1129   UINT f_op3; \
1130   unsigned int length;
1131 #define EXTRACT_FMT_MVTACHI_A_CODE \
1132   length = 2; \
1133   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1134   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1135   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1136   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1137   f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
1138
1139 #define EXTRACT_FMT_MVTC_VARS \
1140   /* Instruction fields.  */ \
1141   UINT f_op1; \
1142   UINT f_r1; \
1143   UINT f_op2; \
1144   UINT f_r2; \
1145   unsigned int length;
1146 #define EXTRACT_FMT_MVTC_CODE \
1147   length = 2; \
1148   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1149   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1150   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1151   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1152
1153 #define EXTRACT_FMT_NOP_VARS \
1154   /* Instruction fields.  */ \
1155   UINT f_op1; \
1156   UINT f_r1; \
1157   UINT f_op2; \
1158   UINT f_r2; \
1159   unsigned int length;
1160 #define EXTRACT_FMT_NOP_CODE \
1161   length = 2; \
1162   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1163   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1164   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1165   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1166
1167 #define EXTRACT_FMT_RAC_DSI_VARS \
1168   /* Instruction fields.  */ \
1169   UINT f_op1; \
1170   UINT f_accd; \
1171   UINT f_bits67; \
1172   UINT f_op2; \
1173   UINT f_accs; \
1174   UINT f_bit14; \
1175   SI f_imm1; \
1176   unsigned int length;
1177 #define EXTRACT_FMT_RAC_DSI_CODE \
1178   length = 2; \
1179   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1180   f_accd = EXTRACT_UINT (insn, 16, 4, 2); \
1181   f_bits67 = EXTRACT_UINT (insn, 16, 6, 2); \
1182   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1183   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1184   f_bit14 = EXTRACT_UINT (insn, 16, 14, 1); \
1185   f_imm1 = ((EXTRACT_UINT (insn, 16, 15, 1)) + (1)); \
1186
1187 #define EXTRACT_FMT_RTE_VARS \
1188   /* Instruction fields.  */ \
1189   UINT f_op1; \
1190   UINT f_r1; \
1191   UINT f_op2; \
1192   UINT f_r2; \
1193   unsigned int length;
1194 #define EXTRACT_FMT_RTE_CODE \
1195   length = 2; \
1196   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1197   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1198   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1199   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1200
1201 #define EXTRACT_FMT_SETH_VARS \
1202   /* Instruction fields.  */ \
1203   UINT f_op1; \
1204   UINT f_r1; \
1205   UINT f_op2; \
1206   UINT f_r2; \
1207   UINT f_hi16; \
1208   unsigned int length;
1209 #define EXTRACT_FMT_SETH_CODE \
1210   length = 4; \
1211   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1212   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1213   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1214   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1215   f_hi16 = EXTRACT_UINT (insn, 32, 16, 16); \
1216
1217 #define EXTRACT_FMT_SLL3_VARS \
1218   /* Instruction fields.  */ \
1219   UINT f_op1; \
1220   UINT f_r1; \
1221   UINT f_op2; \
1222   UINT f_r2; \
1223   INT f_simm16; \
1224   unsigned int length;
1225 #define EXTRACT_FMT_SLL3_CODE \
1226   length = 4; \
1227   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1228   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1229   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1230   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1231   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1232
1233 #define EXTRACT_FMT_SLLI_VARS \
1234   /* Instruction fields.  */ \
1235   UINT f_op1; \
1236   UINT f_r1; \
1237   UINT f_shift_op2; \
1238   UINT f_uimm5; \
1239   unsigned int length;
1240 #define EXTRACT_FMT_SLLI_CODE \
1241   length = 2; \
1242   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1243   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1244   f_shift_op2 = EXTRACT_UINT (insn, 16, 8, 3); \
1245   f_uimm5 = EXTRACT_UINT (insn, 16, 11, 5); \
1246
1247 #define EXTRACT_FMT_ST_VARS \
1248   /* Instruction fields.  */ \
1249   UINT f_op1; \
1250   UINT f_r1; \
1251   UINT f_op2; \
1252   UINT f_r2; \
1253   unsigned int length;
1254 #define EXTRACT_FMT_ST_CODE \
1255   length = 2; \
1256   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1257   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1258   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1259   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1260
1261 #define EXTRACT_FMT_ST_D_VARS \
1262   /* Instruction fields.  */ \
1263   UINT f_op1; \
1264   UINT f_r1; \
1265   UINT f_op2; \
1266   UINT f_r2; \
1267   INT f_simm16; \
1268   unsigned int length;
1269 #define EXTRACT_FMT_ST_D_CODE \
1270   length = 4; \
1271   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1272   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1273   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1274   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1275   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1276
1277 #define EXTRACT_FMT_STB_VARS \
1278   /* Instruction fields.  */ \
1279   UINT f_op1; \
1280   UINT f_r1; \
1281   UINT f_op2; \
1282   UINT f_r2; \
1283   unsigned int length;
1284 #define EXTRACT_FMT_STB_CODE \
1285   length = 2; \
1286   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1287   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1288   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1289   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1290
1291 #define EXTRACT_FMT_STB_D_VARS \
1292   /* Instruction fields.  */ \
1293   UINT f_op1; \
1294   UINT f_r1; \
1295   UINT f_op2; \
1296   UINT f_r2; \
1297   INT f_simm16; \
1298   unsigned int length;
1299 #define EXTRACT_FMT_STB_D_CODE \
1300   length = 4; \
1301   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1302   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1303   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1304   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1305   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1306
1307 #define EXTRACT_FMT_STH_VARS \
1308   /* Instruction fields.  */ \
1309   UINT f_op1; \
1310   UINT f_r1; \
1311   UINT f_op2; \
1312   UINT f_r2; \
1313   unsigned int length;
1314 #define EXTRACT_FMT_STH_CODE \
1315   length = 2; \
1316   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1317   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1318   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1319   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1320
1321 #define EXTRACT_FMT_STH_D_VARS \
1322   /* Instruction fields.  */ \
1323   UINT f_op1; \
1324   UINT f_r1; \
1325   UINT f_op2; \
1326   UINT f_r2; \
1327   INT f_simm16; \
1328   unsigned int length;
1329 #define EXTRACT_FMT_STH_D_CODE \
1330   length = 4; \
1331   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1332   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1333   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1334   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1335   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1336
1337 #define EXTRACT_FMT_ST_PLUS_VARS \
1338   /* Instruction fields.  */ \
1339   UINT f_op1; \
1340   UINT f_r1; \
1341   UINT f_op2; \
1342   UINT f_r2; \
1343   unsigned int length;
1344 #define EXTRACT_FMT_ST_PLUS_CODE \
1345   length = 2; \
1346   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1347   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1348   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1349   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1350
1351 #define EXTRACT_FMT_TRAP_VARS \
1352   /* Instruction fields.  */ \
1353   UINT f_op1; \
1354   UINT f_r1; \
1355   UINT f_op2; \
1356   UINT f_uimm4; \
1357   unsigned int length;
1358 #define EXTRACT_FMT_TRAP_CODE \
1359   length = 2; \
1360   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1361   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1362   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1363   f_uimm4 = EXTRACT_UINT (insn, 16, 12, 4); \
1364
1365 #define EXTRACT_FMT_UNLOCK_VARS \
1366   /* Instruction fields.  */ \
1367   UINT f_op1; \
1368   UINT f_r1; \
1369   UINT f_op2; \
1370   UINT f_r2; \
1371   unsigned int length;
1372 #define EXTRACT_FMT_UNLOCK_CODE \
1373   length = 2; \
1374   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1375   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1376   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1377   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1378
1379 #define EXTRACT_FMT_SATB_VARS \
1380   /* Instruction fields.  */ \
1381   UINT f_op1; \
1382   UINT f_r1; \
1383   UINT f_op2; \
1384   UINT f_r2; \
1385   UINT f_uimm16; \
1386   unsigned int length;
1387 #define EXTRACT_FMT_SATB_CODE \
1388   length = 4; \
1389   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1390   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1391   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1392   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1393   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
1394
1395 #define EXTRACT_FMT_SAT_VARS \
1396   /* Instruction fields.  */ \
1397   UINT f_op1; \
1398   UINT f_r1; \
1399   UINT f_op2; \
1400   UINT f_r2; \
1401   UINT f_uimm16; \
1402   unsigned int length;
1403 #define EXTRACT_FMT_SAT_CODE \
1404   length = 4; \
1405   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1406   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1407   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1408   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1409   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
1410
1411 #define EXTRACT_FMT_SADD_VARS \
1412   /* Instruction fields.  */ \
1413   UINT f_op1; \
1414   UINT f_r1; \
1415   UINT f_op2; \
1416   UINT f_r2; \
1417   unsigned int length;
1418 #define EXTRACT_FMT_SADD_CODE \
1419   length = 2; \
1420   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1421   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1422   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1423   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1424
1425 #define EXTRACT_FMT_MACWU1_VARS \
1426   /* Instruction fields.  */ \
1427   UINT f_op1; \
1428   UINT f_r1; \
1429   UINT f_op2; \
1430   UINT f_r2; \
1431   unsigned int length;
1432 #define EXTRACT_FMT_MACWU1_CODE \
1433   length = 2; \
1434   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1435   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1436   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1437   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1438
1439 #define EXTRACT_FMT_MSBLO_VARS \
1440   /* Instruction fields.  */ \
1441   UINT f_op1; \
1442   UINT f_r1; \
1443   UINT f_op2; \
1444   UINT f_r2; \
1445   unsigned int length;
1446 #define EXTRACT_FMT_MSBLO_CODE \
1447   length = 2; \
1448   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1449   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1450   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1451   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1452
1453 #define EXTRACT_FMT_MULWU1_VARS \
1454   /* Instruction fields.  */ \
1455   UINT f_op1; \
1456   UINT f_r1; \
1457   UINT f_op2; \
1458   UINT f_r2; \
1459   unsigned int length;
1460 #define EXTRACT_FMT_MULWU1_CODE \
1461   length = 2; \
1462   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1463   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1464   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1465   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1466
1467 #define EXTRACT_FMT_SC_VARS \
1468   /* Instruction fields.  */ \
1469   UINT f_op1; \
1470   UINT f_r1; \
1471   UINT f_op2; \
1472   UINT f_r2; \
1473   unsigned int length;
1474 #define EXTRACT_FMT_SC_CODE \
1475   length = 2; \
1476   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1477   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1478   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1479   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1480
1481 /* Queued output values of an instruction.  */
1482
1483 struct parexec {
1484   union {
1485     struct { /* empty format for unspecified field list */
1486       int empty;
1487     } fmt_empty;
1488     struct { /* e.g. add $dr,$sr */
1489       SI dr;
1490     } fmt_add;
1491     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
1492       SI dr;
1493     } fmt_add3;
1494     struct { /* e.g. and3 $dr,$sr,$uimm16 */
1495       SI dr;
1496     } fmt_and3;
1497     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
1498       SI dr;
1499     } fmt_or3;
1500     struct { /* e.g. addi $dr,$simm8 */
1501       SI dr;
1502     } fmt_addi;
1503     struct { /* e.g. addv $dr,$sr */
1504       SI dr;
1505       BI condbit;
1506     } fmt_addv;
1507     struct { /* e.g. addv3 $dr,$sr,$simm16 */
1508       SI dr;
1509       BI condbit;
1510     } fmt_addv3;
1511     struct { /* e.g. addx $dr,$sr */
1512       SI dr;
1513       BI condbit;
1514     } fmt_addx;
1515     struct { /* e.g. bc.s $disp8 */
1516       USI pc;
1517     } fmt_bc8;
1518     struct { /* e.g. bc.l $disp24 */
1519       USI pc;
1520     } fmt_bc24;
1521     struct { /* e.g. beq $src1,$src2,$disp16 */
1522       USI pc;
1523     } fmt_beq;
1524     struct { /* e.g. beqz $src2,$disp16 */
1525       USI pc;
1526     } fmt_beqz;
1527     struct { /* e.g. bl.s $disp8 */
1528       SI h_gr_14;
1529       USI pc;
1530     } fmt_bl8;
1531     struct { /* e.g. bl.l $disp24 */
1532       SI h_gr_14;
1533       USI pc;
1534     } fmt_bl24;
1535     struct { /* e.g. bcl.s $disp8 */
1536       SI h_gr_14;
1537       USI pc;
1538     } fmt_bcl8;
1539     struct { /* e.g. bcl.l $disp24 */
1540       SI h_gr_14;
1541       USI pc;
1542     } fmt_bcl24;
1543     struct { /* e.g. bra.s $disp8 */
1544       USI pc;
1545     } fmt_bra8;
1546     struct { /* e.g. bra.l $disp24 */
1547       USI pc;
1548     } fmt_bra24;
1549     struct { /* e.g. cmp $src1,$src2 */
1550       BI condbit;
1551     } fmt_cmp;
1552     struct { /* e.g. cmpi $src2,$simm16 */
1553       BI condbit;
1554     } fmt_cmpi;
1555     struct { /* e.g. cmpz $src2 */
1556       BI condbit;
1557     } fmt_cmpz;
1558     struct { /* e.g. div $dr,$sr */
1559       SI dr;
1560     } fmt_div;
1561     struct { /* e.g. jc $sr */
1562       USI pc;
1563     } fmt_jc;
1564     struct { /* e.g. jl $sr */
1565       SI h_gr_14;
1566       USI pc;
1567     } fmt_jl;
1568     struct { /* e.g. jmp $sr */
1569       USI pc;
1570     } fmt_jmp;
1571     struct { /* e.g. ld $dr,@$sr */
1572       SI dr;
1573     } fmt_ld;
1574     struct { /* e.g. ld $dr,@($slo16,$sr) */
1575       SI dr;
1576     } fmt_ld_d;
1577     struct { /* e.g. ldb $dr,@$sr */
1578       SI dr;
1579     } fmt_ldb;
1580     struct { /* e.g. ldb $dr,@($slo16,$sr) */
1581       SI dr;
1582     } fmt_ldb_d;
1583     struct { /* e.g. ldh $dr,@$sr */
1584       SI dr;
1585     } fmt_ldh;
1586     struct { /* e.g. ldh $dr,@($slo16,$sr) */
1587       SI dr;
1588     } fmt_ldh_d;
1589     struct { /* e.g. ld $dr,@$sr+ */
1590       SI dr;
1591       SI sr;
1592     } fmt_ld_plus;
1593     struct { /* e.g. ld24 $dr,$uimm24 */
1594       SI dr;
1595     } fmt_ld24;
1596     struct { /* e.g. ldi8 $dr,$simm8 */
1597       SI dr;
1598     } fmt_ldi8;
1599     struct { /* e.g. ldi16 $dr,$hash$slo16 */
1600       SI dr;
1601     } fmt_ldi16;
1602     struct { /* e.g. lock $dr,@$sr */
1603       BI h_lock_0;
1604       SI dr;
1605     } fmt_lock;
1606     struct { /* e.g. machi $src1,$src2,$acc */
1607       DI acc;
1608     } fmt_machi_a;
1609     struct { /* e.g. mulhi $src1,$src2,$acc */
1610       DI acc;
1611     } fmt_mulhi_a;
1612     struct { /* e.g. mv $dr,$sr */
1613       SI dr;
1614     } fmt_mv;
1615     struct { /* e.g. mvfachi $dr,$accs */
1616       SI dr;
1617     } fmt_mvfachi_a;
1618     struct { /* e.g. mvfc $dr,$scr */
1619       SI dr;
1620     } fmt_mvfc;
1621     struct { /* e.g. mvtachi $src1,$accs */
1622       DI accs;
1623     } fmt_mvtachi_a;
1624     struct { /* e.g. mvtc $sr,$dcr */
1625       USI dcr;
1626     } fmt_mvtc;
1627     struct { /* e.g. nop */
1628       int empty;
1629     } fmt_nop;
1630     struct { /* e.g. rac $accd,$accs,$imm1 */
1631       DI accd;
1632     } fmt_rac_dsi;
1633     struct { /* e.g. rte */
1634       USI pc;
1635       USI h_cr_6;
1636       UQI h_psw_0;
1637       UQI h_bpsw_0;
1638     } fmt_rte;
1639     struct { /* e.g. seth $dr,$hash$hi16 */
1640       SI dr;
1641     } fmt_seth;
1642     struct { /* e.g. sll3 $dr,$sr,$simm16 */
1643       SI dr;
1644     } fmt_sll3;
1645     struct { /* e.g. slli $dr,$uimm5 */
1646       SI dr;
1647     } fmt_slli;
1648     struct { /* e.g. st $src1,@$src2 */
1649       SI h_memory_src2;
1650       USI h_memory_src2_idx;
1651     } fmt_st;
1652     struct { /* e.g. st $src1,@($slo16,$src2) */
1653       SI h_memory_add__VM_src2_slo16;
1654       USI h_memory_add__VM_src2_slo16_idx;
1655     } fmt_st_d;
1656     struct { /* e.g. stb $src1,@$src2 */
1657       QI h_memory_src2;
1658       USI h_memory_src2_idx;
1659     } fmt_stb;
1660     struct { /* e.g. stb $src1,@($slo16,$src2) */
1661       QI h_memory_add__VM_src2_slo16;
1662       USI h_memory_add__VM_src2_slo16_idx;
1663     } fmt_stb_d;
1664     struct { /* e.g. sth $src1,@$src2 */
1665       HI h_memory_src2;
1666       USI h_memory_src2_idx;
1667     } fmt_sth;
1668     struct { /* e.g. sth $src1,@($slo16,$src2) */
1669       HI h_memory_add__VM_src2_slo16;
1670       USI h_memory_add__VM_src2_slo16_idx;
1671     } fmt_sth_d;
1672     struct { /* e.g. st $src1,@+$src2 */
1673       SI h_memory_new_src2;
1674       USI h_memory_new_src2_idx;
1675       SI src2;
1676     } fmt_st_plus;
1677     struct { /* e.g. trap $uimm4 */
1678       USI h_cr_14;
1679       USI h_cr_6;
1680       UQI h_bbpsw_0;
1681       UQI h_bpsw_0;
1682       UQI h_psw_0;
1683       SI pc;
1684     } fmt_trap;
1685     struct { /* e.g. unlock $src1,@$src2 */
1686       SI h_memory_src2;
1687       USI h_memory_src2_idx;
1688       BI h_lock_0;
1689     } fmt_unlock;
1690     struct { /* e.g. satb $dr,$sr */
1691       SI dr;
1692     } fmt_satb;
1693     struct { /* e.g. sat $dr,$sr */
1694       SI dr;
1695     } fmt_sat;
1696     struct { /* e.g. sadd */
1697       DI h_accums_0;
1698     } fmt_sadd;
1699     struct { /* e.g. macwu1 $src1,$src2 */
1700       DI h_accums_1;
1701     } fmt_macwu1;
1702     struct { /* e.g. msblo $src1,$src2 */
1703       DI accum;
1704     } fmt_msblo;
1705     struct { /* e.g. mulwu1 $src1,$src2 */
1706       DI h_accums_1;
1707     } fmt_mulwu1;
1708     struct { /* e.g. sc */
1709       int empty;
1710     } fmt_sc;
1711   } operands;
1712   /* For conditionally written operands, bitmask of which ones were.  */
1713   int written;
1714 };
1715
1716 /* Collection of various things for the trace handler to use.  */
1717
1718 typedef struct trace_record {
1719   PCADDR pc;
1720   /* FIXME:wip */
1721 } TRACE_RECORD;
1722
1723 #endif /* CPU_M32RXF_H */