mulx supports apx

This commit is contained in:
MITSUNARI Shigeo 2023-11-10 09:32:44 +09:00
parent 82529af93e
commit 16f1a5d8a6
3 changed files with 13 additions and 3 deletions

View file

@ -1733,7 +1733,7 @@ void put()
uint8_t code; uint8_t code;
} tbl[] = { } tbl[] = {
{ "andn", T_0F38 | T_VEX | T_NF, 0xF2 }, { "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 }, { "pdep", T_F2 | T_0F38, 0xF5 },
{ "pext", T_F3 | T_0F38, 0xF5 }, { "pext", T_F3 | T_0F38, 0xF5 },
}; };

View file

@ -457,7 +457,7 @@ CYBOZU_TEST_AUTO(NF)
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n); CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
} }
CYBOZU_TEST_AUTO(andn) CYBOZU_TEST_AUTO(andn_etc)
{ {
struct Code : Xbyak::CodeGenerator { struct Code : Xbyak::CodeGenerator {
Code() Code()
@ -467,11 +467,21 @@ CYBOZU_TEST_AUTO(andn)
andn(eax, ecx, r8d); // 32bit andn(eax, ecx, r8d); // 32bit
andn(r29, r30, r31); // 64bit andn(r29, r30, r31); // 64bit
andn(r29, r30, ptr [r31+r20*4]); 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; } c;
const uint8_t tbl[] = { const uint8_t tbl[] = {
// andn
0xc4, 0xc2, 0xf0, 0xf2, 0xc0, 0x62, 0xd2, 0xf4, 0x08, 0xf2, 0xc0, 0xc4, 0xc2, 0x70, 0xf2, 0xc0, 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, 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); const size_t n = sizeof(tbl);
CYBOZU_TEST_EQUAL(c.getSize(), n); CYBOZU_TEST_EQUAL(c.getSize(), n);

View file

@ -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 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 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 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 mwait() { db(0x0F); db(0x01); db(0xC9); }
void mwaitx() { db(0x0F); db(0x01); db(0xFB); } void mwaitx() { db(0x0F); db(0x01); db(0xFB); }
void neg(const Operand& op) { opRext(op, 0, 3, 0, 0xF6); } void neg(const Operand& op) { opRext(op, 0, 3, 0, 0xF6); }