@@ -1600,31 +1600,39 @@ LLVMBuildUtils::Comparison LLVMBuildUtils::swapComparisonArgs(Comparison type)
16001600
16011601llvm::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
16831691llvm::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
17111730llvm::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