Revision 6ad02592
b/target-alpha/cpu.h | ||
---|---|---|
269 | 269 |
uint64_t ps; |
270 | 270 |
uint64_t unique; |
271 | 271 |
int saved_mode; /* Used for HW_LD / HW_ST */ |
272 |
int intr_flag; /* For RC and RS */ |
|
272 | 273 |
|
273 | 274 |
#if TARGET_LONG_BITS > HOST_LONG_BITS |
274 | 275 |
/* temporary fixed-point registers |
b/target-alpha/helper.h | ||
---|---|---|
4 | 4 |
|
5 | 5 |
DEF_HELPER(void, helper_tb_flush, (void)) |
6 | 6 |
|
7 |
DEF_HELPER(void, helper_excp, (int, int)) |
|
7 | 8 |
DEF_HELPER(uint64_t, helper_amask, (uint64_t)) |
9 |
DEF_HELPER(uint64_t, helper_load_pcc, (void)) |
|
10 |
DEF_HELPER(uint64_t, helper_load_implver, (void)) |
|
11 |
DEF_HELPER(uint64_t, helper_rc, (void)) |
|
12 |
DEF_HELPER(uint64_t, helper_rs, (void)) |
|
8 | 13 |
|
9 | 14 |
DEF_HELPER(uint64_t, helper_ctpop, (uint64_t)) |
10 | 15 |
DEF_HELPER(uint64_t, helper_ctlz, (uint64_t)) |
b/target-alpha/op.c | ||
---|---|---|
149 | 149 |
#endif |
150 | 150 |
|
151 | 151 |
/* Misc */ |
152 |
void OPPROTO op_excp (void) |
|
153 |
{ |
|
154 |
helper_excp(PARAM(1), PARAM(2)); |
|
155 |
RETURN(); |
|
156 |
} |
|
157 |
|
|
158 |
void OPPROTO op_load_pcc (void) |
|
159 |
{ |
|
160 |
helper_load_pcc(); |
|
161 |
RETURN(); |
|
162 |
} |
|
163 |
|
|
164 |
void OPPROTO op_load_implver (void) |
|
165 |
{ |
|
166 |
helper_load_implver(); |
|
167 |
RETURN(); |
|
168 |
} |
|
169 |
|
|
170 | 152 |
void OPPROTO op_load_fpcr (void) |
171 | 153 |
{ |
172 | 154 |
helper_load_fpcr(); |
... | ... | |
179 | 161 |
RETURN(); |
180 | 162 |
} |
181 | 163 |
|
182 |
void OPPROTO op_load_irf (void) |
|
183 |
{ |
|
184 |
helper_load_irf(); |
|
185 |
RETURN(); |
|
186 |
} |
|
187 |
|
|
188 |
void OPPROTO op_set_irf (void) |
|
189 |
{ |
|
190 |
helper_set_irf(); |
|
191 |
RETURN(); |
|
192 |
} |
|
193 |
|
|
194 |
void OPPROTO op_clear_irf (void) |
|
195 |
{ |
|
196 |
helper_clear_irf(); |
|
197 |
RETURN(); |
|
198 |
} |
|
199 |
|
|
200 | 164 |
/* Arithmetic */ |
201 | 165 |
void OPPROTO op_addqv (void) |
202 | 166 |
{ |
b/target-alpha/op_helper.c | ||
---|---|---|
58 | 58 |
|
59 | 59 |
/*****************************************************************************/ |
60 | 60 |
/* Exceptions processing helpers */ |
61 |
void helper_excp (uint32_t excp, uint32_t error)
|
|
61 |
void helper_excp (int excp, int error)
|
|
62 | 62 |
{ |
63 | 63 |
env->exception_index = excp; |
64 | 64 |
env->error_code = error; |
... | ... | |
80 | 80 |
return arg; |
81 | 81 |
} |
82 | 82 |
|
83 |
void helper_load_pcc (void)
|
|
83 |
uint64_t helper_load_pcc (void)
|
|
84 | 84 |
{ |
85 | 85 |
/* XXX: TODO */ |
86 |
T0 = 0;
|
|
86 |
return 0;
|
|
87 | 87 |
} |
88 | 88 |
|
89 |
void helper_load_implver (void)
|
|
89 |
uint64_t helper_load_implver (void)
|
|
90 | 90 |
{ |
91 |
T0 = env->implver;
|
|
91 |
return env->implver;
|
|
92 | 92 |
} |
93 | 93 |
|
94 | 94 |
void helper_load_fpcr (void) |
... | ... | |
137 | 137 |
} |
138 | 138 |
} |
139 | 139 |
|
140 |
void helper_load_irf (void) |
|
141 |
{ |
|
142 |
/* XXX: TODO */ |
|
143 |
T0 = 0; |
|
144 |
} |
|
140 |
spinlock_t intr_cpu_lock = SPIN_LOCK_UNLOCKED; |
|
145 | 141 |
|
146 |
void helper_set_irf (void)
|
|
142 |
uint64_t helper_rs(void)
|
|
147 | 143 |
{ |
148 |
/* XXX: TODO */ |
|
144 |
uint64_t tmp; |
|
145 |
|
|
146 |
spin_lock(&intr_cpu_lock); |
|
147 |
tmp = env->intr_flag; |
|
148 |
env->intr_flag = 1; |
|
149 |
spin_unlock(&intr_cpu_lock); |
|
150 |
|
|
151 |
return tmp; |
|
149 | 152 |
} |
150 | 153 |
|
151 |
void helper_clear_irf (void)
|
|
154 |
uint64_t helper_rc(void)
|
|
152 | 155 |
{ |
153 |
/* XXX: TODO */ |
|
156 |
uint64_t tmp; |
|
157 |
|
|
158 |
spin_lock(&intr_cpu_lock); |
|
159 |
tmp = env->intr_flag; |
|
160 |
env->intr_flag = 0; |
|
161 |
spin_unlock(&intr_cpu_lock); |
|
162 |
|
|
163 |
return tmp; |
|
154 | 164 |
} |
155 | 165 |
|
156 | 166 |
void helper_addqv (void) |
b/target-alpha/op_helper.h | ||
---|---|---|
19 | 19 |
*/ |
20 | 20 |
|
21 | 21 |
void helper_call_pal (uint32_t palcode); |
22 |
void helper_excp (uint32_t excp, uint32_t error); |
|
23 |
void helper_load_pcc (void); |
|
24 |
void helper_load_implver (void); |
|
25 | 22 |
void helper_load_fpcr (void); |
26 | 23 |
void helper_store_fpcr (void); |
27 |
void helper_load_irf (void); |
|
28 |
void helper_set_irf (void); |
|
29 |
void helper_clear_irf (void); |
|
30 | 24 |
void helper_addqv (void); |
31 | 25 |
void helper_addlv (void); |
32 | 26 |
void helper_subqv (void); |
b/target-alpha/translate.c | ||
---|---|---|
250 | 250 |
static always_inline void gen_excp (DisasContext *ctx, |
251 | 251 |
int exception, int error_code) |
252 | 252 |
{ |
253 |
TCGv tmp1, tmp2; |
|
254 |
|
|
253 | 255 |
tcg_gen_movi_i64(cpu_pc, ctx->pc); |
254 |
gen_op_excp(exception, error_code); |
|
256 |
tmp1 = tcg_const_i32(exception); |
|
257 |
tmp2 = tcg_const_i32(error_code); |
|
258 |
tcg_gen_helper_0_2(helper_excp, tmp1, tmp2); |
|
259 |
tcg_temp_free(tmp2); |
|
260 |
tcg_temp_free(tmp1); |
|
255 | 261 |
} |
256 | 262 |
|
257 | 263 |
static always_inline void gen_invalid (DisasContext *ctx) |
... | ... | |
1176 | 1182 |
break; |
1177 | 1183 |
case 0x6C: |
1178 | 1184 |
/* IMPLVER */ |
1179 |
gen_op_load_implver(); |
|
1180 | 1185 |
if (rc != 31) |
1181 |
tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
|
|
1186 |
tcg_gen_helper_1_0(helper_load_implver, cpu_ir[rc]);
|
|
1182 | 1187 |
break; |
1183 | 1188 |
default: |
1184 | 1189 |
goto invalid_opc; |
... | ... | |
1699 | 1704 |
break; |
1700 | 1705 |
case 0xC000: |
1701 | 1706 |
/* RPCC */ |
1702 |
gen_op_load_pcc(); |
|
1703 | 1707 |
if (ra != 31) |
1704 |
tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
|
|
1708 |
tcg_gen_helper_1_0(helper_load_pcc, cpu_ir[ra]);
|
|
1705 | 1709 |
break; |
1706 | 1710 |
case 0xE000: |
1707 | 1711 |
/* RC */ |
1708 |
gen_op_load_irf(); |
|
1709 | 1712 |
if (ra != 31) |
1710 |
tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]); |
|
1711 |
gen_op_clear_irf(); |
|
1713 |
tcg_gen_helper_1_0(helper_rc, cpu_ir[ra]); |
|
1712 | 1714 |
break; |
1713 | 1715 |
case 0xE800: |
1714 | 1716 |
/* ECB */ |
... | ... | |
1721 | 1723 |
break; |
1722 | 1724 |
case 0xF000: |
1723 | 1725 |
/* RS */ |
1724 |
gen_op_load_irf(); |
|
1725 | 1726 |
if (ra != 31) |
1726 |
tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]); |
|
1727 |
gen_op_set_irf(); |
|
1727 |
tcg_gen_helper_1_0(helper_rs, cpu_ir[ra]); |
|
1728 | 1728 |
break; |
1729 | 1729 |
case 0xF800: |
1730 | 1730 |
/* WH64 */ |
Also available in: Unified diff