From 0b7c8d26500522f84f884f61db20085fafa12635 Mon Sep 17 00:00:00 2001 From: Denis Drakhnya Date: Sat, 16 Jan 2021 13:14:23 +0200 Subject: [PATCH] e2k: Add pshufh instr. --- target/e2k/helper.h | 1 + target/e2k/helper_vec.c | 11 +++++++++++ target/e2k/translate/alc.c | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/target/e2k/helper.h b/target/e2k/helper.h index 062691be6a..ed2aad9dea 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -105,6 +105,7 @@ DEF_HELPER_2(punpckhwd, i64, i64, i64) /* Packed shuffle */ DEF_HELPER_3(pshufb, i64, i64, i64, i64) +DEF_HELPER_2(pshufh, i64, i64, i32) DEF_HELPER_3(pshufw, i64, i64, i64, i32) /* Packed uncategorized */ diff --git a/target/e2k/helper_vec.c b/target/e2k/helper_vec.c index 2ce596975e..37bfabd093 100644 --- a/target/e2k/helper_vec.c +++ b/target/e2k/helper_vec.c @@ -256,6 +256,17 @@ uint64_t HELPER(pshufb)(uint64_t src1, uint64_t src2, uint64_t src3) return ret.ud[0]; } +uint64_t HELPER(pshufh)(uint64_t src1, uint32_t imm8) +{ + int i; + vec64 s1 = { .ud[0] = src1 }, dst; + for (i = 0; i < vec64_uh; i++) { + int j = (imm8 >> (i * 2)) & 0x3; + dst.uh[i] = s1.uh[j]; + } + return dst.ud[0]; +} + uint64_t HELPER(pshufw)(uint64_t src1, uint64_t src2, uint32_t imm8) { int i; diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index 5d2b95f677..4574aea9e1 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -1910,6 +1910,19 @@ static inline void gen_pextrh(TCGv_i64 ret, TCGv_i64 src1, } } +static inline void gen_pshufh(Instr *instr) +{ + Src64 s2 = get_src2_i64(instr); + TCGv_i32 tag = get_temp_i32(instr); + TCGv_i64 dst = get_temp_i64(instr); + TCGv_i32 t0 = tcg_const_i32(instr->src3); + + gen_tag1_i64(tag, s2.tag); + gen_helper_pshufh(dst, s2.value, t0); + gen_al_result_i64(instr, dst, tag); + tcg_temp_free_i32(t0); +} + static inline void gen_pshufw(TCGv_i64 ret, TCGv_i64 src1, TCGv_i64 src2, int i) { @@ -3109,6 +3122,7 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PSRLQH: gen_alopf11_dddi(instr, gen_psrlqh); break; case OP_PINSH: gen_alopf11_dddi(instr, gen_pinsh); break; case OP_PEXTRH: gen_alopf11_dddi(instr, gen_pextrh); break; + case OP_PSHUFH: gen_pshufh(instr); break; case OP_PSHUFW: gen_alopf11_dddi(instr, gen_pshufw); break; case OP_PMOVMSKB: gen_alopf1_ddd(instr, gen_helper_pmovmskb); break; case OP_PMOVMSKPS: gen_alopf1_ddd(instr, gen_helper_pmovmskps); break; @@ -3371,7 +3385,6 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_GETTC: case OP_INVTC: case OP_GETSOD: - case OP_PSHUFH: case OP_STCSQ: case OP_STDSQ: case OP_STESQ: