From: Evan Cheng Date: Fri, 26 May 2006 19:22:06 +0000 (+0000) Subject: Mac OS X ABI document lied. The first four XMM registers are used to pass X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1d6a9b3b6c30c0c85ebdd1aa6d1c7484d8bca841;p=oota-llvm.git Mac OS X ABI document lied. The first four XMM registers are used to pass vector arguments, not three. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28504 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 61cdf6b541f..9658d081741 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -396,7 +396,7 @@ HowToPassCCCArgument(MVT::ValueType ObjectVT, unsigned NumXMMRegs, case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ObjXMMRegs = 1; else ObjSize = 16; @@ -421,7 +421,9 @@ SDOperand X86TargetLowering::LowerCCCArguments(SDOperand Op, SelectionDAG &DAG) // unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot unsigned NumXMMRegs = 0; // XMM regs used for parameter passing. - unsigned XMMArgRegs[] = { X86::XMM0, X86::XMM1, X86::XMM2 }; + static const unsigned XMMArgRegs[] = { + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 + }; for (unsigned i = 0; i < NumArgs; ++i) { MVT::ValueType ObjectVT = Op.getValue(i).getValueType(); unsigned ArgIncrement = 4; @@ -486,7 +488,7 @@ SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG) { // Keep track of the number of XMM regs passed so far. unsigned NumXMMRegs = 0; static const unsigned XMMArgRegs[] = { - X86::XMM0, X86::XMM1, X86::XMM2 + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 }; // Count how many bytes are to be pushed on the stack. @@ -512,7 +514,7 @@ SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG) { case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ++NumXMMRegs; else NumBytes += 16; @@ -568,7 +570,7 @@ SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG) { case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) { + if (NumXMMRegs < 4) { RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg)); NumXMMRegs++; } else { @@ -817,7 +819,7 @@ HowToPassFastCCArgument(MVT::ValueType ObjectVT, case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ObjXMMRegs = 1; else ObjSize = 16; @@ -849,7 +851,7 @@ X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) { unsigned NumXMMRegs = 0; // XMM regs used for parameter passing. static const unsigned XMMArgRegs[] = { - X86::XMM0, X86::XMM1, X86::XMM2 + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 }; for (unsigned i = 0; i < NumArgs; ++i) { @@ -995,7 +997,7 @@ X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) { { X86::EAX, X86::EDX } }; static const unsigned XMMArgRegs[] = { - X86::XMM0, X86::XMM1, X86::XMM2 + X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 }; for (unsigned i = 0; i != NumOps; ++i) { @@ -1023,7 +1025,7 @@ X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) { case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) NumXMMRegs++; else NumBytes += 16; @@ -1082,7 +1084,7 @@ X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) { case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) { + if (NumXMMRegs < 4) { RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg)); NumXMMRegs++; } else {