Skip to content

Commit 2096b40

Browse files
committed
LLVMCodeBuilder: Implement log10 operator
1 parent e80c54f commit 2096b40

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
@@ -50,6 +50,7 @@ class ICodeBuilder
5050
virtual void createAcos() = 0;
5151
virtual void createAtan() = 0;
5252
virtual void createLn() = 0;
53+
virtual void createLog10() = 0;
5354

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
364364
break;
365365
}
366366

367+
case Step::Type::Log10: {
368+
assert(step.args.size() == 1);
369+
const auto &arg = step.args[0];
370+
// log10(x)
371+
llvm::Function *log10Func = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::log10, m_builder.getDoubleTy());
372+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
373+
step.functionReturnReg->value = m_builder.CreateCall(log10Func, num);
374+
break;
375+
}
376+
367377
case Step::Type::Yield:
368378
if (!m_warp) {
369379
freeHeap();
@@ -797,6 +807,11 @@ void LLVMCodeBuilder::createLn()
797807
createOp(Step::Type::Ln, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
798808
}
799809

810+
void LLVMCodeBuilder::createLog10()
811+
{
812+
createOp(Step::Type::Log10, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
813+
}
814+
800815
void LLVMCodeBuilder::beginIfStatement()
801816
{
802817
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
@@ -52,6 +52,7 @@ class LLVMCodeBuilder : public ICodeBuilder
5252
void createAcos() override;
5353
void createAtan() override;
5454
void createLn() override;
55+
void createLog10() override;
5556

5657
void beginIfStatement() override;
5758
void beginElseBranch() override;
@@ -108,6 +109,7 @@ class LLVMCodeBuilder : public ICodeBuilder
108109
Acos,
109110
Atan,
110111
Ln,
112+
Log10,
111113
Yield,
112114
BeginIf,
113115
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,6 +1646,50 @@ TEST_F(LLVMCodeBuilderTest, Ln)
16461646
addOpTest(nan, -inf);
16471647
}
16481648

1649+
TEST_F(LLVMCodeBuilderTest, Log10)
1650+
{
1651+
std::string expected;
1652+
1653+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1654+
createBuilder(true);
1655+
1656+
m_builder->addConstValue(v1);
1657+
m_builder->createLog10();
1658+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1659+
1660+
m_builder->addConstValue(v1);
1661+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1662+
m_builder->createLog10();
1663+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1664+
1665+
std::stringstream stream;
1666+
stream << expectedResult;
1667+
std::string str = stream.str() + '\n';
1668+
std::string expected = str + str;
1669+
1670+
auto code = m_builder->finalize();
1671+
auto ctx = code->createExecutionContext(&m_target);
1672+
1673+
testing::internal::CaptureStdout();
1674+
code->run(ctx.get());
1675+
const std::string quotes1 = v1.isString() ? "\"" : "";
1676+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1677+
};
1678+
1679+
static const double inf = std::numeric_limits<double>::infinity();
1680+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1681+
1682+
addOpTest(10.0, 1.0);
1683+
addOpTest(1000.0, 3.0);
1684+
addOpTest(0.01, -2.0);
1685+
addOpTest(0.0, -inf);
1686+
addOpTest(-0.0, -inf);
1687+
addOpTest(-0.7, nan);
1688+
addOpTest(inf, inf);
1689+
addOpTest(-inf, nan);
1690+
addOpTest(nan, -inf);
1691+
}
1692+
16491693
TEST_F(LLVMCodeBuilderTest, Yield)
16501694
{
16511695
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class CodeBuilderMock : public ICodeBuilder
4040
MOCK_METHOD(void, createAcos, (), (override));
4141
MOCK_METHOD(void, createAtan, (), (override));
4242
MOCK_METHOD(void, createLn, (), (override));
43+
MOCK_METHOD(void, createLog10, (), (override));
4344

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

0 commit comments

Comments
 (0)