summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2013-09-06 11:42:42 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-09-06 11:42:42 -0400
commitdb943fba243f0db60c967fbbd720650a705f5b35 (patch)
tree641249c7762e75ed0d1714a7a567325970f2987b
parent1f4a34212b8ae6410c0af541e28fa99f151658df (diff)
Add more movd/movq plus test suite
-rw-r--r--simplex86.c15
-rw-r--r--simplex86.h2
-rw-r--r--testsuite.c41
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");