* sim-main.h: Delete inclusion of ansidecl.h.
[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 /* GET_H_CR macro user-written */
50 /* SET_H_CR macro user-written */
51 /* accumulator */
52 DI h_accum;
53 /* GET_H_ACCUM macro user-written */
54 /* SET_H_ACCUM macro user-written */
55 /* start-sanitize-m32rx */
56 /* accumulators */
57 DI h_accums[2];
58 /* end-sanitize-m32rx */
59 /* start-sanitize-m32rx */
60 /* GET_H_ACCUMS macro user-written */
61 /* SET_H_ACCUMS macro user-written */
62 /* end-sanitize-m32rx */
63 /* condition bit */
64 BI h_cond;
65 #define GET_H_COND() CPU (h_cond)
66 #define SET_H_COND(x) (CPU (h_cond) = (x))
67 /* psw part of psw */
68 UQI h_psw;
69 /* GET_H_PSW macro user-written */
70 /* SET_H_PSW macro user-written */
71 /* backup psw */
72 UQI h_bpsw;
73 #define GET_H_BPSW() CPU (h_bpsw)
74 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
75 /* backup bpsw */
76 UQI h_bbpsw;
77 #define GET_H_BBPSW() CPU (h_bbpsw)
78 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
79 /* lock */
80 BI h_lock;
81 #define GET_H_LOCK() CPU (h_lock)
82 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
83 } hardware;
84 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
85 } M32RXF_CPU_DATA;
86
87 /* Cover fns for register access. */
88 USI m32rxf_h_pc_get (SIM_CPU *);
89 void m32rxf_h_pc_set (SIM_CPU *, USI);
90 SI m32rxf_h_gr_get (SIM_CPU *, UINT);
91 void m32rxf_h_gr_set (SIM_CPU *, UINT, SI);
92 USI m32rxf_h_cr_get (SIM_CPU *, UINT);
93 void m32rxf_h_cr_set (SIM_CPU *, UINT, USI);
94 DI m32rxf_h_accum_get (SIM_CPU *);
95 void m32rxf_h_accum_set (SIM_CPU *, DI);
96 DI m32rxf_h_accums_get (SIM_CPU *, UINT);
97 void m32rxf_h_accums_set (SIM_CPU *, UINT, DI);
98 BI m32rxf_h_cond_get (SIM_CPU *);
99 void m32rxf_h_cond_set (SIM_CPU *, BI);
100 UQI m32rxf_h_psw_get (SIM_CPU *);
101 void m32rxf_h_psw_set (SIM_CPU *, UQI);
102 UQI m32rxf_h_bpsw_get (SIM_CPU *);
103 void m32rxf_h_bpsw_set (SIM_CPU *, UQI);
104 UQI m32rxf_h_bbpsw_get (SIM_CPU *);
105 void m32rxf_h_bbpsw_set (SIM_CPU *, UQI);
106 BI m32rxf_h_lock_get (SIM_CPU *);
107 void m32rxf_h_lock_set (SIM_CPU *, BI);
108
109 /* These must be hand-written. */
110 extern CPUREG_FETCH_FN m32rxf_fetch_register;
111 extern CPUREG_STORE_FN m32rxf_store_register;
112
113 typedef struct {
114 int empty;
115 } MODEL_M32RX_DATA;
116
117 union sem_fields {
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 };
510
511 /* The ARGBUF struct. */
512 struct argbuf {
513 /* These are the baseclass definitions. */
514 PCADDR addr;
515 const IDESC *idesc;
516 char trace_p;
517 char profile_p;
518 /* cpu specific data follows */
519 union sem semantic;
520 int written;
521 union sem_fields fields;
522 };
523
524 /* A cached insn.
525
526 ??? SCACHE used to contain more than just argbuf. We could delete the
527 type entirely and always just use ARGBUF, but for future concerns and as
528 a level of abstraction it is left in. */
529
530 struct scache {
531 struct argbuf argbuf;
532 };
533
534 /* Macros to simplify extraction, reading and semantic code.
535 These define and assign the local vars that contain the insn's fields. */
536
537 #define EXTRACT_FMT_EMPTY_VARS \
538 /* Instruction fields. */ \
539 unsigned int length;
540 #define EXTRACT_FMT_EMPTY_CODE \
541 length = 0; \
542
543 #define EXTRACT_FMT_ADD_VARS \
544 /* Instruction fields. */ \
545 UINT f_op1; \
546 UINT f_r1; \
547 UINT f_op2; \
548 UINT f_r2; \
549 unsigned int length;
550 #define EXTRACT_FMT_ADD_CODE \
551 length = 2; \
552 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
553 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
554 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
555 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
556
557 #define EXTRACT_FMT_ADD3_VARS \
558 /* Instruction fields. */ \
559 UINT f_op1; \
560 UINT f_r1; \
561 UINT f_op2; \
562 UINT f_r2; \
563 INT f_simm16; \
564 unsigned int length;
565 #define EXTRACT_FMT_ADD3_CODE \
566 length = 4; \
567 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
568 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
569 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
570 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
571 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
572
573 #define EXTRACT_FMT_AND3_VARS \
574 /* Instruction fields. */ \
575 UINT f_op1; \
576 UINT f_r1; \
577 UINT f_op2; \
578 UINT f_r2; \
579 UINT f_uimm16; \
580 unsigned int length;
581 #define EXTRACT_FMT_AND3_CODE \
582 length = 4; \
583 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
584 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
585 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
586 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
587 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
588
589 #define EXTRACT_FMT_OR3_VARS \
590 /* Instruction fields. */ \
591 UINT f_op1; \
592 UINT f_r1; \
593 UINT f_op2; \
594 UINT f_r2; \
595 UINT f_uimm16; \
596 unsigned int length;
597 #define EXTRACT_FMT_OR3_CODE \
598 length = 4; \
599 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
600 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
601 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
602 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
603 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
604
605 #define EXTRACT_FMT_ADDI_VARS \
606 /* Instruction fields. */ \
607 UINT f_op1; \
608 UINT f_r1; \
609 INT f_simm8; \
610 unsigned int length;
611 #define EXTRACT_FMT_ADDI_CODE \
612 length = 2; \
613 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
614 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
615 f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
616
617 #define EXTRACT_FMT_ADDV_VARS \
618 /* Instruction fields. */ \
619 UINT f_op1; \
620 UINT f_r1; \
621 UINT f_op2; \
622 UINT f_r2; \
623 unsigned int length;
624 #define EXTRACT_FMT_ADDV_CODE \
625 length = 2; \
626 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
627 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
628 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
629 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
630
631 #define EXTRACT_FMT_ADDV3_VARS \
632 /* Instruction fields. */ \
633 UINT f_op1; \
634 UINT f_r1; \
635 UINT f_op2; \
636 UINT f_r2; \
637 INT f_simm16; \
638 unsigned int length;
639 #define EXTRACT_FMT_ADDV3_CODE \
640 length = 4; \
641 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
642 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
643 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
644 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
645 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
646
647 #define EXTRACT_FMT_ADDX_VARS \
648 /* Instruction fields. */ \
649 UINT f_op1; \
650 UINT f_r1; \
651 UINT f_op2; \
652 UINT f_r2; \
653 unsigned int length;
654 #define EXTRACT_FMT_ADDX_CODE \
655 length = 2; \
656 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
657 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
658 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
659 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
660
661 #define EXTRACT_FMT_BC8_VARS \
662 /* Instruction fields. */ \
663 UINT f_op1; \
664 UINT f_r1; \
665 SI f_disp8; \
666 unsigned int length;
667 #define EXTRACT_FMT_BC8_CODE \
668 length = 2; \
669 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
670 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
671 f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
672
673 #define EXTRACT_FMT_BC24_VARS \
674 /* Instruction fields. */ \
675 UINT f_op1; \
676 UINT f_r1; \
677 SI f_disp24; \
678 unsigned int length;
679 #define EXTRACT_FMT_BC24_CODE \
680 length = 4; \
681 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
682 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
683 f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
684
685 #define EXTRACT_FMT_BEQ_VARS \
686 /* Instruction fields. */ \
687 UINT f_op1; \
688 UINT f_r1; \
689 UINT f_op2; \
690 UINT f_r2; \
691 SI f_disp16; \
692 unsigned int length;
693 #define EXTRACT_FMT_BEQ_CODE \
694 length = 4; \
695 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
696 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
697 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
698 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
699 f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
700
701 #define EXTRACT_FMT_BEQZ_VARS \
702 /* Instruction fields. */ \
703 UINT f_op1; \
704 UINT f_r1; \
705 UINT f_op2; \
706 UINT f_r2; \
707 SI f_disp16; \
708 unsigned int length;
709 #define EXTRACT_FMT_BEQZ_CODE \
710 length = 4; \
711 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
712 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
713 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
714 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
715 f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
716
717 #define EXTRACT_FMT_BL8_VARS \
718 /* Instruction fields. */ \
719 UINT f_op1; \
720 UINT f_r1; \
721 SI f_disp8; \
722 unsigned int length;
723 #define EXTRACT_FMT_BL8_CODE \
724 length = 2; \
725 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
726 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
727 f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
728
729 #define EXTRACT_FMT_BL24_VARS \
730 /* Instruction fields. */ \
731 UINT f_op1; \
732 UINT f_r1; \
733 SI f_disp24; \
734 unsigned int length;
735 #define EXTRACT_FMT_BL24_CODE \
736 length = 4; \
737 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
738 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
739 f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
740
741 #define EXTRACT_FMT_BCL8_VARS \
742 /* Instruction fields. */ \
743 UINT f_op1; \
744 UINT f_r1; \
745 SI f_disp8; \
746 unsigned int length;
747 #define EXTRACT_FMT_BCL8_CODE \
748 length = 2; \
749 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
750 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
751 f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
752
753 #define EXTRACT_FMT_BCL24_VARS \
754 /* Instruction fields. */ \
755 UINT f_op1; \
756 UINT f_r1; \
757 SI f_disp24; \
758 unsigned int length;
759 #define EXTRACT_FMT_BCL24_CODE \
760 length = 4; \
761 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
762 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
763 f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
764
765 #define EXTRACT_FMT_BRA8_VARS \
766 /* Instruction fields. */ \
767 UINT f_op1; \
768 UINT f_r1; \
769 SI f_disp8; \
770 unsigned int length;
771 #define EXTRACT_FMT_BRA8_CODE \
772 length = 2; \
773 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
774 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
775 f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
776
777 #define EXTRACT_FMT_BRA24_VARS \
778 /* Instruction fields. */ \
779 UINT f_op1; \
780 UINT f_r1; \
781 SI f_disp24; \
782 unsigned int length;
783 #define EXTRACT_FMT_BRA24_CODE \
784 length = 4; \
785 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
786 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
787 f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
788
789 #define EXTRACT_FMT_CMP_VARS \
790 /* Instruction fields. */ \
791 UINT f_op1; \
792 UINT f_r1; \
793 UINT f_op2; \
794 UINT f_r2; \
795 unsigned int length;
796 #define EXTRACT_FMT_CMP_CODE \
797 length = 2; \
798 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
799 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
800 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
801 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
802
803 #define EXTRACT_FMT_CMPI_VARS \
804 /* Instruction fields. */ \
805 UINT f_op1; \
806 UINT f_r1; \
807 UINT f_op2; \
808 UINT f_r2; \
809 INT f_simm16; \
810 unsigned int length;
811 #define EXTRACT_FMT_CMPI_CODE \
812 length = 4; \
813 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
814 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
815 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
816 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
817 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
818
819 #define EXTRACT_FMT_CMPZ_VARS \
820 /* Instruction fields. */ \
821 UINT f_op1; \
822 UINT f_r1; \
823 UINT f_op2; \
824 UINT f_r2; \
825 unsigned int length;
826 #define EXTRACT_FMT_CMPZ_CODE \
827 length = 2; \
828 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
829 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
830 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
831 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
832
833 #define EXTRACT_FMT_DIV_VARS \
834 /* Instruction fields. */ \
835 UINT f_op1; \
836 UINT f_r1; \
837 UINT f_op2; \
838 UINT f_r2; \
839 INT f_simm16; \
840 unsigned int length;
841 #define EXTRACT_FMT_DIV_CODE \
842 length = 4; \
843 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
844 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
845 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
846 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
847 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
848
849 #define EXTRACT_FMT_JC_VARS \
850 /* Instruction fields. */ \
851 UINT f_op1; \
852 UINT f_r1; \
853 UINT f_op2; \
854 UINT f_r2; \
855 unsigned int length;
856 #define EXTRACT_FMT_JC_CODE \
857 length = 2; \
858 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
859 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
860 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
861 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
862
863 #define EXTRACT_FMT_JL_VARS \
864 /* Instruction fields. */ \
865 UINT f_op1; \
866 UINT f_r1; \
867 UINT f_op2; \
868 UINT f_r2; \
869 unsigned int length;
870 #define EXTRACT_FMT_JL_CODE \
871 length = 2; \
872 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
873 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
874 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
875 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
876
877 #define EXTRACT_FMT_JMP_VARS \
878 /* Instruction fields. */ \
879 UINT f_op1; \
880 UINT f_r1; \
881 UINT f_op2; \
882 UINT f_r2; \
883 unsigned int length;
884 #define EXTRACT_FMT_JMP_CODE \
885 length = 2; \
886 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
887 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
888 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
889 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
890
891 #define EXTRACT_FMT_LD_VARS \
892 /* Instruction fields. */ \
893 UINT f_op1; \
894 UINT f_r1; \
895 UINT f_op2; \
896 UINT f_r2; \
897 unsigned int length;
898 #define EXTRACT_FMT_LD_CODE \
899 length = 2; \
900 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
901 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
902 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
903 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
904
905 #define EXTRACT_FMT_LD_D_VARS \
906 /* Instruction fields. */ \
907 UINT f_op1; \
908 UINT f_r1; \
909 UINT f_op2; \
910 UINT f_r2; \
911 INT f_simm16; \
912 unsigned int length;
913 #define EXTRACT_FMT_LD_D_CODE \
914 length = 4; \
915 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
916 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
917 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
918 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
919 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
920
921 #define EXTRACT_FMT_LDB_VARS \
922 /* Instruction fields. */ \
923 UINT f_op1; \
924 UINT f_r1; \
925 UINT f_op2; \
926 UINT f_r2; \
927 unsigned int length;
928 #define EXTRACT_FMT_LDB_CODE \
929 length = 2; \
930 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
931 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
932 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
933 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
934
935 #define EXTRACT_FMT_LDB_D_VARS \
936 /* Instruction fields. */ \
937 UINT f_op1; \
938 UINT f_r1; \
939 UINT f_op2; \
940 UINT f_r2; \
941 INT f_simm16; \
942 unsigned int length;
943 #define EXTRACT_FMT_LDB_D_CODE \
944 length = 4; \
945 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
946 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
947 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
948 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
949 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
950
951 #define EXTRACT_FMT_LDH_VARS \
952 /* Instruction fields. */ \
953 UINT f_op1; \
954 UINT f_r1; \
955 UINT f_op2; \
956 UINT f_r2; \
957 unsigned int length;
958 #define EXTRACT_FMT_LDH_CODE \
959 length = 2; \
960 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
961 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
962 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
963 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
964
965 #define EXTRACT_FMT_LDH_D_VARS \
966 /* Instruction fields. */ \
967 UINT f_op1; \
968 UINT f_r1; \
969 UINT f_op2; \
970 UINT f_r2; \
971 INT f_simm16; \
972 unsigned int length;
973 #define EXTRACT_FMT_LDH_D_CODE \
974 length = 4; \
975 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
976 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
977 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
978 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
979 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
980
981 #define EXTRACT_FMT_LD_PLUS_VARS \
982 /* Instruction fields. */ \
983 UINT f_op1; \
984 UINT f_r1; \
985 UINT f_op2; \
986 UINT f_r2; \
987 unsigned int length;
988 #define EXTRACT_FMT_LD_PLUS_CODE \
989 length = 2; \
990 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
991 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
992 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
993 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
994
995 #define EXTRACT_FMT_LD24_VARS \
996 /* Instruction fields. */ \
997 UINT f_op1; \
998 UINT f_r1; \
999 UINT f_uimm24; \
1000 unsigned int length;
1001 #define EXTRACT_FMT_LD24_CODE \
1002 length = 4; \
1003 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1004 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1005 f_uimm24 = EXTRACT_UINT (insn, 32, 8, 24); \
1006
1007 #define EXTRACT_FMT_LDI8_VARS \
1008 /* Instruction fields. */ \
1009 UINT f_op1; \
1010 UINT f_r1; \
1011 INT f_simm8; \
1012 unsigned int length;
1013 #define EXTRACT_FMT_LDI8_CODE \
1014 length = 2; \
1015 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1016 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1017 f_simm8 = EXTRACT_INT (insn, 16, 8, 8); \
1018
1019 #define EXTRACT_FMT_LDI16_VARS \
1020 /* Instruction fields. */ \
1021 UINT f_op1; \
1022 UINT f_r1; \
1023 UINT f_op2; \
1024 UINT f_r2; \
1025 INT f_simm16; \
1026 unsigned int length;
1027 #define EXTRACT_FMT_LDI16_CODE \
1028 length = 4; \
1029 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1030 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1031 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1032 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1033 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1034
1035 #define EXTRACT_FMT_LOCK_VARS \
1036 /* Instruction fields. */ \
1037 UINT f_op1; \
1038 UINT f_r1; \
1039 UINT f_op2; \
1040 UINT f_r2; \
1041 unsigned int length;
1042 #define EXTRACT_FMT_LOCK_CODE \
1043 length = 2; \
1044 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1045 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1046 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1047 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1048
1049 #define EXTRACT_FMT_MACHI_A_VARS \
1050 /* Instruction fields. */ \
1051 UINT f_op1; \
1052 UINT f_r1; \
1053 UINT f_acc; \
1054 UINT f_op23; \
1055 UINT f_r2; \
1056 unsigned int length;
1057 #define EXTRACT_FMT_MACHI_A_CODE \
1058 length = 2; \
1059 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1060 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1061 f_acc = EXTRACT_UINT (insn, 16, 8, 1); \
1062 f_op23 = EXTRACT_UINT (insn, 16, 9, 3); \
1063 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1064
1065 #define EXTRACT_FMT_MULHI_A_VARS \
1066 /* Instruction fields. */ \
1067 UINT f_op1; \
1068 UINT f_r1; \
1069 UINT f_acc; \
1070 UINT f_op23; \
1071 UINT f_r2; \
1072 unsigned int length;
1073 #define EXTRACT_FMT_MULHI_A_CODE \
1074 length = 2; \
1075 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1076 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1077 f_acc = EXTRACT_UINT (insn, 16, 8, 1); \
1078 f_op23 = EXTRACT_UINT (insn, 16, 9, 3); \
1079 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1080
1081 #define EXTRACT_FMT_MV_VARS \
1082 /* Instruction fields. */ \
1083 UINT f_op1; \
1084 UINT f_r1; \
1085 UINT f_op2; \
1086 UINT f_r2; \
1087 unsigned int length;
1088 #define EXTRACT_FMT_MV_CODE \
1089 length = 2; \
1090 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1091 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1092 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1093 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1094
1095 #define EXTRACT_FMT_MVFACHI_A_VARS \
1096 /* Instruction fields. */ \
1097 UINT f_op1; \
1098 UINT f_r1; \
1099 UINT f_op2; \
1100 UINT f_accs; \
1101 UINT f_op3; \
1102 unsigned int length;
1103 #define EXTRACT_FMT_MVFACHI_A_CODE \
1104 length = 2; \
1105 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1106 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1107 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1108 f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1109 f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
1110
1111 #define EXTRACT_FMT_MVFC_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_MVFC_CODE \
1119 length = 2; \
1120 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1121 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1122 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1123 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1124
1125 #define EXTRACT_FMT_MVTACHI_A_VARS \
1126 /* Instruction fields. */ \
1127 UINT f_op1; \
1128 UINT f_r1; \
1129 UINT f_op2; \
1130 UINT f_accs; \
1131 UINT f_op3; \
1132 unsigned int length;
1133 #define EXTRACT_FMT_MVTACHI_A_CODE \
1134 length = 2; \
1135 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1136 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1137 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1138 f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1139 f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
1140
1141 #define EXTRACT_FMT_MVTC_VARS \
1142 /* Instruction fields. */ \
1143 UINT f_op1; \
1144 UINT f_r1; \
1145 UINT f_op2; \
1146 UINT f_r2; \
1147 unsigned int length;
1148 #define EXTRACT_FMT_MVTC_CODE \
1149 length = 2; \
1150 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1151 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1152 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1153 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1154
1155 #define EXTRACT_FMT_NOP_VARS \
1156 /* Instruction fields. */ \
1157 UINT f_op1; \
1158 UINT f_r1; \
1159 UINT f_op2; \
1160 UINT f_r2; \
1161 unsigned int length;
1162 #define EXTRACT_FMT_NOP_CODE \
1163 length = 2; \
1164 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1165 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1166 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1167 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1168
1169 #define EXTRACT_FMT_RAC_DSI_VARS \
1170 /* Instruction fields. */ \
1171 UINT f_op1; \
1172 UINT f_accd; \
1173 UINT f_bits67; \
1174 UINT f_op2; \
1175 UINT f_accs; \
1176 UINT f_bit14; \
1177 SI f_imm1; \
1178 unsigned int length;
1179 #define EXTRACT_FMT_RAC_DSI_CODE \
1180 length = 2; \
1181 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1182 f_accd = EXTRACT_UINT (insn, 16, 4, 2); \
1183 f_bits67 = EXTRACT_UINT (insn, 16, 6, 2); \
1184 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1185 f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
1186 f_bit14 = EXTRACT_UINT (insn, 16, 14, 1); \
1187 f_imm1 = ((EXTRACT_UINT (insn, 16, 15, 1)) + (1)); \
1188
1189 #define EXTRACT_FMT_RTE_VARS \
1190 /* Instruction fields. */ \
1191 UINT f_op1; \
1192 UINT f_r1; \
1193 UINT f_op2; \
1194 UINT f_r2; \
1195 unsigned int length;
1196 #define EXTRACT_FMT_RTE_CODE \
1197 length = 2; \
1198 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1199 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1200 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1201 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1202
1203 #define EXTRACT_FMT_SETH_VARS \
1204 /* Instruction fields. */ \
1205 UINT f_op1; \
1206 UINT f_r1; \
1207 UINT f_op2; \
1208 UINT f_r2; \
1209 UINT f_hi16; \
1210 unsigned int length;
1211 #define EXTRACT_FMT_SETH_CODE \
1212 length = 4; \
1213 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1214 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1215 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1216 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1217 f_hi16 = EXTRACT_UINT (insn, 32, 16, 16); \
1218
1219 #define EXTRACT_FMT_SLL3_VARS \
1220 /* Instruction fields. */ \
1221 UINT f_op1; \
1222 UINT f_r1; \
1223 UINT f_op2; \
1224 UINT f_r2; \
1225 INT f_simm16; \
1226 unsigned int length;
1227 #define EXTRACT_FMT_SLL3_CODE \
1228 length = 4; \
1229 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1230 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1231 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1232 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1233 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1234
1235 #define EXTRACT_FMT_SLLI_VARS \
1236 /* Instruction fields. */ \
1237 UINT f_op1; \
1238 UINT f_r1; \
1239 UINT f_shift_op2; \
1240 UINT f_uimm5; \
1241 unsigned int length;
1242 #define EXTRACT_FMT_SLLI_CODE \
1243 length = 2; \
1244 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1245 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1246 f_shift_op2 = EXTRACT_UINT (insn, 16, 8, 3); \
1247 f_uimm5 = EXTRACT_UINT (insn, 16, 11, 5); \
1248
1249 #define EXTRACT_FMT_ST_VARS \
1250 /* Instruction fields. */ \
1251 UINT f_op1; \
1252 UINT f_r1; \
1253 UINT f_op2; \
1254 UINT f_r2; \
1255 unsigned int length;
1256 #define EXTRACT_FMT_ST_CODE \
1257 length = 2; \
1258 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1259 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1260 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1261 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1262
1263 #define EXTRACT_FMT_ST_D_VARS \
1264 /* Instruction fields. */ \
1265 UINT f_op1; \
1266 UINT f_r1; \
1267 UINT f_op2; \
1268 UINT f_r2; \
1269 INT f_simm16; \
1270 unsigned int length;
1271 #define EXTRACT_FMT_ST_D_CODE \
1272 length = 4; \
1273 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1274 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1275 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1276 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1277 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1278
1279 #define EXTRACT_FMT_STB_VARS \
1280 /* Instruction fields. */ \
1281 UINT f_op1; \
1282 UINT f_r1; \
1283 UINT f_op2; \
1284 UINT f_r2; \
1285 unsigned int length;
1286 #define EXTRACT_FMT_STB_CODE \
1287 length = 2; \
1288 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1289 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1290 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1291 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1292
1293 #define EXTRACT_FMT_STB_D_VARS \
1294 /* Instruction fields. */ \
1295 UINT f_op1; \
1296 UINT f_r1; \
1297 UINT f_op2; \
1298 UINT f_r2; \
1299 INT f_simm16; \
1300 unsigned int length;
1301 #define EXTRACT_FMT_STB_D_CODE \
1302 length = 4; \
1303 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1304 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1305 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1306 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1307 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1308
1309 #define EXTRACT_FMT_STH_VARS \
1310 /* Instruction fields. */ \
1311 UINT f_op1; \
1312 UINT f_r1; \
1313 UINT f_op2; \
1314 UINT f_r2; \
1315 unsigned int length;
1316 #define EXTRACT_FMT_STH_CODE \
1317 length = 2; \
1318 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1319 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1320 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1321 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1322
1323 #define EXTRACT_FMT_STH_D_VARS \
1324 /* Instruction fields. */ \
1325 UINT f_op1; \
1326 UINT f_r1; \
1327 UINT f_op2; \
1328 UINT f_r2; \
1329 INT f_simm16; \
1330 unsigned int length;
1331 #define EXTRACT_FMT_STH_D_CODE \
1332 length = 4; \
1333 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1334 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1335 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1336 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1337 f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
1338
1339 #define EXTRACT_FMT_ST_PLUS_VARS \
1340 /* Instruction fields. */ \
1341 UINT f_op1; \
1342 UINT f_r1; \
1343 UINT f_op2; \
1344 UINT f_r2; \
1345 unsigned int length;
1346 #define EXTRACT_FMT_ST_PLUS_CODE \
1347 length = 2; \
1348 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1349 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1350 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1351 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1352
1353 #define EXTRACT_FMT_TRAP_VARS \
1354 /* Instruction fields. */ \
1355 UINT f_op1; \
1356 UINT f_r1; \
1357 UINT f_op2; \
1358 UINT f_uimm4; \
1359 unsigned int length;
1360 #define EXTRACT_FMT_TRAP_CODE \
1361 length = 2; \
1362 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1363 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1364 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1365 f_uimm4 = EXTRACT_UINT (insn, 16, 12, 4); \
1366
1367 #define EXTRACT_FMT_UNLOCK_VARS \
1368 /* Instruction fields. */ \
1369 UINT f_op1; \
1370 UINT f_r1; \
1371 UINT f_op2; \
1372 UINT f_r2; \
1373 unsigned int length;
1374 #define EXTRACT_FMT_UNLOCK_CODE \
1375 length = 2; \
1376 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1377 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1378 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1379 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1380
1381 #define EXTRACT_FMT_SATB_VARS \
1382 /* Instruction fields. */ \
1383 UINT f_op1; \
1384 UINT f_r1; \
1385 UINT f_op2; \
1386 UINT f_r2; \
1387 UINT f_uimm16; \
1388 unsigned int length;
1389 #define EXTRACT_FMT_SATB_CODE \
1390 length = 4; \
1391 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1392 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1393 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1394 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1395 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
1396
1397 #define EXTRACT_FMT_SAT_VARS \
1398 /* Instruction fields. */ \
1399 UINT f_op1; \
1400 UINT f_r1; \
1401 UINT f_op2; \
1402 UINT f_r2; \
1403 UINT f_uimm16; \
1404 unsigned int length;
1405 #define EXTRACT_FMT_SAT_CODE \
1406 length = 4; \
1407 f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
1408 f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
1409 f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
1410 f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
1411 f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
1412
1413 #define EXTRACT_FMT_SADD_VARS \
1414 /* Instruction fields. */ \
1415 UINT f_op1; \
1416 UINT f_r1; \
1417 UINT f_op2; \
1418 UINT f_r2; \
1419 unsigned int length;
1420 #define EXTRACT_FMT_SADD_CODE \
1421 length = 2; \
1422 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1423 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1424 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1425 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1426
1427 #define EXTRACT_FMT_MACWU1_VARS \
1428 /* Instruction fields. */ \
1429 UINT f_op1; \
1430 UINT f_r1; \
1431 UINT f_op2; \
1432 UINT f_r2; \
1433 unsigned int length;
1434 #define EXTRACT_FMT_MACWU1_CODE \
1435 length = 2; \
1436 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1437 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1438 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1439 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1440
1441 #define EXTRACT_FMT_MSBLO_VARS \
1442 /* Instruction fields. */ \
1443 UINT f_op1; \
1444 UINT f_r1; \
1445 UINT f_op2; \
1446 UINT f_r2; \
1447 unsigned int length;
1448 #define EXTRACT_FMT_MSBLO_CODE \
1449 length = 2; \
1450 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1451 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1452 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1453 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1454
1455 #define EXTRACT_FMT_MULWU1_VARS \
1456 /* Instruction fields. */ \
1457 UINT f_op1; \
1458 UINT f_r1; \
1459 UINT f_op2; \
1460 UINT f_r2; \
1461 unsigned int length;
1462 #define EXTRACT_FMT_MULWU1_CODE \
1463 length = 2; \
1464 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1465 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1466 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1467 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1468
1469 #define EXTRACT_FMT_SC_VARS \
1470 /* Instruction fields. */ \
1471 UINT f_op1; \
1472 UINT f_r1; \
1473 UINT f_op2; \
1474 UINT f_r2; \
1475 unsigned int length;
1476 #define EXTRACT_FMT_SC_CODE \
1477 length = 2; \
1478 f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
1479 f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
1480 f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
1481 f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
1482
1483 /* Queued output values of an instruction. */
1484
1485 struct parexec {
1486 union {
1487 struct { /* empty format for unspecified field list */
1488 int empty;
1489 } fmt_empty;
1490 struct { /* e.g. add $dr,$sr */
1491 SI dr;
1492 } fmt_add;
1493 struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
1494 SI dr;
1495 } fmt_add3;
1496 struct { /* e.g. and3 $dr,$sr,$uimm16 */
1497 SI dr;
1498 } fmt_and3;
1499 struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
1500 SI dr;
1501 } fmt_or3;
1502 struct { /* e.g. addi $dr,$simm8 */
1503 SI dr;
1504 } fmt_addi;
1505 struct { /* e.g. addv $dr,$sr */
1506 SI dr;
1507 BI condbit;
1508 } fmt_addv;
1509 struct { /* e.g. addv3 $dr,$sr,$simm16 */
1510 SI dr;
1511 BI condbit;
1512 } fmt_addv3;
1513 struct { /* e.g. addx $dr,$sr */
1514 SI dr;
1515 BI condbit;
1516 } fmt_addx;
1517 struct { /* e.g. bc.s $disp8 */
1518 USI pc;
1519 } fmt_bc8;
1520 struct { /* e.g. bc.l $disp24 */
1521 USI pc;
1522 } fmt_bc24;
1523 struct { /* e.g. beq $src1,$src2,$disp16 */
1524 USI pc;
1525 } fmt_beq;
1526 struct { /* e.g. beqz $src2,$disp16 */
1527 USI pc;
1528 } fmt_beqz;
1529 struct { /* e.g. bl.s $disp8 */
1530 SI h_gr_14;
1531 USI pc;
1532 } fmt_bl8;
1533 struct { /* e.g. bl.l $disp24 */
1534 SI h_gr_14;
1535 USI pc;
1536 } fmt_bl24;
1537 struct { /* e.g. bcl.s $disp8 */
1538 SI h_gr_14;
1539 USI pc;
1540 } fmt_bcl8;
1541 struct { /* e.g. bcl.l $disp24 */
1542 SI h_gr_14;
1543 USI pc;
1544 } fmt_bcl24;
1545 struct { /* e.g. bra.s $disp8 */
1546 USI pc;
1547 } fmt_bra8;
1548 struct { /* e.g. bra.l $disp24 */
1549 USI pc;
1550 } fmt_bra24;
1551 struct { /* e.g. cmp $src1,$src2 */
1552 BI condbit;
1553 } fmt_cmp;
1554 struct { /* e.g. cmpi $src2,$simm16 */
1555 BI condbit;
1556 } fmt_cmpi;
1557 struct { /* e.g. cmpz $src2 */
1558 BI condbit;
1559 } fmt_cmpz;
1560 struct { /* e.g. div $dr,$sr */
1561 SI dr;
1562 } fmt_div;
1563 struct { /* e.g. jc $sr */
1564 USI pc;
1565 } fmt_jc;
1566 struct { /* e.g. jl $sr */
1567 SI h_gr_14;
1568 USI pc;
1569 } fmt_jl;
1570 struct { /* e.g. jmp $sr */
1571 USI pc;
1572 } fmt_jmp;
1573 struct { /* e.g. ld $dr,@$sr */
1574 SI dr;
1575 } fmt_ld;
1576 struct { /* e.g. ld $dr,@($slo16,$sr) */
1577 SI dr;
1578 } fmt_ld_d;
1579 struct { /* e.g. ldb $dr,@$sr */
1580 SI dr;
1581 } fmt_ldb;
1582 struct { /* e.g. ldb $dr,@($slo16,$sr) */
1583 SI dr;
1584 } fmt_ldb_d;
1585 struct { /* e.g. ldh $dr,@$sr */
1586 SI dr;
1587 } fmt_ldh;
1588 struct { /* e.g. ldh $dr,@($slo16,$sr) */
1589 SI dr;
1590 } fmt_ldh_d;
1591 struct { /* e.g. ld $dr,@$sr+ */
1592 SI dr;
1593 SI sr;
1594 } fmt_ld_plus;
1595 struct { /* e.g. ld24 $dr,$uimm24 */
1596 SI dr;
1597 } fmt_ld24;
1598 struct { /* e.g. ldi8 $dr,$simm8 */
1599 SI dr;
1600 } fmt_ldi8;
1601 struct { /* e.g. ldi16 $dr,$hash$slo16 */
1602 SI dr;
1603 } fmt_ldi16;
1604 struct { /* e.g. lock $dr,@$sr */
1605 BI h_lock_0;
1606 SI dr;
1607 } fmt_lock;
1608 struct { /* e.g. machi $src1,$src2,$acc */
1609 DI acc;
1610 } fmt_machi_a;
1611 struct { /* e.g. mulhi $src1,$src2,$acc */
1612 DI acc;
1613 } fmt_mulhi_a;
1614 struct { /* e.g. mv $dr,$sr */
1615 SI dr;
1616 } fmt_mv;
1617 struct { /* e.g. mvfachi $dr,$accs */
1618 SI dr;
1619 } fmt_mvfachi_a;
1620 struct { /* e.g. mvfc $dr,$scr */
1621 SI dr;
1622 } fmt_mvfc;
1623 struct { /* e.g. mvtachi $src1,$accs */
1624 DI accs;
1625 } fmt_mvtachi_a;
1626 struct { /* e.g. mvtc $sr,$dcr */
1627 USI dcr;
1628 } fmt_mvtc;
1629 struct { /* e.g. nop */
1630 int empty;
1631 } fmt_nop;
1632 struct { /* e.g. rac $accd,$accs,$imm1 */
1633 DI accd;
1634 } fmt_rac_dsi;
1635 struct { /* e.g. rte */
1636 USI pc;
1637 USI h_cr_6;
1638 UQI h_psw_0;
1639 UQI h_bpsw_0;
1640 } fmt_rte;
1641 struct { /* e.g. seth $dr,$hash$hi16 */
1642 SI dr;
1643 } fmt_seth;
1644 struct { /* e.g. sll3 $dr,$sr,$simm16 */
1645 SI dr;
1646 } fmt_sll3;
1647 struct { /* e.g. slli $dr,$uimm5 */
1648 SI dr;
1649 } fmt_slli;
1650 struct { /* e.g. st $src1,@$src2 */
1651 SI h_memory_src2;
1652 USI h_memory_src2_idx;
1653 } fmt_st;
1654 struct { /* e.g. st $src1,@($slo16,$src2) */
1655 SI h_memory_add__VM_src2_slo16;
1656 USI h_memory_add__VM_src2_slo16_idx;
1657 } fmt_st_d;
1658 struct { /* e.g. stb $src1,@$src2 */
1659 QI h_memory_src2;
1660 USI h_memory_src2_idx;
1661 } fmt_stb;
1662 struct { /* e.g. stb $src1,@($slo16,$src2) */
1663 QI h_memory_add__VM_src2_slo16;
1664 USI h_memory_add__VM_src2_slo16_idx;
1665 } fmt_stb_d;
1666 struct { /* e.g. sth $src1,@$src2 */
1667 HI h_memory_src2;
1668 USI h_memory_src2_idx;
1669 } fmt_sth;
1670 struct { /* e.g. sth $src1,@($slo16,$src2) */
1671 HI h_memory_add__VM_src2_slo16;
1672 USI h_memory_add__VM_src2_slo16_idx;
1673 } fmt_sth_d;
1674 struct { /* e.g. st $src1,@+$src2 */
1675 SI h_memory_new_src2;
1676 USI h_memory_new_src2_idx;
1677 SI src2;
1678 } fmt_st_plus;
1679 struct { /* e.g. trap $uimm4 */
1680 USI h_cr_14;
1681 USI h_cr_6;
1682 UQI h_bbpsw_0;
1683 UQI h_bpsw_0;
1684 UQI h_psw_0;
1685 SI pc;
1686 } fmt_trap;
1687 struct { /* e.g. unlock $src1,@$src2 */
1688 SI h_memory_src2;
1689 USI h_memory_src2_idx;
1690 BI h_lock_0;
1691 } fmt_unlock;
1692 struct { /* e.g. satb $dr,$sr */
1693 SI dr;
1694 } fmt_satb;
1695 struct { /* e.g. sat $dr,$sr */
1696 SI dr;
1697 } fmt_sat;
1698 struct { /* e.g. sadd */
1699 DI h_accums_0;
1700 } fmt_sadd;
1701 struct { /* e.g. macwu1 $src1,$src2 */
1702 DI h_accums_1;
1703 } fmt_macwu1;
1704 struct { /* e.g. msblo $src1,$src2 */
1705 DI accum;
1706 } fmt_msblo;
1707 struct { /* e.g. mulwu1 $src1,$src2 */
1708 DI h_accums_1;
1709 } fmt_mulwu1;
1710 struct { /* e.g. sc */
1711 int empty;
1712 } fmt_sc;
1713 } operands;
1714 /* For conditionally written operands, bitmask of which ones were. */
1715 int written;
1716 };
1717
1718 /* Collection of various things for the trace handler to use. */
1719
1720 typedef struct trace_record {
1721 PCADDR pc;
1722 /* FIXME:wip */
1723 } TRACE_RECORD;
1724
1725 #endif /* CPU_M32RXF_H */