From 7cb77dbe330f4766b0c07af20ed3d9f65a676595 Mon Sep 17 00:00:00 2001 From: Denis Drakhnya Date: Sat, 16 Jan 2021 00:23:31 +0200 Subject: [PATCH] e2k: Add psra{h,w} instrs. --- target/e2k/helper.h | 4 ++++ target/e2k/helper_vec.c | 8 ++++++++ target/e2k/translate/alc.c | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/target/e2k/helper.h b/target/e2k/helper.h index 4350d217b0..20af829992 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -76,6 +76,10 @@ DEF_HELPER_2(psllw, i64, i64, i64) DEF_HELPER_2(psrlh, i64, i64, i64) DEF_HELPER_2(psrlw, i64, i64, i64) +/* Packed shifts with sign */ +DEF_HELPER_2(psrah, i64, i64, i64) +DEF_HELPER_2(psraw, i64, i64, i64) + /* Float 32/64 Ops */ #define DEF_HELPER_3_32_64(name) \ DEF_HELPER_3(name##s, i32, env, i32, i32) \ diff --git a/target/e2k/helper_vec.c b/target/e2k/helper_vec.c index 76d38f70e4..ab54d61fd5 100644 --- a/target/e2k/helper_vec.c +++ b/target/e2k/helper_vec.c @@ -183,6 +183,14 @@ GEN_HELPER_PACKED_SCALAR_BINOP(psllw, uw, <<) GEN_HELPER_PACKED_SCALAR_BINOP(psrlh, uh, >>) GEN_HELPER_PACKED_SCALAR_BINOP(psrlw, uw, >>) +#define GEN_HELPER_PACKED_SRA(name, type, t) \ + GEN_HELPER_PACKED_SCALAR(name, type, { \ + dst.type[i] = (t) s1.type[i] >> s2; \ + }) + +GEN_HELPER_PACKED_SRA(psrah, sh, int32_t) +GEN_HELPER_PACKED_SRA(psraw, sw, int64_t) + uint64_t HELPER(pmovmskb)(uint64_t src1, uint64_t src2) { unsigned int i; diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index 9aa087d209..e490615583 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -3058,7 +3058,9 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PSLLD: gen_alopf1_ddd(instr, tcg_gen_shl_i64); break; case OP_PSRLH: gen_alopf1_ddd(instr, gen_helper_psrlh); break; case OP_PSRLW: gen_alopf1_ddd(instr, gen_helper_psrlw); break; - case OP_PSRLD: gen_alopf1_ddd(instr, tcg_gen_shr_i64); break; + case OP_PSRLD: gen_alopf1_ddd(instr, tcg_gen_shr_i64); break; + case OP_PSRAH: gen_alopf1_ddd(instr, gen_helper_psrah); break; + case OP_PSRAW: gen_alopf1_ddd(instr, gen_helper_psraw); break; case OP_PSLLQL: gen_alopf11_dddi(instr, gen_psllql); break; case OP_PSLLQH: gen_alopf11_dddi(instr, gen_psllqh); break; case OP_PSRLQL: gen_alopf11_dddi(instr, gen_psrlql); break; @@ -3222,8 +3224,6 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PMULHH: case OP_PMULLH: case OP_PMADDH: - case OP_PSRAW: - case OP_PSRAH: case OP_PFADDS: case OP_PFADDD: case OP_PFSUBS: