Skip to content

Commit

Permalink
Implement orpd, punpcklqdq, pminub, pand, por, paddb
Browse files Browse the repository at this point in the history
  • Loading branch information
tbodt committed May 31, 2020
1 parent 84d57ce commit 52ebee6
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 11 deletions.
15 changes: 12 additions & 3 deletions emu/decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,12 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
#endif

#if OP_SIZE == 16
case 0x56: TRACEI("orpd xmm:modrm, xmm");
READMODRM; V_OP(or, xmm_modrm_val, xmm_modrm_reg,128); break;
case 0x60: TRACEI("punpcklbw xmm:modrm, xmm");
READMODRM; V_OP(unpack_bw, xmm_modrm_val, xmm_modrm_reg,128); break;
case 0x6c: TRACEI("punpcklqdq xmm:modrm, xmm");
READMODRM; V_OP(unpack_qdq, xmm_modrm_val, xmm_modrm_reg,128); break;

case 0x6e: TRACEI("movd modrm, xmm");
READMODRM; VMOV(modrm_val, xmm_modrm_reg,32); break;
Expand Down Expand Up @@ -299,7 +303,6 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {

case 0x7e: TRACEI("movd xmm, modrm");
READMODRM; VMOV(xmm_modrm_reg, modrm_val,32); break;

case 0x7f: TRACEI("movdqa xmm, xmm:modrm");
READMODRM; VMOV(xmm_modrm_reg, xmm_modrm_val,128); break;

Expand All @@ -318,12 +321,18 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
case 0xd7: TRACEI("pmovmskb xmm:modrm, reg");
READMODRM_NOMEM; V_OP(movmask_b, xmm_modrm_val, modrm_reg,128); break;

case 0xda: TRACEI("pminub xmm:modrm, xmm");
READMODRM; V_OP(min_ub, xmm_modrm_val, xmm_modrm_reg,128); break;
case 0xdb: TRACEI("pand xmm:modrm, xmm");
READMODRM; V_OP(and, xmm_modrm_val, xmm_modrm_reg,128); break;
case 0xeb: TRACEI("por xmm:modrm, xmm");
READMODRM; V_OP(or, xmm_modrm_val, xmm_modrm_reg,128); break;
case 0xef: TRACEI("pxor xmm:modrm, xmm");
READMODRM; V_OP(xor, xmm_modrm_val, xmm_modrm_reg,128); break;

case 0xf3: TRACEI("psllq xmm:modrm, xmm");
READMODRM; V_OP(shiftl_q, xmm_modrm_val, xmm_modrm_reg, 128); break;

case 0xfc: TRACEI("paddb xmm:modrm, xmm");
READMODRM; V_OP(add_b, xmm_modrm_val, xmm_modrm_reg,128); break;
#else
case 0x10: TRACEI("movups xmm:modrm, xmm");
READMODRM; VMOV(xmm_modrm_val, xmm_modrm_reg,128); break;
Expand Down
21 changes: 21 additions & 0 deletions emu/vec.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,16 +98,34 @@ void vec_shiftr_q128(NO_CPU, union xmm_reg *amount, union xmm_reg *dst) {
}
}

void vec_and128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
dst->qw[0] &= src->qw[0];
dst->qw[1] &= src->qw[1];
}
void vec_or128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
dst->qw[0] |= src->qw[0];
dst->qw[1] |= src->qw[1];
}
void vec_xor128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
dst->qw[0] ^= src->qw[0];
dst->qw[1] ^= src->qw[1];
}

void vec_add_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
for (unsigned i = 0; i < array_size(src->u8); i++)
dst->u8[i] += src->u8[i];
}
void vec_add_q128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
dst->qw[0] += src->qw[0];
dst->qw[1] += src->qw[1];
}

void vec_min_ub128(NO_CPU, union xmm_reg *src, union xmm_reg *dst) {
for (unsigned i = 0; i < array_size(src->u8); i++)
if (src->u8[i] < dst->u8[i])
dst->u8[i] = src->u8[i];
}

void vec_fadds64(NO_CPU, const double *src, double *dst) {
*dst += *src;
}
Expand Down Expand Up @@ -137,6 +155,9 @@ void vec_unpack_bw128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
dst->u8[i*2] = dst->u8[i];
}
}
void vec_unpack_qdq128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst) {
dst->qw[1] = src->qw[0];
}

void vec_shuffle_lw128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst, uint8_t encoding) {
union xmm_reg src_copy = *src;
Expand Down
8 changes: 6 additions & 2 deletions emu/vec.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ void vec_imm_shiftl_q128(NO_CPU, const uint8_t amount, union xmm_reg *dst);
void vec_imm_shiftr_q128(NO_CPU, const uint8_t amount, union xmm_reg *dst);
void vec_shiftl_q128(NO_CPU, union xmm_reg *amount, union xmm_reg *dst);
void vec_shiftr_q128(NO_CPU, union xmm_reg *amount, union xmm_reg *dst);

void vec_and128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);
void vec_or128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);
void vec_xor128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);

