Skip to content

Commit aa1d055

Browse files
committed
LLVMCodeBuilder: Implement list replace
1 parent 79c605f commit aa1d055

File tree

6 files changed

+87
-0
lines changed

6 files changed

+87
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ICodeBuilder
6060
virtual void createListRemove(List *list) = 0;
6161
virtual void createListAppend(List *list) = 0;
6262
virtual void createListInsert(List *list) = 0;
63+
virtual void createListReplace(List *list) = 0;
6364

6465
virtual void beginIfStatement() = 0;
6566
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
@@ -517,6 +517,19 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
517517
break;
518518
}
519519

520+
case LLVMInstruction::Type::ListReplace: {
521+
assert(step.args.size() == 2);
522+
const auto &indexArg = step.args[0];
523+
const auto &valueArg = step.args[1];
524+
Compiler::StaticType type = optimizeRegisterType(valueArg.second);
525+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
526+
llvm::Value *index = m_builder.CreateFPToUI(castValue(indexArg.second, indexArg.first), m_builder.getInt64Ty());
527+
llvm::Value *itemPtr = m_builder.CreateCall(resolve_list_get_item(), { listPtr.ptr, index });
528+
createValueStore(valueArg.second, itemPtr, type, listPtr.type);
529+
// TODO: Implement list type prediction
530+
break;
531+
}
532+
520533
case LLVMInstruction::Type::Yield:
521534
if (!m_warp) {
522535
freeHeap();
@@ -1000,6 +1013,13 @@ void LLVMCodeBuilder::createListInsert(List *list)
10001013
m_listPtrs[list] = LLVMListPtr();
10011014
}
10021015

1016+
void LLVMCodeBuilder::createListReplace(List *list)
1017+
{
1018+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::ListReplace, Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Unknown }, 2);
1019+
ins.workList = list;
1020+
m_listPtrs[list] = LLVMListPtr();
1021+
}
1022+
10031023
void LLVMCodeBuilder::beginIfStatement()
10041024
{
10051025
LLVMInstruction ins(LLVMInstruction::Type::BeginIf);
@@ -1962,6 +1982,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_insert_empty()
19621982
return resolveFunction("list_insert_empty", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr, m_builder.getInt64Ty() }, false));
19631983
}
19641984

1985+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_get_item()
1986+
{
1987+
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
1988+
return resolveFunction("list_get_item", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr, m_builder.getInt64Ty() }, false));
1989+
}
1990+
19651991
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
19661992
{
19671993
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
@@ -66,6 +66,7 @@ class LLVMCodeBuilder : public ICodeBuilder
6666
void createListRemove(List *list) override;
6767
void createListAppend(List *list) override;
6868
void createListInsert(List *list) override;
69+
void createListReplace(List *list) override;
6970

7071
void beginIfStatement() override;
7172
void beginElseBranch() override;
@@ -143,6 +144,7 @@ class LLVMCodeBuilder : public ICodeBuilder
143144
llvm::FunctionCallee resolve_list_remove();
144145
llvm::FunctionCallee resolve_list_append_empty();
145146
llvm::FunctionCallee resolve_list_insert_empty();
147+
llvm::FunctionCallee resolve_list_get_item();
146148
llvm::FunctionCallee resolve_strcasecmp();
147149

148150
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
@@ -46,6 +46,7 @@ struct LLVMInstruction
4646
RemoveListItem,
4747
AppendToList,
4848
InsertToList,
49+
ListReplace,
4950
Yield,
5051
BeginIf,
5152
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,6 +2134,62 @@ TEST_F(LLVMCodeBuilderTest, InsertToList)
21342134
ASSERT_EQ(localList->toString(), "false hello world true");
21352135
}
21362136

2137+
TEST_F(LLVMCodeBuilderTest, ListReplace)
2138+
{
2139+
EngineMock engine;
2140+
Stage stage;
2141+
Sprite sprite;
2142+
sprite.setEngine(&engine);
2143+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
2144+
2145+
std::unordered_map<List *, std::string> strings;
2146+
2147+
auto globalList = std::make_shared<List>("", "");
2148+
stage.addList(globalList);
2149+
2150+
auto localList = std::make_shared<List>("", "");
2151+
sprite.addList(localList);
2152+
2153+
globalList->append(1);
2154+
globalList->append(2);
2155+
globalList->append(3);
2156+
2157+
localList->append("Lorem");
2158+
localList->append("ipsum");
2159+
localList->append("dolor");
2160+
localList->append("sit");
2161+
strings[localList.get()] = localList->toString();
2162+
2163+
createBuilder(&sprite, true);
2164+
2165+
m_builder->addConstValue(2);
2166+
m_builder->addConstValue(1);
2167+
m_builder->createListReplace(globalList.get());
2168+
2169+
m_builder->addConstValue(1);
2170+
m_builder->addConstValue("test");
2171+
m_builder->createListReplace(globalList.get());
2172+
2173+
m_builder->addConstValue(0);
2174+
m_builder->addConstValue(3);
2175+
m_builder->createListReplace(localList.get());
2176+
2177+
m_builder->addConstValue(2);
2178+
m_builder->addConstValue(true);
2179+
m_builder->createListReplace(localList.get());
2180+
2181+
m_builder->addConstValue(3);
2182+
m_builder->addConstValue("hello world");
2183+
m_builder->createListReplace(localList.get());
2184+
2185+
auto code = m_builder->finalize();
2186+
auto ctx = code->createExecutionContext(&sprite);
2187+
code->run(ctx.get());
2188+
2189+
ASSERT_EQ(globalList->toString(), "1 test 1");
2190+
ASSERT_EQ(localList->toString(), "3 ipsum true hello world");
2191+
}
2192+
21372193
TEST_F(LLVMCodeBuilderTest, Yield)
21382194
{
21392195
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class CodeBuilderMock : public ICodeBuilder
5050
MOCK_METHOD(void, createListRemove, (List *), (override));
5151
MOCK_METHOD(void, createListAppend, (List *), (override));
5252
MOCK_METHOD(void, createListInsert, (List *), (override));
53+
MOCK_METHOD(void, createListReplace, (List *), (override));
5354

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

0 commit comments

Comments
 (0)