Skip to content

Commit e01d6ff

Browse files
committed
LLVMCodeBuilder: Implement ceil operator
1 parent 6e66240 commit e01d6ff

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
@@ -41,6 +41,7 @@ class ICodeBuilder
4141
virtual void createRound() = 0;
4242
virtual void createAbs() = 0;
4343
virtual void createFloor() = 0;
44+
virtual void createCeil() = 0;
4445

4546
virtual void beginIfStatement() = 0;
4647
virtual void beginElseBranch() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
229229
break;
230230
}
231231

232+
case Step::Type::Ceil: {
233+
assert(step.args.size() == 1);
234+
const auto &arg = step.args[0];
235+
llvm::Function *ceilFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::ceil, m_builder.getDoubleTy());
236+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
237+
step.functionReturnReg->value = m_builder.CreateCall(ceilFunc, num);
238+
break;
239+
}
240+
232241
case Step::Type::Yield:
233242
if (!m_warp) {
234243
freeHeap();
@@ -617,6 +626,11 @@ void LLVMCodeBuilder::createFloor()
617626
createOp(Step::Type::Floor, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
618627
}
619628

629+
void LLVMCodeBuilder::createCeil()
630+
{
631+
createOp(Step::Type::Ceil, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
632+
}
633+
620634
void LLVMCodeBuilder::beginIfStatement()
621635
{
622636
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
@@ -43,6 +43,7 @@ class LLVMCodeBuilder : public ICodeBuilder
4343
void createRound() override;
4444
void createAbs() override;
4545
void createFloor() override;
46+
void createCeil() override;
4647

4748
void beginIfStatement() override;
4849
void beginElseBranch() override;
@@ -90,6 +91,7 @@ class LLVMCodeBuilder : public ICodeBuilder
9091
Round,
9192
Abs,
9293
Floor,
94+
Ceil,
9395
Yield,
9496
BeginIf,
9597
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,57 @@ TEST_F(LLVMCodeBuilderTest, Floor)
12281228
addOpTest(nan, 0);
12291229
}
12301230

1231+
TEST_F(LLVMCodeBuilderTest, Ceil)
1232+
{
1233+
std::string expected;
1234+
1235+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1236+
createBuilder(true);
1237+
1238+
m_builder->addConstValue(v1);
1239+
m_builder->createCeil();
1240+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1241+
1242+
m_builder->addConstValue(v1);
1243+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1244+
m_builder->createCeil();
1245+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1246+
1247+
std::stringstream stream;
1248+
stream << expectedResult;
1249+
std::string str = stream.str() + '\n';
1250+
std::string expected = str + str;
1251+
1252+
auto code = m_builder->finalize();
1253+
auto ctx = code->createExecutionContext(&m_target);
1254+
1255+
testing::internal::CaptureStdout();
1256+
code->run(ctx.get());
1257+
const std::string quotes1 = v1.isString() ? "\"" : "";
1258+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1259+
};
1260+
1261+
static const double inf = std::numeric_limits<double>::infinity();
1262+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1263+
1264+
addOpTest(8.0, 8.0);
1265+
addOpTest(3.2, 4.0);
1266+
addOpTest(3.5, 4.0);
1267+
addOpTest(3.6, 4.0);
1268+
addOpTest(0.4, 1.0);
1269+
addOpTest(0.0, 0.0);
1270+
addOpTest(-0.0, -0.0);
1271+
addOpTest(-2.4, -2.0);
1272+
addOpTest(-2.5, -2.0);
1273+
addOpTest(-2.6, -2.0);
1274+
addOpTest(-0.4, -0.0);
1275+
addOpTest(-0.5, -0.0);
1276+
addOpTest(-0.51, -0.0);
1277+
addOpTest(inf, inf);
1278+
addOpTest(-inf, -inf);
1279+
addOpTest(nan, 0);
1280+
}
1281+
12311282
TEST_F(LLVMCodeBuilderTest, Yield)
12321283
{
12331284
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class CodeBuilderMock : public ICodeBuilder
3131
MOCK_METHOD(void, createRound, (), (override));
3232
MOCK_METHOD(void, createAbs, (), (override));
3333
MOCK_METHOD(void, createFloor, (), (override));
34+
MOCK_METHOD(void, createCeil, (), (override));
3435

3536
MOCK_METHOD(void, beginIfStatement, (), (override));
3637
MOCK_METHOD(void, beginElseBranch, (), (override));

0 commit comments

Comments
 (0)