* sparc-desc.c: New file.
[external/binutils.git] / sim / sparc / cpu64.h
1 /* CPU family header for sparc64.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright (C) 1999 Cygnus Solutions, Inc.
6
7 This file is part of the Cygnus Simulators.
8
9
10 */
11
12 #ifndef CPU_SPARC64_H
13 #define CPU_SPARC64_H
14
15 /* Maximum number of instructions that are fetched at a time.
16    This is for LIW type instructions sets (e.g. m32r).  */
17 #define MAX_LIW_INSNS 1
18
19 /* Maximum number of instructions that can be executed in parallel.  */
20 #define MAX_PARALLEL_INSNS 1
21
22 /* CPU state information.  */
23 typedef struct {
24   /* Hardware elements.  */
25   struct {
26   /* program counter */
27   USI h_pc;
28 #define GET_H_PC() CPU (h_pc)
29 #define SET_H_PC(x) (CPU (h_pc) = (x))
30   /* next pc */
31   SI h_npc;
32 #define GET_H_NPC() CPU (h_npc)
33 #define SET_H_NPC(x) (CPU (h_npc) = (x))
34 /* GET_H_GR macro user-written */
35 /* SET_H_GR macro user-written */
36   /* icc carry bit */
37   BI h_icc_c;
38 #define GET_H_ICC_C() CPU (h_icc_c)
39 #define SET_H_ICC_C(x) (CPU (h_icc_c) = (x))
40   /* icc negative bit */
41   BI h_icc_n;
42 #define GET_H_ICC_N() CPU (h_icc_n)
43 #define SET_H_ICC_N(x) (CPU (h_icc_n) = (x))
44   /* icc overflow bit */
45   BI h_icc_v;
46 #define GET_H_ICC_V() CPU (h_icc_v)
47 #define SET_H_ICC_V(x) (CPU (h_icc_v) = (x))
48   /* icc zero bit */
49   BI h_icc_z;
50 #define GET_H_ICC_Z() CPU (h_icc_z)
51 #define SET_H_ICC_Z(x) (CPU (h_icc_z) = (x))
52   /* xcc carry bit */
53   BI h_xcc_c;
54 #define GET_H_XCC_C() CPU (h_xcc_c)
55 #define SET_H_XCC_C(x) (CPU (h_xcc_c) = (x))
56   /* xcc negative bit */
57   BI h_xcc_n;
58 #define GET_H_XCC_N() CPU (h_xcc_n)
59 #define SET_H_XCC_N(x) (CPU (h_xcc_n) = (x))
60   /* xcc overflow bit */
61   BI h_xcc_v;
62 #define GET_H_XCC_V() CPU (h_xcc_v)
63 #define SET_H_XCC_V(x) (CPU (h_xcc_v) = (x))
64   /* xcc zero bit */
65   BI h_xcc_z;
66 #define GET_H_XCC_Z() CPU (h_xcc_z)
67 #define SET_H_XCC_Z(x) (CPU (h_xcc_z) = (x))
68 /* GET_H_Y macro user-written */
69 /* SET_H_Y macro user-written */
70   /* ancilliary state registers */
71   SI h_asr[32];
72 #define GET_H_ASR(a1) CPU (h_asr)[a1]
73 #define SET_H_ASR(a1, x) (CPU (h_asr)[a1] = (x))
74   /* annul next insn? - assists execution */
75   BI h_annul_p;
76 #define GET_H_ANNUL_P() CPU (h_annul_p)
77 #define SET_H_ANNUL_P(x) (CPU (h_annul_p) = (x))
78   /* floating point regs */
79   SF h_fr[32];
80 #define GET_H_FR(a1) CPU (h_fr)[a1]
81 #define SET_H_FR(a1, x) (CPU (h_fr)[a1] = (x))
82   /* version */
83   UDI h_ver;
84 #define GET_H_VER() CPU (h_ver)
85 #define SET_H_VER(x) (CPU (h_ver) = (x))
86   /* processor state */
87   UDI h_pstate;
88 #define GET_H_PSTATE() CPU (h_pstate)
89 #define SET_H_PSTATE(x) (CPU (h_pstate) = (x))
90   /* trap base address */
91   UDI h_tba;
92 #define GET_H_TBA() CPU (h_tba)
93 #define SET_H_TBA(x) (CPU (h_tba) = (x))
94   /* trap type */
95   UDI h_tt;
96 #define GET_H_TT() CPU (h_tt)
97 #define SET_H_TT(x) (CPU (h_tt) = (x))
98   /* trap pc */
99   UDI h_tpc;
100 #define GET_H_TPC() CPU (h_tpc)
101 #define SET_H_TPC(x) (CPU (h_tpc) = (x))
102   /* trap npc */
103   UDI h_tnpc;
104 #define GET_H_TNPC() CPU (h_tnpc)
105 #define SET_H_TNPC(x) (CPU (h_tnpc) = (x))
106   /* trap state */
107   UDI h_tstate;
108 #define GET_H_TSTATE() CPU (h_tstate)
109 #define SET_H_TSTATE(x) (CPU (h_tstate) = (x))
110   /* trap level */
111   UQI h_tl;
112 #define GET_H_TL() CPU (h_tl)
113 #define SET_H_TL(x) (CPU (h_tl) = (x))
114   /* address space identifier */
115   UQI h_asi;
116 #define GET_H_ASI() CPU (h_asi)
117 #define SET_H_ASI(x) (CPU (h_asi) = (x))
118   /* tick counter */
119   UDI h_tick;
120 #define GET_H_TICK() CPU (h_tick)
121 #define SET_H_TICK(x) (CPU (h_tick) = (x))
122   /* savable window registers */
123   UDI h_cansave;
124 #define GET_H_CANSAVE() CPU (h_cansave)
125 #define SET_H_CANSAVE(x) (CPU (h_cansave) = (x))
126   /* restorable window registers */
127   UDI h_canrestore;
128 #define GET_H_CANRESTORE() CPU (h_canrestore)
129 #define SET_H_CANRESTORE(x) (CPU (h_canrestore) = (x))
130   /* other window registers */
131   UDI h_otherwin;
132 #define GET_H_OTHERWIN() CPU (h_otherwin)
133 #define SET_H_OTHERWIN(x) (CPU (h_otherwin) = (x))
134   /* clean window registers */
135   UDI h_cleanwin;
136 #define GET_H_CLEANWIN() CPU (h_cleanwin)
137 #define SET_H_CLEANWIN(x) (CPU (h_cleanwin) = (x))
138   /* window state */
139   UDI h_wstate;
140 #define GET_H_WSTATE() CPU (h_wstate)
141 #define SET_H_WSTATE(x) (CPU (h_wstate) = (x))
142   /*  */
143   UQI h_fcc0;
144 #define GET_H_FCC0() CPU (h_fcc0)
145 #define SET_H_FCC0(x) (CPU (h_fcc0) = (x))
146   /*  */
147   UQI h_fcc1;
148 #define GET_H_FCC1() CPU (h_fcc1)
149 #define SET_H_FCC1(x) (CPU (h_fcc1) = (x))
150   /*  */
151   UQI h_fcc2;
152 #define GET_H_FCC2() CPU (h_fcc2)
153 #define SET_H_FCC2(x) (CPU (h_fcc2) = (x))
154   /*  */
155   UQI h_fcc3;
156 #define GET_H_FCC3() CPU (h_fcc3)
157 #define SET_H_FCC3(x) (CPU (h_fcc3) = (x))
158   /* fsr rounding direction */
159   UQI h_fsr_rd;
160 #define GET_H_FSR_RD() CPU (h_fsr_rd)
161 #define SET_H_FSR_RD(x) (CPU (h_fsr_rd) = (x))
162   /* fsr trap enable mask */
163   UQI h_fsr_tem;
164 #define GET_H_FSR_TEM() CPU (h_fsr_tem)
165 #define SET_H_FSR_TEM(x) (CPU (h_fsr_tem) = (x))
166   /* fsr nonstandard fp */
167   BI h_fsr_ns;
168 #define GET_H_FSR_NS() CPU (h_fsr_ns)
169 #define SET_H_FSR_NS(x) (CPU (h_fsr_ns) = (x))
170   /* fsr version */
171   UQI h_fsr_ver;
172 #define GET_H_FSR_VER() CPU (h_fsr_ver)
173 #define SET_H_FSR_VER(x) (CPU (h_fsr_ver) = (x))
174   /* fsr fp trap type */
175   UQI h_fsr_ftt;
176 #define GET_H_FSR_FTT() CPU (h_fsr_ftt)
177 #define SET_H_FSR_FTT(x) (CPU (h_fsr_ftt) = (x))
178   /* fsr queue not empty */
179   BI h_fsr_qne;
180 #define GET_H_FSR_QNE() CPU (h_fsr_qne)
181 #define SET_H_FSR_QNE(x) (CPU (h_fsr_qne) = (x))
182   /* fsr accrued exception */
183   UQI h_fsr_aexc;
184 #define GET_H_FSR_AEXC() CPU (h_fsr_aexc)
185 #define SET_H_FSR_AEXC(x) (CPU (h_fsr_aexc) = (x))
186   /* fsr current exception */
187   UQI h_fsr_cexc;
188 #define GET_H_FSR_CEXC() CPU (h_fsr_cexc)
189 #define SET_H_FSR_CEXC(x) (CPU (h_fsr_cexc) = (x))
190   /* fpsr enable fp */
191   BI h_fpsr_fef;
192 #define GET_H_FPSR_FEF() CPU (h_fpsr_fef)
193 #define SET_H_FPSR_FEF(x) (CPU (h_fpsr_fef) = (x))
194   /* fpsr dirty upper */
195   BI h_fpsr_du;
196 #define GET_H_FPSR_DU() CPU (h_fpsr_du)
197 #define SET_H_FPSR_DU(x) (CPU (h_fpsr_du) = (x))
198   /* fpsr dirty lower */
199   BI h_fpsr_dl;
200 #define GET_H_FPSR_DL() CPU (h_fpsr_dl)
201 #define SET_H_FPSR_DL(x) (CPU (h_fpsr_dl) = (x))
202 /* GET_H_FPSR macro user-written */
203 /* SET_H_FPSR macro user-written */
204   } hardware;
205 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
206 } SPARC64_CPU_DATA;
207
208 /* Cover fns for register access.  */
209 USI sparc64_h_pc_get (SIM_CPU *);
210 void sparc64_h_pc_set (SIM_CPU *, USI);
211 SI sparc64_h_npc_get (SIM_CPU *);
212 void sparc64_h_npc_set (SIM_CPU *, SI);
213 SI sparc64_h_gr_get (SIM_CPU *, UINT);
214 void sparc64_h_gr_set (SIM_CPU *, UINT, SI);
215 BI sparc64_h_icc_c_get (SIM_CPU *);
216 void sparc64_h_icc_c_set (SIM_CPU *, BI);
217 BI sparc64_h_icc_n_get (SIM_CPU *);
218 void sparc64_h_icc_n_set (SIM_CPU *, BI);
219 BI sparc64_h_icc_v_get (SIM_CPU *);
220 void sparc64_h_icc_v_set (SIM_CPU *, BI);
221 BI sparc64_h_icc_z_get (SIM_CPU *);
222 void sparc64_h_icc_z_set (SIM_CPU *, BI);
223 BI sparc64_h_xcc_c_get (SIM_CPU *);
224 void sparc64_h_xcc_c_set (SIM_CPU *, BI);
225 BI sparc64_h_xcc_n_get (SIM_CPU *);
226 void sparc64_h_xcc_n_set (SIM_CPU *, BI);
227 BI sparc64_h_xcc_v_get (SIM_CPU *);
228 void sparc64_h_xcc_v_set (SIM_CPU *, BI);
229 BI sparc64_h_xcc_z_get (SIM_CPU *);
230 void sparc64_h_xcc_z_set (SIM_CPU *, BI);
231 SI sparc64_h_y_get (SIM_CPU *);
232 void sparc64_h_y_set (SIM_CPU *, SI);
233 SI sparc64_h_asr_get (SIM_CPU *, UINT);
234 void sparc64_h_asr_set (SIM_CPU *, UINT, SI);
235 BI sparc64_h_annul_p_get (SIM_CPU *);
236 void sparc64_h_annul_p_set (SIM_CPU *, BI);
237 SF sparc64_h_fr_get (SIM_CPU *, UINT);
238 void sparc64_h_fr_set (SIM_CPU *, UINT, SF);
239 UDI sparc64_h_ver_get (SIM_CPU *);
240 void sparc64_h_ver_set (SIM_CPU *, UDI);
241 UDI sparc64_h_pstate_get (SIM_CPU *);
242 void sparc64_h_pstate_set (SIM_CPU *, UDI);
243 UDI sparc64_h_tba_get (SIM_CPU *);
244 void sparc64_h_tba_set (SIM_CPU *, UDI);
245 UDI sparc64_h_tt_get (SIM_CPU *);
246 void sparc64_h_tt_set (SIM_CPU *, UDI);
247 UDI sparc64_h_tpc_get (SIM_CPU *);
248 void sparc64_h_tpc_set (SIM_CPU *, UDI);
249 UDI sparc64_h_tnpc_get (SIM_CPU *);
250 void sparc64_h_tnpc_set (SIM_CPU *, UDI);
251 UDI sparc64_h_tstate_get (SIM_CPU *);
252 void sparc64_h_tstate_set (SIM_CPU *, UDI);
253 UQI sparc64_h_tl_get (SIM_CPU *);
254 void sparc64_h_tl_set (SIM_CPU *, UQI);
255 UQI sparc64_h_asi_get (SIM_CPU *);
256 void sparc64_h_asi_set (SIM_CPU *, UQI);
257 UDI sparc64_h_tick_get (SIM_CPU *);
258 void sparc64_h_tick_set (SIM_CPU *, UDI);
259 UDI sparc64_h_cansave_get (SIM_CPU *);
260 void sparc64_h_cansave_set (SIM_CPU *, UDI);
261 UDI sparc64_h_canrestore_get (SIM_CPU *);
262 void sparc64_h_canrestore_set (SIM_CPU *, UDI);
263 UDI sparc64_h_otherwin_get (SIM_CPU *);
264 void sparc64_h_otherwin_set (SIM_CPU *, UDI);
265 UDI sparc64_h_cleanwin_get (SIM_CPU *);
266 void sparc64_h_cleanwin_set (SIM_CPU *, UDI);
267 UDI sparc64_h_wstate_get (SIM_CPU *);
268 void sparc64_h_wstate_set (SIM_CPU *, UDI);
269 UQI sparc64_h_fcc0_get (SIM_CPU *);
270 void sparc64_h_fcc0_set (SIM_CPU *, UQI);
271 UQI sparc64_h_fcc1_get (SIM_CPU *);
272 void sparc64_h_fcc1_set (SIM_CPU *, UQI);
273 UQI sparc64_h_fcc2_get (SIM_CPU *);
274 void sparc64_h_fcc2_set (SIM_CPU *, UQI);
275 UQI sparc64_h_fcc3_get (SIM_CPU *);
276 void sparc64_h_fcc3_set (SIM_CPU *, UQI);
277 UQI sparc64_h_fsr_rd_get (SIM_CPU *);
278 void sparc64_h_fsr_rd_set (SIM_CPU *, UQI);
279 UQI sparc64_h_fsr_tem_get (SIM_CPU *);
280 void sparc64_h_fsr_tem_set (SIM_CPU *, UQI);
281 BI sparc64_h_fsr_ns_get (SIM_CPU *);
282 void sparc64_h_fsr_ns_set (SIM_CPU *, BI);
283 UQI sparc64_h_fsr_ver_get (SIM_CPU *);
284 void sparc64_h_fsr_ver_set (SIM_CPU *, UQI);
285 UQI sparc64_h_fsr_ftt_get (SIM_CPU *);
286 void sparc64_h_fsr_ftt_set (SIM_CPU *, UQI);
287 BI sparc64_h_fsr_qne_get (SIM_CPU *);
288 void sparc64_h_fsr_qne_set (SIM_CPU *, BI);
289 UQI sparc64_h_fsr_aexc_get (SIM_CPU *);
290 void sparc64_h_fsr_aexc_set (SIM_CPU *, UQI);
291 UQI sparc64_h_fsr_cexc_get (SIM_CPU *);
292 void sparc64_h_fsr_cexc_set (SIM_CPU *, UQI);
293 BI sparc64_h_fpsr_fef_get (SIM_CPU *);
294 void sparc64_h_fpsr_fef_set (SIM_CPU *, BI);
295 BI sparc64_h_fpsr_du_get (SIM_CPU *);
296 void sparc64_h_fpsr_du_set (SIM_CPU *, BI);
297 BI sparc64_h_fpsr_dl_get (SIM_CPU *);
298 void sparc64_h_fpsr_dl_set (SIM_CPU *, BI);
299 UQI sparc64_h_fpsr_get (SIM_CPU *);
300 void sparc64_h_fpsr_set (SIM_CPU *, UQI);
301
302 /* These must be hand-written.  */
303 extern CPUREG_FETCH_FN sparc64_fetch_register;
304 extern CPUREG_STORE_FN sparc64_store_register;
305
306 typedef struct {
307   int empty;
308 } MODEL_SPARC64_DEF_DATA;
309
310 /* The ARGBUF struct.  */
311 struct argbuf {
312   /* These are the baseclass definitions.  */
313   IADDR addr;
314   const IDESC *idesc;
315   char trace_p;
316   char profile_p;
317   /* cpu specific data follows */
318   CGEN_INSN_INT insn;
319   int written;
320 };
321
322 /* A cached insn.
323
324    ??? SCACHE used to contain more than just argbuf.  We could delete the
325    type entirely and always just use ARGBUF, but for future concerns and as
326    a level of abstraction it is left in.  */
327
328 struct scache {
329   struct argbuf argbuf;
330 };
331
332 /* Macros to simplify extraction, reading and semantic code.
333    These define and assign the local vars that contain the insn's fields.  */
334
335 #define EXTRACT_IFMT_EMPTY_VARS \
336   /* Instruction fields.  */ \
337   unsigned int length;
338 #define EXTRACT_IFMT_EMPTY_CODE \
339   length = 0; \
340
341 #define EXTRACT_IFMT_BEQZ_VARS \
342   /* Instruction fields.  */ \
343   INT f_disp16; \
344   UINT f_disp16_hi; \
345   UINT f_disp16_lo; \
346   UINT f_rs1; \
347   UINT f_p; \
348   UINT f_op2; \
349   UINT f_fmt2_rcond; \
350   INT f_bpr_res28_1; \
351   UINT f_a; \
352   UINT f_op; \
353   unsigned int length;
354 #define EXTRACT_IFMT_BEQZ_CODE \
355   length = 4; \
356   f_disp16_hi = EXTRACT_UINT (insn, 32, 10, 2); \
357   f_disp16_lo = EXTRACT_UINT (insn, 32, 18, 14); \
358 do {\
359   f_disp16 = ((((f_disp16_hi) << (14))) | (f_disp16_low));\
360 } while (0);\
361   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
362   f_p = EXTRACT_UINT (insn, 32, 19, 1); \
363   f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
364   f_fmt2_rcond = EXTRACT_UINT (insn, 32, 27, 3); \
365   f_bpr_res28_1 = EXTRACT_INT (insn, 32, 28, 1); \
366   f_a = EXTRACT_UINT (insn, 32, 29, 1); \
367   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
368
369 #define EXTRACT_IFMT_BPCC_BA_VARS \
370   /* Instruction fields.  */ \
371   INT f_disp19; \
372   UINT f_p; \
373   UINT f_fmt2_cc0; \
374   UINT f_fmt2_cc1; \
375   UINT f_op2; \
376   UINT f_fmt2_cond; \
377   UINT f_a; \
378   UINT f_op; \
379   unsigned int length;
380 #define EXTRACT_IFMT_BPCC_BA_CODE \
381   length = 4; \
382   f_disp19 = EXTRACT_INT (insn, 32, 13, 19); \
383   f_p = EXTRACT_UINT (insn, 32, 19, 1); \
384   f_fmt2_cc0 = EXTRACT_UINT (insn, 32, 20, 1); \
385   f_fmt2_cc1 = EXTRACT_UINT (insn, 32, 21, 1); \
386   f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
387   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
388   f_a = EXTRACT_UINT (insn, 32, 29, 1); \
389   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
390
391 #define EXTRACT_IFMT_DONE_VARS \
392   /* Instruction fields.  */ \
393   INT f_res_18_19; \
394   UINT f_op3; \
395   UINT f_fcn; \
396   UINT f_op; \
397   unsigned int length;
398 #define EXTRACT_IFMT_DONE_CODE \
399   length = 4; \
400   f_res_18_19 = EXTRACT_INT (insn, 32, 18, 19); \
401   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
402   f_fcn = EXTRACT_UINT (insn, 32, 29, 5); \
403   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
404
405 #define EXTRACT_IFMT_FLUSH_VARS \
406   /* Instruction fields.  */ \
407   UINT f_rs2; \
408   INT f_res_asi; \
409   UINT f_i; \
410   UINT f_rs1; \
411   UINT f_op3; \
412   UINT f_rd; \
413   UINT f_op; \
414   unsigned int length;
415 #define EXTRACT_IFMT_FLUSH_CODE \
416   length = 4; \
417   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
418   f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
419   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
420   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
421   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
422   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
423   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
424
425 #define EXTRACT_IFMT_FLUSH_IMM_VARS \
426   /* Instruction fields.  */ \
427   INT f_simm13; \
428   UINT f_i; \
429   UINT f_rs1; \
430   UINT f_op3; \
431   UINT f_rd; \
432   UINT f_op; \
433   unsigned int length;
434 #define EXTRACT_IFMT_FLUSH_IMM_CODE \
435   length = 4; \
436   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
437   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
438   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
439   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
440   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
441   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
442
443 #define EXTRACT_IFMT_FLUSHW_VARS \
444   /* Instruction fields.  */ \
445   INT f_simm13; \
446   UINT f_i; \
447   UINT f_rs1; \
448   UINT f_op3; \
449   UINT f_rd; \
450   UINT f_op; \
451   unsigned int length;
452 #define EXTRACT_IFMT_FLUSHW_CODE \
453   length = 4; \
454   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
455   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
456   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
457   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
458   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
459   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
460
461 #define EXTRACT_IFMT_IMPDEP1_VARS \
462   /* Instruction fields.  */ \
463   INT f_impdep19; \
464   UINT f_op3; \
465   INT f_impdep5; \
466   UINT f_op; \
467   unsigned int length;
468 #define EXTRACT_IFMT_IMPDEP1_CODE \
469   length = 4; \
470   f_impdep19 = EXTRACT_INT (insn, 32, 18, 19); \
471   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
472   f_impdep5 = EXTRACT_INT (insn, 32, 29, 5); \
473   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
474
475 #define EXTRACT_IFMT_MEMBAR_VARS \
476   /* Instruction fields.  */ \
477   UINT f_membarmask; \
478   INT f_membar_res12_6; \
479   UINT f_i; \
480   UINT f_rs1; \
481   UINT f_op3; \
482   UINT f_rd; \
483   UINT f_op; \
484   unsigned int length;
485 #define EXTRACT_IFMT_MEMBAR_CODE \
486   length = 4; \
487   f_membarmask = EXTRACT_UINT (insn, 32, 6, 7); \
488   f_membar_res12_6 = EXTRACT_INT (insn, 32, 12, 6); \
489   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
490   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
491   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
492   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
493   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
494
495 #define EXTRACT_IFMT_MOVA_ICC_ICC_VARS \
496   /* Instruction fields.  */ \
497   UINT f_rs2; \
498   INT f_fmt4_res10_6; \
499   UINT f_fmt4_cc1_0; \
500   UINT f_i; \
501   UINT f_fmt4_cc2; \
502   UINT f_op3; \
503   UINT f_fmt2_cond; \
504   UINT f_rd; \
505   UINT f_op; \
506   unsigned int length;
507 #define EXTRACT_IFMT_MOVA_ICC_ICC_CODE \
508   length = 4; \
509   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
510   f_fmt4_res10_6 = EXTRACT_INT (insn, 32, 10, 6); \
511   f_fmt4_cc1_0 = EXTRACT_UINT (insn, 32, 12, 2); \
512   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
513   f_fmt4_cc2 = EXTRACT_UINT (insn, 32, 18, 1); \
514   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
515   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
516   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
517   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
518
519 #define EXTRACT_IFMT_MOVA_IMM_ICC_ICC_VARS \
520   /* Instruction fields.  */ \
521   INT f_simm11; \
522   UINT f_fmt4_cc1_0; \
523   UINT f_i; \
524   UINT f_fmt4_cc2; \
525   UINT f_op3; \
526   UINT f_fmt2_cond; \
527   UINT f_rd; \
528   UINT f_op; \
529   unsigned int length;
530 #define EXTRACT_IFMT_MOVA_IMM_ICC_ICC_CODE \
531   length = 4; \
532   f_simm11 = EXTRACT_INT (insn, 32, 10, 11); \
533   f_fmt4_cc1_0 = EXTRACT_UINT (insn, 32, 12, 2); \
534   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
535   f_fmt4_cc2 = EXTRACT_UINT (insn, 32, 18, 1); \
536   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
537   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
538   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
539   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
540
541 #define EXTRACT_IFMT_LDSB_REG_REG_VARS \
542   /* Instruction fields.  */ \
543   UINT f_rs2; \
544   INT f_res_asi; \
545   UINT f_i; \
546   UINT f_rs1; \
547   UINT f_op3; \
548   UINT f_rd; \
549   UINT f_op; \
550   unsigned int length;
551 #define EXTRACT_IFMT_LDSB_REG_REG_CODE \
552   length = 4; \
553   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
554   f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
555   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
556   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
557   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
558   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
559   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
560
561 #define EXTRACT_IFMT_LDSB_REG_IMM_VARS \
562   /* Instruction fields.  */ \
563   INT f_simm13; \
564   UINT f_i; \
565   UINT f_rs1; \
566   UINT f_op3; \
567   UINT f_rd; \
568   UINT f_op; \
569   unsigned int length;
570 #define EXTRACT_IFMT_LDSB_REG_IMM_CODE \
571   length = 4; \
572   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
573   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
574   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
575   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
576   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
577   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
578
579 #define EXTRACT_IFMT_LDSB_REG_REG_ASI_VARS \
580   /* Instruction fields.  */ \
581   UINT f_rs2; \
582   UINT f_asi; \
583   UINT f_i; \
584   UINT f_rs1; \
585   UINT f_op3; \
586   UINT f_rd; \
587   UINT f_op; \
588   unsigned int length;
589 #define EXTRACT_IFMT_LDSB_REG_REG_ASI_CODE \
590   length = 4; \
591   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
592   f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
593   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
594   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
595   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
596   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
597   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
598
599 #define EXTRACT_IFMT_LDD_REG_REG_VARS \
600   /* Instruction fields.  */ \
601   UINT f_rs2; \
602   INT f_res_asi; \
603   UINT f_i; \
604   UINT f_rs1; \
605   UINT f_op3; \
606   UINT f_rd; \
607   UINT f_op; \
608   unsigned int length;
609 #define EXTRACT_IFMT_LDD_REG_REG_CODE \
610   length = 4; \
611   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
612   f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
613   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
614   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
615   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
616   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
617   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
618
619 #define EXTRACT_IFMT_LDD_REG_IMM_VARS \
620   /* Instruction fields.  */ \
621   INT f_simm13; \
622   UINT f_i; \
623   UINT f_rs1; \
624   UINT f_op3; \
625   UINT f_rd; \
626   UINT f_op; \
627   unsigned int length;
628 #define EXTRACT_IFMT_LDD_REG_IMM_CODE \
629   length = 4; \
630   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
631   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
632   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
633   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
634   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
635   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
636
637 #define EXTRACT_IFMT_LDD_REG_REG_ASI_VARS \
638   /* Instruction fields.  */ \
639   UINT f_rs2; \
640   UINT f_asi; \
641   UINT f_i; \
642   UINT f_rs1; \
643   UINT f_op3; \
644   UINT f_rd; \
645   UINT f_op; \
646   unsigned int length;
647 #define EXTRACT_IFMT_LDD_REG_REG_ASI_CODE \
648   length = 4; \
649   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
650   f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
651   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
652   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
653   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
654   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
655   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
656
657 #define EXTRACT_IFMT_FP_LD_REG_REG_VARS \
658   /* Instruction fields.  */ \
659   UINT f_rs2; \
660   INT f_res_asi; \
661   UINT f_i; \
662   UINT f_rs1; \
663   UINT f_op3; \
664   UINT f_rd; \
665   UINT f_op; \
666   unsigned int length;
667 #define EXTRACT_IFMT_FP_LD_REG_REG_CODE \
668   length = 4; \
669   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
670   f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
671   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
672   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
673   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
674   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
675   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
676
677 #define EXTRACT_IFMT_FP_LD_REG_IMM_VARS \
678   /* Instruction fields.  */ \
679   INT f_simm13; \
680   UINT f_i; \
681   UINT f_rs1; \
682   UINT f_op3; \
683   UINT f_rd; \
684   UINT f_op; \
685   unsigned int length;
686 #define EXTRACT_IFMT_FP_LD_REG_IMM_CODE \
687   length = 4; \
688   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
689   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
690   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
691   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
692   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
693   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
694
695 #define EXTRACT_IFMT_FP_LD_REG_REG_ASI_VARS \
696   /* Instruction fields.  */ \
697   UINT f_rs2; \
698   UINT f_asi; \
699   UINT f_i; \
700   UINT f_rs1; \
701   UINT f_op3; \
702   UINT f_rd; \
703   UINT f_op; \
704   unsigned int length;
705 #define EXTRACT_IFMT_FP_LD_REG_REG_ASI_CODE \
706   length = 4; \
707   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
708   f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
709   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
710   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
711   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
712   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
713   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
714
715 #define EXTRACT_IFMT_SETHI_VARS \
716   /* Instruction fields.  */ \
717   INT f_hi22; \
718   UINT f_op2; \
719   UINT f_rd; \
720   UINT f_op; \
721   unsigned int length;
722 #define EXTRACT_IFMT_SETHI_CODE \
723   length = 4; \
724   f_hi22 = EXTRACT_INT (insn, 32, 21, 22); \
725   f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
726   f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
727   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
728
729 #define EXTRACT_IFMT_UNIMP_VARS \
730   /* Instruction fields.  */ \
731   INT f_imm22; \
732   UINT f_op2; \
733   UINT f_rd_res; \
734   UINT f_op; \
735   unsigned int length;
736 #define EXTRACT_IFMT_UNIMP_CODE \
737   length = 4; \
738   f_imm22 = EXTRACT_INT (insn, 32, 21, 22); \
739   f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
740   f_rd_res = EXTRACT_UINT (insn, 32, 29, 5); \
741   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
742
743 #define EXTRACT_IFMT_CALL_VARS \
744   /* Instruction fields.  */ \
745   SI f_disp30; \
746   UINT f_op; \
747   unsigned int length;
748 #define EXTRACT_IFMT_CALL_CODE \
749   length = 4; \
750   f_disp30 = ((((EXTRACT_INT (insn, 32, 29, 30)) << (2))) + (pc)); \
751   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
752
753 #define EXTRACT_IFMT_BA_VARS \
754   /* Instruction fields.  */ \
755   SI f_disp22; \
756   UINT f_op2; \
757   UINT f_fmt2_cond; \
758   UINT f_a; \
759   UINT f_op; \
760   unsigned int length;
761 #define EXTRACT_IFMT_BA_CODE \
762   length = 4; \
763   f_disp22 = ((((EXTRACT_INT (insn, 32, 21, 22)) << (2))) + (pc)); \
764   f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
765   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
766   f_a = EXTRACT_UINT (insn, 32, 29, 1); \
767   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
768
769 #define EXTRACT_IFMT_TA_VARS \
770   /* Instruction fields.  */ \
771   UINT f_rs2; \
772   INT f_res_asi; \
773   UINT f_i; \
774   UINT f_rs1; \
775   UINT f_op3; \
776   UINT f_fmt2_cond; \
777   UINT f_a; \
778   UINT f_op; \
779   unsigned int length;
780 #define EXTRACT_IFMT_TA_CODE \
781   length = 4; \
782   f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
783   f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
784   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
785   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
786   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
787   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
788   f_a = EXTRACT_UINT (insn, 32, 29, 1); \
789   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
790
791 #define EXTRACT_IFMT_TA_IMM_VARS \
792   /* Instruction fields.  */ \
793   INT f_simm13; \
794   UINT f_i; \
795   UINT f_rs1; \
796   UINT f_op3; \
797   UINT f_fmt2_cond; \
798   UINT f_a; \
799   UINT f_op; \
800   unsigned int length;
801 #define EXTRACT_IFMT_TA_IMM_CODE \
802   length = 4; \
803   f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
804   f_i = EXTRACT_UINT (insn, 32, 13, 1); \
805   f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
806   f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
807   f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
808   f_a = EXTRACT_UINT (insn, 32, 29, 1); \
809   f_op = EXTRACT_UINT (insn, 32, 31, 2); \
810
811 /* Collection of various things for the trace handler to use.  */
812
813 typedef struct trace_record {
814   IADDR pc;
815   /* FIXME:wip */
816 } TRACE_RECORD;
817
818 #endif /* CPU_SPARC64_H */