1 /* CPU family header for sparc32.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1999 Cygnus Solutions, Inc.
7 This file is part of the Cygnus Simulators.
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
19 /* Maximum number of instructions that can be executed in parallel. */
20 #define MAX_PARALLEL_INSNS 1
22 /* CPU state information. */
24 /* Hardware elements. */
28 #define GET_H_PC() CPU (h_pc)
29 #define SET_H_PC(x) (CPU (h_pc) = (x))
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 */
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 */
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 */
46 #define GET_H_ICC_V() CPU (h_icc_v)
47 #define SET_H_ICC_V(x) (CPU (h_icc_v) = (x))
50 #define GET_H_ICC_Z() CPU (h_icc_z)
51 #define SET_H_ICC_Z(x) (CPU (h_icc_z) = (x))
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 */
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 */
62 #define GET_H_XCC_V() CPU (h_xcc_v)
63 #define SET_H_XCC_V(x) (CPU (h_xcc_v) = (x))
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 */
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 */
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 */
80 #define GET_H_FR(a1) CPU (h_fr)[a1]
81 #define SET_H_FR(a1, x) (CPU (h_fr)[a1] = (x))
84 /* GET_H_PSR macro user-written */
85 /* SET_H_PSR macro user-written */
88 #define GET_H_S() CPU (h_s)
89 #define SET_H_S(x) (CPU (h_s) = (x))
90 /* previous supervisor bit */
92 #define GET_H_PS() CPU (h_ps)
93 #define SET_H_PS(x) (CPU (h_ps) = (x))
94 /* processor interrupt level */
96 #define GET_H_PIL() CPU (h_pil)
97 #define SET_H_PIL(x) (CPU (h_pil) = (x))
98 /* enable traps bit */
100 #define GET_H_ET() CPU (h_et)
101 #define SET_H_ET(x) (CPU (h_et) = (x))
104 /* GET_H_TBR macro user-written */
105 /* SET_H_TBR macro user-written */
106 /* current window pointer */
108 /* GET_H_CWP macro user-written */
109 /* SET_H_CWP macro user-written */
110 /* window invalid mask */
112 /* GET_H_WIM macro user-written */
113 /* SET_H_WIM macro user-written */
114 /* alternate global indicator */
116 #define GET_H_AG() CPU (h_ag)
117 #define SET_H_AG(x) (CPU (h_ag) = (x))
118 /* enable coprocessor bit */
120 #define GET_H_EC() CPU (h_ec)
121 #define SET_H_EC(x) (CPU (h_ec) = (x))
124 #define GET_H_EF() CPU (h_ef)
125 #define SET_H_EF(x) (CPU (h_ef) = (x))
126 /* floating point status register */
128 #define GET_H_FSR() CPU (h_fsr)
129 #define SET_H_FSR(x) (CPU (h_fsr) = (x))
131 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
134 /* Cover fns for register access. */
135 USI
sparc32_h_pc_get (SIM_CPU
*);
136 void sparc32_h_pc_set (SIM_CPU
*, USI
);
137 SI
sparc32_h_npc_get (SIM_CPU
*);
138 void sparc32_h_npc_set (SIM_CPU
*, SI
);
139 SI
sparc32_h_gr_get (SIM_CPU
*, UINT
);
140 void sparc32_h_gr_set (SIM_CPU
*, UINT
, SI
);
141 BI
sparc32_h_icc_c_get (SIM_CPU
*);
142 void sparc32_h_icc_c_set (SIM_CPU
*, BI
);
143 BI
sparc32_h_icc_n_get (SIM_CPU
*);
144 void sparc32_h_icc_n_set (SIM_CPU
*, BI
);
145 BI
sparc32_h_icc_v_get (SIM_CPU
*);
146 void sparc32_h_icc_v_set (SIM_CPU
*, BI
);
147 BI
sparc32_h_icc_z_get (SIM_CPU
*);
148 void sparc32_h_icc_z_set (SIM_CPU
*, BI
);
149 BI
sparc32_h_xcc_c_get (SIM_CPU
*);
150 void sparc32_h_xcc_c_set (SIM_CPU
*, BI
);
151 BI
sparc32_h_xcc_n_get (SIM_CPU
*);
152 void sparc32_h_xcc_n_set (SIM_CPU
*, BI
);
153 BI
sparc32_h_xcc_v_get (SIM_CPU
*);
154 void sparc32_h_xcc_v_set (SIM_CPU
*, BI
);
155 BI
sparc32_h_xcc_z_get (SIM_CPU
*);
156 void sparc32_h_xcc_z_set (SIM_CPU
*, BI
);
157 SI
sparc32_h_y_get (SIM_CPU
*);
158 void sparc32_h_y_set (SIM_CPU
*, SI
);
159 SI
sparc32_h_asr_get (SIM_CPU
*, UINT
);
160 void sparc32_h_asr_set (SIM_CPU
*, UINT
, SI
);
161 BI
sparc32_h_annul_p_get (SIM_CPU
*);
162 void sparc32_h_annul_p_set (SIM_CPU
*, BI
);
163 SF
sparc32_h_fr_get (SIM_CPU
*, UINT
);
164 void sparc32_h_fr_set (SIM_CPU
*, UINT
, SF
);
165 USI
sparc32_h_psr_get (SIM_CPU
*);
166 void sparc32_h_psr_set (SIM_CPU
*, USI
);
167 BI
sparc32_h_s_get (SIM_CPU
*);
168 void sparc32_h_s_set (SIM_CPU
*, BI
);
169 BI
sparc32_h_ps_get (SIM_CPU
*);
170 void sparc32_h_ps_set (SIM_CPU
*, BI
);
171 UQI
sparc32_h_pil_get (SIM_CPU
*);
172 void sparc32_h_pil_set (SIM_CPU
*, UQI
);
173 BI
sparc32_h_et_get (SIM_CPU
*);
174 void sparc32_h_et_set (SIM_CPU
*, BI
);
175 SI
sparc32_h_tbr_get (SIM_CPU
*);
176 void sparc32_h_tbr_set (SIM_CPU
*, SI
);
177 UQI
sparc32_h_cwp_get (SIM_CPU
*);
178 void sparc32_h_cwp_set (SIM_CPU
*, UQI
);
179 USI
sparc32_h_wim_get (SIM_CPU
*);
180 void sparc32_h_wim_set (SIM_CPU
*, USI
);
181 QI
sparc32_h_ag_get (SIM_CPU
*);
182 void sparc32_h_ag_set (SIM_CPU
*, QI
);
183 BI
sparc32_h_ec_get (SIM_CPU
*);
184 void sparc32_h_ec_set (SIM_CPU
*, BI
);
185 BI
sparc32_h_ef_get (SIM_CPU
*);
186 void sparc32_h_ef_set (SIM_CPU
*, BI
);
187 USI
sparc32_h_fsr_get (SIM_CPU
*);
188 void sparc32_h_fsr_set (SIM_CPU
*, USI
);
190 /* These must be hand-written. */
191 extern CPUREG_FETCH_FN sparc32_fetch_register
;
192 extern CPUREG_STORE_FN sparc32_store_register
;
196 } MODEL_SPARC32_DEF_DATA
;
198 /* The ARGBUF struct. */
200 /* These are the baseclass definitions. */
205 /* cpu specific data follows */
212 ??? SCACHE used to contain more than just argbuf. We could delete the
213 type entirely and always just use ARGBUF, but for future concerns and as
214 a level of abstraction it is left in. */
217 struct argbuf argbuf
;
220 /* Macros to simplify extraction, reading and semantic code.
221 These define and assign the local vars that contain the insn's fields. */
223 #define EXTRACT_IFMT_EMPTY_VARS \
224 /* Instruction fields. */ \
226 #define EXTRACT_IFMT_EMPTY_CODE \
229 #define EXTRACT_IFMT_RD_ASR_VARS \
230 /* Instruction fields. */ \
238 #define EXTRACT_IFMT_RD_ASR_CODE \
240 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
241 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
242 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
243 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
244 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
245 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
247 #define EXTRACT_IFMT_WR_ASR_VARS \
248 /* Instruction fields. */ \
257 #define EXTRACT_IFMT_WR_ASR_CODE \
259 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
260 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
261 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
262 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
263 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
264 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
265 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
267 #define EXTRACT_IFMT_WR_ASR_IMM_VARS \
268 /* Instruction fields. */ \
276 #define EXTRACT_IFMT_WR_ASR_IMM_CODE \
278 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
279 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
280 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
281 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
282 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
283 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
285 #define EXTRACT_IFMT_RD_PSR_VARS \
286 /* Instruction fields. */ \
294 #define EXTRACT_IFMT_RD_PSR_CODE \
296 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
297 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
298 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
299 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
300 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
301 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
303 #define EXTRACT_IFMT_WR_PSR_VARS \
304 /* Instruction fields. */ \
313 #define EXTRACT_IFMT_WR_PSR_CODE \
315 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
316 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
317 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
318 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
319 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
320 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
321 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
323 #define EXTRACT_IFMT_WR_PSR_IMM_VARS \
324 /* Instruction fields. */ \
332 #define EXTRACT_IFMT_WR_PSR_IMM_CODE \
334 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
335 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
336 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
337 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
338 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
339 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
341 #define EXTRACT_IFMT_LDSTUB_REG_REG_VARS \
342 /* Instruction fields. */ \
351 #define EXTRACT_IFMT_LDSTUB_REG_REG_CODE \
353 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
354 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
355 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
356 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
357 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
358 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
359 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
361 #define EXTRACT_IFMT_LDSTUB_REG_IMM_VARS \
362 /* Instruction fields. */ \
370 #define EXTRACT_IFMT_LDSTUB_REG_IMM_CODE \
372 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
373 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
374 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
375 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
376 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
377 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
379 #define EXTRACT_IFMT_LDSTUB_REG_REG_ASI_VARS \
380 /* Instruction fields. */ \
389 #define EXTRACT_IFMT_LDSTUB_REG_REG_ASI_CODE \
391 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
392 f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
393 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
394 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
395 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
396 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
397 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
399 #define EXTRACT_IFMT_LDD_REG_REG_VARS \
400 /* Instruction fields. */ \
409 #define EXTRACT_IFMT_LDD_REG_REG_CODE \
411 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
412 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
413 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
414 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
415 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
416 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
417 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
419 #define EXTRACT_IFMT_LDD_REG_IMM_VARS \
420 /* Instruction fields. */ \
428 #define EXTRACT_IFMT_LDD_REG_IMM_CODE \
430 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
431 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
432 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
433 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
434 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
435 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
437 #define EXTRACT_IFMT_LDD_REG_REG_ASI_VARS \
438 /* Instruction fields. */ \
447 #define EXTRACT_IFMT_LDD_REG_REG_ASI_CODE \
449 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
450 f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
451 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
452 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
453 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
454 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
455 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
457 #define EXTRACT_IFMT_FP_LD_REG_REG_VARS \
458 /* Instruction fields. */ \
467 #define EXTRACT_IFMT_FP_LD_REG_REG_CODE \
469 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
470 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
471 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
472 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
473 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
474 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
475 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
477 #define EXTRACT_IFMT_FP_LD_REG_IMM_VARS \
478 /* Instruction fields. */ \
486 #define EXTRACT_IFMT_FP_LD_REG_IMM_CODE \
488 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
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); \
495 #define EXTRACT_IFMT_FP_LD_REG_REG_ASI_VARS \
496 /* Instruction fields. */ \
505 #define EXTRACT_IFMT_FP_LD_REG_REG_ASI_CODE \
507 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
508 f_asi = EXTRACT_UINT (insn, 32, 12, 8); \
509 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
510 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
511 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
512 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
513 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
515 #define EXTRACT_IFMT_SETHI_VARS \
516 /* Instruction fields. */ \
522 #define EXTRACT_IFMT_SETHI_CODE \
524 f_hi22 = EXTRACT_INT (insn, 32, 21, 22); \
525 f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
526 f_rd = EXTRACT_UINT (insn, 32, 29, 5); \
527 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
529 #define EXTRACT_IFMT_UNIMP_VARS \
530 /* Instruction fields. */ \
536 #define EXTRACT_IFMT_UNIMP_CODE \
538 f_imm22 = EXTRACT_INT (insn, 32, 21, 22); \
539 f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
540 f_rd_res = EXTRACT_UINT (insn, 32, 29, 5); \
541 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
543 #define EXTRACT_IFMT_CALL_VARS \
544 /* Instruction fields. */ \
548 #define EXTRACT_IFMT_CALL_CODE \
550 f_disp30 = ((((EXTRACT_INT (insn, 32, 29, 30)) << (2))) + (pc)); \
551 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
553 #define EXTRACT_IFMT_BA_VARS \
554 /* Instruction fields. */ \
561 #define EXTRACT_IFMT_BA_CODE \
563 f_disp22 = ((((EXTRACT_INT (insn, 32, 21, 22)) << (2))) + (pc)); \
564 f_op2 = EXTRACT_UINT (insn, 32, 24, 3); \
565 f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
566 f_a = EXTRACT_UINT (insn, 32, 29, 1); \
567 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
569 #define EXTRACT_IFMT_TA_VARS \
570 /* Instruction fields. */ \
580 #define EXTRACT_IFMT_TA_CODE \
582 f_rs2 = EXTRACT_UINT (insn, 32, 4, 5); \
583 f_res_asi = EXTRACT_INT (insn, 32, 12, 8); \
584 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
585 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
586 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
587 f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
588 f_a = EXTRACT_UINT (insn, 32, 29, 1); \
589 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
591 #define EXTRACT_IFMT_TA_IMM_VARS \
592 /* Instruction fields. */ \
601 #define EXTRACT_IFMT_TA_IMM_CODE \
603 f_simm13 = EXTRACT_INT (insn, 32, 12, 13); \
604 f_i = EXTRACT_UINT (insn, 32, 13, 1); \
605 f_rs1 = EXTRACT_UINT (insn, 32, 18, 5); \
606 f_op3 = EXTRACT_UINT (insn, 32, 24, 6); \
607 f_fmt2_cond = EXTRACT_UINT (insn, 32, 28, 4); \
608 f_a = EXTRACT_UINT (insn, 32, 29, 1); \
609 f_op = EXTRACT_UINT (insn, 32, 31, 2); \
611 /* Collection of various things for the trace handler to use. */
613 typedef struct trace_record
{
618 #endif /* CPU_SPARC32_H */