void vec_add_b128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);
void vec_add_q128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);

void vec_min_ub128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);

void vec_fadds64(NO_CPU, const double *src, double *dst);
void vec_fmuls64(NO_CPU, const double *src, double *dst);
void vec_fsubs64(NO_CPU, const double *src, double *dst);
Expand All @@ -38,6 +41,7 @@ void vec_cvtsd2ss64(NO_CPU, const double *src, float *dst);

// TODO organize
void vec_unpack_bw128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst);
void vec_unpack_qdq128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst);
void vec_shuffle_lw128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst, uint8_t encoding);
void vec_shuffle_d128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst, uint8_t encoding);
void vec_compare_eqb128(NO_CPU, const union xmm_reg *src, union xmm_reg *dst);
Expand Down
12 changes: 12 additions & 0 deletions tests/e2e/qemu/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4360,10 +4360,22 @@ pcmpeqd : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab
pcmpeqd : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=000000000000000000000000ffffffff
paddq : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=1e437bfb3e2e3a326490a093f124201e
paddq : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=e54fd3d192b087270ff2881c10a84ff0
pminub : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=41511efb944a58461f2923c658694873
pminub : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=231be9e8c4c9438d0076255a085427f8
pand : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=40501cfb80424044052120c418284023
pand : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=0213e9e8c4c1438800742042085427f8
por : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=ddf35effbdebf9ee5f6f7fcfd8fbdffb
por : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=e33be9e8cdef439f0f7e67da085427f8
pxor : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=9da342043da9b9aa5a4e5f0bc0d39fd8
pxor : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=e1280000092e00170f0a479800000000
paddb : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=1d437afa3d2d393264909f93f0231f1e
paddb : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=e54ed2d091b086270ff2871c10a84ef0
pextrw : r=0000944a
pmovmskb : r=00009918
punpcklqdq: a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=1f297ccd58bad7ab456723c698694873
punpcklqdq: a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=0f76255a085427f8007c62c2085427f8
orpd : a=dc515cff944a58ec456723c698694873 b=41f21efba9e3e1461f297ccd58bad7ab r=ddf35effbdebf9ee5f6f7fcfd8fbdffb
orpd : a=231be9e8cde7438d007c62c2085427f8 b=c233e9e8c4c9439a0f76255a085427f8 r=e33be9e8cdef439f0f7e67da085427f8
pshufd : a=dc515cff944a58ec456723c698694873 ib=78 r=456723c6dc515cff944a58ec98694873
pshufd : a=231be9e8cde7438d007c62c2085427f8 ib=78 r=007c62c2231be9e8cde7438d085427f8
pshuflw : a=dc515cff944a58ec456723c698694873 ib=78 r=dc515cff944a58ec9869456723c64873
Expand Down
12 changes: 6 additions & 6 deletions tests/e2e/qemu/qemu-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -2417,8 +2417,8 @@ void test_sse(void)
// MMX_OP2(pmullw);
// MMX_OP2(psubusb);
// MMX_OP2(psubusw);
// MMX_OP2(pminub);
// MMX_OP2(pand);
SSE_OP2(pminub);
SSE_OP2(pand);
// MMX_OP2(paddusb);
// MMX_OP2(paddusw);
// MMX_OP2(pmaxub);
Expand All @@ -2430,7 +2430,7 @@ void test_sse(void)
// MMX_OP2(psubsb);
// MMX_OP2(psubsw);
// MMX_OP2(pminsw);
// MMX_OP2(por);
SSE_OP2(por);
// MMX_OP2(paddsb);
// MMX_OP2(paddsw);
// MMX_OP2(pmaxsw);
Expand All @@ -2442,7 +2442,7 @@ void test_sse(void)
// MMX_OP2(psubw);
// MMX_OP2(psubd);
// MMX_OP2(psubq);
// MMX_OP2(paddb);
SSE_OP2(paddb);
// MMX_OP2(paddw);
// MMX_OP2(paddd);

Expand Down Expand Up @@ -2497,14 +2497,14 @@ void test_sse(void)

asm volatile ("emms");

// SSE_OP2(punpcklqdq);
SSE_OP2(punpcklqdq);
// SSE_OP2(punpckhqdq);
// SSE_OP2(andps);
// SSE_OP2(andpd);
// SSE_OP2(andnps);
// SSE_OP2(andnpd);
// SSE_OP2(orps);
// SSE_OP2(orpd);
SSE_OP2(orpd);
// SSE_OP2(xorps);
// SSE_OP2(xorpd);

Expand Down

0 comments on commit 52ebee6

Please sign in to comment.