* cpu.h,decode.c,model.c,sem-switch.c,sem.c: Rebuild.
[external/binutils.git] / sim / m32r / cpux.h
1 /* CPU family header for m32rxf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright (C) 1996, 1997, 1998, 1999 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 sformat 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_dr;
193       SI * i_sr;
194       unsigned char in_dr;
195       unsigned char in_sr;
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_src1;
333       SI * i_src2;
334       unsigned char in_src1;
335       unsigned char in_src2;
336     } fmt_st;
337     struct { /* e.g. st $src1,@($slo16,$src2) */
338       INT f_simm16;
339       SI * i_src1;
340       SI * i_src2;
341       unsigned char in_src1;
342       unsigned char in_src2;
343     } fmt_st_d;
344     struct { /* e.g. stb $src1,@$src2 */
345       SI * i_src1;
346       SI * i_src2;
347       unsigned char in_src1;
348       unsigned char in_src2;
349     } fmt_stb;
350     struct { /* e.g. stb $src1,@($slo16,$src2) */
351       INT f_simm16;
352       SI * i_src1;
353       SI * i_src2;
354       unsigned char in_src1;
355       unsigned char in_src2;
356     } fmt_stb_d;
357     struct { /* e.g. sth $src1,@$src2 */
358       SI * i_src1;
359       SI * i_src2;
360       unsigned char in_src1;
361       unsigned char in_src2;
362     } fmt_sth;
363     struct { /* e.g. sth $src1,@($slo16,$src2) */
364       INT f_simm16;
365       SI * i_src1;
366       SI * i_src2;
367       unsigned char in_src1;
368       unsigned char in_src2;
369     } fmt_sth_d;
370     struct { /* e.g. st $src1,@+$src2 */
371       SI * i_src1;
372       SI * i_src2;
373       unsigned char in_src1;
374       unsigned char in_src2;
375       unsigned char out_src2;
376     } fmt_st_plus;
377     struct { /* e.g. unlock $src1,@$src2 */
378       SI * i_src1;
379       SI * i_src2;
380       unsigned char in_src1;
381       unsigned char in_src2;
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       IADDR i_disp16;
427       SI * i_src1;
428       SI * i_src2;
429       unsigned char in_src1;
430       unsigned char in_src2;
431     } fmt_beq;
432     struct { /* e.g. beqz $src2,$disp16 */
433       IADDR i_disp16;
434       SI * i_src2;
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   IADDR 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_IFMT_EMPTY_VARS \
538   /* Instruction fields.  */ \
539   unsigned int length;
540 #define EXTRACT_IFMT_EMPTY_CODE \
541   length = 0; \
542
543 #define EXTRACT_IFMT_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_IFMT_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_IFMT_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_IFMT_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_IFMT_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_IFMT_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_IFMT_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_IFMT_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_IFMT_ADDI_VARS \
606   /* Instruction fields.  */ \
607   UINT f_op1; \
608   UINT f_r1; \
609   INT f_simm8; \
610   unsigned int length;
611 #define EXTRACT_IFMT_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_IFMT_ADDV3_VARS \
618   /* Instruction fields.  */ \
619   UINT f_op1; \
620   UINT f_r1; \
621   UINT f_op2; \
622   UINT f_r2; \
623   INT f_simm16; \
624   unsigned int length;
625 #define EXTRACT_IFMT_ADDV3_CODE \
626   length = 4; \
627   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
628   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
629   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
630   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
631   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
632
633 #define EXTRACT_IFMT_BC8_VARS \
634   /* Instruction fields.  */ \
635   UINT f_op1; \
636   UINT f_r1; \
637   SI f_disp8; \
638   unsigned int length;
639 #define EXTRACT_IFMT_BC8_CODE \
640   length = 2; \
641   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
642   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
643   f_disp8 = ((((EXTRACT_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
644
645 #define EXTRACT_IFMT_BC24_VARS \
646   /* Instruction fields.  */ \
647   UINT f_op1; \
648   UINT f_r1; \
649   SI f_disp24; \
650   unsigned int length;
651 #define EXTRACT_IFMT_BC24_CODE \
652   length = 4; \
653   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
654   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
655   f_disp24 = ((((EXTRACT_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
656
657 #define EXTRACT_IFMT_BEQ_VARS \
658   /* Instruction fields.  */ \
659   UINT f_op1; \
660   UINT f_r1; \
661   UINT f_op2; \
662   UINT f_r2; \
663   SI f_disp16; \
664   unsigned int length;
665 #define EXTRACT_IFMT_BEQ_CODE \
666   length = 4; \
667   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
668   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
669   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
670   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
671   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
672
673 #define EXTRACT_IFMT_BEQZ_VARS \
674   /* Instruction fields.  */ \
675   UINT f_op1; \
676   UINT f_r1; \
677   UINT f_op2; \
678   UINT f_r2; \
679   SI f_disp16; \
680   unsigned int length;
681 #define EXTRACT_IFMT_BEQZ_CODE \
682   length = 4; \
683   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
684   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
685   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
686   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
687   f_disp16 = ((((EXTRACT_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
688
689 #define EXTRACT_IFMT_CMP_VARS \
690   /* Instruction fields.  */ \
691   UINT f_op1; \
692   UINT f_r1; \
693   UINT f_op2; \
694   UINT f_r2; \
695   unsigned int length;
696 #define EXTRACT_IFMT_CMP_CODE \
697   length = 2; \
698   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
699   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
700   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
701   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
702
703 #define EXTRACT_IFMT_CMPI_VARS \
704   /* Instruction fields.  */ \
705   UINT f_op1; \
706   UINT f_r1; \
707   UINT f_op2; \
708   UINT f_r2; \
709   INT f_simm16; \
710   unsigned int length;
711 #define EXTRACT_IFMT_CMPI_CODE \
712   length = 4; \
713   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
714   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
715   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
716   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
717   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
718
719 #define EXTRACT_IFMT_CMPZ_VARS \
720   /* Instruction fields.  */ \
721   UINT f_op1; \
722   UINT f_r1; \
723   UINT f_op2; \
724   UINT f_r2; \
725   unsigned int length;
726 #define EXTRACT_IFMT_CMPZ_CODE \
727   length = 2; \
728   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
729   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
730   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
731   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
732
733 #define EXTRACT_IFMT_DIV_VARS \
734   /* Instruction fields.  */ \
735   UINT f_op1; \
736   UINT f_r1; \
737   UINT f_op2; \
738   UINT f_r2; \
739   INT f_simm16; \
740   unsigned int length;
741 #define EXTRACT_IFMT_DIV_CODE \
742   length = 4; \
743   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
744   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
745   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
746   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
747   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
748
749 #define EXTRACT_IFMT_JC_VARS \
750   /* Instruction fields.  */ \
751   UINT f_op1; \
752   UINT f_r1; \
753   UINT f_op2; \
754   UINT f_r2; \
755   unsigned int length;
756 #define EXTRACT_IFMT_JC_CODE \
757   length = 2; \
758   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
759   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
760   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
761   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
762
763 #define EXTRACT_IFMT_LD24_VARS \
764   /* Instruction fields.  */ \
765   UINT f_op1; \
766   UINT f_r1; \
767   UINT f_uimm24; \
768   unsigned int length;
769 #define EXTRACT_IFMT_LD24_CODE \
770   length = 4; \
771   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
772   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
773   f_uimm24 = EXTRACT_UINT (insn, 32, 8, 24); \
774
775 #define EXTRACT_IFMT_LDI16_VARS \
776   /* Instruction fields.  */ \
777   UINT f_op1; \
778   UINT f_r1; \
779   UINT f_op2; \
780   UINT f_r2; \
781   INT f_simm16; \
782   unsigned int length;
783 #define EXTRACT_IFMT_LDI16_CODE \
784   length = 4; \
785   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
786   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
787   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
788   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
789   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
790
791 #define EXTRACT_IFMT_MACHI_A_VARS \
792   /* Instruction fields.  */ \
793   UINT f_op1; \
794   UINT f_r1; \
795   UINT f_acc; \
796   UINT f_op23; \
797   UINT f_r2; \
798   unsigned int length;
799 #define EXTRACT_IFMT_MACHI_A_CODE \
800   length = 2; \
801   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
802   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
803   f_acc = EXTRACT_UINT (insn, 16, 8, 1); \
804   f_op23 = EXTRACT_UINT (insn, 16, 9, 3); \
805   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
806
807 #define EXTRACT_IFMT_MVFACHI_A_VARS \
808   /* Instruction fields.  */ \
809   UINT f_op1; \
810   UINT f_r1; \
811   UINT f_op2; \
812   UINT f_accs; \
813   UINT f_op3; \
814   unsigned int length;
815 #define EXTRACT_IFMT_MVFACHI_A_CODE \
816   length = 2; \
817   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
818   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
819   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
820   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
821   f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
822
823 #define EXTRACT_IFMT_MVFC_VARS \
824   /* Instruction fields.  */ \
825   UINT f_op1; \
826   UINT f_r1; \
827   UINT f_op2; \
828   UINT f_r2; \
829   unsigned int length;
830 #define EXTRACT_IFMT_MVFC_CODE \
831   length = 2; \
832   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
833   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
834   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
835   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
836
837 #define EXTRACT_IFMT_MVTACHI_A_VARS \
838   /* Instruction fields.  */ \
839   UINT f_op1; \
840   UINT f_r1; \
841   UINT f_op2; \
842   UINT f_accs; \
843   UINT f_op3; \
844   unsigned int length;
845 #define EXTRACT_IFMT_MVTACHI_A_CODE \
846   length = 2; \
847   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
848   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
849   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
850   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
851   f_op3 = EXTRACT_UINT (insn, 16, 14, 2); \
852
853 #define EXTRACT_IFMT_MVTC_VARS \
854   /* Instruction fields.  */ \
855   UINT f_op1; \
856   UINT f_r1; \
857   UINT f_op2; \
858   UINT f_r2; \
859   unsigned int length;
860 #define EXTRACT_IFMT_MVTC_CODE \
861   length = 2; \
862   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
863   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
864   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
865   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
866
867 #define EXTRACT_IFMT_NOP_VARS \
868   /* Instruction fields.  */ \
869   UINT f_op1; \
870   UINT f_r1; \
871   UINT f_op2; \
872   UINT f_r2; \
873   unsigned int length;
874 #define EXTRACT_IFMT_NOP_CODE \
875   length = 2; \
876   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
877   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
878   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
879   f_r2 = EXTRACT_UINT (insn, 16, 12, 4); \
880
881 #define EXTRACT_IFMT_RAC_DSI_VARS \
882   /* Instruction fields.  */ \
883   UINT f_op1; \
884   UINT f_accd; \
885   UINT f_bits67; \
886   UINT f_op2; \
887   UINT f_accs; \
888   UINT f_bit14; \
889   SI f_imm1; \
890   unsigned int length;
891 #define EXTRACT_IFMT_RAC_DSI_CODE \
892   length = 2; \
893   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
894   f_accd = EXTRACT_UINT (insn, 16, 4, 2); \
895   f_bits67 = EXTRACT_UINT (insn, 16, 6, 2); \
896   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
897   f_accs = EXTRACT_UINT (insn, 16, 12, 2); \
898   f_bit14 = EXTRACT_UINT (insn, 16, 14, 1); \
899   f_imm1 = ((EXTRACT_UINT (insn, 16, 15, 1)) + (1)); \
900
901 #define EXTRACT_IFMT_SETH_VARS \
902   /* Instruction fields.  */ \
903   UINT f_op1; \
904   UINT f_r1; \
905   UINT f_op2; \
906   UINT f_r2; \
907   UINT f_hi16; \
908   unsigned int length;
909 #define EXTRACT_IFMT_SETH_CODE \
910   length = 4; \
911   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
912   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
913   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
914   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
915   f_hi16 = EXTRACT_UINT (insn, 32, 16, 16); \
916
917 #define EXTRACT_IFMT_SLLI_VARS \
918   /* Instruction fields.  */ \
919   UINT f_op1; \
920   UINT f_r1; \
921   UINT f_shift_op2; \
922   UINT f_uimm5; \
923   unsigned int length;
924 #define EXTRACT_IFMT_SLLI_CODE \
925   length = 2; \
926   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
927   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
928   f_shift_op2 = EXTRACT_UINT (insn, 16, 8, 3); \
929   f_uimm5 = EXTRACT_UINT (insn, 16, 11, 5); \
930
931 #define EXTRACT_IFMT_ST_D_VARS \
932   /* Instruction fields.  */ \
933   UINT f_op1; \
934   UINT f_r1; \
935   UINT f_op2; \
936   UINT f_r2; \
937   INT f_simm16; \
938   unsigned int length;
939 #define EXTRACT_IFMT_ST_D_CODE \
940   length = 4; \
941   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
942   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
943   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
944   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
945   f_simm16 = EXTRACT_INT (insn, 32, 16, 16); \
946
947 #define EXTRACT_IFMT_TRAP_VARS \
948   /* Instruction fields.  */ \
949   UINT f_op1; \
950   UINT f_r1; \
951   UINT f_op2; \
952   UINT f_uimm4; \
953   unsigned int length;
954 #define EXTRACT_IFMT_TRAP_CODE \
955   length = 2; \
956   f_op1 = EXTRACT_UINT (insn, 16, 0, 4); \
957   f_r1 = EXTRACT_UINT (insn, 16, 4, 4); \
958   f_op2 = EXTRACT_UINT (insn, 16, 8, 4); \
959   f_uimm4 = EXTRACT_UINT (insn, 16, 12, 4); \
960
961 #define EXTRACT_IFMT_SATB_VARS \
962   /* Instruction fields.  */ \
963   UINT f_op1; \
964   UINT f_r1; \
965   UINT f_op2; \
966   UINT f_r2; \
967   UINT f_uimm16; \
968   unsigned int length;
969 #define EXTRACT_IFMT_SATB_CODE \
970   length = 4; \
971   f_op1 = EXTRACT_UINT (insn, 32, 0, 4); \
972   f_r1 = EXTRACT_UINT (insn, 32, 4, 4); \
973   f_op2 = EXTRACT_UINT (insn, 32, 8, 4); \
974   f_r2 = EXTRACT_UINT (insn, 32, 12, 4); \
975   f_uimm16 = EXTRACT_UINT (insn, 32, 16, 16); \
976
977 /* Queued output values of an instruction.  */
978
979 struct parexec {
980   union {
981     struct { /* empty sformat for unspecified field list */
982       int empty;
983     } fmt_empty;
984     struct { /* e.g. add $dr,$sr */
985       SI dr;
986     } fmt_add;
987     struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
988       SI dr;
989     } fmt_add3;
990     struct { /* e.g. and3 $dr,$sr,$uimm16 */
991       SI dr;
992     } fmt_and3;
993     struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
994       SI dr;
995     } fmt_or3;
996     struct { /* e.g. addi $dr,$simm8 */
997       SI dr;
998     } fmt_addi;
999     struct { /* e.g. addv $dr,$sr */
1000       BI condbit;
1001       SI dr;
1002     } fmt_addv;
1003     struct { /* e.g. addv3 $dr,$sr,$simm16 */
1004       BI condbit;
1005       SI dr;
1006     } fmt_addv3;
1007     struct { /* e.g. addx $dr,$sr */
1008       BI condbit;
1009       SI dr;
1010     } fmt_addx;
1011     struct { /* e.g. bc.s $disp8 */
1012       USI pc;
1013     } fmt_bc8;
1014     struct { /* e.g. bc.l $disp24 */
1015       USI pc;
1016     } fmt_bc24;
1017     struct { /* e.g. beq $src1,$src2,$disp16 */
1018       USI pc;
1019     } fmt_beq;
1020     struct { /* e.g. beqz $src2,$disp16 */
1021       USI pc;
1022     } fmt_beqz;
1023     struct { /* e.g. bl.s $disp8 */
1024       SI h_gr_14;
1025       USI pc;
1026     } fmt_bl8;
1027     struct { /* e.g. bl.l $disp24 */
1028       SI h_gr_14;
1029       USI pc;
1030     } fmt_bl24;
1031     struct { /* e.g. bcl.s $disp8 */
1032       SI h_gr_14;
1033       USI pc;
1034     } fmt_bcl8;
1035     struct { /* e.g. bcl.l $disp24 */
1036       SI h_gr_14;
1037       USI pc;
1038     } fmt_bcl24;
1039     struct { /* e.g. bra.s $disp8 */
1040       USI pc;
1041     } fmt_bra8;
1042     struct { /* e.g. bra.l $disp24 */
1043       USI pc;
1044     } fmt_bra24;
1045     struct { /* e.g. cmp $src1,$src2 */
1046       BI condbit;
1047     } fmt_cmp;
1048     struct { /* e.g. cmpi $src2,$simm16 */
1049       BI condbit;
1050     } fmt_cmpi;
1051     struct { /* e.g. cmpz $src2 */
1052       BI condbit;
1053     } fmt_cmpz;
1054     struct { /* e.g. div $dr,$sr */
1055       SI dr;
1056     } fmt_div;
1057     struct { /* e.g. jc $sr */
1058       USI pc;
1059     } fmt_jc;
1060     struct { /* e.g. jl $sr */
1061       SI h_gr_14;
1062       USI pc;
1063     } fmt_jl;
1064     struct { /* e.g. jmp $sr */
1065       USI pc;
1066     } fmt_jmp;
1067     struct { /* e.g. ld $dr,@$sr */
1068       SI dr;
1069     } fmt_ld;
1070     struct { /* e.g. ld $dr,@($slo16,$sr) */
1071       SI dr;
1072     } fmt_ld_d;
1073     struct { /* e.g. ldb $dr,@$sr */
1074       SI dr;
1075     } fmt_ldb;
1076     struct { /* e.g. ldb $dr,@($slo16,$sr) */
1077       SI dr;
1078     } fmt_ldb_d;
1079     struct { /* e.g. ldh $dr,@$sr */
1080       SI dr;
1081     } fmt_ldh;
1082     struct { /* e.g. ldh $dr,@($slo16,$sr) */
1083       SI dr;
1084     } fmt_ldh_d;
1085     struct { /* e.g. ld $dr,@$sr+ */
1086       SI dr;
1087       SI sr;
1088     } fmt_ld_plus;
1089     struct { /* e.g. ld24 $dr,$uimm24 */
1090       SI dr;
1091     } fmt_ld24;
1092     struct { /* e.g. ldi8 $dr,$simm8 */
1093       SI dr;
1094     } fmt_ldi8;
1095     struct { /* e.g. ldi16 $dr,$hash$slo16 */
1096       SI dr;
1097     } fmt_ldi16;
1098     struct { /* e.g. lock $dr,@$sr */
1099       SI dr;
1100       BI h_lock_0;
1101     } fmt_lock;
1102     struct { /* e.g. machi $src1,$src2,$acc */
1103       DI acc;
1104     } fmt_machi_a;
1105     struct { /* e.g. mulhi $src1,$src2,$acc */
1106       DI acc;
1107     } fmt_mulhi_a;
1108     struct { /* e.g. mv $dr,$sr */
1109       SI dr;
1110     } fmt_mv;
1111     struct { /* e.g. mvfachi $dr,$accs */
1112       SI dr;
1113     } fmt_mvfachi_a;
1114     struct { /* e.g. mvfc $dr,$scr */
1115       SI dr;
1116     } fmt_mvfc;
1117     struct { /* e.g. mvtachi $src1,$accs */
1118       DI accs;
1119     } fmt_mvtachi_a;
1120     struct { /* e.g. mvtc $sr,$dcr */
1121       USI dcr;
1122     } fmt_mvtc;
1123     struct { /* e.g. nop */
1124       int empty;
1125     } fmt_nop;
1126     struct { /* e.g. rac $accd,$accs,$imm1 */
1127       DI accd;
1128     } fmt_rac_dsi;
1129     struct { /* e.g. rte */
1130       UQI h_bpsw_0;
1131       USI h_cr_6;
1132       UQI h_psw_0;
1133       USI pc;
1134     } fmt_rte;
1135     struct { /* e.g. seth $dr,$hash$hi16 */
1136       SI dr;
1137     } fmt_seth;
1138     struct { /* e.g. sll3 $dr,$sr,$simm16 */
1139       SI dr;
1140     } fmt_sll3;
1141     struct { /* e.g. slli $dr,$uimm5 */
1142       SI dr;
1143     } fmt_slli;
1144     struct { /* e.g. st $src1,@$src2 */
1145       SI h_memory_src2;
1146       USI h_memory_src2_idx;
1147     } fmt_st;
1148     struct { /* e.g. st $src1,@($slo16,$src2) */
1149       SI h_memory_add__VM_src2_slo16;
1150       USI h_memory_add__VM_src2_slo16_idx;
1151     } fmt_st_d;
1152     struct { /* e.g. stb $src1,@$src2 */
1153       QI h_memory_src2;
1154       USI h_memory_src2_idx;
1155     } fmt_stb;
1156     struct { /* e.g. stb $src1,@($slo16,$src2) */
1157       QI h_memory_add__VM_src2_slo16;
1158       USI h_memory_add__VM_src2_slo16_idx;
1159     } fmt_stb_d;
1160     struct { /* e.g. sth $src1,@$src2 */
1161       HI h_memory_src2;
1162       USI h_memory_src2_idx;
1163     } fmt_sth;
1164     struct { /* e.g. sth $src1,@($slo16,$src2) */
1165       HI h_memory_add__VM_src2_slo16;
1166       USI h_memory_add__VM_src2_slo16_idx;
1167     } fmt_sth_d;
1168     struct { /* e.g. st $src1,@+$src2 */
1169       SI h_memory_new_src2;
1170       USI h_memory_new_src2_idx;
1171       SI src2;
1172     } fmt_st_plus;
1173     struct { /* e.g. trap $uimm4 */
1174       UQI h_bbpsw_0;
1175       UQI h_bpsw_0;
1176       USI h_cr_14;
1177       USI h_cr_6;
1178       UQI h_psw_0;
1179       SI pc;
1180     } fmt_trap;
1181     struct { /* e.g. unlock $src1,@$src2 */
1182       BI h_lock_0;
1183       SI h_memory_src2;
1184       USI h_memory_src2_idx;
1185     } fmt_unlock;
1186     struct { /* e.g. satb $dr,$sr */
1187       SI dr;
1188     } fmt_satb;
1189     struct { /* e.g. sat $dr,$sr */
1190       SI dr;
1191     } fmt_sat;
1192     struct { /* e.g. sadd */
1193       DI h_accums_0;
1194     } fmt_sadd;
1195     struct { /* e.g. macwu1 $src1,$src2 */
1196       DI h_accums_1;
1197     } fmt_macwu1;
1198     struct { /* e.g. msblo $src1,$src2 */
1199       DI accum;
1200     } fmt_msblo;
1201     struct { /* e.g. mulwu1 $src1,$src2 */
1202       DI h_accums_1;
1203     } fmt_mulwu1;
1204     struct { /* e.g. sc */
1205       int empty;
1206     } fmt_sc;
1207   } operands;
1208   /* For conditionally written operands, bitmask of which ones were.  */
1209   int written;
1210 };
1211
1212 /* Collection of various things for the trace handler to use.  */
1213
1214 typedef struct trace_record {
1215   IADDR pc;
1216   /* FIXME:wip */
1217 } TRACE_RECORD;
1218
1219 #endif /* CPU_M32RXF_H */