@@ -484,6 +484,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
484484 break ;
485485 }
486486
487+ case LLVMInstruction::Type::RemoveListItem: {
488+ assert (step.args .size () == 1 );
489+ const auto &arg = step.args [0 ];
490+ const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
491+ llvm::Value *index = m_builder.CreateFPToUI (castValue (arg.second , arg.first ), m_builder.getInt64Ty ());
492+ m_builder.CreateCall (resolve_list_remove (), { listPtr.ptr , index });
493+ break ;
494+ }
495+
487496 case LLVMInstruction::Type::Yield:
488497 if (!m_warp) {
489498 freeHeap ();
@@ -946,6 +955,13 @@ void LLVMCodeBuilder::createListClear(List *list)
946955 m_listPtrs[list] = LLVMListPtr ();
947956}
948957
958+ void LLVMCodeBuilder::createListRemove (List *list)
959+ {
960+ LLVMInstruction &ins = createOp (LLVMInstruction::Type::RemoveListItem, Compiler::StaticType::Void, Compiler::StaticType::Number, 1 );
961+ ins.workList = list;
962+ m_listPtrs[list] = LLVMListPtr ();
963+ }
964+
949965void LLVMCodeBuilder::beginIfStatement ()
950966{
951967 LLVMInstruction ins (LLVMInstruction::Type::BeginIf);
@@ -1842,6 +1858,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_clear()
18421858 return resolveFunction (" list_clear" , llvm::FunctionType::get (m_builder.getInt1Ty (), { listPtr }, false ));
18431859}
18441860
1861+ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_remove ()
1862+ {
1863+ llvm::Type *listPtr = llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 );
1864+ return resolveFunction (" list_remove" , llvm::FunctionType::get (m_builder.getInt1Ty (), { listPtr, m_builder.getInt64Ty () }, false ));
1865+ }
1866+
18451867llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp ()
18461868{
18471869 llvm::Type *pointerType = llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 );
0 commit comments