target: e2k: Fix ctpr count.

This commit is contained in:
Denis Drakhnia 2020-11-22 09:37:45 +02:00 committed by Denis Drakhnia
parent a69c793e84
commit 3b5241ad15
5 changed files with 8 additions and 8 deletions

View File

@ -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 */

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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];

View File

@ -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) {