Skip to content

Commit 3001766

Browse files
committed
LLVMCodeBuilder: Implement acos operator
1 parent e80226d commit 3001766

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class ICodeBuilder
4747
virtual void createCos() = 0;
4848
virtual void createTan() = 0;
4949
virtual void createAsin() = 0;
50+
virtual void createAcos() = 0;
5051

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,18 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
330330
break;
331331
}
332332

333+
case Step::Type::Acos: {
334+
assert(step.args.size() == 1);
335+
const auto &arg = step.args[0];
336+
// acos(x) * 180.0 / pi
337+
llvm::Constant *pi = llvm::ConstantFP::get(m_ctx, llvm::APFloat(std::acos(-1.0)));
338+
llvm::Constant *piDeg = llvm::ConstantFP::get(m_ctx, llvm::APFloat(180.0));
339+
llvm::Function *acosFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::acos, m_builder.getDoubleTy());
340+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
341+
step.functionReturnReg->value = m_builder.CreateFDiv(m_builder.CreateFMul(m_builder.CreateCall(acosFunc, num), piDeg), pi);
342+
break;
343+
}
344+
333345
case Step::Type::Yield:
334346
if (!m_warp) {
335347
freeHeap();
@@ -748,6 +760,11 @@ void LLVMCodeBuilder::createAsin()
748760
createOp(Step::Type::Asin, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
749761
}
750762

763+
void LLVMCodeBuilder::createAcos()
764+
{
765+
createOp(Step::Type::Acos, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
766+
}
767+
751768
void LLVMCodeBuilder::beginIfStatement()
752769
{
753770
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
@@ -49,6 +49,7 @@ class LLVMCodeBuilder : public ICodeBuilder
4949
void createCos() override;
5050
void createTan() override;
5151
void createAsin() override;
52+
void createAcos() override;
5253

5354
void beginIfStatement() override;
5455
void beginElseBranch() override;
@@ -102,6 +103,7 @@ class LLVMCodeBuilder : public ICodeBuilder
102103
Cos,
103104
Tan,
104105
Asin,
106+
Acos,
105107
Yield,
106108
BeginIf,
107109
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,52 @@ TEST_F(LLVMCodeBuilderTest, Asin)
15131513
addOpTest(nan, 0.0);
15141514
}
15151515

1516+
TEST_F(LLVMCodeBuilderTest, Acos)
1517+
{
1518+
std::string expected;
1519+
1520+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1521+
createBuilder(true);
1522+
1523+
m_builder->addConstValue(v1);
1524+
m_builder->createAcos();
1525+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1526+
1527+
m_builder->addConstValue(v1);
1528+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1529+
m_builder->createAcos();
1530+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1531+
1532+
std::stringstream stream;
1533+
stream << expectedResult;
1534+
std::string str = stream.str() + '\n';
1535+
std::string expected = str + str;
1536+
1537+
auto code = m_builder->finalize();
1538+
auto ctx = code->createExecutionContext(&m_target);
1539+
1540+
testing::internal::CaptureStdout();
1541+
code->run(ctx.get());
1542+
const std::string quotes1 = v1.isString() ? "\"" : "";
1543+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1544+
};
1545+
1546+
static const double inf = std::numeric_limits<double>::infinity();
1547+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1548+
1549+
addOpTest(1.0, 0.0);
1550+
addOpTest(0.5, 60.0);
1551+
addOpTest(0.0, 90.0);
1552+
addOpTest(-0.0, 90.0);
1553+
addOpTest(-0.5, 120.0);
1554+
addOpTest(-1.0, 180.0);
1555+
addOpTest(1.1, nan);
1556+
addOpTest(-1.2, nan);
1557+
addOpTest(inf, nan);
1558+
addOpTest(-inf, nan);
1559+
addOpTest(nan, 90.0);
1560+
}
1561+
15161562
TEST_F(LLVMCodeBuilderTest, Yield)
15171563
{
15181564
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class CodeBuilderMock : public ICodeBuilder
3737
MOCK_METHOD(void, createCos, (), (override));
3838
MOCK_METHOD(void, createTan, (), (override));
3939
MOCK_METHOD(void, createAsin, (), (override));
40+
MOCK_METHOD(void, createAcos, (), (override));
4041

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

0 commit comments

Comments
 (0)