Skip to content

Commit 60b53c4

Browse files
committed
LLVMCodeBuilder: Implement exp10 operator
1 parent 1994f20 commit 60b53c4

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
@@ -52,6 +52,7 @@ class ICodeBuilder
5252
virtual void createLn() = 0;
5353
virtual void createLog10() = 0;
5454
virtual void createExp() = 0;
55+
virtual void createExp10() = 0;
5556

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
384384
break;
385385
}
386386

387+
case Step::Type::Exp10: {
388+
assert(step.args.size() == 1);
389+
const auto &arg = step.args[0];
390+
// exp10(x)
391+
llvm::Function *expFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::exp10, m_builder.getDoubleTy());
392+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
393+
step.functionReturnReg->value = m_builder.CreateCall(expFunc, num);
394+
break;
395+
}
396+
387397
case Step::Type::Yield:
388398
if (!m_warp) {
389399
freeHeap();
@@ -827,6 +837,11 @@ void LLVMCodeBuilder::createExp()
827837
createOp(Step::Type::Exp, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
828838
}
829839

840+
void LLVMCodeBuilder::createExp10()
841+
{
842+
createOp(Step::Type::Exp10, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
843+
}
844+
830845
void LLVMCodeBuilder::beginIfStatement()
831846
{
832847
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
@@ -54,6 +54,7 @@ class LLVMCodeBuilder : public ICodeBuilder
5454
void createLn() override;
5555
void createLog10() override;
5656
void createExp() override;
57+
void createExp10() override;
5758

5859
void beginIfStatement() override;
5960
void beginElseBranch() override;
@@ -112,6 +113,7 @@ class LLVMCodeBuilder : public ICodeBuilder
112113
Ln,
113114
Log10,
114115
Exp,
116+
Exp10,
115117
Yield,
116118
BeginIf,
117119
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,50 @@ TEST_F(LLVMCodeBuilderTest, Exp)
17331733
addOpTest(nan, 1.0);
17341734
}
17351735

1736+
TEST_F(LLVMCodeBuilderTest, Exp10)
1737+
{
1738+
std::string expected;
1739+
1740+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1741+
createBuilder(true);
1742+
1743+
m_builder->addConstValue(v1);
1744+
m_builder->createExp10();
1745+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1746+
1747+
m_builder->addConstValue(v1);
1748+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1749+
m_builder->createExp10();
1750+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1751+
1752+
std::stringstream stream;
1753+
stream << expectedResult;
1754+
std::string str = stream.str() + '\n';
1755+
std::string expected = str + str;
1756+
1757+
auto code = m_builder->finalize();
1758+
auto ctx = code->createExecutionContext(&m_target);
1759+
1760+
testing::internal::CaptureStdout();
1761+
code->run(ctx.get());
1762+
const std::string quotes1 = v1.isString() ? "\"" : "";
1763+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1764+
};
1765+
1766+
static const double inf = std::numeric_limits<double>::infinity();
1767+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1768+
1769+
addOpTest(1.0, 10.0);
1770+
addOpTest(3.0, 1000.0);
1771+
addOpTest(0.0, 1.0);
1772+
addOpTest(-0.0, 1.0);
1773+
addOpTest(-1.0, 0.1);
1774+
addOpTest(-5.0, 0.00001);
1775+
addOpTest(inf, inf);
1776+
addOpTest(-inf, 0.0);
1777+
addOpTest(nan, 1.0);
1778+
}
1779+
17361780
TEST_F(LLVMCodeBuilderTest, Yield)
17371781
{
17381782
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class CodeBuilderMock : public ICodeBuilder
4242
MOCK_METHOD(void, createLn, (), (override));
4343
MOCK_METHOD(void, createLog10, (), (override));
4444
MOCK_METHOD(void, createExp, (), (override));
45+
MOCK_METHOD(void, createExp10, (), (override));
4546

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

0 commit comments

Comments
 (0)