Skip to content

Commit e80c54f

Browse files
committed
LLVMCodeBuilder: Implement ln operator
1 parent 923ec23 commit e80c54f

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
@@ -49,6 +49,7 @@ class ICodeBuilder
4949
virtual void createAsin() = 0;
5050
virtual void createAcos() = 0;
5151
virtual void createAtan() = 0;
52+
virtual void createLn() = 0;
5253

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
354354
break;
355355
}
356356

357+
case Step::Type::Ln: {
358+
assert(step.args.size() == 1);
359+
const auto &arg = step.args[0];
360+
// log(x)
361+
llvm::Function *logFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::log, m_builder.getDoubleTy());
362+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
363+
step.functionReturnReg->value = m_builder.CreateCall(logFunc, num);
364+
break;
365+
}
366+
357367
case Step::Type::Yield:
358368
if (!m_warp) {
359369
freeHeap();
@@ -782,6 +792,11 @@ void LLVMCodeBuilder::createAtan()
782792
createOp(Step::Type::Atan, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
783793
}
784794

795+
void LLVMCodeBuilder::createLn()
796+
{
797+
createOp(Step::Type::Ln, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
798+
}
799+
785800
void LLVMCodeBuilder::beginIfStatement()
786801
{
787802
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
@@ -51,6 +51,7 @@ class LLVMCodeBuilder : public ICodeBuilder
5151
void createAsin() override;
5252
void createAcos() override;
5353
void createAtan() override;
54+
void createLn() override;
5455

5556
void beginIfStatement() override;
5657
void beginElseBranch() override;
@@ -106,6 +107,7 @@ class LLVMCodeBuilder : public ICodeBuilder
106107
Asin,
107108
Acos,
108109
Atan,
110+
Ln,
109111
Yield,
110112
BeginIf,
111113
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,6 +1601,51 @@ TEST_F(LLVMCodeBuilderTest, Atan)
16011601
addOpTest(nan, 0.0);
16021602
}
16031603

1604+
TEST_F(LLVMCodeBuilderTest, Ln)
1605+
{
1606+
std::string expected;
1607+
1608+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1609+
createBuilder(true);
1610+
1611+
m_builder->addConstValue(v1);
1612+
m_builder->createLn();
1613+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1614+
1615+
m_builder->addConstValue(v1);
1616+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1617+
m_builder->createLn();
1618+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1619+
1620+
std::stringstream stream;
1621+
stream << expectedResult;
1622+
std::string str = stream.str() + '\n';
1623+
std::string expected = str + str;
1624+
1625+
auto code = m_builder->finalize();
1626+
auto ctx = code->createExecutionContext(&m_target);
1627+
1628+
testing::internal::CaptureStdout();
1629+
code->run(ctx.get());
1630+
const std::string quotes1 = v1.isString() ? "\"" : "";
1631+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1632+
};
1633+
1634+
static const double inf = std::numeric_limits<double>::infinity();
1635+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1636+
1637+
addOpTest(std::exp(1.0), 1.0);
1638+
addOpTest(std::exp(2.0), 2.0);
1639+
addOpTest(std::exp(0.3), 0.3);
1640+
addOpTest(1.0, 0.0);
1641+
addOpTest(0.0, -inf);
1642+
addOpTest(-0.0, -inf);
1643+
addOpTest(-0.7, -nan); // negative NaN shouldn't be a problem
1644+
addOpTest(inf, inf);
1645+
addOpTest(-inf, -nan);
1646+
addOpTest(nan, -inf);
1647+
}
1648+
16041649
TEST_F(LLVMCodeBuilderTest, Yield)
16051650
{
16061651
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class CodeBuilderMock : public ICodeBuilder
3939
MOCK_METHOD(void, createAsin, (), (override));
4040
MOCK_METHOD(void, createAcos, (), (override));
4141
MOCK_METHOD(void, createAtan, (), (override));
42+
MOCK_METHOD(void, createLn, (), (override));
4243

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

0 commit comments

Comments
 (0)