* Makefile.in: Add m32rx objs, and rules to build them.
[external/binutils.git] / sim / m32r / cpux.h
1 /* CPU family header for m32rx.
2
3 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
4
5 This file is part of the GNU Simulators.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21 */
22
23 #ifndef CPU_M32RX_H
24 #define CPU_M32RX_H
25
26 /* Maximum number of instructions that are fetched at a time.
27    This is for LIW type instructions sets (e.g. m32r).  */
28 #define MAX_LIW_INSNS 2
29
30 /* Maximum number of instructions that can be executed in parallel.  */
31 #define MAX_PARALLEL_INSNS 2
32
33 /* CPU state information.  */
34 typedef struct {
35   /* Hardware elements.  */
36   struct {
37   /* program counter */
38   USI h_pc;
39 #define GET_H_PC() CPU (h_pc)
40 #define SET_H_PC(x) (CPU (h_pc) = (x))
41   /* general registers */
42   SI h_gr[16];
43 #define GET_H_GR(a1) CPU (h_gr)[a1]
44 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
45   /* control registers */
46   SI h_cr[7];
47 #define GET_H_CR(a1) CPU (h_cr)[a1]
48 #define SET_H_CR(a1, x) (CPU (h_cr)[a1] = (x))
49   /* accumulator */
50   DI h_accum;
51 #define GET_H_ACCUM() CPU (h_accum)
52 #define SET_H_ACCUM(x) (CPU (h_accum) = (x))
53   /* accumulators */
54   DI h_accums[2];
55 #define GET_H_ACCUMS(a1) CPU (h_accums)[a1]
56 #define SET_H_ACCUMS(a1, x) (CPU (h_accums)[a1] = (x))
57   /* abort flag */
58   UBI h_abort;
59 #define GET_H_ABORT() CPU (h_abort)
60 #define SET_H_ABORT(x) (CPU (h_abort) = (x))
61   /* condition bit */
62   UBI h_cond;
63 #define GET_H_COND() CPU (h_cond)
64 #define SET_H_COND(x) (CPU (h_cond) = (x))
65   /* sm */
66   UBI h_sm;
67 #define GET_H_SM() CPU (h_sm)
68 #define SET_H_SM(x) (CPU (h_sm) = (x))
69   /* bsm */
70   UBI h_bsm;
71 #define GET_H_BSM() CPU (h_bsm)
72 #define SET_H_BSM(x) (CPU (h_bsm) = (x))
73   /* ie */
74   UBI h_ie;
75 #define GET_H_IE() CPU (h_ie)
76 #define SET_H_IE(x) (CPU (h_ie) = (x))
77   /* bie */
78   UBI h_bie;
79 #define GET_H_BIE() CPU (h_bie)
80 #define SET_H_BIE(x) (CPU (h_bie) = (x))
81   /* bcond */
82   UBI h_bcond;
83 #define GET_H_BCOND() CPU (h_bcond)
84 #define SET_H_BCOND(x) (CPU (h_bcond) = (x))
85   /* bpc */
86   SI h_bpc;
87 #define GET_H_BPC() CPU (h_bpc)
88 #define SET_H_BPC(x) (CPU (h_bpc) = (x))
89   } hardware;
90 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
91   /* CPU profiling state information.  */
92   struct {
93   /* general registers */
94   unsigned long h_gr;
95   } profile;
96 #define CPU_CGEN_PROFILE(cpu) (& (cpu)->cpu_data.profile)
97 } M32RX_CPU_DATA;
98
99 /* FIXME: length parm to decode() is currently unneeded.  */
100 extern DECODE *m32rx_decode (SIM_CPU *, insn_t /*, int*/);
101
102 /* The ARGBUF struct.  */
103 struct argbuf {
104   /* These are the baseclass definitions.  */
105   unsigned int length;
106   PCADDR addr;
107   const struct cgen_insn *opcode;
108   /* unsigned long insn; - no longer needed */
109   /* cpu specific data follows */
110   union {
111     struct { /* e.g. add $dr,$sr */
112       UINT f_r1;
113       UINT f_r2;
114     } fmt_0_add;
115     struct { /* e.g. add3 $dr,$sr,#$slo16 */
116       UINT f_r1;
117       UINT f_r2;
118       HI f_simm16;
119     } fmt_1_add3;
120     struct { /* e.g. and3 $dr,$sr,#$uimm16 */
121       UINT f_r1;
122       UINT f_r2;
123       USI f_uimm16;
124     } fmt_2_and3;
125     struct { /* e.g. or3 $dr,$sr,#$ulo16 */
126       UINT f_r1;
127       UINT f_r2;
128       UHI f_uimm16;
129     } fmt_3_or3;
130     struct { /* e.g. addi $dr,#$simm8 */
131       UINT f_r1;
132       SI f_simm8;
133     } fmt_4_addi;
134     struct { /* e.g. addv3 $dr,$sr,#$simm16 */
135       UINT f_r1;
136       UINT f_r2;
137       SI f_simm16;
138     } fmt_5_addv3;
139     struct { /* e.g. addx $dr,$sr */
140       UINT f_r1;
141       UINT f_r2;
142     } fmt_6_addx;
143     struct { /* e.g. bc $disp8 */
144       IADDR f_disp8;
145     } fmt_7_bc8;
146     struct { /* e.g. bc $disp24 */
147       IADDR f_disp24;
148     } fmt_8_bc24;
149     struct { /* e.g. beq $src1,$src2,$disp16 */
150       UINT f_r1;
151       UINT f_r2;
152       IADDR f_disp16;
153     } fmt_9_beq;
154     struct { /* e.g. beqz $src2,$disp16 */
155       UINT f_r2;
156       IADDR f_disp16;
157     } fmt_10_beqz;
158     struct { /* e.g. bl $disp8 */
159       IADDR f_disp8;
160     } fmt_11_bl8;
161     struct { /* e.g. bl $disp24 */
162       IADDR f_disp24;
163     } fmt_12_bl24;
164     struct { /* e.g. bcl $disp8 */
165       IADDR f_disp8;
166     } fmt_13_bcl8;
167     struct { /* e.g. bcl $disp24 */
168       IADDR f_disp24;
169     } fmt_14_bcl24;
170     struct { /* e.g. bra $disp8 */
171       IADDR f_disp8;
172     } fmt_15_bra8;
173     struct { /* e.g. bra $disp24 */
174       IADDR f_disp24;
175     } fmt_16_bra24;
176     struct { /* e.g. cmp $src1,$src2 */
177       UINT f_r1;
178       UINT f_r2;
179     } fmt_17_cmp;
180     struct { /* e.g. cmpi $src2,#$simm16 */
181       UINT f_r2;
182       SI f_simm16;
183     } fmt_18_cmpi;
184     struct { /* e.g. cmpui $src2,#$uimm16 */
185       UINT f_r2;
186       USI f_uimm16;
187     } fmt_19_cmpui;
188     struct { /* e.g. cmpz $src2 */
189       UINT f_r2;
190     } fmt_20_cmpz;
191     struct { /* e.g. div $dr,$sr */
192       UINT f_r1;
193       UINT f_r2;
194     } fmt_21_div;
195     struct { /* e.g. jc $sr */
196       UINT f_r2;
197     } fmt_22_jc;
198     struct { /* e.g. jl $sr */
199       UINT f_r2;
200     } fmt_23_jl;
201     struct { /* e.g. jmp $sr */
202       UINT f_r2;
203     } fmt_24_jmp;
204     struct { /* e.g. ld $dr,@$sr */
205       UINT f_r1;
206       UINT f_r2;
207     } fmt_25_ld;
208     struct { /* e.g. ld $dr,@($slo16,$sr) */
209       UINT f_r1;
210       UINT f_r2;
211       HI f_simm16;
212     } fmt_26_ld_d;
213     struct { /* e.g. ldb $dr,@$sr */
214       UINT f_r1;
215       UINT f_r2;
216     } fmt_27_ldb;
217     struct { /* e.g. ldb $dr,@($slo16,$sr) */
218       UINT f_r1;
219       UINT f_r2;
220       HI f_simm16;
221     } fmt_28_ldb_d;
222     struct { /* e.g. ldh $dr,@$sr */
223       UINT f_r1;
224       UINT f_r2;
225     } fmt_29_ldh;
226     struct { /* e.g. ldh $dr,@($slo16,$sr) */
227       UINT f_r1;
228       UINT f_r2;
229       HI f_simm16;
230     } fmt_30_ldh_d;
231     struct { /* e.g. ld24 $dr,#$uimm24 */
232       UINT f_r1;
233       ADDR f_uimm24;
234     } fmt_31_ld24;
235     struct { /* e.g. ldi $dr,#$simm8 */
236       UINT f_r1;
237       SI f_simm8;
238     } fmt_32_ldi8;
239     struct { /* e.g. ldi $dr,$slo16 */
240       UINT f_r1;
241       HI f_simm16;
242     } fmt_33_ldi16;
243     struct { /* e.g. machi $src1,$src2 */
244       UINT f_r1;
245       UINT f_r2;
246     } fmt_34_machi;
247     struct { /* e.g. machi $src1,$src2,$acc */
248       UINT f_r1;
249       UINT f_acc;
250       UINT f_r2;
251     } fmt_35_machi_a;
252     struct { /* e.g. mulhi $src1,$src2,$acc */
253       UINT f_r1;
254       UINT f_acc;
255       UINT f_r2;
256     } fmt_36_mulhi_a;
257     struct { /* e.g. mv $dr,$sr */
258       UINT f_r1;
259       UINT f_r2;
260     } fmt_37_mv;
261     struct { /* e.g. mvfachi $dr */
262       UINT f_r1;
263     } fmt_38_mvfachi;
264     struct { /* e.g. mvfachi $dr,$accs */
265       UINT f_r1;
266       UINT f_accs;
267     } fmt_39_mvfachi_a;
268     struct { /* e.g. mvfc $dr,$scr */
269       UINT f_r1;
270       UINT f_r2;
271     } fmt_40_mvfc;
272     struct { /* e.g. mvtachi $src1 */
273       UINT f_r1;
274     } fmt_41_mvtachi;
275     struct { /* e.g. mvtachi $src1,$accs */
276       UINT f_r1;
277       UINT f_accs;
278     } fmt_42_mvtachi_a;
279     struct { /* e.g. mvtc $sr,$dcr */
280       UINT f_r1;
281       UINT f_r2;
282     } fmt_43_mvtc;
283     struct { /* e.g. nop */
284       int empty;
285     } fmt_44_nop;
286     struct { /* e.g. rac */
287       int empty;
288     } fmt_45_rac;
289     struct { /* e.g. rac $accs */
290       UINT f_accs;
291     } fmt_46_rac_a;
292     struct { /* e.g. seth $dr,$hi16 */
293       UINT f_r1;
294       UHI f_hi16;
295     } fmt_47_seth;
296     struct { /* e.g. slli $dr,#$uimm5 */
297       UINT f_r1;
298       USI f_uimm5;
299     } fmt_48_slli;
300     struct { /* e.g. st $src1,@($slo16,$src2) */
301       UINT f_r1;
302       UINT f_r2;
303       HI f_simm16;
304     } fmt_49_st_d;
305     struct { /* e.g. trap #$uimm4 */
306       USI f_uimm4;
307     } fmt_50_trap;
308     struct { /* e.g. satb $dr,$src2 */
309       UINT f_r1;
310       UINT f_r2;
311     } fmt_51_satb;
312     struct { /* e.g. pcmpbz $src2 */
313       UINT f_r2;
314     } fmt_52_pcmpbz;
315     struct { /* e.g. sadd */
316       int empty;
317     } fmt_53_sadd;
318     struct { /* e.g. macwu1 $src1,$src2 */
319       UINT f_r1;
320       UINT f_r2;
321     } fmt_54_macwu1;
322     struct { /* e.g. sc */
323       int empty;
324     } fmt_55_sc;
325   } fields;
326 #if 1 || WITH_PROFILE_MODEL_P /*FIXME:wip*/
327   unsigned long h_gr_get;
328   unsigned long h_gr_set;
329 #endif
330 };
331
332 /* A cached insn.
333    This is also used in the non-scache case.  In this situation we assume
334    the cache size is 1, and do a few things a little differently.  */
335
336 struct scache {
337   IADDR next;
338   union {
339 #if ! WITH_SEM_SWITCH_FULL
340     SEMANTIC_FN *sem_fn;
341 #endif
342 #if ! WITH_SEM_SWITCH_FAST
343 #if WITH_SCACHE
344     SEMANTIC_CACHE_FN *sem_fast_fn;
345 #else
346     SEMANTIC_FN *sem_fast_fn;
347 #endif
348 #endif
349 #if WITH_SEM_SWITCH_FULL || WITH_SEM_SWITCH_FAST
350 #ifdef __GNUC__
351     void *sem_case;
352 #else
353     int sem_case;
354 #endif
355 #endif
356   } semantic;
357   struct argbuf argbuf;
358 };
359
360 /* Macros to simplify extraction, reading and semantic code.
361    These define and assign the local vars that contain the insn's fields.  */
362
363 #define EXTRACT_FMT_0_ADD_VARS \
364   /* Instruction fields.  */ \
365   UINT f_op1; \
366   UINT f_r1; \
367   UINT f_op2; \
368   UINT f_r2; \
369   unsigned int length;
370 #define EXTRACT_FMT_0_ADD_CODE \
371   length = 2; \
372   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
373   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
374   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
375   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
376
377 #define EXTRACT_FMT_1_ADD3_VARS \
378   /* Instruction fields.  */ \
379   UINT f_op1; \
380   UINT f_r1; \
381   UINT f_op2; \
382   UINT f_r2; \
383   int f_simm16; \
384   unsigned int length;
385 #define EXTRACT_FMT_1_ADD3_CODE \
386   length = 4; \
387   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
388   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
389   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
390   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
391   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
392
393 #define EXTRACT_FMT_2_AND3_VARS \
394   /* Instruction fields.  */ \
395   UINT f_op1; \
396   UINT f_r1; \
397   UINT f_op2; \
398   UINT f_r2; \
399   UINT f_uimm16; \
400   unsigned int length;
401 #define EXTRACT_FMT_2_AND3_CODE \
402   length = 4; \
403   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
404   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
405   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
406   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
407   f_uimm16 = EXTRACT_UNSIGNED (insn, 32, 16, 16); \
408
409 #define EXTRACT_FMT_3_OR3_VARS \
410   /* Instruction fields.  */ \
411   UINT f_op1; \
412   UINT f_r1; \
413   UINT f_op2; \
414   UINT f_r2; \
415   UINT f_uimm16; \
416   unsigned int length;
417 #define EXTRACT_FMT_3_OR3_CODE \
418   length = 4; \
419   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
420   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
421   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
422   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
423   f_uimm16 = EXTRACT_UNSIGNED (insn, 32, 16, 16); \
424
425 #define EXTRACT_FMT_4_ADDI_VARS \
426   /* Instruction fields.  */ \
427   UINT f_op1; \
428   UINT f_r1; \
429   int f_simm8; \
430   unsigned int length;
431 #define EXTRACT_FMT_4_ADDI_CODE \
432   length = 2; \
433   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
434   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
435   f_simm8 = EXTRACT_SIGNED (insn, 16, 8, 8); \
436
437 #define EXTRACT_FMT_5_ADDV3_VARS \
438   /* Instruction fields.  */ \
439   UINT f_op1; \
440   UINT f_r1; \
441   UINT f_op2; \
442   UINT f_r2; \
443   int f_simm16; \
444   unsigned int length;
445 #define EXTRACT_FMT_5_ADDV3_CODE \
446   length = 4; \
447   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
448   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
449   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
450   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
451   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
452
453 #define EXTRACT_FMT_6_ADDX_VARS \
454   /* Instruction fields.  */ \
455   UINT f_op1; \
456   UINT f_r1; \
457   UINT f_op2; \
458   UINT f_r2; \
459   unsigned int length;
460 #define EXTRACT_FMT_6_ADDX_CODE \
461   length = 2; \
462   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
463   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
464   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
465   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
466
467 #define EXTRACT_FMT_7_BC8_VARS \
468   /* Instruction fields.  */ \
469   UINT f_op1; \
470   UINT f_r1; \
471   int f_disp8; \
472   unsigned int length;
473 #define EXTRACT_FMT_7_BC8_CODE \
474   length = 2; \
475   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
476   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
477   f_disp8 = EXTRACT_SIGNED (insn, 16, 8, 8) << 2; \
478
479 #define EXTRACT_FMT_8_BC24_VARS \
480   /* Instruction fields.  */ \
481   UINT f_op1; \
482   UINT f_r1; \
483   int f_disp24; \
484   unsigned int length;
485 #define EXTRACT_FMT_8_BC24_CODE \
486   length = 4; \
487   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
488   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
489   f_disp24 = EXTRACT_SIGNED (insn, 32, 8, 24) << 2; \
490
491 #define EXTRACT_FMT_9_BEQ_VARS \
492   /* Instruction fields.  */ \
493   UINT f_op1; \
494   UINT f_r1; \
495   UINT f_op2; \
496   UINT f_r2; \
497   int f_disp16; \
498   unsigned int length;
499 #define EXTRACT_FMT_9_BEQ_CODE \
500   length = 4; \
501   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
502   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
503   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
504   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
505   f_disp16 = EXTRACT_SIGNED (insn, 32, 16, 16) << 2; \
506
507 #define EXTRACT_FMT_10_BEQZ_VARS \
508   /* Instruction fields.  */ \
509   UINT f_op1; \
510   UINT f_r1; \
511   UINT f_op2; \
512   UINT f_r2; \
513   int f_disp16; \
514   unsigned int length;
515 #define EXTRACT_FMT_10_BEQZ_CODE \
516   length = 4; \
517   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
518   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
519   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
520   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
521   f_disp16 = EXTRACT_SIGNED (insn, 32, 16, 16) << 2; \
522
523 #define EXTRACT_FMT_11_BL8_VARS \
524   /* Instruction fields.  */ \
525   UINT f_op1; \
526   UINT f_r1; \
527   int f_disp8; \
528   unsigned int length;
529 #define EXTRACT_FMT_11_BL8_CODE \
530   length = 2; \
531   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
532   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
533   f_disp8 = EXTRACT_SIGNED (insn, 16, 8, 8) << 2; \
534
535 #define EXTRACT_FMT_12_BL24_VARS \
536   /* Instruction fields.  */ \
537   UINT f_op1; \
538   UINT f_r1; \
539   int f_disp24; \
540   unsigned int length;
541 #define EXTRACT_FMT_12_BL24_CODE \
542   length = 4; \
543   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
544   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
545   f_disp24 = EXTRACT_SIGNED (insn, 32, 8, 24) << 2; \
546
547 #define EXTRACT_FMT_13_BCL8_VARS \
548   /* Instruction fields.  */ \
549   UINT f_op1; \
550   UINT f_r1; \
551   int f_disp8; \
552   unsigned int length;
553 #define EXTRACT_FMT_13_BCL8_CODE \
554   length = 2; \
555   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
556   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
557   f_disp8 = EXTRACT_SIGNED (insn, 16, 8, 8) << 2; \
558
559 #define EXTRACT_FMT_14_BCL24_VARS \
560   /* Instruction fields.  */ \
561   UINT f_op1; \
562   UINT f_r1; \
563   int f_disp24; \
564   unsigned int length;
565 #define EXTRACT_FMT_14_BCL24_CODE \
566   length = 4; \
567   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
568   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
569   f_disp24 = EXTRACT_SIGNED (insn, 32, 8, 24) << 2; \
570
571 #define EXTRACT_FMT_15_BRA8_VARS \
572   /* Instruction fields.  */ \
573   UINT f_op1; \
574   UINT f_r1; \
575   int f_disp8; \
576   unsigned int length;
577 #define EXTRACT_FMT_15_BRA8_CODE \
578   length = 2; \
579   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
580   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
581   f_disp8 = EXTRACT_SIGNED (insn, 16, 8, 8) << 2; \
582
583 #define EXTRACT_FMT_16_BRA24_VARS \
584   /* Instruction fields.  */ \
585   UINT f_op1; \
586   UINT f_r1; \
587   int f_disp24; \
588   unsigned int length;
589 #define EXTRACT_FMT_16_BRA24_CODE \
590   length = 4; \
591   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
592   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
593   f_disp24 = EXTRACT_SIGNED (insn, 32, 8, 24) << 2; \
594
595 #define EXTRACT_FMT_17_CMP_VARS \
596   /* Instruction fields.  */ \
597   UINT f_op1; \
598   UINT f_r1; \
599   UINT f_op2; \
600   UINT f_r2; \
601   unsigned int length;
602 #define EXTRACT_FMT_17_CMP_CODE \
603   length = 2; \
604   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
605   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
606   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
607   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
608
609 #define EXTRACT_FMT_18_CMPI_VARS \
610   /* Instruction fields.  */ \
611   UINT f_op1; \
612   UINT f_r1; \
613   UINT f_op2; \
614   UINT f_r2; \
615   int f_simm16; \
616   unsigned int length;
617 #define EXTRACT_FMT_18_CMPI_CODE \
618   length = 4; \
619   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
620   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
621   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
622   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
623   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
624
625 #define EXTRACT_FMT_19_CMPUI_VARS \
626   /* Instruction fields.  */ \
627   UINT f_op1; \
628   UINT f_r1; \
629   UINT f_op2; \
630   UINT f_r2; \
631   UINT f_uimm16; \
632   unsigned int length;
633 #define EXTRACT_FMT_19_CMPUI_CODE \
634   length = 4; \
635   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
636   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
637   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
638   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
639   f_uimm16 = EXTRACT_UNSIGNED (insn, 32, 16, 16); \
640
641 #define EXTRACT_FMT_20_CMPZ_VARS \
642   /* Instruction fields.  */ \
643   UINT f_op1; \
644   UINT f_r1; \
645   UINT f_op2; \
646   UINT f_r2; \
647   unsigned int length;
648 #define EXTRACT_FMT_20_CMPZ_CODE \
649   length = 2; \
650   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
651   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
652   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
653   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
654
655 #define EXTRACT_FMT_21_DIV_VARS \
656   /* Instruction fields.  */ \
657   UINT f_op1; \
658   UINT f_r1; \
659   UINT f_op2; \
660   UINT f_r2; \
661   int f_simm16; \
662   unsigned int length;
663 #define EXTRACT_FMT_21_DIV_CODE \
664   length = 4; \
665   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
666   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
667   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
668   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
669   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
670
671 #define EXTRACT_FMT_22_JC_VARS \
672   /* Instruction fields.  */ \
673   UINT f_op1; \
674   UINT f_r1; \
675   UINT f_op2; \
676   UINT f_r2; \
677   unsigned int length;
678 #define EXTRACT_FMT_22_JC_CODE \
679   length = 2; \
680   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
681   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
682   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
683   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
684
685 #define EXTRACT_FMT_23_JL_VARS \
686   /* Instruction fields.  */ \
687   UINT f_op1; \
688   UINT f_r1; \
689   UINT f_op2; \
690   UINT f_r2; \
691   unsigned int length;
692 #define EXTRACT_FMT_23_JL_CODE \
693   length = 2; \
694   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
695   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
696   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
697   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
698
699 #define EXTRACT_FMT_24_JMP_VARS \
700   /* Instruction fields.  */ \
701   UINT f_op1; \
702   UINT f_r1; \
703   UINT f_op2; \
704   UINT f_r2; \
705   unsigned int length;
706 #define EXTRACT_FMT_24_JMP_CODE \
707   length = 2; \
708   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
709   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
710   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
711   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
712
713 #define EXTRACT_FMT_25_LD_VARS \
714   /* Instruction fields.  */ \
715   UINT f_op1; \
716   UINT f_r1; \
717   UINT f_op2; \
718   UINT f_r2; \
719   unsigned int length;
720 #define EXTRACT_FMT_25_LD_CODE \
721   length = 2; \
722   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
723   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
724   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
725   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
726
727 #define EXTRACT_FMT_26_LD_D_VARS \
728   /* Instruction fields.  */ \
729   UINT f_op1; \
730   UINT f_r1; \
731   UINT f_op2; \
732   UINT f_r2; \
733   int f_simm16; \
734   unsigned int length;
735 #define EXTRACT_FMT_26_LD_D_CODE \
736   length = 4; \
737   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
738   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
739   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
740   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
741   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
742
743 #define EXTRACT_FMT_27_LDB_VARS \
744   /* Instruction fields.  */ \
745   UINT f_op1; \
746   UINT f_r1; \
747   UINT f_op2; \
748   UINT f_r2; \
749   unsigned int length;
750 #define EXTRACT_FMT_27_LDB_CODE \
751   length = 2; \
752   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
753   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
754   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
755   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
756
757 #define EXTRACT_FMT_28_LDB_D_VARS \
758   /* Instruction fields.  */ \
759   UINT f_op1; \
760   UINT f_r1; \
761   UINT f_op2; \
762   UINT f_r2; \
763   int f_simm16; \
764   unsigned int length;
765 #define EXTRACT_FMT_28_LDB_D_CODE \
766   length = 4; \
767   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
768   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
769   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
770   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
771   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
772
773 #define EXTRACT_FMT_29_LDH_VARS \
774   /* Instruction fields.  */ \
775   UINT f_op1; \
776   UINT f_r1; \
777   UINT f_op2; \
778   UINT f_r2; \
779   unsigned int length;
780 #define EXTRACT_FMT_29_LDH_CODE \
781   length = 2; \
782   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
783   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
784   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
785   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
786
787 #define EXTRACT_FMT_30_LDH_D_VARS \
788   /* Instruction fields.  */ \
789   UINT f_op1; \
790   UINT f_r1; \
791   UINT f_op2; \
792   UINT f_r2; \
793   int f_simm16; \
794   unsigned int length;
795 #define EXTRACT_FMT_30_LDH_D_CODE \
796   length = 4; \
797   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
798   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
799   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
800   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
801   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
802
803 #define EXTRACT_FMT_31_LD24_VARS \
804   /* Instruction fields.  */ \
805   UINT f_op1; \
806   UINT f_r1; \
807   UINT f_uimm24; \
808   unsigned int length;
809 #define EXTRACT_FMT_31_LD24_CODE \
810   length = 4; \
811   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
812   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
813   f_uimm24 = EXTRACT_UNSIGNED (insn, 32, 8, 24); \
814
815 #define EXTRACT_FMT_32_LDI8_VARS \
816   /* Instruction fields.  */ \
817   UINT f_op1; \
818   UINT f_r1; \
819   int f_simm8; \
820   unsigned int length;
821 #define EXTRACT_FMT_32_LDI8_CODE \
822   length = 2; \
823   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
824   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
825   f_simm8 = EXTRACT_SIGNED (insn, 16, 8, 8); \
826
827 #define EXTRACT_FMT_33_LDI16_VARS \
828   /* Instruction fields.  */ \
829   UINT f_op1; \
830   UINT f_r1; \
831   UINT f_op2; \
832   UINT f_r2; \
833   int f_simm16; \
834   unsigned int length;
835 #define EXTRACT_FMT_33_LDI16_CODE \
836   length = 4; \
837   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
838   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
839   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
840   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
841   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
842
843 #define EXTRACT_FMT_34_MACHI_VARS \
844   /* Instruction fields.  */ \
845   UINT f_op1; \
846   UINT f_r1; \
847   UINT f_op2; \
848   UINT f_r2; \
849   unsigned int length;
850 #define EXTRACT_FMT_34_MACHI_CODE \
851   length = 2; \
852   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
853   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
854   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
855   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
856
857 #define EXTRACT_FMT_35_MACHI_A_VARS \
858   /* Instruction fields.  */ \
859   UINT f_op1; \
860   UINT f_r1; \
861   UINT f_acc; \
862   UINT f_op23; \
863   UINT f_r2; \
864   unsigned int length;
865 #define EXTRACT_FMT_35_MACHI_A_CODE \
866   length = 2; \
867   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
868   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
869   f_acc = EXTRACT_UNSIGNED (insn, 16, 8, 1); \
870   f_op23 = EXTRACT_UNSIGNED (insn, 16, 9, 3); \
871   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
872
873 #define EXTRACT_FMT_36_MULHI_A_VARS \
874   /* Instruction fields.  */ \
875   UINT f_op1; \
876   UINT f_r1; \
877   UINT f_acc; \
878   UINT f_op23; \
879   UINT f_r2; \
880   unsigned int length;
881 #define EXTRACT_FMT_36_MULHI_A_CODE \
882   length = 2; \
883   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
884   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
885   f_acc = EXTRACT_UNSIGNED (insn, 16, 8, 1); \
886   f_op23 = EXTRACT_UNSIGNED (insn, 16, 9, 3); \
887   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
888
889 #define EXTRACT_FMT_37_MV_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_37_MV_CODE \
897   length = 2; \
898   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
899   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
900   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
901   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
902
903 #define EXTRACT_FMT_38_MVFACHI_VARS \
904   /* Instruction fields.  */ \
905   UINT f_op1; \
906   UINT f_r1; \
907   UINT f_op2; \
908   UINT f_r2; \
909   unsigned int length;
910 #define EXTRACT_FMT_38_MVFACHI_CODE \
911   length = 2; \
912   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
913   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
914   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
915   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
916
917 #define EXTRACT_FMT_39_MVFACHI_A_VARS \
918   /* Instruction fields.  */ \
919   UINT f_op1; \
920   UINT f_r1; \
921   UINT f_op2; \
922   UINT f_accs; \
923   UINT f_op3; \
924   unsigned int length;
925 #define EXTRACT_FMT_39_MVFACHI_A_CODE \
926   length = 2; \
927   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
928   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
929   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
930   f_accs = EXTRACT_UNSIGNED (insn, 16, 12, 2); \
931   f_op3 = EXTRACT_UNSIGNED (insn, 16, 14, 2); \
932
933 #define EXTRACT_FMT_40_MVFC_VARS \
934   /* Instruction fields.  */ \
935   UINT f_op1; \
936   UINT f_r1; \
937   UINT f_op2; \
938   UINT f_r2; \
939   unsigned int length;
940 #define EXTRACT_FMT_40_MVFC_CODE \
941   length = 2; \
942   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
943   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
944   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
945   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
946
947 #define EXTRACT_FMT_41_MVTACHI_VARS \
948   /* Instruction fields.  */ \
949   UINT f_op1; \
950   UINT f_r1; \
951   UINT f_op2; \
952   UINT f_r2; \
953   unsigned int length;
954 #define EXTRACT_FMT_41_MVTACHI_CODE \
955   length = 2; \
956   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
957   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
958   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
959   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
960
961 #define EXTRACT_FMT_42_MVTACHI_A_VARS \
962   /* Instruction fields.  */ \
963   UINT f_op1; \
964   UINT f_r1; \
965   UINT f_op2; \
966   UINT f_accs; \
967   UINT f_op3; \
968   unsigned int length;
969 #define EXTRACT_FMT_42_MVTACHI_A_CODE \
970   length = 2; \
971   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
972   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
973   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
974   f_accs = EXTRACT_UNSIGNED (insn, 16, 12, 2); \
975   f_op3 = EXTRACT_UNSIGNED (insn, 16, 14, 2); \
976
977 #define EXTRACT_FMT_43_MVTC_VARS \
978   /* Instruction fields.  */ \
979   UINT f_op1; \
980   UINT f_r1; \
981   UINT f_op2; \
982   UINT f_r2; \
983   unsigned int length;
984 #define EXTRACT_FMT_43_MVTC_CODE \
985   length = 2; \
986   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
987   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
988   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
989   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
990
991 #define EXTRACT_FMT_44_NOP_VARS \
992   /* Instruction fields.  */ \
993   UINT f_op1; \
994   UINT f_r1; \
995   UINT f_op2; \
996   UINT f_r2; \
997   unsigned int length;
998 #define EXTRACT_FMT_44_NOP_CODE \
999   length = 2; \
1000   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1001   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1002   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1003   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1004
1005 #define EXTRACT_FMT_45_RAC_VARS \
1006   /* Instruction fields.  */ \
1007   UINT f_op1; \
1008   UINT f_r1; \
1009   UINT f_op2; \
1010   UINT f_r2; \
1011   unsigned int length;
1012 #define EXTRACT_FMT_45_RAC_CODE \
1013   length = 2; \
1014   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1015   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1016   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1017   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1018
1019 #define EXTRACT_FMT_46_RAC_A_VARS \
1020   /* Instruction fields.  */ \
1021   UINT f_op1; \
1022   UINT f_r1; \
1023   UINT f_op2; \
1024   UINT f_accs; \
1025   UINT f_op3; \
1026   unsigned int length;
1027 #define EXTRACT_FMT_46_RAC_A_CODE \
1028   length = 2; \
1029   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1030   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1031   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1032   f_accs = EXTRACT_UNSIGNED (insn, 16, 12, 2); \
1033   f_op3 = EXTRACT_UNSIGNED (insn, 16, 14, 2); \
1034
1035 #define EXTRACT_FMT_47_SETH_VARS \
1036   /* Instruction fields.  */ \
1037   UINT f_op1; \
1038   UINT f_r1; \
1039   UINT f_op2; \
1040   UINT f_r2; \
1041   UINT f_hi16; \
1042   unsigned int length;
1043 #define EXTRACT_FMT_47_SETH_CODE \
1044   length = 4; \
1045   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
1046   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
1047   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
1048   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
1049   f_hi16 = EXTRACT_UNSIGNED (insn, 32, 16, 16); \
1050
1051 #define EXTRACT_FMT_48_SLLI_VARS \
1052   /* Instruction fields.  */ \
1053   UINT f_op1; \
1054   UINT f_r1; \
1055   UINT f_shift_op2; \
1056   UINT f_uimm5; \
1057   unsigned int length;
1058 #define EXTRACT_FMT_48_SLLI_CODE \
1059   length = 2; \
1060   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1061   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1062   f_shift_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 3); \
1063   f_uimm5 = EXTRACT_UNSIGNED (insn, 16, 11, 5); \
1064
1065 #define EXTRACT_FMT_49_ST_D_VARS \
1066   /* Instruction fields.  */ \
1067   UINT f_op1; \
1068   UINT f_r1; \
1069   UINT f_op2; \
1070   UINT f_r2; \
1071   int f_simm16; \
1072   unsigned int length;
1073 #define EXTRACT_FMT_49_ST_D_CODE \
1074   length = 4; \
1075   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
1076   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
1077   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
1078   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
1079   f_simm16 = EXTRACT_SIGNED (insn, 32, 16, 16); \
1080
1081 #define EXTRACT_FMT_50_TRAP_VARS \
1082   /* Instruction fields.  */ \
1083   UINT f_op1; \
1084   UINT f_r1; \
1085   UINT f_op2; \
1086   UINT f_uimm4; \
1087   unsigned int length;
1088 #define EXTRACT_FMT_50_TRAP_CODE \
1089   length = 2; \
1090   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1091   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1092   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1093   f_uimm4 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1094
1095 #define EXTRACT_FMT_51_SATB_VARS \
1096   /* Instruction fields.  */ \
1097   UINT f_op1; \
1098   UINT f_r1; \
1099   UINT f_op2; \
1100   UINT f_r2; \
1101   UINT f_uimm16; \
1102   unsigned int length;
1103 #define EXTRACT_FMT_51_SATB_CODE \
1104   length = 4; \
1105   f_op1 = EXTRACT_UNSIGNED (insn, 32, 0, 4); \
1106   f_r1 = EXTRACT_UNSIGNED (insn, 32, 4, 4); \
1107   f_op2 = EXTRACT_UNSIGNED (insn, 32, 8, 4); \
1108   f_r2 = EXTRACT_UNSIGNED (insn, 32, 12, 4); \
1109   f_uimm16 = EXTRACT_UNSIGNED (insn, 32, 16, 16); \
1110
1111 #define EXTRACT_FMT_52_PCMPBZ_VARS \
1112   /* Instruction fields.  */ \
1113   UINT f_op1; \
1114   UINT f_r1; \
1115   UINT f_op2; \
1116   UINT f_r2; \
1117   unsigned int length;
1118 #define EXTRACT_FMT_52_PCMPBZ_CODE \
1119   length = 2; \
1120   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1121   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1122   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1123   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1124
1125 #define EXTRACT_FMT_53_SADD_VARS \
1126   /* Instruction fields.  */ \
1127   UINT f_op1; \
1128   UINT f_r1; \
1129   UINT f_op2; \
1130   UINT f_r2; \
1131   unsigned int length;
1132 #define EXTRACT_FMT_53_SADD_CODE \
1133   length = 2; \
1134   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1135   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1136   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1137   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1138
1139 #define EXTRACT_FMT_54_MACWU1_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_54_MACWU1_CODE \
1147   length = 2; \
1148   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1149   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1150   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1151   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1152
1153 #define EXTRACT_FMT_55_SC_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_55_SC_CODE \
1161   length = 2; \
1162   f_op1 = EXTRACT_UNSIGNED (insn, 16, 0, 4); \
1163   f_r1 = EXTRACT_UNSIGNED (insn, 16, 4, 4); \
1164   f_op2 = EXTRACT_UNSIGNED (insn, 16, 8, 4); \
1165   f_r2 = EXTRACT_UNSIGNED (insn, 16, 12, 4); \
1166
1167 /* Fetched input values of an instruction.  */
1168
1169 struct parallel_exec {
1170   union {
1171     struct { /* e.g. add $dr,$sr */
1172       SI dr;
1173       SI sr;
1174     } fmt_0_add;
1175     struct { /* e.g. add3 $dr,$sr,#$slo16 */
1176       HI slo16;
1177       SI sr;
1178     } fmt_1_add3;
1179     struct { /* e.g. and3 $dr,$sr,#$uimm16 */
1180       SI sr;
1181       USI uimm16;
1182     } fmt_2_and3;
1183     struct { /* e.g. or3 $dr,$sr,#$ulo16 */
1184       SI sr;
1185       UHI ulo16;
1186     } fmt_3_or3;
1187     struct { /* e.g. addi $dr,#$simm8 */
1188       SI dr;
1189       SI simm8;
1190     } fmt_4_addi;
1191     struct { /* e.g. addv3 $dr,$sr,#$simm16 */
1192       SI simm16;
1193       SI sr;
1194     } fmt_5_addv3;
1195     struct { /* e.g. addx $dr,$sr */
1196       UBI condbit;
1197       SI dr;
1198       SI sr;
1199     } fmt_6_addx;
1200     struct { /* e.g. bc $disp8 */
1201       UBI condbit;
1202       IADDR disp8;
1203     } fmt_7_bc8;
1204     struct { /* e.g. bc $disp24 */
1205       UBI condbit;
1206       IADDR disp24;
1207     } fmt_8_bc24;
1208     struct { /* e.g. beq $src1,$src2,$disp16 */
1209       IADDR disp16;
1210       SI src1;
1211       SI src2;
1212     } fmt_9_beq;
1213     struct { /* e.g. beqz $src2,$disp16 */
1214       IADDR disp16;
1215       SI src2;
1216     } fmt_10_beqz;
1217     struct { /* e.g. bl $disp8 */
1218       IADDR disp8;
1219       USI pc;
1220     } fmt_11_bl8;
1221     struct { /* e.g. bl $disp24 */
1222       IADDR disp24;
1223       USI pc;
1224     } fmt_12_bl24;
1225     struct { /* e.g. bcl $disp8 */
1226       UBI condbit;
1227       IADDR disp8;
1228       USI pc;
1229     } fmt_13_bcl8;
1230     struct { /* e.g. bcl $disp24 */
1231       UBI condbit;
1232       IADDR disp24;
1233       USI pc;
1234     } fmt_14_bcl24;
1235     struct { /* e.g. bra $disp8 */
1236       IADDR disp8;
1237     } fmt_15_bra8;
1238     struct { /* e.g. bra $disp24 */
1239       IADDR disp24;
1240     } fmt_16_bra24;
1241     struct { /* e.g. cmp $src1,$src2 */
1242       SI src1;
1243       SI src2;
1244     } fmt_17_cmp;
1245     struct { /* e.g. cmpi $src2,#$simm16 */
1246       SI simm16;
1247       SI src2;
1248     } fmt_18_cmpi;
1249     struct { /* e.g. cmpui $src2,#$uimm16 */
1250       SI src2;
1251       USI uimm16;
1252     } fmt_19_cmpui;
1253     struct { /* e.g. cmpz $src2 */
1254       SI src2;
1255     } fmt_20_cmpz;
1256     struct { /* e.g. div $dr,$sr */
1257       SI dr;
1258       SI sr;
1259     } fmt_21_div;
1260     struct { /* e.g. jc $sr */
1261       UBI condbit;
1262       SI sr;
1263     } fmt_22_jc;
1264     struct { /* e.g. jl $sr */
1265       USI pc;
1266       SI sr;
1267     } fmt_23_jl;
1268     struct { /* e.g. jmp $sr */
1269       SI sr;
1270     } fmt_24_jmp;
1271     struct { /* e.g. ld $dr,@$sr */
1272       UQI h_memory;
1273       SI sr;
1274     } fmt_25_ld;
1275     struct { /* e.g. ld $dr,@($slo16,$sr) */
1276       UQI h_memory;
1277       HI slo16;
1278       SI sr;
1279     } fmt_26_ld_d;
1280     struct { /* e.g. ldb $dr,@$sr */
1281       UQI h_memory;
1282       SI sr;
1283     } fmt_27_ldb;
1284     struct { /* e.g. ldb $dr,@($slo16,$sr) */
1285       UQI h_memory;
1286       HI slo16;
1287       SI sr;
1288     } fmt_28_ldb_d;
1289     struct { /* e.g. ldh $dr,@$sr */
1290       UQI h_memory;
1291       SI sr;
1292     } fmt_29_ldh;
1293     struct { /* e.g. ldh $dr,@($slo16,$sr) */
1294       UQI h_memory;
1295       HI slo16;
1296       SI sr;
1297     } fmt_30_ldh_d;
1298     struct { /* e.g. ld24 $dr,#$uimm24 */
1299       ADDR uimm24;
1300     } fmt_31_ld24;
1301     struct { /* e.g. ldi $dr,#$simm8 */
1302       SI simm8;
1303     } fmt_32_ldi8;
1304     struct { /* e.g. ldi $dr,$slo16 */
1305       HI slo16;
1306     } fmt_33_ldi16;
1307     struct { /* e.g. machi $src1,$src2 */
1308       DI accum;
1309       SI src1;
1310       SI src2;
1311     } fmt_34_machi;
1312     struct { /* e.g. machi $src1,$src2,$acc */
1313       DI acc;
1314       SI src1;
1315       SI src2;
1316     } fmt_35_machi_a;
1317     struct { /* e.g. mulhi $src1,$src2,$acc */
1318       SI src1;
1319       SI src2;
1320     } fmt_36_mulhi_a;
1321     struct { /* e.g. mv $dr,$sr */
1322       SI sr;
1323     } fmt_37_mv;
1324     struct { /* e.g. mvfachi $dr */
1325       DI accum;
1326     } fmt_38_mvfachi;
1327     struct { /* e.g. mvfachi $dr,$accs */
1328       DI accs;
1329     } fmt_39_mvfachi_a;
1330     struct { /* e.g. mvfc $dr,$scr */
1331       SI scr;
1332     } fmt_40_mvfc;
1333     struct { /* e.g. mvtachi $src1 */
1334       DI accum;
1335       SI src1;
1336     } fmt_41_mvtachi;
1337     struct { /* e.g. mvtachi $src1,$accs */
1338       DI accs;
1339       SI src1;
1340     } fmt_42_mvtachi_a;
1341     struct { /* e.g. mvtc $sr,$dcr */
1342       SI sr;
1343     } fmt_43_mvtc;
1344     struct { /* e.g. nop */
1345       int empty;
1346     } fmt_44_nop;
1347     struct { /* e.g. rac */
1348       DI accum;
1349     } fmt_45_rac;
1350     struct { /* e.g. rac $accs */
1351       DI accs;
1352     } fmt_46_rac_a;
1353     struct { /* e.g. seth $dr,$hi16 */
1354       UHI hi16;
1355     } fmt_47_seth;
1356     struct { /* e.g. slli $dr,#$uimm5 */
1357       SI dr;
1358       USI uimm5;
1359     } fmt_48_slli;
1360     struct { /* e.g. st $src1,@($slo16,$src2) */
1361       HI slo16;
1362       SI src1;
1363       SI src2;
1364     } fmt_49_st_d;
1365     struct { /* e.g. trap #$uimm4 */
1366       USI uimm4;
1367     } fmt_50_trap;
1368     struct { /* e.g. satb $dr,$src2 */
1369       int empty;
1370     } fmt_51_satb;
1371     struct { /* e.g. pcmpbz $src2 */
1372       int empty;
1373     } fmt_52_pcmpbz;
1374     struct { /* e.g. sadd */
1375       DI h_accums;
1376       DI h_accums;
1377     } fmt_53_sadd;
1378     struct { /* e.g. macwu1 $src1,$src2 */
1379       DI h_accums;
1380       SI src1;
1381       SI src2;
1382     } fmt_54_macwu1;
1383     struct { /* e.g. sc */
1384       UBI condbit;
1385     } fmt_55_sc;
1386   } operands;
1387 };
1388
1389 #endif /* CPU_M32RX_H */