diff --git a/gen/gen_code.cpp b/gen/gen_code.cpp index b3a961a..bb83983 100644 --- a/gen/gen_code.cpp +++ b/gen/gen_code.cpp @@ -1045,6 +1045,7 @@ void put() puts("void lea(const Reg& reg, const Address& addr) { if (!reg.isBit(16 | i32e)) XBYAK_THROW(ERR_BAD_SIZE_OF_REGISTER) opModM(addr, reg, 0x8D); }"); puts("void bswap(const Reg32e& reg) { opModR(Reg32(1), reg, 0x0F); }"); puts("void ret(int imm = 0) { if (imm) { db(0xC2); dw(imm); } else { db(0xC3); } }"); + puts("void retf(int imm = 0) { if (imm) { db(0xCA); dw(imm); } else { db(0xCB); } }"); puts("void xadd(const Operand& op, const Reg& reg) { opModRM(reg, op, (op.isREG() && reg.isREG() && op.getBit() == reg.getBit()), op.isMEM(), 0x0F, 0xC0 | (reg.isBit(8) ? 0 : 1)); }"); puts("void cmpxchg(const Operand& op, const Reg& reg) { opModRM(reg, op, (op.isREG() && reg.isREG() && op.getBit() == reg.getBit()), op.isMEM(), 0x0F, 0xB0 | (reg.isBit(8) ? 0 : 1)); }"); diff --git a/test/make_nm.cpp b/test/make_nm.cpp index 2dda03e..8af0670 100644 --- a/test/make_nm.cpp +++ b/test/make_nm.cpp @@ -1276,6 +1276,9 @@ class Test { const char *p = "ret"; put(p); put(p, IMM); + p = "retf"; + put(p); + put(p, IMM); p = "mov"; put(p, EAX|REG32|MEM|MEM_ONLY_DISP, REG32|EAX); put(p, REG64|MEM|MEM_ONLY_DISP, REG64|RAX); diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h index 8954949..4efab2d 100644 --- a/xbyak/xbyak_mnemonic.h +++ b/xbyak/xbyak_mnemonic.h @@ -720,6 +720,7 @@ void repne() { db(0xF2); } void repnz() { db(0xF2); } void repz() { db(0xF3); } void ret(int imm = 0) { if (imm) { db(0xC2); dw(imm); } else { db(0xC3); } } +void retf(int imm = 0) { if (imm) { db(0xCA); dw(imm); } else { db(0xCB); } } void rol(const Operand& op, const Reg8& _cl) { opShift(op, _cl, 0); } void rol(const Operand& op, int imm) { opShift(op, imm, 0); } void ror(const Operand& op, const Reg8& _cl) { opShift(op, _cl, 1); }