Skip to content

Commit 14840cf

Browse files
committed
LLVMCodeBuilder: Implement list insert
1 parent cf0f440 commit 14840cf

File tree

6 files changed

+93
-0
lines changed

6 files changed

+93
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class ICodeBuilder
5959
virtual void createListClear(List *list) = 0;
6060
virtual void createListRemove(List *list) = 0;
6161
virtual void createListAppend(List *list) = 0;
62+
virtual void createListInsert(List *list) = 0;
6263

6364
virtual void beginIfStatement() = 0;
6465
virtual void beginElseBranch() = 0;

src/dev/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,19 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
504504
break;
505505
}
506506

507+
case LLVMInstruction::Type::InsertToList: {
508+
assert(step.args.size() == 2);
509+
const auto &indexArg = step.args[0];
510+
const auto &valueArg = step.args[1];
511+
Compiler::StaticType type = optimizeRegisterType(valueArg.second);
512+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
513+
llvm::Value *index = m_builder.CreateFPToUI(castValue(indexArg.second, indexArg.first), m_builder.getInt64Ty());
514+
llvm::Value *itemPtr = m_builder.CreateCall(resolve_list_insert_empty(), { listPtr.ptr, index });
515+
createInitialValueStore(valueArg.second, itemPtr, type);
516+
// TODO: Implement list type prediction
517+
break;
518+
}
519+
507520
case LLVMInstruction::Type::Yield:
508521
if (!m_warp) {
509522
freeHeap();
@@ -980,6 +993,13 @@ void LLVMCodeBuilder::createListAppend(List *list)
980993
m_listPtrs[list] = LLVMListPtr();
981994
}
982995

996+
void LLVMCodeBuilder::createListInsert(List *list)
997+
{
998+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::InsertToList, Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Unknown }, 2);
999+
ins.workList = list;
1000+
m_listPtrs[list] = LLVMListPtr();
1001+
}
1002+
9831003
void LLVMCodeBuilder::beginIfStatement()
9841004
{
9851005
LLVMInstruction ins(LLVMInstruction::Type::BeginIf);
@@ -1936,6 +1956,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_append_empty()
19361956
return resolveFunction("list_append_empty", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr }, false));
19371957
}
19381958

1959+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_insert_empty()
1960+
{
1961+
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
1962+
return resolveFunction("list_insert_empty", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr, m_builder.getInt64Ty() }, false));
1963+
}
1964+
19391965
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
19401966
{
19411967
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);

src/dev/engine/internal/llvm/llvmcodebuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class LLVMCodeBuilder : public ICodeBuilder
6565
void createListClear(List *list) override;
6666
void createListRemove(List *list) override;
6767
void createListAppend(List *list) override;
68+
void createListInsert(List *list) override;
6869

6970
void beginIfStatement() override;
7071
void beginElseBranch() override;
@@ -141,6 +142,7 @@ class LLVMCodeBuilder : public ICodeBuilder
141142
llvm::FunctionCallee resolve_list_clear();
142143
llvm::FunctionCallee resolve_list_remove();
143144
llvm::FunctionCallee resolve_list_append_empty();
145+
llvm::FunctionCallee resolve_list_insert_empty();
144146
llvm::FunctionCallee resolve_strcasecmp();
145147

146148
Target *m_target = nullptr;

src/dev/engine/internal/llvm/llvminstruction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct LLVMInstruction
4545
ClearList,
4646
RemoveListItem,
4747
AppendToList,
48+
InsertToList,
4849
Yield,
4950
BeginIf,
5051
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,68 @@ TEST_F(LLVMCodeBuilderTest, AppendToList)
20722072
ASSERT_EQ(localList->toString(), "true false hello world");
20732073
}
20742074

2075+
TEST_F(LLVMCodeBuilderTest, InsertToList)
2076+
{
2077+
EngineMock engine;
2078+
Stage stage;
2079+
Sprite sprite;
2080+
sprite.setEngine(&engine);
2081+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
2082+
2083+
std::unordered_map<List *, std::string> strings;
2084+
2085+
auto globalList = std::make_shared<List>("", "");
2086+
stage.addList(globalList);
2087+
2088+
auto localList = std::make_shared<List>("", "");
2089+
sprite.addList(localList);
2090+
2091+
globalList->append(1);
2092+
globalList->append(2);
2093+
globalList->append(3);
2094+
2095+
localList->append("Lorem");
2096+
localList->append("ipsum");
2097+
localList->append("dolor");
2098+
localList->append("sit");
2099+
strings[localList.get()] = localList->toString();
2100+
2101+
createBuilder(&sprite, true);
2102+
2103+
m_builder->addConstValue(2);
2104+
m_builder->addConstValue(1);
2105+
m_builder->createListInsert(globalList.get());
2106+
2107+
m_builder->addConstValue(3);
2108+
m_builder->addConstValue("test");
2109+
m_builder->createListInsert(globalList.get());
2110+
2111+
m_builder->addConstValue(0);
2112+
m_builder->addConstValue(3);
2113+
m_builder->createListInsert(localList.get());
2114+
2115+
m_builder->createListClear(localList.get());
2116+
2117+
m_builder->addConstValue(0);
2118+
m_builder->addConstValue(true);
2119+
m_builder->createListInsert(localList.get());
2120+
2121+
m_builder->addConstValue(0);
2122+
m_builder->addConstValue(false);
2123+
m_builder->createListInsert(localList.get());
2124+
2125+
m_builder->addConstValue(1);
2126+
m_builder->addConstValue("hello world");
2127+
m_builder->createListInsert(localList.get());
2128+
2129+
auto code = m_builder->finalize();
2130+
auto ctx = code->createExecutionContext(&sprite);
2131+
code->run(ctx.get());
2132+
2133+
ASSERT_EQ(globalList->toString(), "1 2 1 test 3");
2134+
ASSERT_EQ(localList->toString(), "false hello world true");
2135+
}
2136+
20752137
TEST_F(LLVMCodeBuilderTest, Yield)
20762138
{
20772139
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class CodeBuilderMock : public ICodeBuilder
4949
MOCK_METHOD(void, createListClear, (List *), (override));
5050
MOCK_METHOD(void, createListRemove, (List *), (override));
5151
MOCK_METHOD(void, createListAppend, (List *), (override));
52+
MOCK_METHOD(void, createListInsert, (List *), (override));
5253

5354
MOCK_METHOD(void, beginIfStatement, (), (override));
5455
MOCK_METHOD(void, beginElseBranch, (), (override));

0 commit comments

Comments
 (0)