Skip to content

Commit b381271

Browse files
committed
[SOL] Implement isAddImmediate for SBF (#162)
* Code is add imm * Add tests
1 parent 694cdbc commit b381271

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed

llvm/lib/Target/SBF/SBFInstrInfo.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,30 @@ unsigned SBFInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
400400

401401
return 8;
402402
}
403+
404+
std::optional<RegImmPair> SBFInstrInfo::isAddImmediate(const MachineInstr &MI,
405+
Register Reg) const {
406+
const MachineOperand &Op0 = MI.getOperand(0);
407+
if (!Op0.isReg() || Reg != Op0.getReg())
408+
return std::nullopt;
409+
410+
if (!MI.getOperand(1).isReg() || !MI.getOperand(2).isImm())
411+
return std::nullopt;
412+
413+
int Sign = 1;
414+
int64_t Offset = 0;
415+
unsigned Opcode = MI.getOpcode();
416+
switch (Opcode) {
417+
default:
418+
return std::nullopt;
419+
case SBF::SUB_ri:
420+
case SBF::SUB_ri_32:
421+
Sign *= -1;
422+
[[fallthrough]];
423+
case SBF::ADD_ri:
424+
case SBF::ADD_ri_32: {
425+
Offset = MI.getOperand(2).getImm() * Sign;
426+
return RegImmPair{MI.getOperand(1).getReg(), Offset};
427+
}
428+
}
429+
}

