Changes in directory llvm/lib/Target/X86:
X86ISelLowering.cpp updated: 1.220 -> 1.221 --- Log message: Mac OS X ABI document lied. The first four XMM registers are used to pass vector arguments, not three. --- Diffs of the changes: (+12 -10) X86ISelLowering.cpp | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.220 llvm/lib/Target/X86/X86ISelLowering.cpp:1.221 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.220 Fri May 26 13:39:59 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri May 26 14:22:06 2006 @@ -396,7 +396,7 @@ case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ObjXMMRegs = 1; else ObjSize = 16; @@ -421,7 +421,9 @@ // 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 @@ // 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 @@ case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ++NumXMMRegs; else NumBytes += 16; @@ -568,7 +570,7 @@ 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 @@ case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) ObjXMMRegs = 1; else ObjSize = 16; @@ -849,7 +851,7 @@ 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 @@ { 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 @@ case MVT::v2i64: case MVT::v4f32: case MVT::v2f64: - if (NumXMMRegs < 3) + if (NumXMMRegs < 4) NumXMMRegs++; else NumBytes += 16; @@ -1082,7 +1084,7 @@ 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 { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits