Skip to content

Commit d60cbe7

Browse files
committed
LLVMCodeBuilder: Implement get list item
1 parent aa1d055 commit d60cbe7

File tree

6 files changed

+103
-0
lines changed

6 files changed

+103
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class ICodeBuilder
2323
virtual void addConstValue(const Value &value) = 0;
2424
virtual void addVariableValue(Variable *variable) = 0;
2525
virtual void addListContents(List *list) = 0;
26+
virtual void addListItem(List *list) = 0;
2627

2728
virtual void createAdd() = 0;
2829
virtual void createSub() = 0;

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
530530
break;
531531
}
532532

533+
case LLVMInstruction::Type::GetListItem: {
534+
assert(step.args.size() == 1);
535+
const auto &arg = step.args[0];
536+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
537+
llvm::Value *index = m_builder.CreateFPToUI(castValue(arg.second, arg.first), m_builder.getInt64Ty());
538+
step.functionReturnReg->value = m_builder.CreateCall(resolve_list_get_item(), { listPtr.ptr, index });
539+
step.functionReturnReg->type = listPtr.type;
540+
break;
541+
}
542+
533543
case LLVMInstruction::Type::Yield:
534544
if (!m_warp) {
535545
freeHeap();
@@ -848,6 +858,26 @@ void LLVMCodeBuilder::addListContents(List *list)
848858
{
849859
}
850860

861+
void LLVMCodeBuilder::addListItem(List *list)
862+
{
863+
LLVMInstruction ins(LLVMInstruction::Type::GetListItem);
864+
ins.workList = list;
865+
m_listPtrs[list] = LLVMListPtr();
866+
867+
assert(m_tmpRegs.size() >= 1);
868+
ins.args.push_back({ Compiler::StaticType::Number, m_tmpRegs[0] });
869+
870+
m_tmpRegs.erase(m_tmpRegs.end() - 1, m_tmpRegs.end());
871+
872+
auto ret = std::make_shared<LLVMRegister>(Compiler::StaticType::Unknown);
873+
ret->isRawValue = false;
874+
ins.functionReturnReg = ret;
875+
m_regs[m_currentFunction].push_back(ret);
876+
m_tmpRegs.push_back(ret);
877+
878+
m_instructions.push_back(ins);
879+
}
880+
851881
void LLVMCodeBuilder::createAdd()
852882
{
853883
createOp(LLVMInstruction::Type::Add, Compiler::StaticType::Number, Compiler::StaticType::Number, 2);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class LLVMCodeBuilder : public ICodeBuilder
2929
void addConstValue(const Value &value) override;
3030
void addVariableValue(Variable *variable) override;
3131
void addListContents(List *list) override;
32+
void addListItem(List *list) override;
3233

3334
void createAdd() override;
3435
void createSub() override;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct LLVMInstruction
4747
AppendToList,
4848
InsertToList,
4949
ListReplace,
50+
GetListItem,
5051
Yield,
5152
BeginIf,
5253
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,6 +2190,75 @@ TEST_F(LLVMCodeBuilderTest, ListReplace)
21902190
ASSERT_EQ(localList->toString(), "3 ipsum true hello world");
21912191
}
21922192

2193+
TEST_F(LLVMCodeBuilderTest, GetListItem)
2194+
{
2195+
EngineMock engine;
2196+
Stage stage;
2197+
Sprite sprite;
2198+
sprite.setEngine(&engine);
2199+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
2200+
2201+
std::unordered_map<List *, std::string> strings;
2202+
2203+
auto globalList = std::make_shared<List>("", "");
2204+
stage.addList(globalList);
2205+
2206+
auto localList = std::make_shared<List>("", "");
2207+
sprite.addList(localList);
2208+
2209+
globalList->append(1);
2210+
globalList->append(2);
2211+
globalList->append(3);
2212+
2213+
localList->append("Lorem");
2214+
localList->append("ipsum");
2215+
localList->append("dolor");
2216+
localList->append("sit");
2217+
strings[localList.get()] = localList->toString();
2218+
2219+
createBuilder(&sprite, true);
2220+
2221+
m_builder->addConstValue(2);
2222+
m_builder->addListItem(globalList.get());
2223+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2224+
2225+
m_builder->addConstValue(1);
2226+
m_builder->addConstValue("test");
2227+
m_builder->createListReplace(globalList.get());
2228+
2229+
m_builder->addConstValue(0);
2230+
m_builder->addListItem(globalList.get());
2231+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2232+
2233+
m_builder->addConstValue(0);
2234+
m_builder->addListItem(localList.get());
2235+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2236+
2237+
m_builder->addConstValue(2);
2238+
m_builder->addListItem(localList.get());
2239+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2240+
2241+
m_builder->addConstValue(3);
2242+
m_builder->addListItem(localList.get());
2243+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2244+
2245+
static const std::string expected =
2246+
"3\n"
2247+
"1\n"
2248+
"Lorem\n"
2249+
"dolor\n"
2250+
"sit\n";
2251+
2252+
auto code = m_builder->finalize();
2253+
auto ctx = code->createExecutionContext(&sprite);
2254+
testing::internal::CaptureStdout();
2255+
code->run(ctx.get());
2256+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
2257+
2258+
ASSERT_EQ(globalList->toString(), "1 test 3");
2259+
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor sit");
2260+
}
2261+
21932262
TEST_F(LLVMCodeBuilderTest, Yield)
21942263
{
21952264
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class CodeBuilderMock : public ICodeBuilder
1313
MOCK_METHOD(void, addConstValue, (const Value &), (override));
1414
MOCK_METHOD(void, addVariableValue, (Variable *), (override));
1515
MOCK_METHOD(void, addListContents, (List *), (override));
16+
MOCK_METHOD(void, addListItem, (List *), (override));
1617

1718
MOCK_METHOD(void, createAdd, (), (override));
1819
MOCK_METHOD(void, createSub, (), (override));

0 commit comments

Comments
 (0)