aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-02-09 02:15:30 +0000
committerChris Lattner <sabre@nondot.org>2006-02-09 02:15:30 +0000
commit23c574a841fce0082f61d3f7e0671bf27801bcc7 (patch)
tree059dee1196e21ad506368da3748c2690c0ca81e9
parentef3640aded552279f65bd6d18633e15ffb245157 (diff)
provide an explicit alignment for cp entries
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26069 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86ISelPattern.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp
index 77863e177c..dc3ef6aba7 100644
--- a/lib/Target/X86/X86ISelPattern.cpp
+++ b/lib/Target/X86/X86ISelPattern.cpp
@@ -101,11 +101,14 @@ namespace {
/// Subtarget - Keep a pointer to the X86Subtarget around so that we can
/// make the right decision when generating code for different targets.
const X86Subtarget *Subtarget;
+
+ const TargetData &TD;
/// X86ScalarSSE - Select between SSE2 or x87 floating point ops.
bool X86ScalarSSE;
public:
- ISel(TargetMachine &TM) : SelectionDAGISel(X86Lowering), X86Lowering(TM) {
+ ISel(TargetMachine &TM) : SelectionDAGISel(X86Lowering),
+ X86Lowering(TM), TD(TM.getTargetData()) {
Subtarget = &TM.getSubtarget<X86Subtarget>();
X86ScalarSSE = Subtarget->hasSSE2();
}
@@ -1312,11 +1315,17 @@ unsigned ISel::SelectExpr(SDOperand N) {
Tmp1 = cast<FrameIndexSDNode>(N)->getIndex();
addFrameReference(BuildMI(BB, X86::LEA32r, 4, Result), (int)Tmp1);
return Result;
- case ISD::ConstantPool:
- Tmp1 = BB->getParent()->getConstantPool()->
- getConstantPoolIndex(cast<ConstantPoolSDNode>(N)->get());
+ case ISD::ConstantPool: {
+ Constant *C = cast<ConstantPoolSDNode>(N)->get();
+ unsigned Align = cast<ConstantPoolSDNode>(N)->getAlignment();
+ if (Align == 0) {
+ Align = C->getType() == Type::DoubleTy ? 3 :
+ TD.getTypeAlignmentShift(C->getType());
+ }
+ Tmp1 = BB->getParent()->getConstantPool()->getConstantPoolIndex(C, Align);
addConstantPoolReference(BuildMI(BB, X86::LEA32r, 4, Result), Tmp1);
return Result;
+ }
case ISD::ConstantFP:
if (X86ScalarSSE) {
assert(cast<ConstantFPSDNode>(N)->isExactlyValue(+0.0) &&
@@ -2240,8 +2249,15 @@ unsigned ISel::SelectExpr(SDOperand N) {
}
if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N.getOperand(1))){
+ Constant *C = CP->get();
+ unsigned Align = CP->getAlignment();
+ if (Align == 0) {
+ Align = C->getType() == Type::DoubleTy ? 3 :
+ TD.getTypeAlignmentShift(C->getType());
+ }
+
unsigned CPIdx = BB->getParent()->getConstantPool()->
- getConstantPoolIndex(CP->get());
+ getConstantPoolIndex(C, Align);
Select(N.getOperand(0));
addConstantPoolReference(BuildMI(BB, Opc, 4, Result), CPIdx);
} else {
@@ -2296,7 +2312,7 @@ unsigned ISel::SelectExpr(SDOperand N) {
assert(cast<VTSDNode>(Node->getOperand(3))->getVT() == MVT::f32 &&
"Bad EXTLOAD!");
unsigned CPIdx = BB->getParent()->getConstantPool()->
- getConstantPoolIndex(CP->get());
+ getConstantPoolIndex(CP->get(), 2);
addConstantPoolReference(BuildMI(BB, X86::FpLD32m, 4, Result), CPIdx);
return Result;