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