Skip to content

Commit 3260662

Browse files
committed
LLVMCodeBuilder: Implement subtract operator
1 parent ebce257 commit 3260662

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-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: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,51 @@ TEST_F(LLVMCodeBuilderTest, Add)
245245
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
246246
}
247247

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