Skip to content

Commit 4d9f6fa

Browse files
committed
LLVMCodeBuilder: Implement not gate
1 parent eca7a73 commit 4d9f6fa

File tree

5 files changed

+82
-0
lines changed

5 files changed

+82
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class ICodeBuilder
3535

3636
virtual void createAnd() = 0;
3737
virtual void createOr() = 0;
38+
virtual void createNot() = 0;
39+
3840
virtual void beginIfStatement() = 0;
3941
virtual void beginElseBranch() = 0;
4042
virtual void endIf() = 0;

src/dev/engine/internal/llvmcodebuilder.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
172172
break;
173173
}
174174

175+
case Step::Type::Not: {
176+
assert(step.args.size() == 1);
177+
const auto &arg = step.args[0];
178+
llvm::Value *value = castValue(arg.second, arg.first);
179+
step.functionReturnReg->value = m_builder.CreateNot(value);
180+
break;
181+
}
182+
175183
case Step::Type::Yield:
176184
if (!m_warp) {
177185
freeHeap();
@@ -535,6 +543,11 @@ void LLVMCodeBuilder::createOr()
535543
createOp(Step::Type::Or, Compiler::StaticType::Bool, Compiler::StaticType::Bool, 2);
536544
}
537545

546+
void LLVMCodeBuilder::createNot()
547+
{
548+
createOp(Step::Type::Not, Compiler::StaticType::Bool, Compiler::StaticType::Bool, 1);
549+
}
550+
538551
void LLVMCodeBuilder::beginIfStatement()
539552
{
540553
Step step(Step::Type::BeginIf);

src/dev/engine/internal/llvmcodebuilder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class LLVMCodeBuilder : public ICodeBuilder
3737

3838
void createAnd() override;
3939
void createOr() override;
40+
void createNot() override;
41+
4042
void beginIfStatement() override;
4143
void beginElseBranch() override;
4244
void endIf() override;
@@ -78,6 +80,7 @@ class LLVMCodeBuilder : public ICodeBuilder
7880
CmpLT,
7981
And,
8082
Or,
83+
Not,
8184
Yield,
8285
BeginIf,
8386
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,68 @@ TEST_F(LLVMCodeBuilderTest, AndOr)
962962
addOpTest("nan", nan);
963963
}
964964

965+
TEST_F(LLVMCodeBuilderTest, Not)
966+
{
967+
auto addOpTest = [this](Value v) {
968+
createBuilder(true);
969+
970+
m_builder->addConstValue(v);
971+
m_builder->createNot();
972+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
973+
974+
m_builder->addConstValue(v);
975+
callConstFuncForType(v.type());
976+
m_builder->createNot();
977+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
978+
979+
std::string str = Value(!v.toBool()).toString() + '\n';
980+
std::string expected = str + str;
981+
982+
auto code = m_builder->finalize();
983+
auto ctx = code->createExecutionContext(&m_target);
984+
985+
testing::internal::CaptureStdout();
986+
code->run(ctx.get());
987+
const std::string quotes = v.isString() ? "\"" : "";
988+
ASSERT_THAT(testing::internal::GetCapturedStdout(), Eq(expected)) << "NOT: " << quotes << v.toString() << quotes;
989+
};
990+
991+
addOpTest(10);
992+
addOpTest(-4.25);
993+
addOpTest(5.312);
994+
addOpTest(1);
995+
addOpTest(0);
996+
997+
addOpTest(true);
998+
addOpTest(false);
999+
1000+
addOpTest("abc");
1001+
addOpTest("5.25");
1002+
addOpTest("0");
1003+
1004+
static const double inf = std::numeric_limits<double>::infinity();
1005+
static const double nan = std::numeric_limits<double>::quiet_NaN();
1006+
1007+
addOpTest(inf);
1008+
addOpTest(-inf);
1009+
addOpTest(nan);
1010+
1011+
addOpTest("true");
1012+
addOpTest("false");
1013+
addOpTest("TRUE");
1014+
addOpTest("FALSE");
1015+
1016+
addOpTest("00001");
1017+
addOpTest("00000");
1018+
1019+
addOpTest("Infinity");
1020+
addOpTest("infinity");
1021+
addOpTest("-Infinity");
1022+
addOpTest("-infinity");
1023+
addOpTest("NaN");
1024+
addOpTest("nan");
1025+
}
1026+
9651027
TEST_F(LLVMCodeBuilderTest, Yield)
9661028
{
9671029
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class CodeBuilderMock : public ICodeBuilder
2525

2626
MOCK_METHOD(void, createAnd, (), (override));
2727
MOCK_METHOD(void, createOr, (), (override));
28+
MOCK_METHOD(void, createNot, (), (override));
29+
2830
MOCK_METHOD(void, beginIfStatement, (), (override));
2931
MOCK_METHOD(void, beginElseBranch, (), (override));
3032
MOCK_METHOD(void, endIf, (), (override));

0 commit comments

Comments
 (0)