@@ -99,12 +99,32 @@ PPCRegisterInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
99
99
MachineBasicBlock::iterator MI,
100
100
unsigned SrcReg, int FrameIdx,
101
101
const TargetRegisterClass *RC) const {
102
- if (SrcReg == PPC::LR) {
103
- // FIXME: this spills LR immediately to memory in one step. To do this, we
104
- // use R11, which we know cannot be used in the prolog/epilog. This is a
105
- // hack.
106
- BuildMI (MBB, MI, PPC::MFLR, 1 , PPC::R11);
107
- addFrameReference (BuildMI (MBB, MI, PPC::STW, 3 ).addReg (PPC::R11), FrameIdx);
102
+ if (RC == PPC::GPRCRegisterClass) {
103
+ if (SrcReg != PPC::LR) {
104
+ addFrameReference (BuildMI (MBB, MI, PPC::STW, 3 ).addReg (SrcReg),FrameIdx);
105
+ } else {
106
+ // FIXME: this spills LR immediately to memory in one step. To do this,
107
+ // we use R11, which we know cannot be used in the prolog/epilog. This is
108
+ // a hack.
109
+ BuildMI (MBB, MI, PPC::MFLR, 1 , PPC::R11);
110
+ addFrameReference (BuildMI (MBB, MI, PPC::STW, 3 ).addReg (PPC::R11),
111
+ FrameIdx);
112
+ }
113
+ } else if (RC == PPC::G8RCRegisterClass) {
114
+ if (SrcReg != PPC::LR8) {
115
+ addFrameReference (BuildMI (MBB, MI, PPC::STD, 3 ).addReg (SrcReg), FrameIdx);
116
+ } else {
117
+ // FIXME: this spills LR immediately to memory in one step. To do this,
118
+ // we use R11, which we know cannot be used in the prolog/epilog. This is
119
+ // a hack.
120
+ BuildMI (MBB, MI, PPC::MFLR8, 1 , PPC::X11);
121
+ addFrameReference (BuildMI (MBB, MI, PPC::STD, 3 ).addReg (PPC::X11),
122
+ FrameIdx);
123
+ }
124
+ } else if (RC == PPC::F8RCRegisterClass) {
125
+ addFrameReference (BuildMI (MBB, MI, PPC::STFD, 3 ).addReg (SrcReg),FrameIdx);
126
+ } else if (RC == PPC::F4RCRegisterClass) {
127
+ addFrameReference (BuildMI (MBB, MI, PPC::STFS, 3 ).addReg (SrcReg),FrameIdx);
108
128
} else if (RC == PPC::CRRCRegisterClass) {
109
129
// FIXME: We use R0 here, because it isn't available for RA.
110
130
// We need to store the CR in the low 4-bits of the saved value. First,
@@ -121,14 +141,6 @@ PPCRegisterInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
121
141
}
122
142
123
143
addFrameReference (BuildMI (MBB, MI, PPC::STW, 3 ).addReg (PPC::R0), FrameIdx);
124
- } else if (RC == PPC::GPRCRegisterClass) {
125
- addFrameReference (BuildMI (MBB, MI, PPC::STW, 3 ).addReg (SrcReg),FrameIdx);
126
- } else if (RC == PPC::G8RCRegisterClass) {
127
- addFrameReference (BuildMI (MBB, MI, PPC::STD, 3 ).addReg (SrcReg),FrameIdx);
128
- } else if (RC == PPC::F8RCRegisterClass) {
129
- addFrameReference (BuildMI (MBB, MI, PPC::STFD, 3 ).addReg (SrcReg),FrameIdx);
130
- } else if (RC == PPC::F4RCRegisterClass) {
131
- addFrameReference (BuildMI (MBB, MI, PPC::STFS, 3 ).addReg (SrcReg),FrameIdx);
132
144
} else if (RC == PPC::VRRCRegisterClass) {
133
145
// We don't have indexed addressing for vector loads. Emit:
134
146
// R11 = ADDI FI#
@@ -146,12 +158,27 @@ PPCRegisterInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
146
158
147
159
void
148
160
PPCRegisterInfo::loadRegFromStackSlot (MachineBasicBlock &MBB,
149
- MachineBasicBlock::iterator MI,
150
- unsigned DestReg, int FrameIdx,
151
- const TargetRegisterClass *RC) const {
152
- if (DestReg == PPC::LR) {
153
- addFrameReference (BuildMI (MBB, MI, PPC::LWZ, 2 , PPC::R11), FrameIdx);
154
- BuildMI (MBB, MI, PPC::MTLR, 1 ).addReg (PPC::R11);
161
+ MachineBasicBlock::iterator MI,
162
+ unsigned DestReg, int FrameIdx,
163
+ const TargetRegisterClass *RC) const {
164
+ if (RC == PPC::GPRCRegisterClass) {
165
+ if (DestReg != PPC::LR) {
166
+ addFrameReference (BuildMI (MBB, MI, PPC::LWZ, 2 , DestReg), FrameIdx);
167
+ } else {
168
+ addFrameReference (BuildMI (MBB, MI, PPC::LWZ, 2 , PPC::R11), FrameIdx);
169
+ BuildMI (MBB, MI, PPC::MTLR, 1 ).addReg (PPC::R11);
170
+ }
171
+ } else if (RC == PPC::G8RCRegisterClass) {
172
+ if (DestReg != PPC::LR8) {
173
+ addFrameReference (BuildMI (MBB, MI, PPC::LD, 2 , DestReg), FrameIdx);
174
+ } else {
175
+ addFrameReference (BuildMI (MBB, MI, PPC::LD, 2 , PPC::R11), FrameIdx);
176
+ BuildMI (MBB, MI, PPC::MTLR8, 1 ).addReg (PPC::R11);
177
+ }
178
+ } else if (RC == PPC::F8RCRegisterClass) {
179
+ addFrameReference (BuildMI (MBB, MI, PPC::LFD, 2 , DestReg), FrameIdx);
180
+ } else if (RC == PPC::F4RCRegisterClass) {
181
+ addFrameReference (BuildMI (MBB, MI, PPC::LFS, 2 , DestReg), FrameIdx);
155
182
} else if (RC == PPC::CRRCRegisterClass) {
156
183
// FIXME: We use R0 here, because it isn't available for RA.
157
184
addFrameReference (BuildMI (MBB, MI, PPC::LWZ, 2 , PPC::R0), FrameIdx);
@@ -166,14 +193,6 @@ PPCRegisterInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
166
193
}
167
194
168
195
BuildMI (MBB, MI, PPC::MTCRF, 1 , DestReg).addReg (PPC::R0);
169
- } else if (RC == PPC::GPRCRegisterClass) {
170
- addFrameReference (BuildMI (MBB, MI, PPC::LWZ, 2 , DestReg), FrameIdx);
171
- } else if (RC == PPC::G8RCRegisterClass) {
172
- addFrameReference (BuildMI (MBB, MI, PPC::LD, 2 , DestReg), FrameIdx);
173
- } else if (RC == PPC::F8RCRegisterClass) {
174
- addFrameReference (BuildMI (MBB, MI, PPC::LFD, 2 , DestReg), FrameIdx);
175
- } else if (RC == PPC::F4RCRegisterClass) {
176
- addFrameReference (BuildMI (MBB, MI, PPC::LFS, 2 , DestReg), FrameIdx);
177
196
} else if (RC == PPC::VRRCRegisterClass) {
178
197
// We don't have indexed addressing for vector loads. Emit:
179
198
// R11 = ADDI FI#
@@ -251,7 +270,7 @@ const unsigned* PPCRegisterInfo::getCalleeSaveRegs() const {
251
270
PPC::V24, PPC::V25, PPC::V26, PPC::V27,
252
271
PPC::V28, PPC::V29, PPC::V30, PPC::V31,
253
272
254
- PPC::LR , 0
273
+ PPC::LR8 , 0
255
274
};
256
275
257
276
return Subtarget.isPPC64 () ? Darwin64_CalleeSaveRegs :
@@ -303,7 +322,7 @@ PPCRegisterInfo::getCalleeSaveRegClasses() const {
303
322
&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
304
323
&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
305
324
306
- &PPC::GPRCRegClass , 0
325
+ &PPC::G8RCRegClass , 0
307
326
};
308
327
309
328
return Subtarget.isPPC64 () ? Darwin64_CalleeSaveRegClasses :
@@ -780,7 +799,8 @@ void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
780
799
}
781
800
782
801
unsigned PPCRegisterInfo::getRARegister () const {
783
- return PPC::LR;
802
+ return !Subtarget.isPPC64 () ? PPC::LR : PPC::LR8;
803
+
784
804
}
785
805
786
806
unsigned PPCRegisterInfo::getFrameRegister (MachineFunction &MF) const {
0 commit comments