Skip to content

Commit 24c8a12

Browse files
committed
Add support for Tzcnt and Lzcnt
1 parent 2ad4c7c commit 24c8a12

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

src/capstone2llvmir/x86/x86.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3364,6 +3364,7 @@ void Capstone2LlvmIrTranslatorX86_impl::translateShiftX(cs_insn* i, cs_x86* xi,
33643364
case X86_INS_SHR: return llvm::Instruction::BinaryOps::LShr;
33653365
case X86_INS_SAR: return llvm::Instruction::BinaryOps::AShr;
33663366
case X86_INS_SHL: return llvm::Instruction::BinaryOps::Shl;
3367+
default: assert(false);
33673368
}
33683369
}();
33693370

@@ -5442,5 +5443,28 @@ void Capstone2LlvmIrTranslatorX86_impl::translateRdtscp(cs_insn* i, cs_x86* xi,
54425443
storeRegister(X86_REG_ECX, irb.CreateExtractValue(c, {2}), irb);
54435444
}
54445445

5446+
void Capstone2LlvmIrTranslatorX86_impl::translateTzcntOrLzcnt(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb)
5447+
{
5448+
EXPECT_IS_BINARY(i, xi, irb);
5449+
5450+
std::tie(op0, op1) = loadOpBinary(xi, irb);
5451+
5452+
storeRegister(X86_REG_CF, generateZeroFlag(op1, irb), irb);
5453+
5454+
op0 = irb.CreateIntrinsic(
5455+
i->id == X86_INS_LZCNT ? llvm::Intrinsic::ctlz : llvm::Intrinsic::cttz,
5456+
{op1->getType()},
5457+
{op1, irb.getFalse()});
5458+
5459+
storeRegister(X86_REG_OF, irb.getFalse(), irb); // undef
5460+
storeRegister(X86_REG_SF, irb.getFalse(), irb); // undef
5461+
storeRegister(X86_REG_PF, irb.getFalse(), irb); // undef
5462+
storeRegister(X86_REG_AF, irb.getFalse(), irb); // undef
5463+
5464+
storeRegister(X86_REG_ZF, generateZeroFlag(op0, irb), irb);
5465+
5466+
storeOp(xi->operands[0], op0, irb);
5467+
}
5468+
54455469
} // namespace capstone2llvmir
54465470
} // namespace retdec

src/capstone2llvmir/x86/x86_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ class Capstone2LlvmIrTranslatorX86_impl :
354354
void translateXchg(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
355355
void translateXlatb(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
356356
void translateXor(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
357+
void translateTzcntOrLzcnt(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
357358
};
358359

359360
} // namespace capstone2llvmir

src/capstone2llvmir/x86/x86_init.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ Capstone2LlvmIrTranslatorX86_impl::_i2fm =
966966
{X86_INS_LSS, &Capstone2LlvmIrTranslatorX86_impl::translateLoadFarPtr},
967967
{X86_INS_LTR, nullptr},
968968
{X86_INS_XADD, &Capstone2LlvmIrTranslatorX86_impl::translateAdd},
969-
{X86_INS_LZCNT, nullptr},
969+
{X86_INS_LZCNT, &Capstone2LlvmIrTranslatorX86_impl::translateTzcntOrLzcnt},
970970
{X86_INS_MASKMOVDQU, nullptr},
971971
{X86_INS_MAXPD, nullptr},
972972
{X86_INS_MAXPS, nullptr},
@@ -1320,7 +1320,7 @@ Capstone2LlvmIrTranslatorX86_impl::_i2fm =
13201320
{X86_INS_TEST, &Capstone2LlvmIrTranslatorX86_impl::translateAnd},
13211321
{X86_INS_UD2, &Capstone2LlvmIrTranslatorX86_impl::translateNop},
13221322
{X86_INS_FTST, &Capstone2LlvmIrTranslatorX86_impl::translateFucomPop},
1323-
{X86_INS_TZCNT, nullptr},
1323+
{X86_INS_TZCNT, &Capstone2LlvmIrTranslatorX86_impl::translateTzcntOrLzcnt},
13241324
{X86_INS_TZMSK, nullptr},
13251325
{X86_INS_FUCOMPI, &Capstone2LlvmIrTranslatorX86_impl::translateFucomPop},
13261326
{X86_INS_FUCOMI, &Capstone2LlvmIrTranslatorX86_impl::translateFucomPop},

0 commit comments

Comments
 (0)