Skip to content

Commit 6e66240

Browse files
committed
LLVMCodeBuilder: Implement floor operator
1 parent 7e7f7da commit 6e66240

File tree

5 files changed

+68
-0
lines changed

5 files changed

+68
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class ICodeBuilder
4040
virtual void createMod() = 0;
4141
virtual void createRound() = 0;
4242
virtual void createAbs() = 0;
43+
virtual void createFloor() = 0;
4344

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

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
220220
break;
221221
}
222222

223+
case Step::Type::Floor: {
224+
assert(step.args.size() == 1);
225+
const auto &arg = step.args[0];
226+
llvm::Function *floorFunc = llvm::Intrinsic::getDeclaration(m_module.get(), llvm::Intrinsic::floor, m_builder.getDoubleTy());
227+
llvm::Value *num = removeNaN(castValue(arg.second, arg.first));
228+
step.functionReturnReg->value = m_builder.CreateCall(floorFunc, num);
229+
break;
230+
}
231+
223232
case Step::Type::Yield:
224233
if (!m_warp) {
225234
freeHeap();
@@ -603,6 +612,11 @@ void LLVMCodeBuilder::createAbs()
603612
createOp(Step::Type::Abs, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
604613
}
605614

615+
void LLVMCodeBuilder::createFloor()
616+
{
617+
createOp(Step::Type::Floor, Compiler::StaticType::Number, Compiler::StaticType::Number, 1);
618+
}
619+
606620
void LLVMCodeBuilder::beginIfStatement()
607621
{
608622
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
@@ -42,6 +42,7 @@ class LLVMCodeBuilder : public ICodeBuilder
4242
void createMod() override;
4343
void createRound() override;
4444
void createAbs() override;
45+
void createFloor() override;
4546

4647
void beginIfStatement() override;
4748
void beginElseBranch() override;
@@ -88,6 +89,7 @@ class LLVMCodeBuilder : public ICodeBuilder
8889
Mod,
8990
Round,
9091
Abs,
92+
Floor,
9193
Yield,
9294
BeginIf,
9395
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,56 @@ TEST_F(LLVMCodeBuilderTest, Abs)
11781178
addOpTest(nan, 0);
11791179
}
11801180

1181+
TEST_F(LLVMCodeBuilderTest, Floor)
1182+
{
1183+
std::string expected;
1184+
1185+
auto addOpTest = [this, &expected](Value v1, double expectedResult) {
1186+
createBuilder(true);
1187+
1188+
m_builder->addConstValue(v1);
1189+
m_builder->createFloor();
1190+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1191+
1192+
m_builder->addConstValue(v1);
1193+
m_builder->addFunctionCall("test_const_number", Compiler::StaticType::Number, { Compiler::StaticType::Number });
1194+
m_builder->createFloor();
1195+
m_builder->addFunctionCall("test_print_number", Compiler::StaticType::Void, { Compiler::StaticType::Number });
1196+
1197+
std::stringstream stream;
1198+
stream << expectedResult;
1199+
std::string str = stream.str() + '\n';
1200+
std::string expected = str + str;
1201+
1202+
auto code = m_builder->finalize();
1203+
auto ctx = code->createExecutionContext(&m_target);
1204+
1205+
testing::internal::CaptureStdout();
1206+
code->run(ctx.get());
1207+
const std::string quotes1 = v1.isString() ? "\"" : "";
1208+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << quotes1 << v1.toString() << quotes1;
1209+
};
1210+
1211+
static const double inf = std::numeric_limits<double>::infinity();
1212+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1213+
1214+
addOpTest(4.0, 4.0);
1215+
addOpTest(3.2, 3.0);
1216+
addOpTest(3.5, 3.0);
1217+
addOpTest(3.6, 3.0);
1218+
addOpTest(0.0, 0.0);
1219+
addOpTest(-0.0, -0.0);
1220+
addOpTest(-2.4, -3.0);
1221+
addOpTest(-2.5, -3.0);
1222+
addOpTest(-2.6, -3.0);
1223+
addOpTest(-0.4, -1.0);
1224+
addOpTest(-0.5, -1.0);
1225+
addOpTest(-0.51, -1.0);
1226+
addOpTest(inf, inf);
1227+
addOpTest(-inf, -inf);
1228+
addOpTest(nan, 0);
1229+
}
1230+
11811231
TEST_F(LLVMCodeBuilderTest, Yield)
11821232
{
11831233
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class CodeBuilderMock : public ICodeBuilder
3030
MOCK_METHOD(void, createMod, (), (override));
3131
MOCK_METHOD(void, createRound, (), (override));
3232
MOCK_METHOD(void, createAbs, (), (override));
33+
MOCK_METHOD(void, createFloor, (), (override));
3334

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

0 commit comments

Comments
 (0)