Skip to content

Commit

Permalink
Implement PSLLQ
Browse files Browse the repository at this point in the history
  • Loading branch information
MatthewMerrill committed May 31, 2020
1 parent 45f3b38 commit 03fd5bc
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 1 deletion.
10 changes: 9 additions & 1 deletion emu/decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,15 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
case 0x73: READMODRM;
switch (modrm.opcode) {
case 0x02: TRACEI("psrlq imm, xmm");
READIMM8; VSHIFTR_IMM(imm, xmm_modrm_reg,64); break;
READIMM8;
VSHIFTR_IMM(imm, xmm_modrm_reg,64);
break;

case 0x06: TRACEI("psllq imm, xmm");
READIMM8;
VSHIFTL_IMM(imm, xmm_modrm_reg,64);
break;

default: UNDEFINED;
}
break;
Expand Down
9 changes: 9 additions & 0 deletions emu/vec.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ void vec_merge128(NO_CPU, const void *src, void *dst) {
memcpy(dst, src, 16);
}

void vec_imm_shiftl64(NO_CPU, const uint8_t amount, union xmm_reg *dst) {
if (amount > 63) {
zero_xmm(dst);
} else {
dst->qw[0] <<= amount;
dst->qw[1] <<= amount;
}
}

void vec_imm_shiftr64(NO_CPU, const uint8_t amount, union xmm_reg *dst) {
if (amount > 63) {
zero_xmm(dst);
Expand Down
1 change: 1 addition & 0 deletions emu/vec.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ void vec_merge32(NO_CPU, const void *src, void *dst);
void vec_merge64(NO_CPU, const void *src, void *dst);
void vec_merge128(NO_CPU, const void *src, void *dst);

void vec_imm_shiftl64(NO_CPU, const uint8_t amount, union xmm_reg *dst);
void vec_imm_shiftr64(NO_CPU, const uint8_t amount, union xmm_reg *dst);
void vec_xor128(NO_CPU, union xmm_reg *src, union xmm_reg *dst);

Expand Down
1 change: 1 addition & 0 deletions jit/gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,7 @@ static inline bool gen_vec(enum arg src, enum arg dst, void (*helper)(), gadget_
}

#define VCOMPARE(src, dst,z) v(compare, src, dst,z)
#define VSHIFTL_IMM(src, dst, z) v(imm_shiftl, src, dst,z)
#define VSHIFTR_IMM(src, dst, z) v(imm_shiftr, src, dst,z)
#define V_OP(op, src, dst, z) v(op, src, dst, z)
#define V_OP_IMM(op, src, dst, z) v_imm(op, src, dst, z)
Expand Down
4 changes: 4 additions & 0 deletions tests/e2e/sse2/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ xorps
7.05E-37 5.31E-37 1.46E-38 1.18E-38
1.11E+01 2.22E+01 3.33E+01 4.44E+01
0.00E+00 0.00E+00 0.00E+00 0.00E+00
psllq
01234 05678
02468 11356
00000 00000
psrlq
01234 05678
00617 02839
Expand Down
32 changes: 32 additions & 0 deletions tests/e2e/sse2/psllq.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <stdint.h>
#include <stdio.h>
#include <emmintrin.h>
#include <xmmintrin.h>

#define printout() printf("%05lld %05lld\n", (long long) out[0], (long long) out[1])

void main(void) {
int64_t out[2] = { 0, 0 };
int64_t buf1234[2] = { 1234, 5678 };

// xmm1 Initially 1234
__m128i xmm1 = _mm_load_si128((__m128i*) buf1234);
_mm_store_si128((__m128i*) out, xmm1);
printout();

// xmm2 is just multiply by 2
asm volatile( "psllq $1, %[vec1]\n\t"
: [vec1] "+x" (xmm1)
:);
_mm_store_si128((__m128i*) out, xmm1);
printout();

// xmm1 should be cleared
asm volatile( "psllq $66, %[vec1]\n\t"
: [vec1] "+x" (xmm1)
:);
//shift_right(&xmm1, 66);
_mm_store_si128((__m128i*) out, xmm1);
printout();
}

4 changes: 4 additions & 0 deletions tests/e2e/sse2/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ echo xorps
gcc -msse2 xorps.c -o test_xorps
./test_xorps

echo psllq
gcc -msse2 psllq.c -o test_psllq
./test_psllq

echo psrlq
gcc -msse2 psrlq.c -o test_psrlq
./test_psrlq

0 comments on commit 03fd5bc

Please sign in to comment.