Skip to content

Commit f68f44f

Browse files
committed
LLVMCodeBuilder: Implement multiply operator
1 parent 3260662 commit f68f44f

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ICodeBuilder
2626

2727
virtual void createAdd() = 0;
2828
virtual void createSub() = 0;
29+
virtual void createMul() = 0;
2930
virtual void beginIfStatement() = 0;
3031
virtual void beginElseBranch() = 0;
3132
virtual void endIf() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
108108
break;
109109
}
110110

111+
case Step::Type::Mul: {
112+
assert(step.args.size() == 2);
113+
const auto &arg1 = step.args[0];
114+
const auto &arg2 = step.args[1];
115+
llvm::Value *num1 = removeNaN(castValue(arg1.second, arg1.first));
116+
llvm::Value *num2 = removeNaN(castValue(arg2.second, arg2.first));
117+
step.functionReturnReg->value = m_builder.CreateFMul(num1, num2);
118+
break;
119+
}
120+
111121
case Step::Type::Yield:
112122
if (!m_warp) {
113123
freeHeap();
@@ -442,6 +452,11 @@ void LLVMCodeBuilder::createSub()
442452
createOp(Step::Type::Sub, 2);
443453
}
444454

455+
void LLVMCodeBuilder::createMul()
456+
{
457+
createOp(Step::Type::Mul, 2);
458+
}
459+
445460
void LLVMCodeBuilder::beginIfStatement()
446461
{
447462
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
@@ -28,6 +28,7 @@ class LLVMCodeBuilder : public ICodeBuilder
2828

2929
void createAdd() override;
3030
void createSub() override;
31+
void createMul() override;
3132
void beginIfStatement() override;
3233
void beginElseBranch() override;
3334
void endIf() override;
@@ -62,6 +63,7 @@ class LLVMCodeBuilder : public ICodeBuilder
6263
FunctionCall,
6364
Add,
6465
Sub,
66+
Mul,
6567
Yield,
6668
BeginIf,
6769
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,54 @@ TEST_F(LLVMCodeBuilderTest, Subtract)
290290
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
291291
}
292292

293+
TEST_F(LLVMCodeBuilderTest, Multiply)
294+
{
295+
std::string expected;
296+
297+
auto addOpTest = [this, &expected](Value v1, Value v2, double expectedResult) {
298+
m_builder->addConstValue(v1);
299+
m_builder->addConstValue(v2);
300+
m_builder->createMul();
301+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
302+
303+
m_builder->addConstValue(v1);
304+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
305+
m_builder->addConstValue(v2);
306+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
307+
m_builder->createMul();
308+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
309+
310+
std::string str = Value(expectedResult).toString() + '\n';
311+
expected += str;
312+
expected += str;
313+
};
314+
315+
createBuilder(true);
316+
317+
addOpTest(50, 2, 100);
318+
addOpTest(-500, 25, -12500);
319+
addOpTest("-500", -25, 12500);
320+
addOpTest("2.54", "6.28", 15.9512);
321+
addOpTest(true, true, 1);
322+
addOpTest("Infinity", "Infinity", std::numeric_limits<double>::infinity());
323+
addOpTest("Infinity", 0, std::numeric_limits<double>::quiet_NaN());
324+
addOpTest("Infinity", 2, std::numeric_limits<double>::infinity());
325+
addOpTest("Infinity", "-Infinity", -std::numeric_limits<double>::infinity());
326+
addOpTest("-Infinity", "Infinity", -std::numeric_limits<double>::infinity());
327+
addOpTest("-Infinity", 0, std::numeric_limits<double>::quiet_NaN());
328+
addOpTest("-Infinity", 2, -std::numeric_limits<double>::infinity());
329+
addOpTest("-Infinity", "-Infinity", std::numeric_limits<double>::infinity());
330+
addOpTest(1, "NaN", 0);
331+
addOpTest("NaN", 1, 0);
332+
333+
auto code = m_builder->finalize();
334+
auto ctx = code->createExecutionContext(&m_target);
335+
336+
testing::internal::CaptureStdout();
337+
code->run(ctx.get());
338+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
339+
}
340+
293341
TEST_F(LLVMCodeBuilderTest, Yield)
294342
{
295343
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class CodeBuilderMock : public ICodeBuilder
1616

1717
MOCK_METHOD(void, createAdd, (), (override));
1818
MOCK_METHOD(void, createSub, (), (override));
19+
MOCK_METHOD(void, createMul, (), (override));
1920
MOCK_METHOD(void, beginIfStatement, (), (override));
2021
MOCK_METHOD(void, beginElseBranch, (), (override));
2122
MOCK_METHOD(void, endIf, (), (override));

0 commit comments

Comments
 (0)