Skip to content

Commit 7e7f7da

Browse files
committed
LLVMCodeBuilder: Implement abs operator
1 parent ba6a97b commit 7e7f7da

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
@@ -39,6 +39,7 @@ class ICodeBuilder
3939

4040
virtual void createMod() = 0;
4141
virtual void createRound() = 0;
42+
virtual void createAbs() = 0;
4243

4344
virtual void beginIfStatement() = 0;
4445
virtual void beginElseBranch() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
211211
break;
212212
}
213213

214+
case Step::Type::Abs: {
215+
assert(step.args.size() == 1);
216+
const auto &arg = step.args[0];
217+
llvm::Function *absFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::fabs, m_builder.getDoubleTy());
218+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
219+
step.functionReturnReg->value = m_builder.CreateCall(absFunc, num);
220+
break;
221+
}
222+
214223
case Step::Type::Yield:
215224
if (!m_warp) {
216225
freeHeap();
@@ -589,6 +598,11 @@ void LLVMCodeBuilder::createRound()
589598
createOp(Step::Type::Round, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
590599
}
591600

601+
void LLVMCodeBuilder::createAbs()
602+
{
603+
createOp(Step::Type::Abs, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
604+
}
605+
592606
void LLVMCodeBuilder::beginIfStatement()
593607
{
594608
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
@@ -41,6 +41,7 @@ class LLVMCodeBuilder : public ICodeBuilder
4141

4242
void createMod() override;
4343
void createRound() override;
44+
void createAbs() override;
4445

4546
void beginIfStatement() override;
4647
void beginElseBranch() override;
@@ -86,6 +87,7 @@ class LLVMCodeBuilder : public ICodeBuilder
8687
Not,
8788
Mod,
8889
Round,
90+
Abs,
8991
Yield,
9092
BeginIf,
9193
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,51 @@ TEST_F(LLVMCodeBuilderTest, Round)
11331133
addOpTest(nan, 0);
11341134
}
11351135

1136+
TEST_F(LLVMCodeBuilderTest, Abs)
1137+
{
1138+
std::string expected;
1139+
1140+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1141+
createBuilder(true);
1142+
1143+
m_builder->addConstValue(v1);
1144+
m_builder->createAbs();
1145+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1146+
1147+
m_builder->addConstValue(v1);
1148+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1149+
m_builder->createAbs();
1150+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1151+
1152+
std::stringstream stream;
1153+
stream << expectedResult;
1154+
std::string str = stream.str() + '\n';
1155+
std::string expected = str + str;
1156+
1157+
auto code = m_builder->finalize();
1158+
auto ctx = code->createExecutionContext(&m_target);
1159+
1160+
testing::internal::CaptureStdout();
1161+
code->run(ctx.get());
1162+
const std::string quotes1 = v1.isString() ? "\"" : "";
1163+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1164+
};
1165+
1166+
static const double inf = std::numeric_limits<double>::infinity();
1167+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1168+
1169+
addOpTest(4.0, 4.0);
1170+
addOpTest(3.2, 3.2);
1171+
addOpTest(-2.0, 2.0);
1172+
addOpTest(-2.5, 2.5);
1173+
addOpTest(-2.6, 2.6);
1174+
addOpTest(0.0, 0.0);
1175+
addOpTest(-0.0, 0.0);
1176+
addOpTest(inf, inf);
1177+
addOpTest(-inf, inf);
1178+
addOpTest(nan, 0);
1179+
}
1180+
11361181
TEST_F(LLVMCodeBuilderTest, Yield)
11371182
{
11381183
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class CodeBuilderMock : public ICodeBuilder
2929

3030
MOCK_METHOD(void, createMod, (), (override));
3131
MOCK_METHOD(void, createRound, (), (override));
32+
MOCK_METHOD(void, createAbs, (), (override));
3233

3334
MOCK_METHOD(void, beginIfStatement, (), (override));
3435
MOCK_METHOD(void, beginElseBranch, (), (override));

0 commit comments

Comments
 (0)