llvm/lib/Target/SBF/SBFInstrInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ class SBFInstrInfo : public SBFGenInstrInfo {
6565

6666
unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
6767

68+
std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
69+
Register Reg) const override;
70+
6871
private:
6972
bool HasExplicitSignExt;
7073
bool NewMemEncoding;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
include_directories(
2+
${LLVM_MAIN_SRC_DIR}/lib/Target/SBF
3+
${LLVM_BINARY_DIR}/lib/Target/SBF
4+
)
5+
6+
set(LLVM_LINK_COMPONENTS
7+
SBFCodeGen
8+
SBFDesc
9+
SBFInfo
10+
Analysis
11+
CodeGen
12+
Core
13+
MC
14+
SelectionDAG
15+
TargetParser
16+
)
17+
18+
add_llvm_target_unittest(SBFTests
19+
SBFInstrInfoTest.cpp
20+
)
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
//===- SBFInstrInfoTest.cpp - SBFInstrInfo unit tests -----------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "SBFInstrInfo.h"
10+
#include "SBFSubtarget.h"
11+
#include "SBFTargetMachine.h"
12+
#include "llvm/CodeGen/MachineModuleInfo.h"
13+
#include "llvm/IR/DebugInfoMetadata.h"
14+
#include "llvm/IR/Module.h"
15+
#include "llvm/MC/TargetRegistry.h"
16+
#include "llvm/Support/TargetSelect.h"
17+
#include "llvm/Target/TargetLoweringObjectFile.h"
18+
#include "llvm/Target/TargetMachine.h"
19+
#include "llvm/Target/TargetOptions.h"
20+
21+
#include "gtest/gtest.h"
22+
23+
#include <memory>
24+
25+
using namespace llvm;
26+
27+
namespace {
28+
29+
class SBFInstrInfoTest : public testing::TestWithParam<const char *> {
30+
protected:
31+
std::unique_ptr<SBFTargetMachine> TM;
32+
std::unique_ptr<LLVMContext> Ctx;
33+
std::unique_ptr<SBFSubtarget> ST;
34+
std::unique_ptr<MachineModuleInfo> MMI;
35+
std::unique_ptr<MachineFunction> MF;
36+
std::unique_ptr<Module> M;
37+
38+
static void SetUpTestSuite() {
39+
LLVMInitializeSBFTargetInfo();
40+
LLVMInitializeSBFTarget();
41+
LLVMInitializeSBFTargetMC();
42+
}
43+
44+
SBFInstrInfoTest() {
45+
std::string Error;
46+
auto TT(Triple::normalize(GetParam()));
47+
const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);
48+
TargetOptions Options;
49+
50+
TM.reset(static_cast<SBFTargetMachine *>(TheTarget->createTargetMachine(
51+
TT, "generic", "", Options, std::nullopt, std::nullopt,
52+
CodeGenOptLevel::Default)));
53+
54+
Ctx = std::make_unique<LLVMContext>();
55+
M = std::make_unique<Module>("Module", *Ctx);
56+
M->setDataLayout(TM->createDataLayout());
57+
auto *FType = FunctionType::get(Type::getVoidTy(*Ctx), false);
58+
auto *F = Function::Create(FType, GlobalValue::ExternalLinkage, "Test", *M);
59+
MMI = std::make_unique<MachineModuleInfo>(TM.get());
60+
61+
ST = std::make_unique<SBFSubtarget>(
62+
TM->getTargetTriple(), TM->getTargetCPU().str(),
63+
TM->getTargetFeatureString().str(), *TM);
64+
65+
MF = std::make_unique<MachineFunction>(*F, *TM, *ST, 42, *MMI);
66+
}
67+
};
68+
69+
TEST_P(SBFInstrInfoTest, IsAddImmediate) {
70+
const SBFInstrInfo *TII = ST->getInstrInfo();
71+
DebugLoc DL;
72+
73+
MachineInstr *MI1 = BuildMI(*MF, DL, TII->get(SBF::ADD_ri_32), SBF::R1)
74+
.addReg(SBF::R1)
75+
.addImm(80)
76+
.getInstr();
77+
auto MI1Res = TII->isAddImmediate(*MI1, SBF::R1);
78+
ASSERT_TRUE(MI1Res.has_value());
79+
EXPECT_EQ(MI1Res->Reg, SBF::R1);
80+
EXPECT_EQ(MI1Res->Imm, 80);
81+
82+
MachineInstr *MI2 =
83+
BuildMI(*MF, DL, TII->get(SBF::ADD_ri_32), SBF::R1).addImm(80).getInstr();
84+
EXPECT_FALSE(TII->isAddImmediate(*MI2, SBF::R2));
85+
86+
MachineInstr *MI3 = BuildMI(*MF, DL, TII->get(SBF::ADD_ri), SBF::R1)
87+
.addReg(SBF::R1)
88+
.addImm(80)
89+
.getInstr();
90+
auto MI3Res = TII->isAddImmediate(*MI3, SBF::R1);
91+
ASSERT_TRUE(MI3Res.has_value());
92+
EXPECT_EQ(MI3Res->Reg, SBF::R1);
93+
EXPECT_EQ(MI3Res->Imm, 80);
94+
95+
MachineInstr *MI4 = BuildMI(*MF, DL, TII->get(SBF::SUB_ri), SBF::R1)
96+
.addReg(SBF::R1)
97+
.addImm(80)
98+
.getInstr();
99+
auto MI4Res = TII->isAddImmediate(*MI4, SBF::R1);
100+
ASSERT_TRUE(MI4Res.has_value());
101+
EXPECT_EQ(MI4Res->Reg, SBF::R1);
102+
EXPECT_EQ(MI4Res->Imm, -80);
103+
104+
MachineInstr *MI5 = BuildMI(*MF, DL, TII->get(SBF::SUB_ri_32), SBF::R1)
105+
.addReg(SBF::R1)
106+
.addImm(80)
107+
.getInstr();
108+
auto MI5Res = TII->isAddImmediate(*MI5, SBF::R1);
109+
ASSERT_TRUE(MI5Res.has_value());
110+
EXPECT_EQ(MI5Res->Reg, SBF::R1);
111+
EXPECT_EQ(MI5Res->Imm, -80);
112+
113+
MachineInstr *MI6 = BuildMI(*MF, DL, TII->get(SBF::SUB_ri_32), SBF::R1)
114+
.addImm(2)
115+
.addImm(80)
116+
.getInstr();
117+
auto MI6Res = TII->isAddImmediate(*MI6, SBF::R1);
118+
ASSERT_FALSE(MI6Res.has_value());
119+
120+
MachineInstr *MI7 = BuildMI(*MF, DL, TII->get(SBF::SUB_ri_32), SBF::R1)
121+
.addReg(SBF::R2)
122+
.addReg(SBF::R3)
123+
.getInstr();
124+
auto MI7Res = TII->isAddImmediate(*MI7, SBF::R1);
125+
ASSERT_FALSE(MI7Res.has_value());
126+
}
127+
128+
} // namespace
129+
130+
INSTANTIATE_TEST_SUITE_P(SBFTest, SBFInstrInfoTest, testing::Values("sbf"));

0 commit comments

Comments
 (0)