From 83c06a7807d3c3f413bbc39584e51a115ec03bdd Mon Sep 17 00:00:00 2001 From: Denis Drakhnya Date: Sat, 16 Jan 2021 01:27:25 +0200 Subject: [PATCH] e2k: Add psadbw instr. --- target/e2k/helper.h | 3 +++ target/e2k/helper_vec.c | 55 ++++++++++++++++++++------------------ target/e2k/translate/alc.c | 2 +- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/target/e2k/helper.h b/target/e2k/helper.h index e70a86f8a4..73fcd5b090 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -84,6 +84,9 @@ DEF_HELPER_2(psraw, i64, i64, i64) DEF_HELPER_2(pmaddh, i64, i64, i64) DEF_HELPER_2(pmaddubsh, i64, i64, i64) +/* Packed uncategorized */ +DEF_HELPER_2(psadbw, 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 0af583cdf6..fbbd21537e 100644 --- a/target/e2k/helper_vec.c +++ b/target/e2k/helper_vec.c @@ -35,6 +35,12 @@ typedef union { int64_t sd[vec64_ud]; } vec64; +#define ident(x) x +#define satsb(x) MIN(MAX(x, -128), 127) +#define satsh(x) MIN(MAX(x, -32768), 32767) +#define satub(x) MIN(MAX(x, 0), 255) +#define satuh(x) MIN(MAX(x, 0), 65535) + uint64_t HELPER(packed_shuffle_i64)(uint64_t src1, uint64_t src2, uint64_t src3) { vec64 ret, s1, s2, s3; @@ -108,7 +114,8 @@ uint64_t HELPER(packed_shuffle_i64)(uint64_t src1, uint64_t src2, uint64_t src3) uint64_t HELPER(name)(uint64_t src1, uint64_t src2) \ { \ size_t i = 0; \ - vec64 s1 = { .ud[0] = src1 }, s2 = { .ud[0] = src2 }, dst; \ + vec64 s1 = { .ud[0] = src1 }, s2 = { .ud[0] = src2 }; \ + vec64 dst = { .ud[0] = 0 }; \ for (; i < glue(vec64_, type); i++) { \ code \ } \ @@ -118,7 +125,7 @@ uint64_t HELPER(packed_shuffle_i64)(uint64_t src1, uint64_t src2, uint64_t src3) uint64_t HELPER(name)(uint64_t src1, uint64_t s2) \ { \ size_t i = 0; \ - vec64 s1 = { .ud[0] = src1 }, dst; \ + vec64 s1 = { .ud[0] = src1 }, dst = { .ud[0] = 0 }; \ for (; i < glue(vec64_, type); i++) { \ code \ } \ @@ -158,20 +165,20 @@ GEN_HELPER_PACKED_CMP(pcmpgth, sh, >) GEN_HELPER_PACKED_CMP(pcmpgtw, sw, >) GEN_HELPER_PACKED_CMP(pcmpgtd, sd, >) -#define GEN_HELPER_PACKED_BINOP_SATURATE(name, type, op, t, min, max) \ +#define GEN_HELPER_PACKED_BINOP_MAP(name, type, op, cast, map) \ GEN_HELPER_PACKED(name, type, { \ - dst.type[i] = MIN(MAX(s1.type[i] op s2.type[i], min), max); \ + dst.type[i] = map((cast) s1.type[i] op s2.type[i]); \ }) -GEN_HELPER_PACKED_BINOP_SATURATE(paddsb, sb, +, int, -128, 127) -GEN_HELPER_PACKED_BINOP_SATURATE(paddsh, sh, +, int, -32768, 32767) -GEN_HELPER_PACKED_BINOP_SATURATE(paddusb, ub, +, int, 0, 255) -GEN_HELPER_PACKED_BINOP_SATURATE(paddush, uh, +, int, 0, 65535) +GEN_HELPER_PACKED_BINOP_MAP(paddsb, sb, +, int16_t, satsb) +GEN_HELPER_PACKED_BINOP_MAP(paddsh, sh, +, int32_t, satsh) +GEN_HELPER_PACKED_BINOP_MAP(paddusb, ub, +, uint16_t, satub) +GEN_HELPER_PACKED_BINOP_MAP(paddush, uh, +, uint32_t, satuh) -GEN_HELPER_PACKED_BINOP_SATURATE(psubsb, sb, -, int, -128, 127) -GEN_HELPER_PACKED_BINOP_SATURATE(psubsh, sh, -, int, -32768, 32767) -GEN_HELPER_PACKED_BINOP_SATURATE(psubusb, ub, -, int, 0, 255) -GEN_HELPER_PACKED_BINOP_SATURATE(psubush, uh, -, int, 0, 65535) +GEN_HELPER_PACKED_BINOP_MAP(psubsb, sb, -, int16_t, satsb) +GEN_HELPER_PACKED_BINOP_MAP(psubsh, sh, -, int32_t, satsh) +GEN_HELPER_PACKED_BINOP_MAP(psubusb, ub, -, uint16_t, satub) +GEN_HELPER_PACKED_BINOP_MAP(psubush, uh, -, uint32_t, satuh) #define GEN_HELPER_PACKED_SCALAR_BINOP(name, type, op) \ GEN_HELPER_PACKED_SCALAR(name, type, { \ @@ -192,26 +199,22 @@ GEN_HELPER_PACKED_SRA(psrah, sh, int32_t) GEN_HELPER_PACKED_SRA(psraw, sw, int64_t) #define GEN_HELPER_PACKED_MAD(name, dst_type, type, cast, op) \ - uint64_t HELPER(name)(uint64_t src1, uint64_t src2) \ - { \ - size_t i = 0; \ - vec64 s1 = { .ud[0] = src1 }, s2 = { .ud[0] = src2 }, dst; \ - for (; i < glue(vec64_, type); i += 2) { \ - dst.dst_type[i >> 1] = op((cast) s1.type[i + 1] * s2.type[i + 1] +\ - (cast) s1.type[i ] * s2.type[i ]); \ - } \ - return dst.ud[0]; \ - } - -#define ident(x) x -#define satsh(x) MIN(MAX(x, -32768), 32767) + GEN_HELPER_PACKED(name, dst_type, { \ + int j = i * 2; \ + dst.dst_type[i] = op( \ + (cast) s1.type[j + 1] * s2.type[j + 1] + \ + (cast) s1.type[j ] * s2.type[j ] \ + ); \ + }) GEN_HELPER_PACKED_MAD(pmaddh, sw, sh, int32_t, ident) GEN_HELPER_PACKED_MAD(pmaddubsh, sh, ub, int16_t, satsh) +GEN_HELPER_PACKED(psadbw, ub, { dst.uw[0] += s1.ub[i] - s2.ub[i]; }) + uint64_t HELPER(pmovmskb)(uint64_t src1, uint64_t src2) { - unsigned int i; + int i; vec64 s1, s2; uint16_t ret = 0; diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index 19b5614aa9..d5cb289390 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -3055,6 +3055,7 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_PSUBUSH: gen_alopf1_ddd(instr, gen_helper_psubush); 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_PSADBW: gen_alopf1_ddd(instr, gen_helper_psadbw); break; case OP_PSLLH: gen_alopf1_ddd(instr, gen_helper_psllh); break; case OP_PSLLW: gen_alopf1_ddd(instr, gen_helper_psllw); break; case OP_PSLLD: gen_alopf1_ddd(instr, tcg_gen_shl_i64); break; @@ -3221,7 +3222,6 @@ static void gen_op(DisasContext *ctx, Instr *instr) case OP_FSQRTTD: case OP_PFMULS: case OP_PFMULD: - case OP_PSADBW: case OP_PMULHUH: case OP_PMULHH: case OP_PMULLH: