Skip to content

Commit 0659c6a

Browse files
committed
Move LLVM instructions to separate classes
1 parent c21ea7b commit 0659c6a

22 files changed

+1906
-1385
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,91 @@
11
// SPDX-License-Identifier: Apache-2.0
22

33
#include "comparison.h"
4+
#include "../llvminstruction.h"
45
#include "../llvmbuildutils.h"
56

7+
using namespace libscratchcpp;
68
using namespace libscratchcpp::llvmins;
79

810
ProcessResult Comparison::process(LLVMInstruction *ins)
911
{
12+
ProcessResult ret(true, ins);
13+
14+
switch (ins->type) {
15+
case LLVMInstruction::Type::CmpEQ:
16+
ret.next = buildCmpEQ(ins);
17+
break;
18+
19+
case LLVMInstruction::Type::CmpGT:
20+
ret.next = buildCmpGT(ins);
21+
break;
22+
23+
case LLVMInstruction::Type::CmpLT:
24+
ret.next = buildCmpLT(ins);
25+
break;
26+
27+
case LLVMInstruction::Type::StrCmpEQCS:
28+
ret.next = buildStrCmpEQCS(ins);
29+
break;
30+
31+
case LLVMInstruction::Type::StrCmpEQCI:
32+
ret.next = buildStrCmpEQCI(ins);
33+
break;
34+
35+
default:
36+
ret.match = false;
37+
break;
38+
}
39+
40+
return ret;
41+
}
42+
43+
LLVMInstruction *Comparison::buildCmpEQ(LLVMInstruction *ins)
44+
{
45+
assert(ins->args.size() == 2);
46+
const auto &arg1 = ins->args[0].second;
47+
const auto &arg2 = ins->args[1].second;
48+
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::EQ);
49+
50+
return ins->next;
51+
}
52+
53+
LLVMInstruction *Comparison::buildCmpGT(LLVMInstruction *ins)
54+
{
55+
assert(ins->args.size() == 2);
56+
const auto &arg1 = ins->args[0].second;
57+
const auto &arg2 = ins->args[1].second;
58+
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::GT);
59+
60+
return ins->next;
61+
}
62+
63+
LLVMInstruction *Comparison::buildCmpLT(LLVMInstruction *ins)
64+
{
65+
assert(ins->args.size() == 2);
66+
const auto &arg1 = ins->args[0].second;
67+
const auto &arg2 = ins->args[1].second;
68+
ins->functionReturnReg->value = m_utils.createComparison(arg1, arg2, LLVMBuildUtils::Comparison::LT);
69+
70+
return ins->next;
71+
}
72+
73+
LLVMInstruction *Comparison::buildStrCmpEQCS(LLVMInstruction *ins)
74+
{
75+
assert(ins->args.size() == 2);
76+
const auto &arg1 = ins->args[0].second;
77+
const auto &arg2 = ins->args[1].second;
78+
ins->functionReturnReg->value = m_utils.createStringComparison(arg1, arg2, true);
79+
80+
return ins->next;
81+
}
82+
83+
LLVMInstruction *Comparison::buildStrCmpEQCI(LLVMInstruction *ins)
84+
{
85+
assert(ins->args.size() == 2);
86+
const auto &arg1 = ins->args[0].second;
87+
const auto &arg2 = ins->args[1].second;
88+
ins->functionReturnReg->value = m_utils.createStringComparison(arg1, arg2, false);
89+
90+
return ins->next;
1091
}

src/engine/internal/llvm/instructions/comparison.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ class Comparison : public InstructionGroup
1313
using InstructionGroup::InstructionGroup;
1414

1515
ProcessResult process(LLVMInstruction *ins) override;
16+
17+
private:
18+
LLVMInstruction *buildCmpEQ(LLVMInstruction *ins);
19+
LLVMInstruction *buildCmpGT(LLVMInstruction *ins);
20+
LLVMInstruction *buildCmpLT(LLVMInstruction *ins);
21+
LLVMInstruction *buildStrCmpEQCS(LLVMInstruction *ins);
22+
LLVMInstruction *buildStrCmpEQCI(LLVMInstruction *ins);
1623
};
1724

1825
} // namespace libscratchcpp::llvmins

0 commit comments

Comments
 (0)