diff --git a/gen/gen_code.cpp b/gen/gen_code.cpp index 8a6f7ac..251351c 100644 --- a/gen/gen_code.cpp +++ b/gen/gen_code.cpp @@ -1733,7 +1733,7 @@ void put() uint8_t code; } tbl[] = { { "andn", T_0F38 | T_VEX | T_NF, 0xF2 }, - { "mulx", T_F2 | T_0F38, 0xF6 }, + { "mulx", T_F2 | T_0F38 | T_VEX , 0xF6 }, { "pdep", T_F2 | T_0F38, 0xF5 }, { "pext", T_F3 | T_0F38, 0xF5 }, }; diff --git a/test/apx.cpp b/test/apx.cpp index d07c6cc..633b4bc 100644 --- a/test/apx.cpp +++ b/test/apx.cpp @@ -457,7 +457,7 @@ CYBOZU_TEST_AUTO(NF) CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n); } -CYBOZU_TEST_AUTO(andn) +CYBOZU_TEST_AUTO(andn_etc) { struct Code : Xbyak::CodeGenerator { Code() @@ -467,11 +467,21 @@ CYBOZU_TEST_AUTO(andn) andn(eax, ecx, r8d); // 32bit andn(r29, r30, r31); // 64bit andn(r29, r30, ptr [r31+r20*4]); + + mulx(rax, rcx, r8); + mulx(eax, ecx, r8d); + mulx(r29, r30, r31); + mulx(r29, r30, ptr [r31+r20*4]); } } c; const uint8_t tbl[] = { + // andn 0xc4, 0xc2, 0xf0, 0xf2, 0xc0, 0x62, 0xd2, 0xf4, 0x08, 0xf2, 0xc0, 0xc4, 0xc2, 0x70, 0xf2, 0xc0, 0x62, 0x4a, 0x8c, 0x00, 0xf2, 0xef, 0x62, 0x4a, 0x88, 0x00, 0xf2, 0x2c, 0xa7, + + // mulx + 0xc4, 0xc2, 0xf3, 0xf6, 0xc0, 0xc4, 0xc2, 0x73, 0xf6, 0xc0, 0x62, 0x4a, 0x8f, 0x00, 0xf6, 0xef, +0x62, 0x4a, 0x8b, 0x00, 0xf6, 0x2c, 0xa7, }; const size_t n = sizeof(tbl); CYBOZU_TEST_EQUAL(c.getSize(), n); diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h index 5d31a63..4f769f0 100644 --- a/xbyak/xbyak_mnemonic.h +++ b/xbyak/xbyak_mnemonic.h @@ -560,7 +560,7 @@ void mulpd(const Xmm& xmm, const Operand& op) { opSSE(xmm, op, T_0F | T_66, 0x59 void mulps(const Xmm& xmm, const Operand& op) { opSSE(xmm, op, T_0F, 0x59, isXMM_XMMorMEM); } void mulsd(const Xmm& xmm, const Operand& op) { opSSE(xmm, op, T_0F | T_F2, 0x59, isXMM_XMMorMEM); } void mulss(const Xmm& xmm, const Operand& op) { opSSE(xmm, op, T_0F | T_F3, 0x59, isXMM_XMMorMEM); } -void mulx(const Reg& r1, const Reg32e& r2, const Operand& op) { opRRO(r1, r2, op, T_F2|T_0F38, 0xf6); } +void mulx(const Reg& r1, const Reg32e& r2, const Operand& op) { opRRO(r1, r2, op, T_VEX|T_F2|T_0F38, 0xf6); } void mwait() { db(0x0F); db(0x01); db(0xC9); } void mwaitx() { db(0x0F); db(0x01); db(0xFB); } void neg(const Operand& op) { opRext(op, 0, 3, 0, 0xF6); }