summaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-02-20 20:43:02 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-02-20 20:43:02 +0000
commit79fb3b434f83bcb7c382dbcfea485884a39b9544 (patch)
tree7166ad77f5af08c582f8b0b398afc328d65b0022 /lib/Target
parent9a65cfe7dd7662558b45bcba46b11ee52c4bbf6c (diff)
downloadexternal_llvm-79fb3b434f83bcb7c382dbcfea485884a39b9544.zip
external_llvm-79fb3b434f83bcb7c382dbcfea485884a39b9544.tar.gz
external_llvm-79fb3b434f83bcb7c382dbcfea485884a39b9544.tar.bz2
Support return of MMX values in 64-bit mode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65152 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 85a6c0b..efcb3f4 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/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()) {