Skip to content

Commit 1994f20

Browse files
committed
LLVMCodeBuilder: Implement exp operator
1 parent 2096b40 commit 1994f20

File tree

5 files changed

+62
-0
lines changed

5 files changed

+62
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class ICodeBuilder
5151
virtual void createAtan() = 0;
5252
virtual void createLn() = 0;
5353
virtual void createLog10() = 0;
54+
virtual void createExp() = 0;
5455

5556
virtual void beginIfStatement() = 0;
5657
virtual void beginElseBranch() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
374374
break;
375375
}
376376

377+
case Step::Type::Exp: {
378+
assert(step.args.size() == 1);
379+
const auto &arg = step.args[0];
380+
// exp(x)
381+
llvm::Function *expFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::exp, m_builder.getDoubleTy());
382+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
383+
step.functionReturnReg->value = m_builder.CreateCall(expFunc, num);
384+
break;
385+
}
386+
377387
case Step::Type::Yield:
378388
if (!m_warp) {
379389
freeHeap();
@@ -812,6 +822,11 @@ void LLVMCodeBuilder::createLog10()
812822
createOp(Step::Type::Log10, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
813823
}
814824

825+
void LLVMCodeBuilder::createExp()
826+
{
827+
createOp(Step::Type::Exp, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
828+
}
829+
815830
void LLVMCodeBuilder::beginIfStatement()
816831
{
817832
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
@@ -53,6 +53,7 @@ class LLVMCodeBuilder : public ICodeBuilder
5353
void createAtan() override;
5454
void createLn() override;
5555
void createLog10() override;
56+
void createExp() override;
5657

5758
void beginIfStatement() override;
5859
void beginElseBranch() override;
@@ -110,6 +111,7 @@ class LLVMCodeBuilder : public ICodeBuilder
110111
Atan,
111112
Ln,
112113
Log10,
114+
Exp,
113115
Yield,
114116
BeginIf,
115117
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,6 +1690,49 @@ TEST_F(LLVMCodeBuilderTest, Log10)
16901690
addOpTest(nan, -inf);
16911691
}
16921692

1693+
TEST_F(LLVMCodeBuilderTest, Exp)
1694+
{
1695+
std::string expected;
1696+
1697+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1698+
createBuilder(true);
1699+
1700+
m_builder->addConstValue(v1);
1701+
m_builder->createExp();
1702+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1703+
1704+
m_builder->addConstValue(v1);
1705+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1706+
m_builder->createExp();
1707+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1708+
1709+
std::stringstream stream;
1710+
stream << expectedResult;
1711+
std::string str = stream.str() + '\n';
1712+
std::string expected = str + str;
1713+
1714+
auto code = m_builder->finalize();
1715+
auto ctx = code->createExecutionContext(&m_target);
1716+
1717+
testing::internal::CaptureStdout();
1718+
code->run(ctx.get());
1719+
const std::string quotes1 = v1.isString() ? "\"" : "";
1720+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1721+
};
1722+
1723+
static const double inf = std::numeric_limits<double>::infinity();
1724+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1725+
1726+
addOpTest(1.0, std::exp(1.0));
1727+
addOpTest(0.5, std::exp(0.5));
1728+
addOpTest(0.0, 1.0);
1729+
addOpTest(-0.0, 1.0);
1730+
addOpTest(-0.7, std::exp(-0.7));
1731+
addOpTest(inf, inf);
1732+
addOpTest(-inf, 0.0);
1733+
addOpTest(nan, 1.0);
1734+
}
1735+
16931736
TEST_F(LLVMCodeBuilderTest, Yield)
16941737
{
16951738
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class CodeBuilderMock : public ICodeBuilder
4141
MOCK_METHOD(void, createAtan, (), (override));
4242
MOCK_METHOD(void, createLn, (), (override));
4343
MOCK_METHOD(void, createLog10, (), (override));
44+
MOCK_METHOD(void, createExp, (), (override));
4445

4546
MOCK_METHOD(void, beginIfStatement, (), (override));
4647
MOCK_METHOD(void, beginElseBranch, (), (override));

0 commit comments

Comments
 (0)