Skip to content

Commit e43091b

Browse files
committed
LLVMBuildUtils: Add integer support to comparison instructions
1 parent 82c8f0e commit e43091b

File tree

1 file changed

+48
-30
lines changed

1 file changed

+48
-30
lines changed

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,31 +1600,39 @@ LLVMBuildUtils::Comparison LLVMBuildUtils::swapComparisonArgs(Comparison type)
16001600

16011601
llvm::Value *LLVMBuildUtils::createNumberAndNumberComparison(LLVMRegister *arg1, LLVMRegister *arg2, Comparison type)
16021602
{
1603-
// TODO: Add integer support
1604-
llvm::Value *value1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Double);
1605-
llvm::Value *value2 = castValue(arg2, Compiler::StaticType::Number, NumberType::Double);
1603+
llvm::Value *double1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Double);
1604+
llvm::Value *double2 = castValue(arg2, Compiler::StaticType::Number, NumberType::Double);
1605+
1606+
llvm::Value *int1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Int);
1607+
llvm::Value *int2 = castValue(arg2, Compiler::StaticType::Number, NumberType::Int);
1608+
1609+
llvm::Value *isInt = m_builder.CreateAnd(arg1->isInt, arg2->isInt);
1610+
llvm::Value *bothNan = m_builder.CreateAnd(isNaN(double1), isNaN(double2)); // NaN == NaN
16061611

16071612
switch (type) {
16081613
case Comparison::EQ: {
1609-
llvm::Value *bothNan = m_builder.CreateAnd(isNaN(value1), isNaN(value2)); // NaN == NaN
1610-
llvm::Value *cmp = m_builder.CreateFCmpOEQ(value1, value2);
1611-
return m_builder.CreateOr(bothNan, cmp);
1614+
llvm::Value *fcmp = m_builder.CreateFCmpOEQ(double1, double2);
1615+
llvm::Value *doubleResult = m_builder.CreateOr(bothNan, fcmp);
1616+
llvm::Value *icmp = m_builder.CreateICmpEQ(int1, int2);
1617+
return m_builder.CreateSelect(isInt, icmp, doubleResult);
16121618
}
16131619

16141620
case Comparison::GT: {
1615-
llvm::Value *bothNan = m_builder.CreateAnd(isNaN(value1), isNaN(value2)); // NaN == NaN
1616-
llvm::Value *cmp = m_builder.CreateFCmpOGT(value1, value2);
1617-
llvm::Value *nan = isNaN(value1);
1618-
llvm::Value *nanCmp = m_builder.CreateFCmpUGT(value1, value2);
1619-
return m_builder.CreateAnd(m_builder.CreateNot(bothNan), m_builder.CreateSelect(nan, nanCmp, cmp));
1621+
llvm::Value *fcmp = m_builder.CreateFCmpOGT(double1, double2);
1622+
llvm::Value *nan = isNaN(double1);
1623+
llvm::Value *nanCmp = m_builder.CreateFCmpUGT(double1, double2);
1624+
llvm::Value *doubleResult = m_builder.CreateAnd(m_builder.CreateNot(bothNan), m_builder.CreateSelect(nan, nanCmp, fcmp));
1625+
llvm::Value *icmp = m_builder.CreateICmpSGT(int1, int2);
1626+
return m_builder.CreateSelect(isInt, icmp, doubleResult);
16201627
}
16211628

16221629
case Comparison::LT: {
1623-
llvm::Value *bothNan = m_builder.CreateAnd(isNaN(value1), isNaN(value2)); // NaN == NaN
1624-
llvm::Value *cmp = m_builder.CreateFCmpOLT(value1, value2);
1625-
llvm::Value *nan = isNaN(value2);
1626-
llvm::Value *nanCmp = m_builder.CreateFCmpULT(value1, value2);
1627-
return m_builder.CreateAnd(m_builder.CreateNot(bothNan), m_builder.CreateSelect(nan, nanCmp, cmp));
1630+
llvm::Value *fcmp = m_builder.CreateFCmpOLT(double1, double2);
1631+
llvm::Value *nan = isNaN(double2);
1632+
llvm::Value *nanCmp = m_builder.CreateFCmpULT(double1, double2);
1633+
llvm::Value *doubleResult = m_builder.CreateAnd(m_builder.CreateNot(bothNan), m_builder.CreateSelect(nan, nanCmp, fcmp));
1634+
llvm::Value *icmp = m_builder.CreateICmpSLT(int1, int2);
1635+
return m_builder.CreateSelect(isInt, icmp, doubleResult);
16281636
}
16291637

16301638
default:
@@ -1682,25 +1690,36 @@ llvm::Value *LLVMBuildUtils::createStringAndStringComparison(LLVMRegister *arg1,
16821690

16831691
llvm::Value *LLVMBuildUtils::createNumberAndBoolComparison(LLVMRegister *arg1, LLVMRegister *arg2, Comparison type)
16841692
{
1685-
// TODO: Add integer support
1686-
llvm::Value *value1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Double);
1687-
llvm::Value *value2 = castValue(arg2, Compiler::StaticType::Bool);
1693+
llvm::Value *doubleValue1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Double);
1694+
llvm::Value *intValue1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Int);
1695+
1696+
llvm::Value *boolValue2 = castValue(arg2, Compiler::StaticType::Bool);
1697+
llvm::Value *intValue2 = castValue(arg2, Compiler::StaticType::Number, NumberType::Int);
16881698

