Set CF correctly on BLSI patch

This commit is contained in:
offtkp 2024-09-02 01:55:45 +03:00
parent 101aeb920d
commit 1e9ca6fb7f

View File

@ -307,9 +307,24 @@ static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
SaveRegisters(c, {scratch}); SaveRegisters(c, {scratch});
// BLSI sets CF to zero if source is zero, otherwise it sets CF to one.
Xbyak::Label carrySet, carryNotSet, end;
c.mov(scratch, *src); c.mov(scratch, *src);
c.neg(scratch); c.neg(scratch); // NEG, like BLSI, clears CF if the source is zero and sets it otherwise
c.jc(carrySet);
c.jmp(carryNotSet);
c.L(carrySet);
c.and_(scratch, *src); c.and_(scratch, *src);
c.stc(); // setting/clearing carry needs to happen after the AND because that clears CF
c.jmp(end);
c.L(carryNotSet);
c.and_(scratch, *src);
c.clc();
c.L(end);
c.mov(dst, scratch); c.mov(dst, scratch);
RestoreRegisters(c, {scratch}); RestoreRegisters(c, {scratch});