target: e2k: Add basic setmas support.
This commit is contained in:
parent
d240aa2b85
commit
58663bb93e
|
@ -265,6 +265,11 @@ static inline void gen_goto_ctpr_disp(TCGv_i64 ctpr)
|
|||
tcg_temp_free_i64(t0);
|
||||
}
|
||||
|
||||
static inline void do_reset(DisasContext *ctx)
|
||||
{
|
||||
memset(ctx->mas, 0, sizeof(ctx->mas));
|
||||
}
|
||||
|
||||
static inline void do_decode(DisasContext *ctx, CPUState *cs)
|
||||
{
|
||||
E2KCPU *cpu = E2K_CPU(cs);
|
||||
|
@ -286,15 +291,15 @@ static inline void do_execute(DisasContext *ctx)
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
e2k_plu_execute(ctx);
|
||||
e2k_control_gen(ctx);
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (ctx->bundle.als_present[i]) {
|
||||
ctx->alc[i].tag = RESULT_NONE;
|
||||
e2k_execute_alc(ctx, i);
|
||||
}
|
||||
}
|
||||
|
||||
e2k_plu_execute(ctx);
|
||||
e2k_control_gen(ctx);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -454,6 +459,7 @@ static void e2k_tr_translate_insn(DisasContextBase *db, CPUState *cs)
|
|||
gen_helper_break_restore_state(cpu_env);
|
||||
gen_set_label(l0);
|
||||
|
||||
do_reset(ctx);
|
||||
do_decode(ctx, cs);
|
||||
do_execute(ctx);
|
||||
do_commit(ctx);
|
||||
|
|
|
@ -148,6 +148,7 @@ typedef struct DisasContext {
|
|||
target_ulong npc;
|
||||
int jump_ctpr;
|
||||
int mmuidx;
|
||||
uint8_t mas[4];
|
||||
|
||||
int version;
|
||||
|
||||
|
|
|
@ -603,6 +603,31 @@ static void gen_movtd(DisasContext *dc, int chan)
|
|||
store_reg_alc_result(dc, chan, t0);
|
||||
}
|
||||
|
||||
static MemOp gen_mas(DisasContext *ctx, int chan, MemOp memop, TCGv_i64 addr)
|
||||
{
|
||||
uint8_t mas = ctx->mas[chan];
|
||||
|
||||
if ((mas & 0x7) == 7) {
|
||||
// TODO: special mas
|
||||
e2k_gen_exception(ctx, E2K_EXCP_ILLOPC);
|
||||
} else if (mas) {
|
||||
int mod = extract8(mas, 0, 3);
|
||||
// int dc = extract8(mas, 5, 2);
|
||||
|
||||
if (mod != 0) {
|
||||
// TODO: mas modes
|
||||
e2k_gen_exception(ctx, E2K_EXCP_ILLOPC);
|
||||
}
|
||||
|
||||
memop |= GET_BIT(mas, 3) ? MO_BE : MO_LE;
|
||||
memop |= GET_BIT(mas, 4) ? MO_UNALN : MO_ALIGN;
|
||||
} else {
|
||||
memop |= MO_LE | MO_ALIGN;
|
||||
}
|
||||
|
||||
return memop;
|
||||
}
|
||||
|
||||
static void gen_ld(DisasContext *dc, int chan, MemOp memop)
|
||||
{
|
||||
uint32_t als = dc->bundle.als[chan];
|
||||
|
@ -612,6 +637,7 @@ static void gen_ld(DisasContext *dc, int chan, MemOp memop)
|
|||
TCGv_i64 t1 = e2k_get_temp_i64(dc);
|
||||
|
||||
tcg_gen_add_i64(t0, src1, src2);
|
||||
memop = gen_mas(dc, chan, memop, t0);
|
||||
tcg_gen_qemu_ld_i64(t1, t0, dc->mmuidx, memop);
|
||||
store_reg_alc_result(dc, chan, t1);
|
||||
|
||||
|
@ -627,6 +653,7 @@ static void gen_st(DisasContext *dc, int chan, MemOp memop)
|
|||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
|
||||
tcg_gen_add_i64(t0, src1, src2);
|
||||
memop = gen_mas(dc, chan, memop, t0);
|
||||
tcg_gen_qemu_st_i64(src4, t0, dc->mmuidx, memop);
|
||||
|
||||
tcg_temp_free_i64(t0);
|
||||
|
@ -776,7 +803,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
}
|
||||
case 0x25: { /* sth */
|
||||
if (chan == 2 || chan == 5) {
|
||||
gen_st(dc, chan, MO_TEUW);
|
||||
gen_st(dc, chan, MO_UW);
|
||||
} else {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
}
|
||||
|
@ -784,7 +811,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
}
|
||||
case 0x26: { /* stw */
|
||||
if (chan == 2 || chan == 5) {
|
||||
gen_st(dc, chan, MO_TEUL);
|
||||
gen_st(dc, chan, MO_UL);
|
||||
} else {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
}
|
||||
|
@ -792,7 +819,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
}
|
||||
case 0x27: { /* std */
|
||||
if (chan == 2 || chan == 5) {
|
||||
gen_st(dc, chan, MO_TEQ);
|
||||
gen_st(dc, chan, MO_Q);
|
||||
} else {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
}
|
||||
|
@ -820,7 +847,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
if (chan == 1 || chan == 4) {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
} else {
|
||||
gen_ld(dc, chan, MO_TEUW);
|
||||
gen_ld(dc, chan, MO_UW);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -828,7 +855,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
if (chan == 1 || chan == 4) {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
} else {
|
||||
gen_ld(dc, chan, MO_TEUL);
|
||||
gen_ld(dc, chan, MO_UL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -836,7 +863,7 @@ static void execute_alopf_simple(DisasContext *dc, int chan)
|
|||
if (chan == 1 || chan == 4) {
|
||||
gen_helper_unimpl(cpu_env);
|
||||
} else {
|
||||
gen_ld(dc, chan, MO_TEQ);
|
||||
gen_ld(dc, chan, MO_Q);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -459,10 +459,10 @@ static void gen_cs1(DisasContext *dc)
|
|||
}
|
||||
}
|
||||
} else if (opc == MAS_OPC) {
|
||||
// TODO: mas
|
||||
// unsigned int mas = cs1 & 0x0fffffff;
|
||||
|
||||
gen_helper_unimpl(cpu_env);
|
||||
dc->mas[0] = extract32(cs1, 21, 7);
|
||||
dc->mas[2] = extract32(cs1, 14, 7);
|
||||
dc->mas[3] = extract32(cs1, 7, 7);
|
||||
dc->mas[5] = extract32(cs1, 0, 7);
|
||||
} else if (opc == FLUSHR) {
|
||||
if (cs1 & 0x00000001) {
|
||||
// TODO: flushr
|
||||
|
|
Loading…
Reference in New Issue