From dc9b17e91ad92d44d4d518f09cc4ac89cbfb238d Mon Sep 17 00:00:00 2001 From: Denis Drakhnya Date: Sat, 16 Jan 2021 11:23:16 +0200 Subject: [PATCH] e2k: Add packsshb, packushb and packsswh instrs. --- target/e2k/helper.h | 5 +++++ target/e2k/helper_vec.c | 9 +++++++++ target/e2k/translate/alc.c | 6 +++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/target/e2k/helper.h b/target/e2k/helper.h index bab56c57ed..db416b13d3 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -91,6 +91,11 @@ DEF_HELPER_2(pmovmskb, i64, i64, i64) DEF_HELPER_2(pmovmskps, i64, i64, i64) DEF_HELPER_2(pmovmskpd, i64, i64, i64) +/* Packed packs */ +DEF_HELPER_2(packsshb, i64, i64, i64) +DEF_HELPER_2(packsswh, i64, i64, i64) +DEF_HELPER_2(packushb, i64, i64, i64) + /* Packed uncategorized */ DEF_HELPER_2(psadbw, i64, i64, i64) DEF_HELPER_2(pavgusb, i64, i64, i64) diff --git a/target/e2k/helper_vec.c b/target/e2k/helper_vec.c index 336f919ef9..70028ad663 100644 --- a/target/e2k/helper_vec.c +++ b/target/e2k/helper_vec.c @@ -233,3 +233,12 @@ GEN_HELPER_PACKED(pmulhuh, uh, { \ GEN_HELPER_PACKED(pmovmskb, sb, MOVMASK(uh, sb)) GEN_HELPER_PACKED(pmovmskps, sw, MOVMASK(ub, sw)) GEN_HELPER_PACKED(pmovmskpd, sd, MOVMASK(ub, sd)) + +#define PACK(dst_type, type, op) { \ + dst.dst_type[i + glue(vec64_, type)] = op(s1.type[i]); \ + dst.dst_type[i ] = op(s2.type[i]); \ +} + +GEN_HELPER_PACKED(packsshb, sh, PACK(sb, sh, satsb)) +GEN_HELPER_PACKED(packushb, uh, PACK(ub, sh, satub)) +GEN_HELPER_PACKED(packsswh, sw, PACK(sh, sw, satsh)) diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index 6d2f1c2b93..2a8261c8d9 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -3108,6 +3108,9 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PMOVMSKB: gen_alopf1_ddd(instr, gen_helper_pmovmskb); break; case OP_PMOVMSKPS: gen_alopf1_ddd(instr, gen_helper_pmovmskps); break; case OP_PMOVMSKPD: gen_alopf1_ddd(instr, gen_helper_pmovmskpd); break; + case OP_PACKSSHB: gen_alopf1_ddd(instr, gen_helper_packsshb); break; + case OP_PACKUSHB: gen_alopf1_ddd(instr, gen_helper_packushb); break; + case OP_PACKSSWH: gen_alopf1_ddd(instr, gen_helper_packsswh); break; case OP_STAAB: gen_staa_i32(instr, MO_8); break; case OP_STAAH: gen_staa_i32(instr, MO_16); break; case OP_STAAW: gen_staa_i32(instr, MO_32); break; @@ -3308,10 +3311,7 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PFCMPNLTD: case OP_PFCMPNLED: case OP_PFCMPODD: - case OP_PACKSSHB: - case OP_PACKUSHB: case OP_PSHUFW: - case OP_PACKSSWH: case OP_PUNPCKHBH: case OP_PUNPCKHHW: case OP_PUNPCKHWD: