Skip to content

Commit 923ec23

Browse files
committed
LLVMCodeBuilder: Implement atan operator
1 parent 3001766 commit 923ec23

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
@@ -48,6 +48,7 @@ class ICodeBuilder
4848
virtual void createTan() = 0;
4949
virtual void createAsin() = 0;
5050
virtual void createAcos() = 0;
51+
virtual void createAtan() = 0;
5152

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,18 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
342342
break;
343343
}
344344

345+
case Step::Type::Atan: {
346+
assert(step.args.size() == 1);
347+
const auto &arg = step.args[0];
348+
// atan(x) * 180.0 / pi
349+
llvm::Constant *pi = llvm::ConstantFP::get(m_ctx, llvm::APFloat(std::acos(-1.0)));
350+
llvm::Constant *piDeg = llvm::ConstantFP::get(m_ctx, llvm::APFloat(180.0));
351+
llvm::Function *atanFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::atan, m_builder.getDoubleTy());
352+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
353+
step.functionReturnReg->value = m_builder.CreateFDiv(m_builder.CreateFMul(m_builder.CreateCall(atanFunc, num), piDeg), pi);
354+
break;
355+
}
356+
345357
case Step::Type::Yield:
346358
if (!m_warp) {
347359
freeHeap();
@@ -765,6 +777,11 @@ void LLVMCodeBuilder::createAcos()
765777
createOp(Step::Type::Acos, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
766778
}
767779

780+
void LLVMCodeBuilder::createAtan()
781+
{
782+
createOp(Step::Type::Atan, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
783+
}
784+
768785
void LLVMCodeBuilder::beginIfStatement()
769786
{
770787
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
@@ -50,6 +50,7 @@ class LLVMCodeBuilder : public ICodeBuilder
5050
void createTan() override;
5151
void createAsin() override;
5252
void createAcos() override;
53+
void createAtan() override;
5354

5455
void beginIfStatement() override;
5556
void beginElseBranch() override;
@@ -104,6 +105,7 @@ class LLVMCodeBuilder : public ICodeBuilder
104105
Tan,
105106
Asin,
106107
Acos,
108+
Atan,
107109
Yield,
108110
BeginIf,
109111
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,48 @@ TEST_F(LLVMCodeBuilderTest, Acos)
15591559
addOpTest(nan, 90.0);
15601560
}
15611561

1562+
TEST_F(LLVMCodeBuilderTest, Atan)
1563+
{
1564+
std::string expected;
1565+
1566+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1567+
createBuilder(true);
1568+
1569+
m_builder->addConstValue(v1);
1570+
m_builder->createAtan();
1571+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1572+
1573+
m_builder->addConstValue(v1);
1574+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1575+
m_builder->createAtan();
1576+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1577+
1578+
std::stringstream stream;
1579+
stream << expectedResult;
1580+
std::string str = stream.str() + '\n';
1581+
std::string expected = str + str;
1582+
1583+
auto code = m_builder->finalize();
1584+
auto ctx = code->createExecutionContext(&m_target);
1585+
1586+
testing::internal::CaptureStdout();
1587+
code->run(ctx.get());
1588+
const std::string quotes1 = v1.isString() ? "\"" : "";
1589+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1590+
};
1591+
1592+
static const double inf = std::numeric_limits<double>::infinity();
1593+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1594+
1595+
addOpTest(1.0, 45.0);
1596+
addOpTest(0.0, 0.0);
1597+
addOpTest(-0.0, -0.0);
1598+
addOpTest(-1.0, -45.0);
1599+
addOpTest(inf, 90.0);
1600+
addOpTest(-inf, -90.0);
1601+
addOpTest(nan, 0.0);
1602+
}
1603+
15621604
TEST_F(LLVMCodeBuilderTest, Yield)
15631605
{
15641606
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class CodeBuilderMock : public ICodeBuilder
3838
MOCK_METHOD(void, createTan, (), (override));
3939
MOCK_METHOD(void, createAsin, (), (override));
4040
MOCK_METHOD(void, createAcos, (), (override));
41+
MOCK_METHOD(void, createAtan, (), (override));
4142

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

0 commit comments

Comments
 (0)