@@ -40,27 +40,20 @@ namespace llvm {
4040// / with BP or SP and Disp being offsetted accordingly. The displacement may
4141// / also include the offset of a global value.
4242struct X86AddressMode {
43- enum {
44- RegBase,
45- FrameIndexBase
46- } BaseType;
43+ enum { RegBase, FrameIndexBase } BaseType = RegBase;
4744
48- union {
49- unsigned Reg;
45+ union BaseUnion {
46+ Register Reg;
5047 int FrameIndex;
51- } Base;
5248
53- unsigned Scale;
54- unsigned IndexReg;
55- int Disp;
56- const GlobalValue *GV;
57- unsigned GVOpFlags;
49+ BaseUnion () : Reg () {}
50+ } Base;
5851
59- X86AddressMode ()
60- : BaseType(RegBase), Scale( 1 ), IndexReg( 0 ), Disp( 0 ), GV( nullptr ),
61- GVOpFlags ( 0 ) {
62- Base. Reg = 0 ;
63- }
52+ unsigned Scale = 1 ;
53+ Register IndexReg;
54+ int Disp = 0 ;
55+ const GlobalValue *GV = nullptr ;
56+ unsigned GVOpFlags = 0 ;
6457
6558 void getFullAddress (SmallVectorImpl<MachineOperand> &MO) {
6659 assert (Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8 );
@@ -121,54 +114,58 @@ static inline X86AddressMode getAddressFromInstr(const MachineInstr *MI,
121114// / with no scale, index or displacement. An example is: DWORD PTR [EAX].
122115// /
123116static inline const MachineInstrBuilder &
124- addDirectMem (const MachineInstrBuilder &MIB, unsigned Reg) {
117+ addDirectMem (const MachineInstrBuilder &MIB, Register Reg) {
125118 // Because memory references are always represented with five
126119 // values, this adds: Reg, 1, NoReg, 0, NoReg to the instruction.
127- return MIB.addReg (Reg).addImm (1 ).addReg (0 ).addImm (0 ).addReg (0 );
120+ return MIB.addReg (Reg)
121+ .addImm (1 )
122+ .addReg (Register ())
123+ .addImm (0 )
124+ .addReg (Register ());
128125}
129126
130127// / Replace the address used in the instruction with the direct memory
131128// / reference.
132129static inline void setDirectAddressInInstr (MachineInstr *MI, unsigned Operand,
133- unsigned Reg) {
130+ Register Reg) {
134131 // Direct memory address is in a form of: Reg/FI, 1 (Scale), NoReg, 0, NoReg.
135132 MI->getOperand (Operand).ChangeToRegister (Reg, /* isDef=*/ false );
136133 MI->getOperand (Operand + 1 ).setImm (1 );
137- MI->getOperand (Operand + 2 ).setReg (0 );
134+ MI->getOperand (Operand + 2 ).setReg (Register () );
138135 MI->getOperand (Operand + 3 ).ChangeToImmediate (0 );
139- MI->getOperand (Operand + 4 ).setReg (0 );
136+ MI->getOperand (Operand + 4 ).setReg (Register () );
140137}
141138
142139static inline const MachineInstrBuilder &
143140addOffset (const MachineInstrBuilder &MIB, int Offset) {
144- return MIB.addImm (1 ).addReg (0 ) .addImm (Offset).addReg (0 );
141+ return MIB.addImm (1 ).addReg (Register ()) .addImm (Offset).addReg (Register () );
145142}
146143
147144static inline const MachineInstrBuilder &
148145addOffset (const MachineInstrBuilder &MIB, const MachineOperand& Offset) {
149- return MIB.addImm (1 ).addReg (0 ) .add (Offset).addReg (0 );
146+ return MIB.addImm (1 ).addReg (Register ()) .add (Offset).addReg (Register () );
150147}
151148
152149// / addRegOffset - This function is used to add a memory reference of the form
153150// / [Reg + Offset], i.e., one with no scale or index, but with a
154151// / displacement. An example is: DWORD PTR [EAX + 4].
155152// /
156153static inline const MachineInstrBuilder &
157- addRegOffset (const MachineInstrBuilder &MIB,
158- unsigned Reg, bool isKill, int Offset) {
154+ addRegOffset (const MachineInstrBuilder &MIB, Register Reg, bool isKill,
155+ int Offset) {
159156 return addOffset (MIB.addReg (Reg, getKillRegState (isKill)), Offset);
160157}
161158
162159// / addRegReg - This function is used to add a memory reference of the form:
163160// / [Reg + Reg].
164161static inline const MachineInstrBuilder &
165- addRegReg (const MachineInstrBuilder &MIB, unsigned Reg1, bool isKill1,
166- unsigned SubReg1, unsigned Reg2, bool isKill2, unsigned SubReg2) {
162+ addRegReg (const MachineInstrBuilder &MIB, Register Reg1, bool isKill1,
163+ unsigned SubReg1, Register Reg2, bool isKill2, unsigned SubReg2) {
167164 return MIB.addReg (Reg1, getKillRegState (isKill1), SubReg1)
168165 .addImm (1 )
169166 .addReg (Reg2, getKillRegState (isKill2), SubReg2)
170167 .addImm (0 )
171- .addReg (0 );
168+ .addReg (Register () );
172169}
173170
174171static inline const MachineInstrBuilder &
@@ -189,7 +186,7 @@ addFullAddress(const MachineInstrBuilder &MIB,
189186 else
190187 MIB.addImm (AM.Disp );
191188
192- return MIB.addReg (0 );
189+ return MIB.addReg (Register () );
193190}
194191
195192// / addFrameReference - This function is used to add a reference to the base of
@@ -224,10 +221,13 @@ addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {
224221// /
225222static inline const MachineInstrBuilder &
226223addConstantPoolReference (const MachineInstrBuilder &MIB, unsigned CPI,
227- unsigned GlobalBaseReg, unsigned char OpFlags) {
224+ Register GlobalBaseReg, unsigned char OpFlags) {
228225 // FIXME: factor this
229- return MIB.addReg (GlobalBaseReg).addImm (1 ).addReg (0 )
230- .addConstantPoolIndex (CPI, 0 , OpFlags).addReg (0 );
226+ return MIB.addReg (GlobalBaseReg)
227+ .addImm (1 )
228+ .addReg (Register ())
229+ .addConstantPoolIndex (CPI, 0 , OpFlags)
230+ .addReg (Register ());
231231}
232232
233233} // end namespace llvm
0 commit comments