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