1689-
llvm::Value *doubleValue = m_builder.CreateUIToFP(value2, m_builder.getDoubleTy());
1699+
llvm::Value *doubleValue2 = m_builder.CreateUIToFP(boolValue2, m_builder.getDoubleTy());
1700+
llvm::Value *isInt = arg1->isInt;
16901701

16911702
switch (type) {
1692-
case Comparison::EQ:
1693-
return m_builder.CreateFCmpOEQ(value1, doubleValue);
1703+
case Comparison::EQ: {
1704+
llvm::Value *fcmp = m_builder.CreateFCmpOEQ(doubleValue1, doubleValue2);
1705+
llvm::Value *icmp = m_builder.CreateICmpEQ(intValue1, intValue2);
1706+
return m_builder.CreateSelect(isInt, icmp, fcmp);
1707+
}
16941708

16951709
case Comparison::GT: {
1696-
llvm::Value *cmp = m_builder.CreateFCmpOGT(value1, doubleValue);
1697-
llvm::Value *nan = isNaN(value1);
1698-
llvm::Value *nanCmp = m_builder.CreateFCmpUGT(value1, doubleValue);
1699-
return m_builder.CreateSelect(nan, nanCmp, cmp);
1710+
llvm::Value *fcmp = m_builder.CreateFCmpOGT(doubleValue1, doubleValue2);
1711+
llvm::Value *nan = isNaN(doubleValue1);
1712+
llvm::Value *nanCmp = m_builder.CreateFCmpUGT(doubleValue1, doubleValue2);
1713+
llvm::Value *doubleResult = m_builder.CreateSelect(nan, nanCmp, fcmp);
1714+
llvm::Value *icmp = m_builder.CreateICmpSGT(intValue1, intValue2);
1715+
return m_builder.CreateSelect(isInt, icmp, doubleResult);
17001716
}
17011717

1702-
case Comparison::LT:
1703-
return m_builder.CreateFCmpOLT(value1, doubleValue);
1718+
case Comparison::LT: {
1719+
llvm::Value *fcmp = m_builder.CreateFCmpOLT(doubleValue1, doubleValue2);
1720+
llvm::Value *icmp = m_builder.CreateICmpSLT(intValue1, intValue2);
1721+
return m_builder.CreateSelect(isInt, icmp, fcmp);
1722+
}
17041723

17051724
default:
17061725
assert(false);
@@ -1710,12 +1729,11 @@ llvm::Value *LLVMBuildUtils::createNumberAndBoolComparison(LLVMRegister *arg1, L
17101729

17111730
llvm::Value *LLVMBuildUtils::createNumberAndStringComparison(LLVMRegister *arg1, LLVMRegister *arg2, Comparison type)
17121731
{
1713-
// TODO: Add integer support
17141732
llvm::Value *value1 = castValue(arg1, Compiler::StaticType::Number, NumberType::Double);
17151733
llvm::Value *value2 = castValue(arg2, Compiler::StaticType::String);
17161734

17171735
// If the number is NaN, skip the string to double conversion
1718-
llvm::Value *nan = isNaN(value1);
1736+
llvm::Value *nan = m_builder.CreateAnd(m_builder.CreateNot(arg1->isInt), isNaN(value1));
17191737

17201738
llvm::BasicBlock *nanBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function);
17211739
llvm::BasicBlock *stringCastBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function);

0 commit comments

Comments
 (0)