target: e2k: Fix sxt/st operand sizes.
This commit is contained in:
parent
24bb677df9
commit
f0941a1a6b
|
@ -3,7 +3,7 @@ DEF_HELPER_1(debug, void, env)
|
||||||
DEF_HELPER_2(prep_return, i64, env, int)
|
DEF_HELPER_2(prep_return, i64, env, int)
|
||||||
DEF_HELPER_1(return, void, env)
|
DEF_HELPER_1(return, void, env)
|
||||||
DEF_HELPER_4(call, void, env, i64, int, tl)
|
DEF_HELPER_4(call, void, env, i64, int, tl)
|
||||||
DEF_HELPER_2(sxt, i64, i64, i64)
|
DEF_HELPER_2(sxt, i64, i64, i32)
|
||||||
DEF_HELPER_1(debug_i32, void, i32)
|
DEF_HELPER_1(debug_i32, void, i32)
|
||||||
DEF_HELPER_1(debug_i64, void, i64)
|
DEF_HELPER_1(debug_i64, void, i64)
|
||||||
DEF_HELPER_1(debug_ptr, void, ptr)
|
DEF_HELPER_1(debug_ptr, void, ptr)
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "translate.h"
|
#include "translate.h"
|
||||||
|
|
||||||
uint64_t helper_sxt(uint64_t x, uint64_t y)
|
uint64_t helper_sxt(uint64_t x, uint32_t y)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
|
|
|
@ -1155,6 +1155,18 @@ static inline void gen_rw_i32(DisasContext *ctx, int chan)
|
||||||
tcg_temp_free_i32(t0);
|
tcg_temp_free_i32(t0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_sxt(DisasContext *ctx, int chan)
|
||||||
|
{
|
||||||
|
Src64 s1 = get_src1_i64(ctx, chan);
|
||||||
|
Src32 s2 = get_src2_i32(ctx, chan);
|
||||||
|
TCGv_i32 tag = e2k_get_temp_i32(ctx);
|
||||||
|
TCGv_i64 dst = e2k_get_temp_i64(ctx);
|
||||||
|
|
||||||
|
gen_tag2_i64(tag, s1.tag, s2.tag);
|
||||||
|
gen_helper_sxt(dst, s1.value, s2.value);
|
||||||
|
gen_al_result_i64(ctx, chan, dst, tag);
|
||||||
|
}
|
||||||
|
|
||||||
static void gen_getsp(DisasContext *ctx, int chan)
|
static void gen_getsp(DisasContext *ctx, int chan)
|
||||||
{
|
{
|
||||||
Src32 s2 = get_src2_i32(ctx, chan);
|
Src32 s2 = get_src2_i32(ctx, chan);
|
||||||
|
@ -1182,7 +1194,6 @@ static MemOp gen_mas(DisasContext *ctx, int chan, MemOp memop, TCGv_i64 addr)
|
||||||
// e2k_tr_gen_exception(ctx, E2K_EXCP_ILLOPC);
|
// e2k_tr_gen_exception(ctx, E2K_EXCP_ILLOPC);
|
||||||
qemu_log_mask(LOG_UNIMP, "0x%lx: mas=%#x, opc=%#x is not implemented!\n",
|
qemu_log_mask(LOG_UNIMP, "0x%lx: mas=%#x, opc=%#x is not implemented!\n",
|
||||||
ctx->pc, mas, opc);
|
ctx->pc, mas, opc);
|
||||||
return 0;
|
|
||||||
} else if (mas) {
|
} else if (mas) {
|
||||||
int mod = extract8(mas, 0, 3);
|
int mod = extract8(mas, 0, 3);
|
||||||
// int dc = extract8(mas, 5, 2);
|
// int dc = extract8(mas, 5, 2);
|
||||||
|
@ -1237,7 +1248,7 @@ static void gen_ld(DisasContext *ctx, int chan, MemOp memop)
|
||||||
tcg_temp_free_i64(t0);
|
tcg_temp_free_i64(t0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_st(DisasContext *ctx, int chan, MemOp memop)
|
static void gen_st_i64(DisasContext *ctx, int chan, MemOp memop)
|
||||||
{
|
{
|
||||||
bool sm = GET_BIT(ctx->bundle.als[chan], 31);
|
bool sm = GET_BIT(ctx->bundle.als[chan], 31);
|
||||||
TCGLabel *l0 = gen_new_label();
|
TCGLabel *l0 = gen_new_label();
|
||||||
|
@ -1252,11 +1263,6 @@ static void gen_st(DisasContext *ctx, int chan, MemOp memop)
|
||||||
tcg_gen_add_i64(t0, s1.value, s2.value);
|
tcg_gen_add_i64(t0, s1.value, s2.value);
|
||||||
memop = gen_mas(ctx, chan, memop, t0);
|
memop = gen_mas(ctx, chan, memop, t0);
|
||||||
|
|
||||||
if (memop == 0) {
|
|
||||||
// TODO: memop is zero after gen_mas
|
|
||||||
tcg_gen_br(l0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sm) {
|
if (sm) {
|
||||||
TCGv_i32 t1 = tcg_temp_new_i32();
|
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||||
gen_helper_probe_write_access(t1, cpu_env, t0);
|
gen_helper_probe_write_access(t1, cpu_env, t0);
|
||||||
|
@ -1270,6 +1276,34 @@ static void gen_st(DisasContext *ctx, int chan, MemOp memop)
|
||||||
tcg_temp_free_i64(t0);
|
tcg_temp_free_i64(t0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_st_i32(DisasContext *ctx, int chan, MemOp memop)
|
||||||
|
{
|
||||||
|
bool sm = GET_BIT(ctx->bundle.als[chan], 31);
|
||||||
|
TCGLabel *l0 = gen_new_label();
|
||||||
|
Src64 s1 = get_src1_i64(ctx, chan);
|
||||||
|
Src64 s2 = get_src2_i64(ctx, chan);
|
||||||
|
Src32 s4 = get_src4_i32(ctx, chan);
|
||||||
|
TCGv_i64 t0 = tcg_temp_local_new_i64();
|
||||||
|
|
||||||
|
gen_tag_check(ctx, sm, s1.tag);
|
||||||
|
gen_tag_check(ctx, sm, s2.tag);
|
||||||
|
gen_tag_check(ctx, sm, s4.tag);
|
||||||
|
tcg_gen_add_i64(t0, s1.value, s2.value);
|
||||||
|
memop = gen_mas(ctx, chan, memop, t0);
|
||||||
|
|
||||||
|
if (sm) {
|
||||||
|
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||||
|
gen_helper_probe_write_access(t1, cpu_env, t0);
|
||||||
|
tcg_gen_brcondi_i32(TCG_COND_EQ, t1, 0, l0);
|
||||||
|
tcg_temp_free_i32(t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
tcg_gen_qemu_st_i32(s4.value, t0, ctx->mmuidx, memop);
|
||||||
|
gen_set_label(l0);
|
||||||
|
|
||||||
|
tcg_temp_free_i64(t0);
|
||||||
|
}
|
||||||
|
|
||||||
static void gen_staa_i64(DisasContext *ctx, int chan)
|
static void gen_staa_i64(DisasContext *ctx, int chan)
|
||||||
{
|
{
|
||||||
uint32_t als = ctx->bundle.als[chan];
|
uint32_t als = ctx->bundle.als[chan];
|
||||||
|
@ -1567,7 +1601,7 @@ static void execute_ext_00(DisasContext *ctx, Instr *instr)
|
||||||
case 0x09: /* xord */ gen_alopf1_i64(ctx, chan, tcg_gen_xor_i64); return;
|
case 0x09: /* xord */ gen_alopf1_i64(ctx, chan, tcg_gen_xor_i64); return;
|
||||||
case 0x0a: /* xorns */ gen_alopf1_i32(ctx, chan, gen_xorn_i32); return;
|
case 0x0a: /* xorns */ gen_alopf1_i32(ctx, chan, gen_xorn_i32); return;
|
||||||
case 0x0b: /* xornd */ gen_alopf1_i64(ctx, chan, gen_xorn_i64); return;
|
case 0x0b: /* xornd */ gen_alopf1_i64(ctx, chan, gen_xorn_i64); return;
|
||||||
case 0x0c: /* sxt */ gen_alopf1_i64(ctx, chan, gen_helper_sxt); return;
|
case 0x0c: /* sxt */ gen_sxt(ctx, chan); return;
|
||||||
case 0x0e: /* merges */ gen_alopf1_mrgc_i32(ctx, instr); return;
|
case 0x0e: /* merges */ gen_alopf1_mrgc_i32(ctx, instr); return;
|
||||||
case 0x0f: /* merged */ gen_alopf1_mrgc_i64(ctx, instr); return;
|
case 0x0f: /* merged */ gen_alopf1_mrgc_i64(ctx, instr); return;
|
||||||
case 0x10: /* adds */ gen_alopf1_i32(ctx, chan, tcg_gen_add_i32); return;
|
case 0x10: /* adds */ gen_alopf1_i32(ctx, chan, tcg_gen_add_i32); return;
|
||||||
|
@ -1617,7 +1651,7 @@ static void execute_ext_00(DisasContext *ctx, Instr *instr)
|
||||||
case 0x24: {
|
case 0x24: {
|
||||||
if (is_chan_25(chan)) {
|
if (is_chan_25(chan)) {
|
||||||
/* stb */
|
/* stb */
|
||||||
gen_st(ctx, chan, MO_UB);
|
gen_st_i32(ctx, chan, MO_UB);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1625,7 +1659,7 @@ static void execute_ext_00(DisasContext *ctx, Instr *instr)
|
||||||
case 0x25: {
|
case 0x25: {
|
||||||
if (is_chan_25(chan)) {
|
if (is_chan_25(chan)) {
|
||||||
/* sth */
|
/* sth */
|
||||||
gen_st(ctx, chan, MO_UW);
|
gen_st_i32(ctx, chan, MO_UW);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1633,7 +1667,7 @@ static void execute_ext_00(DisasContext *ctx, Instr *instr)
|
||||||
case 0x26: {
|
case 0x26: {
|
||||||
if (is_chan_25(chan)) {
|
if (is_chan_25(chan)) {
|
||||||
/* stw */
|
/* stw */
|
||||||
gen_st(ctx, chan, MO_UL);
|
gen_st_i32(ctx, chan, MO_UL);
|
||||||
return;
|
return;
|
||||||
} else if(instr->opce1 == 0xc0 && ctx->version >= 2) {
|
} else if(instr->opce1 == 0xc0 && ctx->version >= 2) {
|
||||||
/* bitrevs */
|
/* bitrevs */
|
||||||
|
@ -1645,7 +1679,7 @@ static void execute_ext_00(DisasContext *ctx, Instr *instr)
|
||||||
case 0x27: {
|
case 0x27: {
|
||||||
if (is_chan_25(chan)) {
|
if (is_chan_25(chan)) {
|
||||||
/* std */
|
/* std */
|
||||||
gen_st(ctx, chan, MO_Q);
|
gen_st_i64(ctx, chan, MO_Q);
|
||||||
return;
|
return;
|
||||||
} else if(instr->opce1 == 0xc0 && ctx->version >= 2) {
|
} else if(instr->opce1 == 0xc0 && ctx->version >= 2) {
|
||||||
/* bitrevd */
|
/* bitrevd */
|
||||||
|
|
Loading…
Reference in New Issue