e2k: Add punpck{l,h}{bh,hw,wd} instrs.

This commit is contained in:
Denis Drakhnia 2021-01-16 13:09:59 +02:00 committed by Denis Drakhnia
parent 06471fe869
commit 8606e02150
3 changed files with 31 additions and 10 deletions

View File

@ -95,6 +95,14 @@ DEF_HELPER_2(packsshb, i64, i64, i64)
DEF_HELPER_2(packsswh, i64, i64, i64)
DEF_HELPER_2(packushb, i64, i64, i64)
/* Packed unpacks */
DEF_HELPER_2(punpcklbh, i64, i64, i64)
DEF_HELPER_2(punpcklhw, i64, i64, i64)
DEF_HELPER_2(punpcklwd, i64, i64, i64)
DEF_HELPER_2(punpckhbh, i64, i64, i64)
DEF_HELPER_2(punpckhhw, i64, i64, i64)
DEF_HELPER_2(punpckhwd, i64, i64, i64)
/* Packed shuffle */
DEF_HELPER_3(pshufb, i64, i64, i64, i64)
DEF_HELPER_3(pshufw, i64, i64, i64, i32)

View File

@ -174,6 +174,19 @@ 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))
#define GEN_HELPER_PACKED_UNPACK(name, type, offset) \
GEN_HELPER_PACKED(name, type, { \
int j = offset + i / 2; \
dst.type[i] = i & 1 ? s1.type[j] : s2.type[j]; \
})
GEN_HELPER_PACKED_UNPACK(punpcklbh, ub, 0)
GEN_HELPER_PACKED_UNPACK(punpcklhw, uh, 0)
GEN_HELPER_PACKED_UNPACK(punpcklwd, uw, 0)
GEN_HELPER_PACKED_UNPACK(punpckhbh, ub, 4)
GEN_HELPER_PACKED_UNPACK(punpckhhw, uh, 2)
GEN_HELPER_PACKED_UNPACK(punpckhwd, uw, 1)
uint64_t HELPER(pshufb)(uint64_t src1, uint64_t src2, uint64_t src3)
{
vec64 ret, s1, s2, s3;

View File

@ -3110,16 +3110,22 @@ static void gen_op(DisasContext *ctx, Instr *instr)
case OP_PINSH: gen_alopf11_dddi(instr, gen_pinsh); break;
case OP_PEXTRH: gen_alopf11_dddi(instr, gen_pextrh); break;
case OP_PSHUFW: gen_alopf11_dddi(instr, gen_pshufw); break;
case OP_GETTAGS: gen_gettag_i32(instr); break;
case OP_GETTAGD: gen_gettag_i64(instr); break;
case OP_PUTTAGS: gen_puttag_i32(instr); break;
case OP_PUTTAGD: gen_puttag_i64(instr); break;
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_PUNPCKLBH: gen_alopf1_ddd(instr, gen_helper_punpcklbh); break;
case OP_PUNPCKLHW: gen_alopf1_ddd(instr, gen_helper_punpcklhw); break;
case OP_PUNPCKLWD: gen_alopf1_ddd(instr, gen_helper_punpcklwd); break;
case OP_PUNPCKHBH: gen_alopf1_ddd(instr, gen_helper_punpckhbh); break;
case OP_PUNPCKHHW: gen_alopf1_ddd(instr, gen_helper_punpckhhw); break;
case OP_PUNPCKHWD: gen_alopf1_ddd(instr, gen_helper_punpckhwd); break;
case OP_GETTAGS: gen_gettag_i32(instr); break;
case OP_GETTAGD: gen_gettag_i64(instr); break;
case OP_PUTTAGS: gen_puttag_i32(instr); break;
case OP_PUTTAGD: gen_puttag_i64(instr); 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;
@ -3320,12 +3326,6 @@ static void gen_op(DisasContext *ctx, Instr *instr)
case OP_PFCMPNLTD:
case OP_PFCMPNLED:
case OP_PFCMPODD:
case OP_PUNPCKHBH:
case OP_PUNPCKHHW:
case OP_PUNPCKHWD:
case OP_PUNPCKLBH:
case OP_PUNPCKLHW:
case OP_PUNPCKLWD:
case OP_LDGDB:
case OP_LDGDH:
case OP_LDGDW: