target: e2k: Fix ctpr count.
This commit is contained in:
parent
a69c793e84
commit
3b5241ad15
|
@ -240,7 +240,7 @@ typedef struct CPUArchState {
|
|||
uint64_t usd_hi;
|
||||
|
||||
/* control registers */
|
||||
target_ulong ctprs[4]; // Control Transfer Preparation Register (CTPR)
|
||||
target_ulong ctprs[3]; // Control Transfer Preparation Register (CTPR)
|
||||
target_ulong ct_cond;
|
||||
|
||||
/* special registers */
|
||||
|
|
|
@ -10,7 +10,7 @@ static inline void reset_ctprs(CPUE2KState *env)
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
env->ctprs[i] = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -527,7 +527,7 @@ void e2k_tcg_initialize(void) {
|
|||
offsetof(CPUE2KState, gregs[i]), buf);
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
snprintf(buf, ARRAY_SIZE(buf), "%%ctpr%d", i + 1);
|
||||
e2k_cs.ctprs[i] = tcg_global_mem_new(cpu_env,
|
||||
offsetof(CPUE2KState, ctprs[i]), buf);
|
||||
|
|
|
@ -57,7 +57,7 @@ typedef enum {
|
|||
typedef struct CPUE2KStateTCG {
|
||||
TCGv pc;
|
||||
TCGv npc;
|
||||
TCGv ctprs[4];
|
||||
TCGv ctprs[3];
|
||||
TCGv ct_cond;
|
||||
TCGv_i64 lsr;
|
||||
TCGv_i64 wregs[WREGS_SIZE];
|
||||
|
|
|
@ -269,14 +269,14 @@ static void gen_cs0(DisasContext *dc)
|
|||
if (type == LDISP) {
|
||||
reg |= (uint64_t) CTPR_OPC_LDISP << CTPR_OPC_OFF;
|
||||
}
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr], reg);
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr - 1], reg);
|
||||
} else if (type == SDISP) {
|
||||
unsigned int disp = GET_FIELD(cs0, 0, 27) << 11;
|
||||
target_ulong base = ((uint64_t) 0xe2 << 40) | disp;
|
||||
uint64_t reg = (dc->pc + base) |
|
||||
((uint64_t) CTPR_TAG_SDISP << CTPR_TAG_OFF) |
|
||||
((uint64_t) ipd << CTPR_IPD_OFF);
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr], reg);
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr - 1], reg);
|
||||
}
|
||||
|
||||
/* Note that RETURN is said to be COPF1. I can't understand what its
|
||||
|
@ -286,7 +286,7 @@ static void gen_cs0(DisasContext *dc)
|
|||
if (type == RETURN) {
|
||||
uint64_t reg = ((uint64_t) CTPR_TAG_RETURN << CTPR_TAG_OFF) |
|
||||
((uint64_t) ipd << CTPR_IPD_OFF);
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr], reg);
|
||||
tcg_gen_movi_tl(e2k_cs.ctprs[ctpr - 1], reg);
|
||||
}
|
||||
|
||||
/* GETTSD has as meaningless `CS0.param' as RETURN. The only
|
||||
|
@ -494,7 +494,7 @@ static void gen_jmp(DisasContext *dc)
|
|||
/* TODO: different kinds of ct */
|
||||
if (ctpr != 0) {
|
||||
dc->ct.type = CT_JUMP;
|
||||
dc->ct.u.ctpr = e2k_cs.ctprs[ctpr];
|
||||
dc->ct.u.ctpr = e2k_cs.ctprs[ctpr - 1];
|
||||
}
|
||||
|
||||
if (cond_type > 1) {
|
||||
|
|
Loading…
Reference in New Issue