Changes in directory llvm/lib/Target/X86:
X86ISelLowering.cpp updated: 1.221 -> 1.222 --- Log message: Vector argument must be passed in memory location aligned on 16-byte boundary. --- Diffs of the changes: (+18 -2) X86ISelLowering.cpp | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.221 llvm/lib/Target/X86/X86ISelLowering.cpp:1.222 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.221 Fri May 26 14:22:06 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri May 26 15:37:47 2006 @@ -442,6 +442,9 @@ ArgValues.push_back(ArgValue); NumXMMRegs += ObjXMMRegs; } else { + // XMM arguments have to be aligned on 16-byte boundary. + if (ObjSize == 16) + ArgOffset = ((ArgOffset + 15) / 16) * 16; // Create the frame index object for this incoming parameter... int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy()); @@ -516,8 +519,11 @@ case MVT::v2f64: if (NumXMMRegs < 4) ++NumXMMRegs; - else + else { + // XMM arguments have to be aligned on 16-byte boundary. + NumBytes = ((NumBytes + 15) / 16) * 16; NumBytes += 16; + } break; } } @@ -574,6 +580,8 @@ RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg)); NumXMMRegs++; } else { + // XMM arguments have to be aligned on 16-byte boundary. + ArgOffset = ((ArgOffset + 15) / 16) * 16; SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy()); PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff); MemOpChains.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, @@ -911,6 +919,9 @@ } if (ObjSize) { + // XMM arguments have to be aligned on 16-byte boundary. + if (ObjSize == 16) + ArgOffset = ((ArgOffset + 15) / 16) * 16; // Create the SelectionDAG nodes corresponding to a load from this // parameter. int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); @@ -1027,8 +1038,11 @@ case MVT::v2f64: if (NumXMMRegs < 4) NumXMMRegs++; - else + else { + // XMM arguments have to be aligned on 16-byte boundary. + NumBytes = ((NumBytes + 15) / 16) * 16; NumBytes += 16; + } break; } } @@ -1088,6 +1102,8 @@ RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg)); NumXMMRegs++; } else { + // XMM arguments have to be aligned on 16-byte boundary. + ArgOffset = ((ArgOffset + 15) / 16) * 16; SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy()); PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff); MemOpChains.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits