diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-02-20 20:43:02 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-02-20 20:43:02 +0000 |
commit | 2a9bad5ac11cfa83f69094effe68824ac5488277 (patch) | |
tree | 00e4cefb85a9fffdc676abeb207109eddbd49b28 /llvm/lib/Target | |
parent | a4af543375104757a9e90757c2955dc49689b83f (diff) | |
download | bcm5719-llvm-2a9bad5ac11cfa83f69094effe68824ac5488277.tar.gz bcm5719-llvm-2a9bad5ac11cfa83f69094effe68824ac5488277.zip |
Support return of MMX values in 64-bit mode.
llvm-svn: 65152
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 85a6c0bb9bd..efcb3f47ff7 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1071,9 +1071,21 @@ LowerCallResult(SDValue Chain, SDValue InFlag, CallSDNode *TheCall, CopyVT = MVT::f80; } - Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), - CopyVT, InFlag).getValue(1); - SDValue Val = Chain.getValue(0); + SDValue Val; + if (Is64Bit && CopyVT.isVector() && CopyVT.getSizeInBits() == 64) { + // For x86-64, MMX values are returned in XMM0 and XMM1. Issue an + // extract_vector_elt to i64 and then bit_convert it to the desired type. + Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), + MVT::v2i64, InFlag).getValue(1); + Val = Chain.getValue(0); + Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, + Val, DAG.getConstant(0, MVT::i64)); + Val = DAG.getNode(ISD::BIT_CONVERT, dl, CopyVT, Val); + } else { + Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), + CopyVT, InFlag).getValue(1); + Val = Chain.getValue(0); + } InFlag = Chain.getValue(2); if (CopyVT != VA.getValVT()) { |