diff --git a/target/e2k/helper.h b/target/e2k/helper.h index 9ab9fd3459..3756c8d829 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -131,6 +131,7 @@ DEF_HELPER_2(psadbw, i64, i64, i64) DEF_HELPER_2(pavgusb, i64, i64, i64) DEF_HELPER_2(pavgush, i64, i64, i64) DEF_HELPER_2(phminposuh, i64, i64, i64) +DEF_HELPER_2(mpsadbh, i64, i64, i64) /* Float 32/64 Ops */ #define DEF_HELPER_3_32_64(name) \ diff --git a/target/e2k/helper_vec.c b/target/e2k/helper_vec.c index ab1b8753d9..2364fe0277 100644 --- a/target/e2k/helper_vec.c +++ b/target/e2k/helper_vec.c @@ -190,6 +190,13 @@ GEN_HELPER_PACKED(pmulubhh, uh, { \ dst.uh[i] = (((int16_t) s1.ub[i] * s2.sh[i]) + s1.ub[i]) >> 8; \ }) +GEN_HELPER_PACKED(mpsadbh, uh, { \ + dst.uh[i] = abs((int16_t) s1.ub[i ] - s2.ub[0]) \ + + abs((int16_t) s1.ub[i + 1] - s2.ub[1]) \ + + abs((int16_t) s1.ub[i + 2] - s2.ub[2]) \ + + abs((int16_t) s1.ub[i + 3] - s2.ub[3]); \ +}) + #define mul_sign(a, b) ((b) < 0 ? -(a) : ((b) > 0 ? (a) : 0)) GEN_HELPER_PACKED_OP(psignb, sb, mul_sign) diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index c68d65a6e6..2c39b4ea94 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -3113,6 +3113,7 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PMULHRSH: gen_alopf1_ddd(instr, gen_helper_pmulhrsh); break; case OP_PMADDH: gen_alopf1_ddd(instr, gen_helper_pmaddh); break; case OP_PMADDUBSH: gen_alopf1_ddd(instr, gen_helper_pmaddubsh); break; + case OP_MPSADBH: gen_alopf1_ddd(instr, gen_helper_mpsadbh); break; case OP_PSADBW: gen_alopf1_ddd(instr, gen_helper_psadbw); break; case OP_PSIGNB: gen_alopf1_ddd(instr, gen_helper_psignb); break; case OP_PSIGNH: gen_alopf1_ddd(instr, gen_helper_psignh); break; @@ -3439,7 +3440,6 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_MOVX: case OP_MOVXA: case OP_MOVXC: - case OP_MPSADBH: case OP_PFHADDS: case OP_PFHSUBS: case OP_PFADDSUBS: