mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-17 18:24:34 +00:00
Implement double return values in calls. Fixes
SingleSource/Regression/C/casts.c. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115246 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1162,17 +1162,43 @@ bool ARMFastISel::FinishCall(EVT RetVT, SmallVectorImpl<unsigned> &UsedRegs,
|
|||||||
CCInfo.AnalyzeCallResult(RetVT, CCAssignFnForCall(CC, true));
|
CCInfo.AnalyzeCallResult(RetVT, CCAssignFnForCall(CC, true));
|
||||||
|
|
||||||
// Copy all of the result registers out of their specified physreg.
|
// Copy all of the result registers out of their specified physreg.
|
||||||
assert(RVLocs.size() == 1 && "Can't handle multi-value calls!");
|
if (RVLocs.size() == 2 && RetVT.getSimpleVT().SimpleTy == MVT::f64) {
|
||||||
EVT CopyVT = RVLocs[0].getValVT();
|
// For this move we copy into two registers and then move into the
|
||||||
TargetRegisterClass* DstRC = TLI.getRegClassFor(CopyVT);
|
// double fp reg we want.
|
||||||
|
// TODO: Are the copies necessary?
|
||||||
|
TargetRegisterClass *CopyRC = TLI.getRegClassFor(MVT::i32);
|
||||||
|
unsigned Copy1 = createResultReg(CopyRC);
|
||||||
|
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
|
||||||
|
Copy1).addReg(RVLocs[0].getLocReg());
|
||||||
|
UsedRegs.push_back(RVLocs[0].getLocReg());
|
||||||
|
|
||||||
|
unsigned Copy2 = createResultReg(CopyRC);
|
||||||
|
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
|
||||||
|
Copy2).addReg(RVLocs[1].getLocReg());
|
||||||
|
UsedRegs.push_back(RVLocs[1].getLocReg());
|
||||||
|
|
||||||
|
EVT DestVT = RVLocs[0].getValVT();
|
||||||
|
TargetRegisterClass* DstRC = TLI.getRegClassFor(DestVT);
|
||||||
|
unsigned ResultReg = createResultReg(DstRC);
|
||||||
|
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||||
|
TII.get(ARM::VMOVDRR), ResultReg)
|
||||||
|
.addReg(Copy1).addReg(Copy2));
|
||||||
|
|
||||||
|
// Finally update the result.
|
||||||
|
UpdateValueMap(I, ResultReg);
|
||||||
|
} else {
|
||||||
|
assert(RVLocs.size() == 1 && "Can't handle non-double multi-reg retvals!");
|
||||||
|
EVT CopyVT = RVLocs[0].getValVT();
|
||||||
|
TargetRegisterClass* DstRC = TLI.getRegClassFor(CopyVT);
|
||||||
|
|
||||||
unsigned ResultReg = createResultReg(DstRC);
|
unsigned ResultReg = createResultReg(DstRC);
|
||||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
|
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
|
||||||
ResultReg).addReg(RVLocs[0].getLocReg());
|
ResultReg).addReg(RVLocs[0].getLocReg());
|
||||||
UsedRegs.push_back(RVLocs[0].getLocReg());
|
UsedRegs.push_back(RVLocs[0].getLocReg());
|
||||||
|
|
||||||
// Finally update the result.
|
// Finally update the result.
|
||||||
UpdateValueMap(I, ResultReg);
|
UpdateValueMap(I, ResultReg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user