From 2e8a3235b897bd0dcbc0108b731e796cf1a5bbe3 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 19 Apr 2011 23:02:19 +0000 Subject: [PATCH] Added the "movq" instruction --- src/arch/i686.ins | 141 +++++++++++++++++++++++++--------------------- test/i686.S | 12 ++++ 2 files changed, 90 insertions(+), 63 deletions(-) diff --git a/src/arch/i686.ins b/src/arch/i686.ins index 124f6a2..b38e73c 100644 --- a/src/arch/i686.ins +++ b/src/arch/i686.ins @@ -27,73 +27,88 @@ /* instructions */ /* EMMS 0x0f77 2 */ -{ "emms", 0x0f77, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, -/* PADDB 0x0ffc /r 2 mm mm/m64 */ +{ "emms", 0x0f77, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* MOVQ 0x0f6f /r OP2F mm mm/m64 */ #if 1 /* FIXME doesn't work properly */ -{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +{ "movq", 0x0f6f, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "movq", 0x0f6f, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "movq", 0x0f6f, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "movq", 0x0f6f, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, #endif -/* PADDD 0x0ffd /r 2 mm mm/m64 */ +/* MOVQ 0x0f7f /r OP2F mm/m64 mm */ +{ "movq", 0x0f7f, OP2F, OP_RM64_D0_R,OP_R64_R, AOT_NONE }, +{ "movq", 0x0f7f, OP2F, OP_RM64_D8_R,OP_R64_R, AOT_NONE }, +{ "movq", 0x0f7f, OP2F, OP_RM64_DW_R,OP_R64_R, AOT_NONE }, #if 1 /* FIXME doesn't work properly */ -{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +{ "movq", 0x0f7f, OP2F, OP_RM64_R64_R,OP_R64_R, AOT_NONE }, #endif -/* PADDW 0x0ffd /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* PADDSB 0x0fec /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* PADDSW 0x0fed /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* PAND 0x0fdb /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* PANDN 0x0fdf /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* POR 0x0feb /r 2 mm mm/m64 */ -#if 1 /* FIXME doesn't work properly */ -{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, -#endif -/* PUNPCKLBW 0x0f60 /r 2 mm mm/m32 */ /* FIXME implement */ -/* PUNPCKLBD 0x0f61 /r 2 mm mm/m32 */ -/* FIXME implement */ -/* PUNPCKLBQ 0x0f62 /r 2 mm mm/m32 */ -/* FIXME implement */ -/* PXOR 0x0fef /r 2 mm mm/m64 */ +/* PADDB 0x0ffc /r 2 mm mm/m64 */ #if 1 /* FIXME doesn't work properly */ -{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE}, -{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE}, -{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE}, -{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "paddb", 0x0ffc, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PADDD 0x0ffd /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "paddd", 0x0ffe, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PADDW 0x0ffd /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "paddw", 0x0ffd, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PADDSB 0x0fec /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "paddsb", 0x0fec, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PADDSW 0x0fed /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "paddsw", 0x0fed, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PAND 0x0fdb /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "pand", 0x0fdb, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PANDN 0x0fdf /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "pandn", 0x0fdf, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* POR 0x0feb /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "por", 0x0feb, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, +#endif +/* PUNPCKLBW 0x0f60 /r 2 mm mm/m32 */ +/* FIXME implement */ +/* PUNPCKLBD 0x0f61 /r 2 mm mm/m32 */ +/* FIXME implement */ +/* PUNPCKLBQ 0x0f62 /r 2 mm mm/m32 */ +/* FIXME implement */ +/* PXOR 0x0fef /r 2 mm mm/m64 */ +#if 1 /* FIXME doesn't work properly */ +{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_D0_R,AOT_NONE }, +{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_D8_R,AOT_NONE }, +{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_DW_R,AOT_NONE }, +{ "pxor", 0x0fef, OP2F, OP_R64_R, OP_RM64_R64_R,AOT_NONE}, #endif diff --git a/test/i686.S b/test/i686.S index 0a09c6d..3bc6e76 100644 --- a/test/i686.S +++ b/test/i686.S @@ -1,6 +1,18 @@ /* $Id$ */ .text emms /* 0f 77 */ +#if 1 /* FIXME doesn't work properly */ + movq %mm1, [%edx] + movq %mm2, [%edx + $0x56] + movq %mm3, [%edx + $0x789abc] + movq %mm4, %mm5 +#endif + movq [%edx], %mm2 + movq [%edx + $0x56], %mm3 + movq [%edx + $0x789abc], %mm4 +#if 1 /* FIXME doesn't work properly */ + movq %mm5, %mm6 +#endif #if 1 /* FIXME doesn't work properly */ paddb %mm1, [%edx] paddb %mm2, [%edx + $0x56]