Skip to content

Commit 79af1cb

Browse files
committed
[GlobalISel] Add wrapper classes for G_INDEXED_LOAD/G_INDEXED_STORE
1 parent 7ce800b commit 79af1cb

File tree

1 file changed

+81
-6
lines changed

1 file changed

+81
-6
lines changed

llvm/include/llvm/CodeGen/GlobalISel/GenericMachineInstrs.h

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,9 @@ class GenericMachineInstr : public MachineInstr {
3636
}
3737
};
3838

39-
/// Represents any type of generic load or store.
40-
/// G_LOAD, G_STORE, G_ZEXTLOAD, G_SEXTLOAD.
41-
class GLoadStore : public GenericMachineInstr {
39+
/// Provides common memory operand functionality.
40+
class GMemOperation : public GenericMachineInstr {
4241
public:
43-
/// Get the source register of the pointer value.
44-
Register getPointerReg() const { return getOperand(1).getReg(); }
45-
4642
/// Get the MachineMemOperand on this instruction.
4743
MachineMemOperand &getMMO() const { return **memoperands_begin(); }
4844

@@ -62,6 +58,18 @@ class GLoadStore : public GenericMachineInstr {
6258
} /// Returns the size in bits of the memory access.
6359
uint64_t getMemSizeInBits() const { return getMMO().getSizeInBits(); }
6460

61+
static bool classof(const MachineInstr *MI) {
62+
return GenericMachineInstr::classof(MI) && MI->hasOneMemOperand();
63+
}
64+
};
65+
66+
/// Represents any type of generic load or store.
67+
/// G_LOAD, G_STORE, G_ZEXTLOAD, G_SEXTLOAD.
68+
class GLoadStore : public GMemOperation {
69+
public:
70+
/// Get the source register of the pointer value.
71+
Register getPointerReg() const { return getOperand(1).getReg(); }
72+
6573
static bool classof(const MachineInstr *MI) {
6674
switch (MI->getOpcode()) {
6775
case TargetOpcode::G_LOAD:
@@ -75,6 +83,73 @@ class GLoadStore : public GenericMachineInstr {
7583
}
7684
};
7785

86+
/// Represents indexed loads. These are different enough from regular loads
87+
/// that they get their own class. Including them in GAnyLoad would probably
88+
/// make a footgun for someone.
89+
class GIndexedLoad : public GMemOperation {
90+
public:
91+
/// Get the definition register of the loaded value.
92+
Register getDstReg() const { return getOperand(0).getReg(); }
93+
/// Get the def register of the writeback value.
94+
Register getWritebackReg() const { return getOperand(1).getReg(); }
95+
/// Get the base register of the pointer value.
96+
Register getBaseReg() const { return getOperand(2).getReg(); }
97+
/// Get the offset register of the pointer value.
98+
Register getOffsetReg() const { return getOperand(3).getReg(); }
99+
100+
bool isPre() const { return getOperand(5).getImm() == 1; }
101+
bool isPost() const { return !isPre(); }
102+
103+
static bool classof(const MachineInstr *MI) {
104+
return MI->getOpcode() == TargetOpcode::G_INDEXED_LOAD;
105+
}
106+
};
107+
108+
/// Represents a G_INDEX_ZEXTLOAD/G_INDEXED_SEXTLOAD.
109+
class GIndexedExtLoad : public GIndexedLoad {
110+
public:
111+
static bool classof(const MachineInstr *MI) {
112+
return MI->getOpcode() == TargetOpcode::G_INDEXED_SEXTLOAD ||
113+
MI->getOpcode() == TargetOpcode::G_INDEXED_ZEXTLOAD;
114+
}
115+
};
116+
117+
/// Represents a G_ZEXTLOAD.
118+
class GIndexedZExtLoad : GIndexedExtLoad {
119+
public:
120+
static bool classof(const MachineInstr *MI) {
121+
return MI->getOpcode() == TargetOpcode::G_INDEXED_ZEXTLOAD;
122+
}
123+
};
124+
125+
/// Represents a G_SEXTLOAD.
126+
class GIndexedSExtLoad : GIndexedExtLoad {
127+
public:
128+
static bool classof(const MachineInstr *MI) {
129+
return MI->getOpcode() == TargetOpcode::G_INDEXED_SEXTLOAD;
130+
}
131+
};
132+
133+
/// Represents indexed stores.
134+
class GIndexedStore : public GMemOperation {
135+
public:
136+
/// Get the def register of the writeback value.
137+
Register getWritebackReg() const { return getOperand(0).getReg(); }
138+
/// Get the stored value register.
139+
Register getValueReg() const { return getOperand(1).getReg(); }
140+
/// Get the base register of the pointer value.
141+
Register getBaseReg() const { return getOperand(2).getReg(); }
142+
/// Get the offset register of the pointer value.
143+
Register getOffsetReg() const { return getOperand(3).getReg(); }
144+
145+
bool isPre() const { return getOperand(4).getImm() == 1; }
146+
bool isPost() const { return !isPre(); }
147+
148+
static bool classof(const MachineInstr *MI) {
149+
return MI->getOpcode() == TargetOpcode::G_INDEXED_STORE;
150+
}
151+
};
152+
78153
/// Represents any generic load, including sign/zero extending variants.
79154
class GAnyLoad : public GLoadStore {
80155
public:

0 commit comments

Comments
 (0)