@@ -27,6 +27,12 @@ bool MipsCallLowering::MipsHandler::assign(const CCValAssign &VA,
27
27
unsigned vreg) {
28
28
if (VA.isRegLoc ()) {
29
29
assignValueToReg (vreg, VA.getLocReg ());
30
+ } else if (VA.isMemLoc ()) {
31
+ unsigned Size = alignTo (VA.getValVT ().getSizeInBits (), 8 ) / 8 ;
32
+ unsigned Offset = VA.getLocMemOffset ();
33
+ MachinePointerInfo MPO;
34
+ unsigned StackAddr = getStackAddress (Size, Offset, MPO);
35
+ assignValueToAddress (vreg, StackAddr, Size, MPO);
30
36
} else {
31
37
return false ;
32
38
}
@@ -43,11 +49,24 @@ class IncomingValueHandler : public MipsCallLowering::MipsHandler {
43
49
ArrayRef<CallLowering::ArgInfo> Args);
44
50
45
51
private:
46
- virtual void assignValueToReg (unsigned ValVReg, unsigned PhysReg) override ;
52
+ void assignValueToReg (unsigned ValVReg, unsigned PhysReg) override ;
53
+
54
+ unsigned getStackAddress (uint64_t Size, int64_t Offset,
55
+ MachinePointerInfo &MPO) override ;
56
+
57
+ void assignValueToAddress (unsigned ValVReg, unsigned Addr, uint64_t Size,
58
+ MachinePointerInfo &MPO) override ;
47
59
48
60
virtual void markPhysRegUsed (unsigned PhysReg) {
49
61
MIRBuilder.getMBB ().addLiveIn (PhysReg);
50
62
}
63
+
64
+ void buildLoad (unsigned Val, unsigned Addr, uint64_t Size, unsigned Alignment,
65
+ MachinePointerInfo &MPO) {
66
+ MachineMemOperand *MMO = MIRBuilder.getMF ().getMachineMemOperand (
67
+ MPO, MachineMemOperand::MOLoad, Size, Alignment);
68
+ MIRBuilder.buildLoad (Val, Addr, *MMO);
69
+ }
51
70
};
52
71
53
72
class CallReturnHandler : public IncomingValueHandler {
@@ -57,7 +76,7 @@ class CallReturnHandler : public IncomingValueHandler {
57
76
: IncomingValueHandler(MIRBuilder, MRI), MIB(MIB) {}
58
77
59
78
private:
60
- virtual void markPhysRegUsed (unsigned PhysReg) override {
79
+ void markPhysRegUsed (unsigned PhysReg) override {
61
80
MIB.addDef (PhysReg, RegState::Implicit);
62
81
}
63
82
@@ -72,6 +91,26 @@ void IncomingValueHandler::assignValueToReg(unsigned ValVReg,
72
91
markPhysRegUsed (PhysReg);
73
92
}
74
93
94
+ unsigned IncomingValueHandler::getStackAddress (uint64_t Size, int64_t Offset,
95
+ MachinePointerInfo &MPO) {
96
+ MachineFrameInfo &MFI = MIRBuilder.getMF ().getFrameInfo ();
97
+
98
+ int FI = MFI.CreateFixedObject (Size, Offset, true );
99
+ MPO = MachinePointerInfo::getFixedStack (MIRBuilder.getMF (), FI);
100
+
101
+ unsigned AddrReg = MRI.createGenericVirtualRegister (LLT::pointer (0 , 32 ));
102
+ MIRBuilder.buildFrameIndex (AddrReg, FI);
103
+
104
+ return AddrReg;
105
+ }
106
+
107
+ void IncomingValueHandler::assignValueToAddress (unsigned ValVReg, unsigned Addr,
108
+ uint64_t Size,
109
+ MachinePointerInfo &MPO) {
110
+ // If the value is not extended, a simple load will suffice.
111
+ buildLoad (ValVReg, Addr, Size, /* Alignment */ 0 , MPO);
112
+ }
113
+
75
114
bool IncomingValueHandler::handle (ArrayRef<CCValAssign> ArgLocs,
76
115
ArrayRef<CallLowering::ArgInfo> Args) {
77
116
for (unsigned i = 0 , ArgsSize = Args.size (); i < ArgsSize; ++i) {
@@ -92,7 +131,13 @@ class OutgoingValueHandler : public MipsCallLowering::MipsHandler {
92
131
ArrayRef<CallLowering::ArgInfo> Args);
93
132
94
133
private:
95
- virtual void assignValueToReg (unsigned ValVReg, unsigned PhysReg) override ;
134
+ void assignValueToReg (unsigned ValVReg, unsigned PhysReg) override ;
135
+
136
+ unsigned getStackAddress (uint64_t Size, int64_t Offset,
137
+ MachinePointerInfo &MPO) override ;
138
+
139
+ void assignValueToAddress (unsigned ValVReg, unsigned Addr, uint64_t Size,
140
+ MachinePointerInfo &MPO) override ;
96
141
97
142
MachineInstrBuilder &MIB;
98
143
};
@@ -104,6 +149,31 @@ void OutgoingValueHandler::assignValueToReg(unsigned ValVReg,
104
149
MIB.addUse (PhysReg, RegState::Implicit);
105
150
}
106
151
152
+ unsigned OutgoingValueHandler::getStackAddress (uint64_t Size, int64_t Offset,
153
+ MachinePointerInfo &MPO) {
154
+ LLT p0 = LLT::pointer (0 , 32 );
155
+ LLT s32 = LLT::scalar (32 );
156
+ unsigned SPReg = MRI.createGenericVirtualRegister (p0);
157
+ MIRBuilder.buildCopy (SPReg, Mips::SP);
158
+
159
+ unsigned OffsetReg = MRI.createGenericVirtualRegister (s32);
160
+ MIRBuilder.buildConstant (OffsetReg, Offset);
161
+
162
+ unsigned AddrReg = MRI.createGenericVirtualRegister (p0);
163
+ MIRBuilder.buildGEP (AddrReg, SPReg, OffsetReg);
164
+
165
+ MPO = MachinePointerInfo::getStack (MIRBuilder.getMF (), Offset);
166
+ return AddrReg;
167
+ }
168
+
169
+ void OutgoingValueHandler::assignValueToAddress (unsigned ValVReg, unsigned Addr,
170
+ uint64_t Size,
171
+ MachinePointerInfo &MPO) {
172
+ MachineMemOperand *MMO = MIRBuilder.getMF ().getMachineMemOperand (
173
+ MPO, MachineMemOperand::MOStore, Size, /* Alignment */ 0 );
174
+ MIRBuilder.buildStore (ValVReg, Addr, *MMO);
175
+ }
176
+
107
177
bool OutgoingValueHandler::handle (ArrayRef<CCValAssign> ArgLocs,
108
178
ArrayRef<CallLowering::ArgInfo> Args) {
109
179
for (unsigned i = 0 ; i < Args.size (); ++i) {
@@ -205,6 +275,11 @@ bool MipsCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
205
275
MipsCCState CCInfo (F.getCallingConv (), F.isVarArg (), MF, ArgLocs,
206
276
F.getContext ());
207
277
278
+ const MipsTargetMachine &TM =
279
+ static_cast <const MipsTargetMachine &>(MF.getTarget ());
280
+ const MipsABIInfo &ABI = TM.getABI ();
281
+ CCInfo.AllocateStack (ABI.GetCalleeAllocdArgSizeInBytes (F.getCallingConv ()),
282
+ 1 );
208
283
CCInfo.AnalyzeFormalArguments (Ins, TLI.CCAssignFnForCall ());
209
284
210
285
IncomingValueHandler Handler (MIRBuilder, MF.getRegInfo ());
@@ -281,6 +356,7 @@ bool MipsCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
281
356
MipsCCState CCInfo (F.getCallingConv (), F.isVarArg (), MF, ArgLocs,
282
357
F.getContext ());
283
358
359
+ CCInfo.AllocateStack (ABI.GetCalleeAllocdArgSizeInBytes (CallConv), 1 );
284
360
const char *Call = Callee.isSymbol () ? Callee.getSymbolName () : nullptr ;
285
361
CCInfo.AnalyzeCallOperands (Outs, TLI.CCAssignFnForCall (), FuncOrigArgs, Call);
286
362
@@ -289,8 +365,12 @@ bool MipsCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
289
365
return false ;
290
366
}
291
367
292
- // TODO: Calculate stack offset.
293
- CallSeqStart.addImm (ABI.GetCalleeAllocdArgSizeInBytes (CallConv)).addImm (0 );
368
+ unsigned NextStackOffset = CCInfo.getNextStackOffset ();
369
+ const TargetFrameLowering *TFL = MF.getSubtarget ().getFrameLowering ();
370
+ unsigned StackAlignment = TFL->getStackAlignment ();
371
+ NextStackOffset = alignTo (NextStackOffset, StackAlignment);
372
+ CallSeqStart.addImm (NextStackOffset).addImm (0 );
373
+
294
374
MIRBuilder.insertInstr (MIB);
295
375
296
376
if (OrigRet.Reg ) {
@@ -319,9 +399,7 @@ bool MipsCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
319
399
return false ;
320
400
}
321
401
322
- MIRBuilder.buildInstr (Mips::ADJCALLSTACKUP)
323
- .addImm (ABI.GetCalleeAllocdArgSizeInBytes (CallConv))
324
- .addImm (0 );
402
+ MIRBuilder.buildInstr (Mips::ADJCALLSTACKUP).addImm (NextStackOffset).addImm (0 );
325
403
326
404
return true ;
327
405
}
0 commit comments