@@ -144,6 +144,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
144144 break ;
145145 }
146146
147+ case Step::Type::CmpLT: {
148+ assert (step.args .size () == 2 );
149+ const auto &arg1 = step.args [0 ].second ;
150+ const auto &arg2 = step.args [1 ].second ;
151+ step.functionReturnReg ->value = createComparison (arg1, arg2, Comparison::LT);
152+ break ;
153+ }
154+
147155 case Step::Type::Yield:
148156 if (!m_warp) {
149157 freeHeap ();
@@ -492,6 +500,11 @@ void LLVMCodeBuilder::createCmpGT()
492500 createOp (Step::Type::CmpGT, Compiler::StaticType::Bool, 2 );
493501}
494502
503+ void LLVMCodeBuilder::createCmpLT ()
504+ {
505+ createOp (Step::Type::CmpLT, Compiler::StaticType::Bool, 2 );
506+ }
507+
495508void LLVMCodeBuilder::beginIfStatement ()
496509{
497510 Step step (Step::Type::BeginIf);
@@ -1036,8 +1049,25 @@ llvm::Value *LLVMCodeBuilder::createComparison(std::shared_ptr<Register> arg1, s
10361049 return m_builder.CreateAnd (m_builder.CreateNot (bothNan), m_builder.CreateSelect (nan, nanCmp, cmp));
10371050 }
10381051
1039- case Comparison::LT:
1040- return m_builder.CreateFCmpOLT (value1, value2);
1052+ case Comparison::LT: {
1053+ llvm::Value *bothNan = m_builder.CreateAnd (isNaN (value1), isNaN (value2)); // NaN == NaN
1054+ llvm::Value *cmp = m_builder.CreateFCmpOLT (value1, value2);
1055+ llvm::Value *nan;
1056+ llvm::Value *nanCmp;
1057+
1058+ if (optNumberBool == 1 ) {
1059+ nan = isNaN (value2);
1060+ nanCmp = m_builder.CreateNot (castValue (arg1, Compiler::StaticType::Bool));
1061+ } else if (optNumberBool == 2 ) {
1062+ nan = isNaN (value1);
1063+ nanCmp = castValue (arg2, Compiler::StaticType::Bool);
1064+ } else {
1065+ nan = isNaN (value2);
1066+ nanCmp = m_builder.CreateFCmpULT (value1, value2);
1067+ }
1068+
1069+ return m_builder.CreateAnd (m_builder.CreateNot (bothNan), m_builder.CreateSelect (nan, nanCmp, cmp));
1070+ }
10411071
10421072 default :
10431073 assert (false );
@@ -1056,7 +1086,8 @@ llvm::Value *LLVMCodeBuilder::createComparison(std::shared_ptr<Register> arg1, s
10561086 return m_builder.CreateAnd (value1, m_builder.CreateNot (value2));
10571087
10581088 case Comparison::LT:
1059- return m_builder.CreateICmpSLT (value1, value2);
1089+ // value2 && !value1
1090+ return m_builder.CreateAnd (value2, m_builder.CreateNot (value1));
10601091
10611092 default :
10621093 assert (false );
0 commit comments