Revision af7bf89b target-sparc/cpu.h
b/target-sparc/cpu.h | ||
---|---|---|
1 | 1 |
#ifndef CPU_SPARC_H |
2 | 2 |
#define CPU_SPARC_H |
3 | 3 |
|
4 |
#include "config.h" |
|
5 |
|
|
6 |
#if !defined(TARGET_SPARC64) |
|
4 | 7 |
#define TARGET_LONG_BITS 32 |
8 |
#define TARGET_FPREGS 32 |
|
9 |
#define TARGET_FPREG_T float |
|
10 |
#else |
|
11 |
#define TARGET_LONG_BITS 64 |
|
12 |
#define TARGET_FPREGS 64 |
|
13 |
#define TARGET_FPREG_T double |
|
14 |
#endif |
|
5 | 15 |
|
6 | 16 |
#include "cpu-defs.h" |
7 | 17 |
|
... | ... | |
95 | 105 |
#define NWINDOWS 32 |
96 | 106 |
|
97 | 107 |
typedef struct CPUSPARCState { |
98 |
uint32_t gregs[8]; /* general registers */
|
|
99 |
uint32_t *regwptr; /* pointer to current register window */
|
|
100 |
float fpr[32]; /* floating point registers */
|
|
101 |
uint32_t pc; /* program counter */
|
|
102 |
uint32_t npc; /* next program counter */
|
|
103 |
uint32_t y; /* multiply/divide register */
|
|
108 |
target_ulong gregs[8]; /* general registers */
|
|
109 |
target_ulong *regwptr; /* pointer to current register window */
|
|
110 |
TARGET_FPREG_T fpr[TARGET_FPREGS]; /* floating point registers */
|
|
111 |
target_ulong pc; /* program counter */
|
|
112 |
target_ulong npc; /* next program counter */
|
|
113 |
target_ulong y; /* multiply/divide register */
|
|
104 | 114 |
uint32_t psr; /* processor state register */ |
105 | 115 |
uint32_t fsr; /* FPU state register */ |
106 |
uint32_t T2; |
|
107 | 116 |
uint32_t cwp; /* index of current register window (extracted |
108 | 117 |
from PSR) */ |
109 | 118 |
uint32_t wim; /* window invalid mask */ |
... | ... | |
118 | 127 |
int exception_index; |
119 | 128 |
int interrupt_index; |
120 | 129 |
int interrupt_request; |
121 |
uint32_t exception_next_pc;
|
|
130 |
target_ulong exception_next_pc;
|
|
122 | 131 |
struct TranslationBlock *current_tb; |
123 | 132 |
void *opaque; |
124 | 133 |
/* NOTE: we allow 8 more registers to handle wrapping */ |
125 |
uint32_t regbase[NWINDOWS * 16 + 8];
|
|
134 |
target_ulong regbase[NWINDOWS * 16 + 8];
|
|
126 | 135 |
|
127 | 136 |
/* in order to avoid passing too many arguments to the memory |
128 | 137 |
write helpers, we store some rarely used information in the CPU |
... | ... | |
140 | 149 |
/* temporary float registers */ |
141 | 150 |
float ft0, ft1, ft2; |
142 | 151 |
double dt0, dt1, dt2; |
152 |
#if defined(TARGET_SPARC64) |
|
153 |
target_ulong t0, t1, t2; |
|
154 |
#endif |
|
143 | 155 |
|
144 | 156 |
/* ice debug support */ |
145 |
uint32_t breakpoints[MAX_BREAKPOINTS];
|
|
157 |
target_ulong breakpoints[MAX_BREAKPOINTS];
|
|
146 | 158 |
int nb_breakpoints; |
147 | 159 |
int singlestep_enabled; /* XXX: should use CPU single step mode instead */ |
148 | 160 |
|
... | ... | |
155 | 167 |
double cpu_put_fp64(uint64_t mant, uint16_t exp); |
156 | 168 |
|
157 | 169 |
/* Fake impl 0, version 4 */ |
158 |
#define GET_PSR(env) ((0 << 28) | (4 << 24) | env->psr | \
|
|
170 |
#define GET_PSR(env) ((0 << 28) | (4 << 24) | (env->psr & PSR_ICC) | \
|
|
159 | 171 |
(env->psref? PSR_EF : 0) | \ |
160 | 172 |
(env->psrpil << 8) | \ |
161 | 173 |
(env->psrs? PSR_S : 0) | \ |
... | ... | |
167 | 179 |
#endif |
168 | 180 |
|
169 | 181 |
#define PUT_PSR(env, val) do { int _tmp = val; \ |
170 |
env->psr = _tmp & ~PSR_ICC; \
|
|
182 |
env->psr = _tmp & PSR_ICC; \ |
|
171 | 183 |
env->psref = (_tmp & PSR_EF)? 1 : 0; \ |
172 | 184 |
env->psrpil = (_tmp & PSR_PIL) >> 8; \ |
173 | 185 |
env->psrs = (_tmp & PSR_S)? 1 : 0; \ |
Also available in: Unified diff