diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-09-06 11:42:42 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2013-09-06 11:42:42 -0400 |
commit | db943fba243f0db60c967fbbd720650a705f5b35 (patch) | |
tree | 641249c7762e75ed0d1714a7a567325970f2987b | |
parent | 1f4a34212b8ae6410c0af541e28fa99f151658df (diff) |
Add more movd/movq plus test suite
-rw-r--r-- | simplex86.c | 15 | ||||
-rw-r--r-- | simplex86.h | 2 | ||||
-rw-r--r-- | testsuite.c | 41 |
3 files changed, 55 insertions, 3 deletions
diff --git a/simplex86.c b/simplex86.c index 3409215..3e24df6 100644 --- a/simplex86.c +++ b/simplex86.c @@ -392,18 +392,27 @@ static const variant_t variants[] = { I_movd, { A_SSE, A_RM32 }, F_SSE2, E_RM, 0x0f6e, PRE_66 }, { I_movd, { A_RM32, A_SSE }, F_SSE2, E_MR, 0x0f6e, PRE_66 }, - /* movq for SIMD<->mem */ + { I_vmovd, { A_SSE, A_RM32 }, F_AVX, E_RM, 0x6e, VEX(128,0x66,0x0f,W0) }, + { I_vmovd, { A_RM32, A_SSE }, F_AVX, E_MR, 0x7e, VEX(128,0x66,0x0f,W0) }, + { I_vmovd, { A_SSE, A_RM32 }, F_AVX, E_RM, 0x6e, VEX(128,0x66,0x0f,W0) }, + { I_vmovd, { A_RM32, A_SSE }, F_AVX, E_MR, 0x7e, VEX(128,0x66,0x0f,W0) }, + { I_movq, { A_MMX, A_RM64 }, F_MMX, E_RM, 0x0f6e }, { I_movq, { A_RM64, A_MMX }, F_MMX, E_MR, 0x0f7e }, { I_movq, { A_SSE, A_RM64 }, F_SSE2, E_RM, 0x0f6e, PRE_66 }, { I_movq, { A_RM64, A_SSE }, F_SSE2, E_MR, 0x0f7e, PRE_66 }, - - /* movq for SIMD<->SIMD */ { I_movq, { A_MMX, A_MMXM }, F_MMX, E_RM, 0x0f6f, NO_REX_W }, { I_movq, { A_MMXM, A_MMX }, F_MMX, E_MR, 0x0f7f, NO_REX_W }, { I_movq, { A_SSE, A_SSEM }, F_SSE2, E_RM, 0x0f7e, PRE_F3 | NO_REX_W }, { I_movq, { A_SSEM, A_SSE }, F_SSE2, E_MR, 0x0fd6, PRE_66 | NO_REX_W }, + { I_vmovq, { A_SSE, A_RM64 }, F_AVX, E_RM, 0x6e, VEX(128,0x66,0x0f,W1) }, + { I_vmovq, { A_RM64, A_SSE }, F_AVX, E_MR, 0x7e, VEX(128,0x66,0x0f,W1) }, + { I_vmovq, { A_SSE, A_RM64 }, F_AVX, E_RM, 0x6e, VEX(128,0x66,0x0f,W1) }, + { I_vmovq, { A_SSE, A_RM64 }, F_AVX, E_MR, 0x7e, VEX(128,0x66,0x0f,W1) }, + { I_vmovq, { A_SSE, A_SSEM }, F_AVX, E_RM, 0x7e, VEX(128,0xf3,0x0f,WIG) }, + { I_vmovq, { A_SSEM, A_SSE }, F_AVX, E_MR, 0xd6, VEX(128,0x66,0x0f,WIG) }, + #define MMX_TRINARY(name, opc) \ { I_##name, { A_MMX, A_MMXM }, F_MMX, E_RM, (0x0f00 + opc) }, \ { I_##name, { A_SSE, A_SSEM }, F_SSE2, E_RM, (0x0f00 + opc), PRE_66 }, \ diff --git a/simplex86.h b/simplex86.h index bddd3d1..f4751f5 100644 --- a/simplex86.h +++ b/simplex86.h @@ -316,7 +316,9 @@ typedef enum PROCESS_INSTRUCTION (mov, 2) \ PROCESS_INSTRUCTION (movabs, 3) \ PROCESS_INSTRUCTION (movd, 2) \ + PROCESS_INSTRUCTION (vmovd, 2) \ PROCESS_INSTRUCTION (movq, 2) \ + PROCESS_INSTRUCTION (vmovq, 2) \ PROCESS_INSTRUCTION (movq2dq, 2) \ PROCESS_INSTRUCTION (shrd, 3) \ PROCESS_INSTRUCTION (shld, 3) \ diff --git a/testsuite.c b/testsuite.c index 0aef5ed..0aece9e 100644 --- a/testsuite.c +++ b/testsuite.c @@ -86,6 +86,46 @@ test_shifts (assembler_t *as) } static uint8_t * +test_movdq (assembler_t *as) +{ + fragment_t *frag = fragment_new (as); + uint8_t *result; + + BEGIN_ASM (frag) + I_movd, mm7, DWORD_PTR + PTR (r9), + I_movd, DWORD_PTR + INDEX (r12, 0, rax, 8), mm7, + I_movd, xmm12, DWORD_PTR + PTR (r10), + I_movd, DWORD_PTR + INDEX (r11, 0, rax, 8), xmm12, + + I_vmovd, xmm12, DWORD_PTR + PTR (r10), + I_vmovd, DWORD_PTR + INDEX (r11, 0, rax, 8), xmm12, + + /* These variants should use the RM64 variant + * due to r9 being a 64 bit register + */ + I_movq, mm7, PTR (r9), + I_movq, PTR(r9), mm7, + I_movq, xmm7, PTR (r10), + I_movq, PTR (r10), xmm7, + + /* These will use the SSEM variant due to eax being + * a 32 bit register + */ + I_movq, PTR (eax), xmm7, + I_movq, xmm7, PTR (eax), + I_movq, PTR (eax), mm7, + I_movq, mm7, PTR (eax), + + I_vmovq, PTR (eax), xmm7, + I_vmovq, xmm7, PTR (eax), + END_ASM (); + + result = assembler_link (as, frag, NULL); + + return result; +} + +static uint8_t * test_float (assembler_t *as) { fragment_t *frag = fragment_new (as); @@ -423,6 +463,7 @@ main () success &= run_test (as, "test_convert", test_convert, 0x9d52c83b); success &= run_test (as, "test_misc", test_misc, 0x483565c1); success &= run_test (as, "test_riprel", test_riprel, 0xf5497642); + success &= run_test (as, "test_movdq", test_movdq, 0xf6f727a6); if (success) printf ("Test suite PASSED\n"); |