Skip to content

Commit e80226d

Browse files
committed
LLVMCodeBuilder: Implement asin operator
1 parent f0c6eb5 commit e80226d

File tree

5 files changed

+69
-0
lines changed

5 files changed

+69
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class ICodeBuilder
4646
virtual void createSin() = 0;
4747
virtual void createCos() = 0;
4848
virtual void createTan() = 0;
49+
virtual void createAsin() = 0;
4950

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,20 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
316316
break;
317317
}
318318

319+
case Step::Type::Asin: {
320+
assert(step.args.size() == 1);
321+
const auto &arg = step.args[0];
322+
// asin(x) * 180.0 / pi + 0.0
323+
// +0.0 to avoid -0.0
324+
llvm::Constant *zero = llvm::ConstantFP::get(m_ctx, llvm::APFloat(0.0));
325+
llvm::Constant *pi = llvm::ConstantFP::get(m_ctx, llvm::APFloat(std::acos(-1.0)));
326+
llvm::Constant *piDeg = llvm::ConstantFP::get(m_ctx, llvm::APFloat(180.0));
327+
llvm::Function *asinFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::asin, m_builder.getDoubleTy());
328+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
329+
step.functionReturnReg->value = m_builder.CreateFAdd(m_builder.CreateFDiv(m_builder.CreateFMul(m_builder.CreateCall(asinFunc, num), piDeg), pi), zero);
330+
break;
331+
}
332+
319333
case Step::Type::Yield:
320334
if (!m_warp) {
321335
freeHeap();
@@ -729,6 +743,11 @@ void LLVMCodeBuilder::createTan()
729743
createOp(Step::Type::Tan, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
730744
}
731745

746+
void LLVMCodeBuilder::createAsin()
747+
{
748+
createOp(Step::Type::Asin, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
749+
}
750+
732751
void LLVMCodeBuilder::beginIfStatement()
733752
{
734753
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
@@ -48,6 +48,7 @@ class LLVMCodeBuilder : public ICodeBuilder
4848
void createSin() override;
4949
void createCos() override;
5050
void createTan() override;
51+
void createAsin() override;
5152

5253
void beginIfStatement() override;
5354
void beginElseBranch() override;
@@ -100,6 +101,7 @@ class LLVMCodeBuilder : public ICodeBuilder
100101
Sin,
101102
Cos,
102103
Tan,
104+
Asin,
103105
Yield,
104106
BeginIf,
105107
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,52 @@ TEST_F(LLVMCodeBuilderTest, Tan)
14671467
addOpTest(nan, 0.0);
14681468
}
14691469

1470+
TEST_F(LLVMCodeBuilderTest, Asin)
1471+
{
1472+
std::string expected;
1473+
1474+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1475+
createBuilder(true);
1476+
1477+
m_builder->addConstValue(v1);
1478+
m_builder->createAsin();
1479+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1480+
1481+
m_builder->addConstValue(v1);
1482+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1483+
m_builder->createAsin();
1484+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1485+
1486+
std::stringstream stream;
1487+
stream << expectedResult;
1488+
std::string str = stream.str() + '\n';
1489+
std::string expected = str + str;
1490+
1491+
auto code = m_builder->finalize();
1492+
auto ctx = code->createExecutionContext(&m_target);
1493+
1494+
testing::internal::CaptureStdout();
1495+
code->run(ctx.get());
1496+
const std::string quotes1 = v1.isString() ? "\"" : "";
1497+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1498+
};
1499+
1500+
static const double inf = std::numeric_limits<double>::infinity();
1501+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1502+
1503+
addOpTest(1.0, 90.0);
1504+
addOpTest(0.5, 30.0);
1505+
addOpTest(0.0, 0.0);
1506+
addOpTest(-0.0, 0.0);
1507+
addOpTest(-0.5, -30.0);
1508+
addOpTest(-1.0, -90.0);
1509+
addOpTest(1.1, nan);
1510+
addOpTest(-1.2, nan);
1511+
addOpTest(inf, nan);
1512+
addOpTest(-inf, nan);
1513+
addOpTest(nan, 0.0);
1514+
}
1515+
14701516
TEST_F(LLVMCodeBuilderTest, Yield)
14711517
{
14721518
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class CodeBuilderMock : public ICodeBuilder
3636
MOCK_METHOD(void, createSin, (), (override));
3737
MOCK_METHOD(void, createCos, (), (override));
3838
MOCK_METHOD(void, createTan, (), (override));
39+
MOCK_METHOD(void, createAsin, (), (override));
3940

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

0 commit comments

Comments
 (0)