Allow FP arguments pass / return

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76015 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2009-07-16 14:19:16 +00:00
parent 2c97ae8826
commit 0e31d5cf80
2 changed files with 39 additions and 21 deletions

View File

@ -17,7 +17,11 @@ def RetCC_SystemZ : CallingConv<[
CCIfType<[i8, i16, i32], CCPromoteToType<i64>>, CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
// i64 is returned in register R2 // i64 is returned in register R2
CCIfType<[i64], CCAssignToReg<[R2D]>> CCIfType<[i64], CCAssignToReg<[R2D]>>,
// f32 / f64 are returned in F0
CCIfType<[f32], CCAssignToReg<[F0S]>>,
CCIfType<[f64], CCAssignToReg<[F0L]>>
]>; ]>;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -31,6 +35,11 @@ def CC_SystemZ : CallingConv<[
// integer registers. // integer registers.
CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D, R6D]>>, CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D, R6D]>>,
// The first 4 ifloating point arguments of non-varargs functions are passed
// in FP registers.
CCIfType<[f32], CCAssignToReg<[F0S, F2S, F4S, F6S]>>,
CCIfType<[f64], CCAssignToReg<[F0L, F2L, F4L, F6L]>>,
// Integer values get stored in stack slots that are 8 bytes in // Integer values get stored in stack slots that are 8 bytes in
// size and 8-byte aligned. // size and 8-byte aligned.
CCIfType<[i64], CCAssignToStack<8, 8>> CCIfType<[i64], CCAssignToStack<8, 8>>

View File

@ -173,6 +173,7 @@ SDValue SystemZTargetLowering::LowerCCCArguments(SDValue Op,
if (VA.isRegLoc()) { if (VA.isRegLoc()) {
// Arguments passed in registers // Arguments passed in registers
MVT RegVT = VA.getLocVT(); MVT RegVT = VA.getLocVT();
TargetRegisterClass *RC;
switch (RegVT.getSimpleVT()) { switch (RegVT.getSimpleVT()) {
default: default:
cerr << "LowerFORMAL_ARGUMENTS Unhandled argument type: " cerr << "LowerFORMAL_ARGUMENTS Unhandled argument type: "
@ -180,8 +181,17 @@ SDValue SystemZTargetLowering::LowerCCCArguments(SDValue Op,
<< "\n"; << "\n";
abort(); abort();
case MVT::i64: case MVT::i64:
unsigned VReg = RC = SystemZ::GR64RegisterClass;
RegInfo.createVirtualRegister(SystemZ::GR64RegisterClass); break;
case MVT::f32:
RC = SystemZ::FP32RegisterClass;
break;
case MVT::f64:
RC = SystemZ::FP64RegisterClass;
break;
}
unsigned VReg = RegInfo.createVirtualRegister(RC);
RegInfo.addLiveIn(VA.getLocReg(), VReg); RegInfo.addLiveIn(VA.getLocReg(), VReg);
SDValue ArgValue = DAG.getCopyFromReg(Root, dl, VReg, RegVT); SDValue ArgValue = DAG.getCopyFromReg(Root, dl, VReg, RegVT);
@ -199,7 +209,6 @@ SDValue SystemZTargetLowering::LowerCCCArguments(SDValue Op,
ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue); ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
ArgValues.push_back(ArgValue); ArgValues.push_back(ArgValue);
}
} else { } else {
// Sanity check // Sanity check
assert(VA.isMemLoc()); assert(VA.isMemLoc());