@@ -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 {
4241public:
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.
79154class GAnyLoad : public GLoadStore {
80155public:
0 commit comments