diff options
author | MITSUNARI Shigeo <[email protected]> | 2023-02-20 14:03:03 +0900 |
---|---|---|
committer | MITSUNARI Shigeo <[email protected]> | 2023-02-20 14:07:43 +0900 |
commit | ad0dfffd29e1e99e3f9b7aae575dc901cd67b56d (patch) | |
tree | 97a5e6cb1c4fd2766b3cc11c6ef50b71663416da | |
parent | e78f1121b92a5544ace367115427ed88fbc7bb12 (diff) | |
download | xbyak-ad0dfffd29e1e99e3f9b7aae575dc901cd67b56d.tar.gz xbyak-ad0dfffd29e1e99e3f9b7aae575dc901cd67b56d.zip |
add senduipi/stui/testui/uiret
-rw-r--r-- | gen/gen_code.cpp | 6 | ||||
-rw-r--r-- | test/misc.cpp | 10 | ||||
-rw-r--r-- | xbyak/xbyak_mnemonic.h | 6 |
3 files changed, 20 insertions, 2 deletions
diff --git a/gen/gen_code.cpp b/gen/gen_code.cpp index e0fb14f..a074db3 100644 --- a/gen/gen_code.cpp +++ b/gen/gen_code.cpp @@ -659,7 +659,6 @@ void put() { "cli", 0xFA }, { "cmc", 0xF5 }, - { "clui", 0xF3, 0x0F, 0x01, 0xEE }, { "cpuid", 0x0F, 0xA2 }, { "cwd", 0x66, 0x99 }, { "cwde", 0x98 }, @@ -1868,6 +1867,10 @@ void put64() { "stosq", 0x48, 0xAB }, { "syscall", 0x0F, 0x05 }, { "sysret", 0x0F, 0x07 }, + { "clui", 0xF3, 0x0F, 0x01, 0xEE }, + { "stui", 0xF3, 0x0F, 0x01, 0xEF }, + { "testui", 0xF3, 0x0F, 0x01, 0xED }, + { "uiret", 0xF3, 0x0F, 0x01, 0xEC }, }; putGeneric(tbl, NUM_OF_ARRAY(tbl)); @@ -1878,6 +1881,7 @@ void put64() puts("void movsxd(const Reg64& reg, const Operand& op) { if (!op.isBit(32)) XBYAK_THROW(ERR_BAD_COMBINATION) opModRM(reg, op, op.isREG(), op.isMEM(), 0x63); }"); puts("void pextrq(const Operand& op, const Xmm& xmm, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x16, 0x66, 0, imm, 0x3A); }"); puts("void pinsrq(const Xmm& xmm, const Operand& op, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x22, 0x66, 0, imm, 0x3A); }"); + puts("void senduipi(const Reg64& r) { db(0xF3); opModR(Reg32(6), r.cvt32(), 0x0F, 0xC7); }"); puts("void vcvtss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_ER_X | T_N8, 0x2D); }"); puts("void vcvttss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_SAE_X | T_N8, 0x2C); }"); diff --git a/test/misc.cpp b/test/misc.cpp index 6bf8d3d..a62d9c0 100644 --- a/test/misc.cpp +++ b/test/misc.cpp @@ -1950,6 +1950,11 @@ CYBOZU_TEST_AUTO(misc) movdiri(ptr[rax+r12*2+4], r9d); movdir64b(r10, ptr[r8]); clui(); + senduipi(rax); + senduipi(r10); + stui(); + testui(); + uiret(); #endif } } c; @@ -1974,6 +1979,11 @@ CYBOZU_TEST_AUTO(misc) 0x46, 0x0f, 0x38, 0xf9, 0x4c, 0x60, 0x04, // movdiri 0x66, 0x45, 0x0f, 0x38, 0xf8, 0x10, // movdir64b 0xf3, 0x0f, 0x01, 0xee, // clui + 0xf3, 0x0f, 0xc7, 0xf0, // senduipi rax + 0xf3, 0x41, 0x0f, 0xc7, 0xf2, // senduipi r10 + 0xf3, 0x0f, 0x01, 0xef, // stui + 0xf3, 0x0f, 0x01, 0xed, // testui + 0xf3, 0x0f, 0x01, 0xec, // uiret #endif }; const size_t n = sizeof(tbl) / sizeof(tbl[0]); diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h index 792ea96..9f0c8ac 100644 --- a/xbyak/xbyak_mnemonic.h +++ b/xbyak/xbyak_mnemonic.h @@ -65,7 +65,6 @@ void cldemote(const Address& addr) { opMIB(addr, eax, 0x0F, 0x1C); } void clflush(const Address& addr) { opModM(addr, Reg32(7), 0x0F, 0xAE); } void clflushopt(const Address& addr) { db(0x66); opModM(addr, Reg32(7), 0x0F, 0xAE); } void cli() { db(0xFA); } -void clui() { db(0xF3); db(0x0F); db(0x01); db(0xEE); } void clwb(const Address& addr) { db(0x66); opMIB(addr, esi, 0x0F, 0xAE); } void clzero() { db(0x0F); db(0x01); db(0xFC); } void cmc() { db(0xF5); } @@ -1652,6 +1651,10 @@ void scasq() { db(0x48); db(0xAF); } void stosq() { db(0x48); db(0xAB); } void syscall() { db(0x0F); db(0x05); } void sysret() { db(0x0F); db(0x07); } +void clui() { db(0xF3); db(0x0F); db(0x01); db(0xEE); } +void stui() { db(0xF3); db(0x0F); db(0x01); db(0xEF); } +void testui() { db(0xF3); db(0x0F); db(0x01); db(0xED); } +void uiret() { db(0xF3); db(0x0F); db(0x01); db(0xEC); } void cmpxchg16b(const Address& addr) { opModM(addr, Reg64(1), 0x0F, 0xC7); } void fxrstor64(const Address& addr) { opModM(addr, Reg64(1), 0x0F, 0xAE); } void movq(const Reg64& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); } @@ -1659,6 +1662,7 @@ void movq(const Mmx& mmx, const Reg64& reg) { if (mmx.isXMM()) db(0x66); opModR( void movsxd(const Reg64& reg, const Operand& op) { if (!op.isBit(32)) XBYAK_THROW(ERR_BAD_COMBINATION) opModRM(reg, op, op.isREG(), op.isMEM(), 0x63); } void pextrq(const Operand& op, const Xmm& xmm, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x16, 0x66, 0, imm, 0x3A); } void pinsrq(const Xmm& xmm, const Operand& op, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x22, 0x66, 0, imm, 0x3A); } +void senduipi(const Reg64& r) { db(0xF3); opModR(Reg32(6), r.cvt32(), 0x0F, 0xC7); } void vcvtss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_ER_X | T_N8, 0x2D); } void vcvttss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_SAE_X | T_N8, 0x2C); } void vcvtsd2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F2 | T_W1 | T_EVEX | T_EW1 | T_N4 | T_ER_X, 0x2D); } |