Skip to content

Commit 1f06e28

Browse files
committed
LLVMCodeBuilder: Implement subtract operator
1 parent edd5726 commit 1f06e28

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ICodeBuilder
2525
virtual void addListContents(List *list) = 0;
2626

2727
virtual void createAdd() = 0;
28+
virtual void createSub() = 0;
2829
virtual void beginIfStatement() = 0;
2930
virtual void beginElseBranch() = 0;
3031
virtual void endIf() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
9898
break;
9999
}
100100

101+
case Step::Type::Sub: {
102+
assert(step.args.size() == 2);
103+
const auto &arg1 = step.args[0];
104+
const auto &arg2 = step.args[1];
105+
llvm::Value *num1 = removeNaN(castValue(arg1.second, arg1.first));
106+
llvm::Value *num2 = removeNaN(castValue(arg2.second, arg2.first));
107+
step.functionReturnReg->value = m_builder.CreateFSub(num1, num2);
108+
break;
109+
}
110+
101111
case Step::Type::Yield:
102112
if (!m_warp) {
103113
freeHeap();
@@ -427,6 +437,11 @@ void LLVMCodeBuilder::createAdd()
427437
createOp(Step::Type::Add, 2);
428438
}
429439

440+
void LLVMCodeBuilder::createSub()
441+
{
442+
createOp(Step::Type::Sub, 2);
443+
}
444+
430445
void LLVMCodeBuilder::beginIfStatement()
431446
{
432447
Step step(Step::Type::BeginIf);

src/dev/engine/internal/llvmcodebuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class LLVMCodeBuilder : public ICodeBuilder
2727
void addListContents(List *list) override;
2828

2929
void createAdd() override;
30+
void createSub() override;
3031
void beginIfStatement() override;
3132
void beginElseBranch() override;
3233
void endIf() override;
@@ -60,6 +61,7 @@ class LLVMCodeBuilder : public ICodeBuilder
6061
{
6162
FunctionCall,
6263
Add,
64+
Sub,
6365
Yield,
6466
BeginIf,
6567
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,50 @@ TEST_F(LLVMCodeBuilderTest, Add)
244244
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
245245
}
246246

247+
TEST_F(LLVMCodeBuilderTest, Subtract)
248+
{
249+
std::string expected;
250+
251+
auto addOpTest = [this, &expected](Value v1, Value v2, double expectedResult) {
252+
m_builder->addConstValue(v1);
253+
m_builder->addConstValue(v2);
254+
m_builder->createSub();
255+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
256+
257+
m_builder->addConstValue(v1);
258+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
259+
m_builder->addConstValue(v2);
260+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
261+
m_builder->createSub();
262+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
263+
264+
std::string str = Value(expectedResult).toString() + '\n';
265+
expected += str;
266+
expected += str;
267+
};
268+
269+
createBuilder(true);
270+
271+
addOpTest(50, 25, 25);
272+
addOpTest(-500, 25, -525);
273+
addOpTest(-500, -25, -475);
274+
addOpTest("2.54", "6.28", -3.74);
275+
addOpTest(2.54, "-6.28", 8.82);
276+
addOpTest(true, true, 0);
277+
addOpTest("Infinity", "Infinity", std::numeric_limits<double>::quiet_NaN());
278+
addOpTest("Infinity", "-Infinity", std::numeric_limits<double>::infinity());
279+
addOpTest("-Infinity", "Infinity", -std::numeric_limits<double>::infinity());
280+
addOpTest("-Infinity", "-Infinity", std::numeric_limits<double>::quiet_NaN());
281+
addOpTest(1, "NaN", 1);
282+
283+
auto code = m_builder->finalize();
284+
auto ctx = code->createExecutionContext(&m_target);
285+
286+
testing::internal::CaptureStdout();
287+
code->run(ctx.get());
288+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
289+
}
290+
247291
TEST_F(LLVMCodeBuilderTest, Yield)
248292
{
249293
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class CodeBuilderMock : public ICodeBuilder
1515
MOCK_METHOD(void, addListContents, (List *), (override));
1616

1717
MOCK_METHOD(void, createAdd, (), (override));
18+
MOCK_METHOD(void, createSub, (), (override));
1819
MOCK_METHOD(void, beginIfStatement, (), (override));
1920
MOCK_METHOD(void, beginElseBranch, (), (override));
2021
MOCK_METHOD(void, endIf, (), (override));

0 commit comments

Comments
 (0)