mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-10 14:36:12 +00:00
The only supported calling convention for X86-64 uses
SSE, so we can't return floating point values if this is disabled. Detect this error for clang. With SSE1 only, f64 is a problem; it can be done, but neither llvm-gcc nor clang has ever generated correct code for it. Since nobody noticed this I think it's OK to treat it as an error for now. This also handles SSE-sized vectors of floating point. 8207686, 8204109. llvm-svn: 109201
This commit is contained in:
parent
93fd8bdf6a
commit
1ee436f417
@ -1260,6 +1260,20 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
||||
CCValAssign &VA = RVLocs[i];
|
||||
assert(VA.isRegLoc() && "Can only return in registers!");
|
||||
SDValue ValToCopy = OutVals[i];
|
||||
EVT ValVT = ValToCopy.getValueType();
|
||||
|
||||
// If this is x86-64, and we disabled SSE, we can't return FP values
|
||||
if ((ValVT == MVT::f32 || ValVT == MVT::f64) &&
|
||||
(Subtarget->is64Bit() && !Subtarget->hasSSE1())) {
|
||||
report_fatal_error("SSE register return with SSE disabled");
|
||||
}
|
||||
// Likewise we can't return F64 values with SSE1 only. gcc does so, but
|
||||
// llvm-gcc has never done it right and no one has noticed, so this
|
||||
// should be OK for now.
|
||||
if (ValVT == MVT::f64 &&
|
||||
(Subtarget->is64Bit() && !Subtarget->hasSSE2())) {
|
||||
report_fatal_error("SSE2 register return with SSE2 disabled");
|
||||
}
|
||||
|
||||
// Returns in ST0/ST1 are handled specially: these are pushed as operands to
|
||||
// the RET instruction and handled by the FP Stackifier.
|
||||
@ -1277,7 +1291,6 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
||||
// 64-bit vector (MMX) values are returned in XMM0 / XMM1 except for v1i64
|
||||
// which is returned in RAX / RDX.
|
||||
if (Subtarget->is64Bit()) {
|
||||
EVT ValVT = ValToCopy.getValueType();
|
||||
if (ValVT.isVector() && ValVT.getSizeInBits() == 64) {
|
||||
ValToCopy = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i64, ValToCopy);
|
||||
if (VA.getLocReg() == X86::XMM0 || VA.getLocReg() == X86::XMM1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user