Switch the license of all files explicitly copyright the FSF
[external/binutils.git] / sim / cris / cpuv10.h
1 /* CPU family header for crisv10f.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2005 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 3 of the License, or
12 (at your option) 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
20 along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 */
23
24 #ifndef CPU_CRISV10F_H
25 #define CPU_CRISV10F_H
26
27 /* Maximum number of instructions that are fetched at a time.
28    This is for LIW type instructions sets (e.g. m32r).  */
29 #define MAX_LIW_INSNS 1
30
31 /* Maximum number of instructions that can be executed in parallel.  */
32 #define MAX_PARALLEL_INSNS 1
33
34 /* CPU state information.  */
35 typedef struct {
36   /* Hardware elements.  */
37   struct {
38   /* program counter */
39   USI h_pc;
40 #define GET_H_PC() CPU (h_pc)
41 #define SET_H_PC(x) \
42 do { \
43 CPU (h_pc) = ANDSI ((x), (~ (1)));\
44 ;} while (0)
45   /* General purpose registers */
46   SI h_gr_real_pc[16];
47 #define GET_H_GR_REAL_PC(a1) CPU (h_gr_real_pc)[a1]
48 #define SET_H_GR_REAL_PC(a1, x) (CPU (h_gr_real_pc)[a1] = (x))
49   /* Special registers for v10 */
50   SI h_sr_v10[16];
51 #define GET_H_SR_V10(index) (ORIF (ORIF (((index) == (((UINT) 0))), ((index) == (((UINT) 4)))), ((index) == (((UINT) 8))))) ? (0) : (((index) == (((UINT) 1)))) ? (10) : (ORIF (((index) == (((UINT) 5))), ((index) == (((UINT) 13))))) ? (ORSI (ANDSI (CPU (h_sr_v10[((UINT) 5)]), 0xffffff00), ORSI (ZEXTBISI (CPU (h_cbit)), ORSI (SLLSI (ZEXTBISI (CPU (h_vbit)), 1), ORSI (SLLSI (ZEXTBISI (CPU (h_zbit)), 2), ORSI (SLLSI (ZEXTBISI (CPU (h_nbit)), 3), ORSI (SLLSI (ZEXTBISI (CPU (h_xbit)), 4), ORSI (SLLSI (ZEXTBISI (GET_H_IBIT ()), 5), ORSI (SLLSI (ZEXTBISI (GET_H_UBIT ()), 6), ORSI (SLLSI (ZEXTBISI (CPU (h_pbit)), 7), 0)))))))))) : (CPU (h_sr_v10[index]))
52 #define SET_H_SR_V10(index, x) \
53 do { \
54 if (ORIF (ORIF ((((index)) == (((UINT) 0))), (((index)) == (((UINT) 4)))), ORIF ((((index)) == (((UINT) 8))), (((index)) == (((UINT) 1)))))) {\
55 ((void) 0); /*nop*/\
56 }\
57  else if (ORIF ((((index)) == (((UINT) 5))), (((index)) == (((UINT) 13))))) {\
58 {\
59 CPU (h_cbit) = ((NESI (ANDSI ((x), ((1) << (0))), 0)) ? (1) : (0));\
60 CPU (h_vbit) = ((NESI (ANDSI ((x), ((1) << (1))), 0)) ? (1) : (0));\
61 CPU (h_zbit) = ((NESI (ANDSI ((x), ((1) << (2))), 0)) ? (1) : (0));\
62 CPU (h_nbit) = ((NESI (ANDSI ((x), ((1) << (3))), 0)) ? (1) : (0));\
63 CPU (h_xbit) = ((NESI (ANDSI ((x), ((1) << (4))), 0)) ? (1) : (0));\
64 SET_H_IBIT (((NESI (ANDSI ((x), ((1) << (5))), 0)) ? (1) : (0)));\
65 SET_H_UBIT (((NESI (ANDSI ((x), ((1) << (6))), 0)) ? (1) : (0)));\
66 CPU (h_pbit) = ((NESI (ANDSI ((x), ((1) << (7))), 0)) ? (1) : (0));\
67 CPU (h_sr_v10[((UINT) 5)]) = (x);\
68 CPU (h_sr_v10[((UINT) 13)]) = (x);\
69 }\
70 }\
71  else {\
72 CPU (h_sr_v10[(index)]) = (x);\
73 }\
74 ;} while (0)
75   /* carry bit */
76   BI h_cbit;
77 #define GET_H_CBIT() CPU (h_cbit)
78 #define SET_H_CBIT(x) (CPU (h_cbit) = (x))
79   /* overflow bit */
80   BI h_vbit;
81 #define GET_H_VBIT() CPU (h_vbit)
82 #define SET_H_VBIT(x) (CPU (h_vbit) = (x))
83   /* zero bit */
84   BI h_zbit;
85 #define GET_H_ZBIT() CPU (h_zbit)
86 #define SET_H_ZBIT(x) (CPU (h_zbit) = (x))
87   /* sign bit */
88   BI h_nbit;
89 #define GET_H_NBIT() CPU (h_nbit)
90 #define SET_H_NBIT(x) (CPU (h_nbit) = (x))
91   /* extended-arithmetic bit */
92   BI h_xbit;
93 #define GET_H_XBIT() CPU (h_xbit)
94 #define SET_H_XBIT(x) (CPU (h_xbit) = (x))
95   /* interrupt-enable bit */
96   BI h_ibit_pre_v32;
97 #define GET_H_IBIT_PRE_V32() CPU (h_ibit_pre_v32)
98 #define SET_H_IBIT_PRE_V32(x) (CPU (h_ibit_pre_v32) = (x))
99   /* sequence-broken bit */
100   BI h_pbit;
101 #define GET_H_PBIT() CPU (h_pbit)
102 #define SET_H_PBIT(x) (CPU (h_pbit) = (x))
103   /* user mode bit */
104   BI h_ubit_pre_v32;
105 #define GET_H_UBIT_PRE_V32() CPU (h_ubit_pre_v32)
106 #define SET_H_UBIT_PRE_V32(x) (CPU (h_ubit_pre_v32) = (x))
107   /* instruction-is-prefixed bit */
108   BI h_insn_prefixed_p_pre_v32;
109 #define GET_H_INSN_PREFIXED_P_PRE_V32() CPU (h_insn_prefixed_p_pre_v32)
110 #define SET_H_INSN_PREFIXED_P_PRE_V32(x) (CPU (h_insn_prefixed_p_pre_v32) = (x))
111   /* Prefix-address register */
112   SI h_prefixreg_pre_v32;
113 #define GET_H_PREFIXREG_PRE_V32() CPU (h_prefixreg_pre_v32)
114 #define SET_H_PREFIXREG_PRE_V32(x) (CPU (h_prefixreg_pre_v32) = (x))
115   } hardware;
116 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
117 } CRISV10F_CPU_DATA;
118
119 /* Virtual regs.  */
120
121 #define GET_H_V32_NON_V32() 0
122 #define SET_H_V32_NON_V32(x) \
123 do { \
124 cgen_rtx_error (current_cpu, "Can't set h-v32");\
125 ;} while (0)
126 #define GET_H_GR(index) GET_H_GR_PC (index)
127 #define SET_H_GR(index, x) \
128 do { \
129 SET_H_GR_PC ((index), (x));\
130 ;} while (0)
131 #define GET_H_GR_PC(index) ((((index) == (15))) ? ((cgen_rtx_error (current_cpu, "General register read of PC is not implemented."), 0)) : (CPU (h_gr_real_pc[index])))
132 #define SET_H_GR_PC(index, x) \
133 do { \
134 {\
135 if ((((index)) == (15))) {\
136 cgen_rtx_error (current_cpu, "General register write to PC is not implemented.");\
137 }\
138 CPU (h_gr_real_pc[(index)]) = (x);\
139 }\
140 ;} while (0)
141 #define GET_H_RAW_GR_PC(index) CPU (h_gr_real_pc[index])
142 #define SET_H_RAW_GR_PC(index, x) \
143 do { \
144 CPU (h_gr_real_pc[(index)]) = (x);\
145 ;} while (0)
146 #define GET_H_SR(index) GET_H_SR_V10 (index)
147 #define SET_H_SR(index, x) \
148 do { \
149 SET_H_SR_V10 ((index), (x));\
150 ;} while (0)
151 #define GET_H_CBIT_MOVE() GET_H_CBIT_MOVE_PRE_V32 ()
152 #define SET_H_CBIT_MOVE(x) \
153 do { \
154 SET_H_CBIT_MOVE_PRE_V32 ((x));\
155 ;} while (0)
156 #define GET_H_CBIT_MOVE_PRE_V32() CPU (h_cbit)
157 #define SET_H_CBIT_MOVE_PRE_V32(x) \
158 do { \
159 CPU (h_cbit) = (x);\
160 ;} while (0)
161 #define GET_H_VBIT_MOVE() GET_H_VBIT_MOVE_PRE_V32 ()
162 #define SET_H_VBIT_MOVE(x) \
163 do { \
164 SET_H_VBIT_MOVE_PRE_V32 ((x));\
165 ;} while (0)
166 #define GET_H_VBIT_MOVE_PRE_V32() CPU (h_vbit)
167 #define SET_H_VBIT_MOVE_PRE_V32(x) \
168 do { \
169 CPU (h_vbit) = (x);\
170 ;} while (0)
171 #define GET_H_ZBIT_MOVE() GET_H_ZBIT_MOVE_PRE_V32 ()
172 #define SET_H_ZBIT_MOVE(x) \
173 do { \
174 SET_H_ZBIT_MOVE_PRE_V32 ((x));\
175 ;} while (0)
176 #define GET_H_ZBIT_MOVE_PRE_V32() CPU (h_zbit)
177 #define SET_H_ZBIT_MOVE_PRE_V32(x) \
178 do { \
179 CPU (h_zbit) = (x);\
180 ;} while (0)
181 #define GET_H_NBIT_MOVE() GET_H_NBIT_MOVE_PRE_V32 ()
182 #define SET_H_NBIT_MOVE(x) \
183 do { \
184 SET_H_NBIT_MOVE_PRE_V32 ((x));\
185 ;} while (0)
186 #define GET_H_NBIT_MOVE_PRE_V32() CPU (h_nbit)
187 #define SET_H_NBIT_MOVE_PRE_V32(x) \
188 do { \
189 CPU (h_nbit) = (x);\
190 ;} while (0)
191 #define GET_H_IBIT() CPU (h_ibit_pre_v32)
192 #define SET_H_IBIT(x) \
193 do { \
194 CPU (h_ibit_pre_v32) = (x);\
195 ;} while (0)
196 #define GET_H_UBIT() CPU (h_ubit_pre_v32)
197 #define SET_H_UBIT(x) \
198 do { \
199 CPU (h_ubit_pre_v32) = (x);\
200 ;} while (0)
201 #define GET_H_INSN_PREFIXED_P() CPU (h_insn_prefixed_p_pre_v32)
202 #define SET_H_INSN_PREFIXED_P(x) \
203 do { \
204 CPU (h_insn_prefixed_p_pre_v32) = (x);\
205 ;} while (0)
206
207 /* Cover fns for register access.  */
208 BI crisv10f_h_v32_non_v32_get (SIM_CPU *);
209 void crisv10f_h_v32_non_v32_set (SIM_CPU *, BI);
210 USI crisv10f_h_pc_get (SIM_CPU *);
211 void crisv10f_h_pc_set (SIM_CPU *, USI);
212 SI crisv10f_h_gr_get (SIM_CPU *, UINT);
213 void crisv10f_h_gr_set (SIM_CPU *, UINT, SI);
214 SI crisv10f_h_gr_pc_get (SIM_CPU *, UINT);
215 void crisv10f_h_gr_pc_set (SIM_CPU *, UINT, SI);
216 SI crisv10f_h_gr_real_pc_get (SIM_CPU *, UINT);
217 void crisv10f_h_gr_real_pc_set (SIM_CPU *, UINT, SI);
218 SI crisv10f_h_raw_gr_pc_get (SIM_CPU *, UINT);
219 void crisv10f_h_raw_gr_pc_set (SIM_CPU *, UINT, SI);
220 SI crisv10f_h_sr_get (SIM_CPU *, UINT);
221 void crisv10f_h_sr_set (SIM_CPU *, UINT, SI);
222 SI crisv10f_h_sr_v10_get (SIM_CPU *, UINT);
223 void crisv10f_h_sr_v10_set (SIM_CPU *, UINT, SI);
224 BI crisv10f_h_cbit_get (SIM_CPU *);
225 void crisv10f_h_cbit_set (SIM_CPU *, BI);
226 BI crisv10f_h_cbit_move_get (SIM_CPU *);
227 void crisv10f_h_cbit_move_set (SIM_CPU *, BI);
228 BI crisv10f_h_cbit_move_pre_v32_get (SIM_CPU *);
229 void crisv10f_h_cbit_move_pre_v32_set (SIM_CPU *, BI);
230 BI crisv10f_h_vbit_get (SIM_CPU *);
231 void crisv10f_h_vbit_set (SIM_CPU *, BI);
232 BI crisv10f_h_vbit_move_get (SIM_CPU *);
233 void crisv10f_h_vbit_move_set (SIM_CPU *, BI);
234 BI crisv10f_h_vbit_move_pre_v32_get (SIM_CPU *);
235 void crisv10f_h_vbit_move_pre_v32_set (SIM_CPU *, BI);
236 BI crisv10f_h_zbit_get (SIM_CPU *);
237 void crisv10f_h_zbit_set (SIM_CPU *, BI);
238 BI crisv10f_h_zbit_move_get (SIM_CPU *);
239 void crisv10f_h_zbit_move_set (SIM_CPU *, BI);
240 BI crisv10f_h_zbit_move_pre_v32_get (SIM_CPU *);
241 void crisv10f_h_zbit_move_pre_v32_set (SIM_CPU *, BI);
242 BI crisv10f_h_nbit_get (SIM_CPU *);
243 void crisv10f_h_nbit_set (SIM_CPU *, BI);
244 BI crisv10f_h_nbit_move_get (SIM_CPU *);
245 void crisv10f_h_nbit_move_set (SIM_CPU *, BI);
246 BI crisv10f_h_nbit_move_pre_v32_get (SIM_CPU *);
247 void crisv10f_h_nbit_move_pre_v32_set (SIM_CPU *, BI);
248 BI crisv10f_h_xbit_get (SIM_CPU *);
249 void crisv10f_h_xbit_set (SIM_CPU *, BI);
250 BI crisv10f_h_ibit_get (SIM_CPU *);
251 void crisv10f_h_ibit_set (SIM_CPU *, BI);
252 BI crisv10f_h_ibit_pre_v32_get (SIM_CPU *);
253 void crisv10f_h_ibit_pre_v32_set (SIM_CPU *, BI);
254 BI crisv10f_h_pbit_get (SIM_CPU *);
255 void crisv10f_h_pbit_set (SIM_CPU *, BI);
256 BI crisv10f_h_ubit_get (SIM_CPU *);
257 void crisv10f_h_ubit_set (SIM_CPU *, BI);
258 BI crisv10f_h_ubit_pre_v32_get (SIM_CPU *);
259 void crisv10f_h_ubit_pre_v32_set (SIM_CPU *, BI);
260 BI crisv10f_h_insn_prefixed_p_get (SIM_CPU *);
261 void crisv10f_h_insn_prefixed_p_set (SIM_CPU *, BI);
262 BI crisv10f_h_insn_prefixed_p_pre_v32_get (SIM_CPU *);
263 void crisv10f_h_insn_prefixed_p_pre_v32_set (SIM_CPU *, BI);
264 SI crisv10f_h_prefixreg_pre_v32_get (SIM_CPU *);
265 void crisv10f_h_prefixreg_pre_v32_set (SIM_CPU *, SI);
266
267 /* These must be hand-written.  */
268 extern CPUREG_FETCH_FN crisv10f_fetch_register;
269 extern CPUREG_STORE_FN crisv10f_store_register;
270
271 typedef struct {
272   int empty;
273 } MODEL_CRISV10_DATA;
274
275 /* Instruction argument buffer.  */
276
277 union sem_fields {
278   struct { /* no operands */
279     int empty;
280   } fmt_empty;
281   struct { /*  */
282     UINT f_u4;
283   } sfmt_break;
284   struct { /*  */
285     UINT f_dstsrc;
286   } sfmt_setf;
287   struct { /*  */
288     IADDR i_o_word_pcrel;
289     UINT f_operand2;
290   } sfmt_bcc_w;
291   struct { /*  */
292     IADDR i_o_pcrel;
293     UINT f_operand2;
294   } sfmt_bcc_b;
295   struct { /*  */
296     UINT f_memmode;
297     unsigned char in_h_gr_SI_14;
298     unsigned char out_h_gr_SI_14;
299   } sfmt_move_m_spplus_p8;
300   struct { /*  */
301     INT f_s8;
302     UINT f_operand2;
303     unsigned char in_Rd;
304   } sfmt_addoq;
305   struct { /*  */
306     INT f_indir_pc__dword;
307     UINT f_operand2;
308     unsigned char out_Pd;
309   } sfmt_move_c_sprv10_p9;
310   struct { /*  */
311     INT f_indir_pc__word;
312     UINT f_operand2;
313     unsigned char out_Pd;
314   } sfmt_move_c_sprv10_p5;
315   struct { /*  */
316     INT f_s6;
317     UINT f_operand2;
318     unsigned char out_Rd;
319   } sfmt_moveq;
320   struct { /*  */
321     INT f_indir_pc__dword;
322     UINT f_operand2;
323     unsigned char in_Rd;
324     unsigned char out_Rd;
325   } sfmt_bound_cd;
326   struct { /*  */
327     INT f_indir_pc__word;
328     UINT f_operand2;
329     unsigned char in_Rd;
330     unsigned char out_Rd;
331   } sfmt_bound_cw;
332   struct { /*  */
333     INT f_indir_pc__byte;
334     UINT f_operand2;
335     unsigned char in_Rd;
336     unsigned char out_Rd;
337   } sfmt_bound_cb;
338   struct { /*  */
339     UINT f_operand2;
340     UINT f_u5;
341     unsigned char in_Rd;
342     unsigned char out_Rd;
343   } sfmt_asrq;
344   struct { /*  */
345     INT f_s6;
346     UINT f_operand2;
347     unsigned char in_Rd;
348     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
349   } sfmt_andq;
350   struct { /*  */
351     INT f_indir_pc__dword;
352     UINT f_operand2;
353     unsigned char in_Rd;
354     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
355   } sfmt_addcdr;
356   struct { /*  */
357     INT f_indir_pc__word;
358     UINT f_operand2;
359     unsigned char in_Rd;
360     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
361   } sfmt_addcwr;
362   struct { /*  */
363     INT f_indir_pc__byte;
364     UINT f_operand2;
365     unsigned char in_Rd;
366     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
367   } sfmt_addcbr;
368   struct { /*  */
369     UINT f_operand1;
370     UINT f_operand2;
371     unsigned char in_Ps;
372     unsigned char out_h_gr_SI_index_of__DFLT_Rs;
373   } sfmt_move_spr_rv10;
374   struct { /*  */
375     UINT f_operand2;
376     UINT f_u6;
377     unsigned char in_Rd;
378     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
379   } sfmt_addq;
380   struct { /*  */
381     UINT f_operand1;
382     UINT f_operand2;
383     unsigned char in_Rd;
384     unsigned char in_Rs;
385     unsigned char out_h_gr_SI_index_of__DFLT_Rd;
386   } sfmt_add_b_r;
387   struct { /*  */
388     UINT f_operand1;
389     UINT f_operand2;
390     unsigned char in_Rd;
391     unsigned char in_Rs;
392     unsigned char out_Rd;
393     unsigned char out_h_sr_SI_7;
394   } sfmt_muls_b;
395   struct { /*  */
396     UINT f_memmode;
397     UINT f_operand1;
398     UINT f_operand2;
399     unsigned char in_Ps;
400     unsigned char in_Rs;
401     unsigned char out_Rs;
402   } sfmt_move_spr_mv10;
403   struct { /*  */
404     UINT f_memmode;
405     UINT f_operand1;
406     UINT f_operand2;
407     unsigned char in_Rs;
408     unsigned char out_Pd;
409     unsigned char out_Rs;
410   } sfmt_move_m_sprv10;
411   struct { /*  */
412     UINT f_memmode;
413     UINT f_operand1;
414     UINT f_operand2;
415     unsigned char in_Rd;
416     unsigned char in_Rs;
417     unsigned char out_Rd;
418     unsigned char out_Rs;
419   } sfmt_bound_m_b_m;
420   struct { /*  */
421     UINT f_memmode;
422     UINT f_operand1;
423     UINT f_operand2;
424     unsigned char in_Rd;
425     unsigned char in_Rs;
426     unsigned char out_Rs;
427     unsigned char out_h_gr_SI_if__SI_andif__DFLT_prefix_set_not__DFLT_inc_index_of__DFLT_Rs_index_of__DFLT_Rd;
428   } sfmt_add_m_b_m;
429   struct { /*  */
430     UINT f_memmode;
431     UINT f_operand1;
432     UINT f_operand2;
433     unsigned char in_Rd;
434     unsigned char in_Rs;
435     unsigned char out_Rs;
436     unsigned char out_h_gr_SI_0;
437     unsigned char out_h_gr_SI_1;
438     unsigned char out_h_gr_SI_10;
439     unsigned char out_h_gr_SI_11;
440     unsigned char out_h_gr_SI_12;
441     unsigned char out_h_gr_SI_13;
442     unsigned char out_h_gr_SI_14;
443     unsigned char out_h_gr_SI_2;
444     unsigned char out_h_gr_SI_3;
445     unsigned char out_h_gr_SI_4;
446     unsigned char out_h_gr_SI_5;
447     unsigned char out_h_gr_SI_6;
448     unsigned char out_h_gr_SI_7;
449     unsigned char out_h_gr_SI_8;
450     unsigned char out_h_gr_SI_9;
451   } sfmt_movem_m_r;
452   struct { /*  */
453     UINT f_memmode;
454     UINT f_operand1;
455     UINT f_operand2;
456     unsigned char in_Rd;
457     unsigned char in_Rs;
458     unsigned char in_h_gr_SI_0;
459     unsigned char in_h_gr_SI_1;
460     unsigned char in_h_gr_SI_10;
461     unsigned char in_h_gr_SI_11;
462     unsigned char in_h_gr_SI_12;
463     unsigned char in_h_gr_SI_13;
464     unsigned char in_h_gr_SI_14;
465     unsigned char in_h_gr_SI_15;
466     unsigned char in_h_gr_SI_2;
467     unsigned char in_h_gr_SI_3;
468     unsigned char in_h_gr_SI_4;
469     unsigned char in_h_gr_SI_5;
470     unsigned char in_h_gr_SI_6;
471     unsigned char in_h_gr_SI_7;
472     unsigned char in_h_gr_SI_8;
473     unsigned char in_h_gr_SI_9;
474     unsigned char out_Rs;
475   } sfmt_movem_r_m;
476 #if WITH_SCACHE_PBB
477   /* Writeback handler.  */
478   struct {
479     /* Pointer to argbuf entry for insn whose results need writing back.  */
480     const struct argbuf *abuf;
481   } write;
482   /* x-before handler */
483   struct {
484     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
485     int first_p;
486   } before;
487   /* x-after handler */
488   struct {
489     int empty;
490   } after;
491   /* This entry is used to terminate each pbb.  */
492   struct {
493     /* Number of insns in pbb.  */
494     int insn_count;
495     /* Next pbb to execute.  */
496     SCACHE *next;
497     SCACHE *branch_target;
498   } chain;
499 #endif
500 };
501
502 /* The ARGBUF struct.  */
503 struct argbuf {
504   /* These are the baseclass definitions.  */
505   IADDR addr;
506   const IDESC *idesc;
507   char trace_p;
508   char profile_p;
509   /* ??? Temporary hack for skip insns.  */
510   char skip_count;
511   char unused;
512   /* cpu specific data follows */
513   union sem semantic;
514   int written;
515   union sem_fields fields;
516 };
517
518 /* A cached insn.
519
520    ??? SCACHE used to contain more than just argbuf.  We could delete the
521    type entirely and always just use ARGBUF, but for future concerns and as
522    a level of abstraction it is left in.  */
523
524 struct scache {
525   struct argbuf argbuf;
526 };
527
528 /* Macros to simplify extraction, reading and semantic code.
529    These define and assign the local vars that contain the insn's fields.  */
530
531 #define EXTRACT_IFMT_EMPTY_VARS \
532   unsigned int length;
533 #define EXTRACT_IFMT_EMPTY_CODE \
534   length = 0; \
535
536 #define EXTRACT_IFMT_NOP_VARS \
537   UINT f_operand2; \
538   UINT f_mode; \
539   UINT f_opcode; \
540   UINT f_size; \
541   UINT f_operand1; \
542   unsigned int length;
543 #define EXTRACT_IFMT_NOP_CODE \
544   length = 2; \
545   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
546   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
547   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
548   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
549   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
550
551 #define EXTRACT_IFMT_MOVE_B_R_VARS \
552   UINT f_operand2; \
553   UINT f_mode; \
554   UINT f_opcode; \
555   UINT f_size; \
556   UINT f_operand1; \
557   unsigned int length;
558 #define EXTRACT_IFMT_MOVE_B_R_CODE \
559   length = 2; \
560   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
561   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
562   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
563   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
564   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
565
566 #define EXTRACT_IFMT_MOVEPCR_VARS \
567   UINT f_operand2; \
568   UINT f_mode; \
569   UINT f_opcode; \
570   UINT f_size; \
571   UINT f_operand1; \
572   unsigned int length;
573 #define EXTRACT_IFMT_MOVEPCR_CODE \
574   length = 2; \
575   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
576   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
577   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
578   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
579   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
580
581 #define EXTRACT_IFMT_MOVEQ_VARS \
582   UINT f_operand2; \
583   UINT f_mode; \
584   UINT f_opcode; \
585   INT f_s6; \
586   unsigned int length;
587 #define EXTRACT_IFMT_MOVEQ_CODE \
588   length = 2; \
589   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
590   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
591   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
592   f_s6 = EXTRACT_LSB0_INT (insn, 16, 5, 6); \
593
594 #define EXTRACT_IFMT_MOVECBR_VARS \
595   UINT f_operand2; \
596   INT f_indir_pc__byte; \
597   UINT f_mode; \
598   UINT f_opcode; \
599   UINT f_size; \
600   UINT f_operand1; \
601   /* Contents of trailing part of insn.  */ \
602   UINT word_1; \
603   unsigned int length;
604 #define EXTRACT_IFMT_MOVECBR_CODE \
605   length = 4; \
606   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
607   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
608   f_indir_pc__byte = (0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)); \
609   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
610   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
611   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
612   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
613
614 #define EXTRACT_IFMT_MOVECWR_VARS \
615   UINT f_operand2; \
616   INT f_indir_pc__word; \
617   UINT f_mode; \
618   UINT f_opcode; \
619   UINT f_size; \
620   UINT f_operand1; \
621   /* Contents of trailing part of insn.  */ \
622   UINT word_1; \
623   unsigned int length;
624 #define EXTRACT_IFMT_MOVECWR_CODE \
625   length = 4; \
626   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
627   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
628   f_indir_pc__word = (0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)); \
629   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
630   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
631   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
632   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
633
634 #define EXTRACT_IFMT_MOVECDR_VARS \
635   INT f_indir_pc__dword; \
636   UINT f_operand2; \
637   UINT f_mode; \
638   UINT f_opcode; \
639   UINT f_size; \
640   UINT f_operand1; \
641   /* Contents of trailing part of insn.  */ \
642   UINT word_1; \
643   unsigned int length;
644 #define EXTRACT_IFMT_MOVECDR_CODE \
645   length = 6; \
646   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
647   f_indir_pc__dword = (0|(EXTRACT_LSB0_UINT (word_1, 32, 31, 32) << 0)); \
648   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
649   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
650   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
651   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
652   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
653
654 #define EXTRACT_IFMT_MOVUCBR_VARS \
655   UINT f_operand2; \
656   INT f_indir_pc__byte; \
657   UINT f_mode; \
658   UINT f_opcode; \
659   UINT f_size; \
660   UINT f_operand1; \
661   /* Contents of trailing part of insn.  */ \
662   UINT word_1; \
663   unsigned int length;
664 #define EXTRACT_IFMT_MOVUCBR_CODE \
665   length = 4; \
666   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
667   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
668   f_indir_pc__byte = (0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)); \
669   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
670   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
671   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
672   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
673
674 #define EXTRACT_IFMT_MOVUCWR_VARS \
675   UINT f_operand2; \
676   INT f_indir_pc__word; \
677   UINT f_mode; \
678   UINT f_opcode; \
679   UINT f_size; \
680   UINT f_operand1; \
681   /* Contents of trailing part of insn.  */ \
682   UINT word_1; \
683   unsigned int length;
684 #define EXTRACT_IFMT_MOVUCWR_CODE \
685   length = 4; \
686   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
687   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
688   f_indir_pc__word = (0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)); \
689   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
690   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
691   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
692   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
693
694 #define EXTRACT_IFMT_ADDQ_VARS \
695   UINT f_operand2; \
696   UINT f_mode; \
697   UINT f_opcode; \
698   UINT f_u6; \
699   unsigned int length;
700 #define EXTRACT_IFMT_ADDQ_CODE \
701   length = 2; \
702   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
703   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
704   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
705   f_u6 = EXTRACT_LSB0_UINT (insn, 16, 5, 6); \
706
707 #define EXTRACT_IFMT_CMP_M_B_M_VARS \
708   UINT f_operand2; \
709   UINT f_membit; \
710   UINT f_memmode; \
711   UINT f_opcode; \
712   UINT f_size; \
713   UINT f_operand1; \
714   unsigned int length;
715 #define EXTRACT_IFMT_CMP_M_B_M_CODE \
716   length = 2; \
717   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
718   f_membit = EXTRACT_LSB0_UINT (insn, 16, 11, 1); \
719   f_memmode = EXTRACT_LSB0_UINT (insn, 16, 10, 1); \
720   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
721   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
722   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
723
724 #define EXTRACT_IFMT_MOVE_R_SPRV10_VARS \
725   UINT f_operand2; \
726   UINT f_mode; \
727   UINT f_opcode; \
728   UINT f_size; \
729   UINT f_operand1; \
730   unsigned int length;
731 #define EXTRACT_IFMT_MOVE_R_SPRV10_CODE \
732   length = 2; \
733   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
734   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
735   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
736   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
737   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
738
739 #define EXTRACT_IFMT_MOVE_SPR_RV10_VARS \
740   UINT f_operand2; \
741   UINT f_mode; \
742   UINT f_opcode; \
743   UINT f_size; \
744   UINT f_operand1; \
745   unsigned int length;
746 #define EXTRACT_IFMT_MOVE_SPR_RV10_CODE \
747   length = 2; \
748   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
749   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
750   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
751   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
752   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
753
754 #define EXTRACT_IFMT_RET_TYPE_VARS \
755   UINT f_operand2; \
756   UINT f_mode; \
757   UINT f_opcode; \
758   UINT f_size; \
759   UINT f_operand1; \
760   unsigned int length;
761 #define EXTRACT_IFMT_RET_TYPE_CODE \
762   length = 2; \
763   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
764   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
765   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
766   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
767   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
768
769 #define EXTRACT_IFMT_MOVE_M_SPRV10_VARS \
770   UINT f_operand2; \
771   UINT f_membit; \
772   UINT f_memmode; \
773   UINT f_opcode; \
774   UINT f_size; \
775   UINT f_operand1; \
776   unsigned int length;
777 #define EXTRACT_IFMT_MOVE_M_SPRV10_CODE \
778   length = 2; \
779   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
780   f_membit = EXTRACT_LSB0_UINT (insn, 16, 11, 1); \
781   f_memmode = EXTRACT_LSB0_UINT (insn, 16, 10, 1); \
782   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
783   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
784   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
785
786 #define EXTRACT_IFMT_MOVE_C_SPRV10_P5_VARS \
787   UINT f_operand2; \
788   INT f_indir_pc__word; \
789   UINT f_mode; \
790   UINT f_opcode; \
791   UINT f_size; \
792   UINT f_operand1; \
793   /* Contents of trailing part of insn.  */ \
794   UINT word_1; \
795   unsigned int length;
796 #define EXTRACT_IFMT_MOVE_C_SPRV10_P5_CODE \
797   length = 4; \
798   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
799   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
800   f_indir_pc__word = (0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)); \
801   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
802   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
803   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
804   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
805
806 #define EXTRACT_IFMT_MOVE_C_SPRV10_P9_VARS \
807   INT f_indir_pc__dword; \
808   UINT f_operand2; \
809   UINT f_mode; \
810   UINT f_opcode; \
811   UINT f_size; \
812   UINT f_operand1; \
813   /* Contents of trailing part of insn.  */ \
814   UINT word_1; \
815   unsigned int length;
816 #define EXTRACT_IFMT_MOVE_C_SPRV10_P9_CODE \
817   length = 6; \
818   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
819   f_indir_pc__dword = (0|(EXTRACT_LSB0_UINT (word_1, 32, 31, 32) << 0)); \
820   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
821   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
822   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
823   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
824   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
825
826 #define EXTRACT_IFMT_MOVE_SPR_MV10_VARS \
827   UINT f_operand2; \
828   UINT f_membit; \
829   UINT f_memmode; \
830   UINT f_opcode; \
831   UINT f_size; \
832   UINT f_operand1; \
833   unsigned int length;
834 #define EXTRACT_IFMT_MOVE_SPR_MV10_CODE \
835   length = 2; \
836   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
837   f_membit = EXTRACT_LSB0_UINT (insn, 16, 11, 1); \
838   f_memmode = EXTRACT_LSB0_UINT (insn, 16, 10, 1); \
839   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
840   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
841   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
842
843 #define EXTRACT_IFMT_SBFS_VARS \
844   UINT f_operand2; \
845   UINT f_membit; \
846   UINT f_memmode; \
847   UINT f_opcode; \
848   UINT f_size; \
849   UINT f_operand1; \
850   unsigned int length;
851 #define EXTRACT_IFMT_SBFS_CODE \
852   length = 2; \
853   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
854   f_membit = EXTRACT_LSB0_UINT (insn, 16, 11, 1); \
855   f_memmode = EXTRACT_LSB0_UINT (insn, 16, 10, 1); \
856   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
857   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
858   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
859
860 #define EXTRACT_IFMT_SWAP_VARS \
861   UINT f_operand2; \
862   UINT f_mode; \
863   UINT f_opcode; \
864   UINT f_size; \
865   UINT f_operand1; \
866   unsigned int length;
867 #define EXTRACT_IFMT_SWAP_CODE \
868   length = 2; \
869   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
870   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
871   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
872   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
873   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
874
875 #define EXTRACT_IFMT_ASRQ_VARS \
876   UINT f_operand2; \
877   UINT f_mode; \
878   UINT f_opcode; \
879   UINT f_b5; \
880   UINT f_u5; \
881   unsigned int length;
882 #define EXTRACT_IFMT_ASRQ_CODE \
883   length = 2; \
884   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
885   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
886   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
887   f_b5 = EXTRACT_LSB0_UINT (insn, 16, 5, 1); \
888   f_u5 = EXTRACT_LSB0_UINT (insn, 16, 4, 5); \
889
890 #define EXTRACT_IFMT_SETF_VARS \
891   UINT f_mode; \
892   UINT f_opcode; \
893   UINT f_size; \
894   UINT f_operand2; \
895   UINT f_operand1; \
896   UINT f_dstsrc; \
897   unsigned int length;
898 #define EXTRACT_IFMT_SETF_CODE \
899   length = 2; \
900   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
901   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
902   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
903   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
904   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
905   f_dstsrc = ((((f_operand1) | (((f_operand2) << (4))))) & (255));\
906
907 #define EXTRACT_IFMT_BCC_B_VARS \
908   UINT f_operand2; \
909   UINT f_mode; \
910   UINT f_opcode_hi; \
911   INT f_disp9_hi; \
912   UINT f_disp9_lo; \
913   INT f_disp9; \
914   unsigned int length;
915 #define EXTRACT_IFMT_BCC_B_CODE \
916   length = 2; \
917   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
918   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
919   f_opcode_hi = EXTRACT_LSB0_UINT (insn, 16, 9, 2); \
920   f_disp9_hi = EXTRACT_LSB0_INT (insn, 16, 0, 1); \
921   f_disp9_lo = EXTRACT_LSB0_UINT (insn, 16, 7, 7); \
922 {\
923   SI tmp_abslo;\
924   SI tmp_absval;\
925   tmp_abslo = ((f_disp9_lo) << (1));\
926   tmp_absval = ((((((f_disp9_hi) != (0))) ? ((~ (255))) : (0))) | (tmp_abslo));\
927   f_disp9 = ((((pc) + (tmp_absval))) + (((GET_H_V32_NON_V32 ()) ? (0) : (2))));\
928 }\
929
930 #define EXTRACT_IFMT_BA_B_VARS \
931   UINT f_operand2; \
932   UINT f_mode; \
933   UINT f_opcode_hi; \
934   INT f_disp9_hi; \
935   UINT f_disp9_lo; \
936   INT f_disp9; \
937   unsigned int length;
938 #define EXTRACT_IFMT_BA_B_CODE \
939   length = 2; \
940   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
941   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
942   f_opcode_hi = EXTRACT_LSB0_UINT (insn, 16, 9, 2); \
943   f_disp9_hi = EXTRACT_LSB0_INT (insn, 16, 0, 1); \
944   f_disp9_lo = EXTRACT_LSB0_UINT (insn, 16, 7, 7); \
945 {\
946   SI tmp_abslo;\
947   SI tmp_absval;\
948   tmp_abslo = ((f_disp9_lo) << (1));\
949   tmp_absval = ((((((f_disp9_hi) != (0))) ? ((~ (255))) : (0))) | (tmp_abslo));\
950   f_disp9 = ((((pc) + (tmp_absval))) + (((GET_H_V32_NON_V32 ()) ? (0) : (2))));\
951 }\
952
953 #define EXTRACT_IFMT_BCC_W_VARS \
954   UINT f_operand2; \
955   SI f_indir_pc__word_pcrel; \
956   UINT f_mode; \
957   UINT f_opcode; \
958   UINT f_size; \
959   UINT f_operand1; \
960   /* Contents of trailing part of insn.  */ \
961   UINT word_1; \
962   unsigned int length;
963 #define EXTRACT_IFMT_BCC_W_CODE \
964   length = 4; \
965   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
966   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
967   f_indir_pc__word_pcrel = ((EXTHISI (((HI) (UINT) ((0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)))))) + (((pc) + (((GET_H_V32_NON_V32 ()) ? (0) : (4)))))); \
968   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
969   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
970   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
971   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
972
973 #define EXTRACT_IFMT_BA_W_VARS \
974   UINT f_operand2; \
975   SI f_indir_pc__word_pcrel; \
976   UINT f_mode; \
977   UINT f_opcode; \
978   UINT f_size; \
979   UINT f_operand1; \
980   /* Contents of trailing part of insn.  */ \
981   UINT word_1; \
982   unsigned int length;
983 #define EXTRACT_IFMT_BA_W_CODE \
984   length = 4; \
985   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
986   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
987   f_indir_pc__word_pcrel = ((EXTHISI (((HI) (UINT) ((0|(EXTRACT_LSB0_UINT (word_1, 32, 15, 16) << 0)))))) + (((pc) + (((GET_H_V32_NON_V32 ()) ? (0) : (4)))))); \
988   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
989   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
990   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
991   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
992
993 #define EXTRACT_IFMT_JUMP_C_VARS \
994   INT f_indir_pc__dword; \
995   UINT f_operand2; \
996   UINT f_mode; \
997   UINT f_opcode; \
998   UINT f_size; \
999   UINT f_operand1; \
1000   /* Contents of trailing part of insn.  */ \
1001   UINT word_1; \
1002   unsigned int length;
1003 #define EXTRACT_IFMT_JUMP_C_CODE \
1004   length = 6; \
1005   word_1 = GETIMEMUSI (current_cpu, pc + 2); \
1006   f_indir_pc__dword = (0|(EXTRACT_LSB0_UINT (word_1, 32, 31, 32) << 0)); \
1007   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
1008   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
1009   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
1010   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
1011   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
1012
1013 #define EXTRACT_IFMT_BREAK_VARS \
1014   UINT f_operand2; \
1015   UINT f_mode; \
1016   UINT f_opcode; \
1017   UINT f_size; \
1018   UINT f_u4; \
1019   unsigned int length;
1020 #define EXTRACT_IFMT_BREAK_CODE \
1021   length = 2; \
1022   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
1023   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
1024   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
1025   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
1026   f_u4 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
1027
1028 #define EXTRACT_IFMT_SCC_VARS \
1029   UINT f_operand2; \
1030   UINT f_mode; \
1031   UINT f_opcode; \
1032   UINT f_size; \
1033   UINT f_operand1; \
1034   unsigned int length;
1035 #define EXTRACT_IFMT_SCC_CODE \
1036   length = 2; \
1037   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
1038   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
1039   f_opcode = EXTRACT_LSB0_UINT (insn, 16, 9, 4); \
1040   f_size = EXTRACT_LSB0_UINT (insn, 16, 5, 2); \
1041   f_operand1 = EXTRACT_LSB0_UINT (insn, 16, 3, 4); \
1042
1043 #define EXTRACT_IFMT_ADDOQ_VARS \
1044   UINT f_operand2; \
1045   UINT f_mode; \
1046   UINT f_opcode_hi; \
1047   INT f_s8; \
1048   unsigned int length;
1049 #define EXTRACT_IFMT_ADDOQ_CODE \
1050   length = 2; \
1051   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
1052   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
1053   f_opcode_hi = EXTRACT_LSB0_UINT (insn, 16, 9, 2); \
1054   f_s8 = EXTRACT_LSB0_INT (insn, 16, 7, 8); \
1055
1056 #define EXTRACT_IFMT_BDAPQPC_VARS \
1057   UINT f_operand2; \
1058   UINT f_mode; \
1059   UINT f_opcode_hi; \
1060   INT f_s8; \
1061   unsigned int length;
1062 #define EXTRACT_IFMT_BDAPQPC_CODE \
1063   length = 2; \
1064   f_operand2 = EXTRACT_LSB0_UINT (insn, 16, 15, 4); \
1065   f_mode = EXTRACT_LSB0_UINT (insn, 16, 11, 2); \
1066   f_opcode_hi = EXTRACT_LSB0_UINT (insn, 16, 9, 2); \
1067   f_s8 = EXTRACT_LSB0_INT (insn, 16, 7, 8); \
1068
1069 /* Collection of various things for the trace handler to use.  */
1070
1071 typedef struct trace_record {
1072   IADDR pc;
1073   /* FIXME:wip */
1074 } TRACE_RECORD;
1075
1076 #endif /* CPU_CRISV10F_H */