summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-04-18 20:55:41 +0000
committerDan Gohman <gohman@apple.com>2008-04-18 20:55:41 +0000
commitad4071a9e1e4af548a1d4dd4f7aaeea1a697b18d (patch)
tree7e3d27cf691b4fd45bc81b06be92ee543247c3cb /llvm/lib/Target
parent00bd8d904a13df6948f93d77f039b1b51c9f6743 (diff)
downloadbcm5719-llvm-ad4071a9e1e4af548a1d4dd4f7aaeea1a697b18d.tar.gz
bcm5719-llvm-ad4071a9e1e4af548a1d4dd4f7aaeea1a697b18d.zip
Fix the handling of va_copy on x86-64. As of llvm-gcc r49920
llvm-gcc is now lowering va_copy on x86-64, so this completes the fix for PR2230. llvm-svn: 49922
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp18
1 files changed, 4 insertions, 14 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index e01f140ef31..0e27c00e4af 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -4954,26 +4954,16 @@ SDOperand X86TargetLowering::LowerVASTART(SDOperand Op, SelectionDAG &DAG) {
SDOperand X86TargetLowering::LowerVACOPY(SDOperand Op, SelectionDAG &DAG) {
// X86-64 va_list is a struct { i32, i32, i8*, i8* }.
+ assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!");
SDOperand Chain = Op.getOperand(0);
SDOperand DstPtr = Op.getOperand(1);
SDOperand SrcPtr = Op.getOperand(2);
const Value *DstSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue();
const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
- SrcPtr = DAG.getLoad(getPointerTy(), Chain, SrcPtr, SrcSV, 0);
- Chain = SrcPtr.getValue(1);
- for (unsigned i = 0; i < 3; ++i) {
- SDOperand Val = DAG.getLoad(MVT::i64, Chain, SrcPtr, SrcSV, 0);
- Chain = Val.getValue(1);
- Chain = DAG.getStore(Chain, Val, DstPtr, DstSV, 0);
- if (i == 2)
- break;
- SrcPtr = DAG.getNode(ISD::ADD, getPointerTy(), SrcPtr,
- DAG.getIntPtrConstant(8));
- DstPtr = DAG.getNode(ISD::ADD, getPointerTy(), DstPtr,
- DAG.getIntPtrConstant(8));
- }
- return Chain;
+ return DAG.getMemcpy(Chain, DstPtr, SrcPtr,
+ DAG.getIntPtrConstant(24), 8, false,
+ DstSV, 0, SrcSV, 0);
}
SDOperand
OpenPOWER on IntegriCloud