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