[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.344 -> 1.345
---
Log message:

Scalarized vector stores need not be legal, e.g. if the vector element type
needs to be promoted or expanded.  Relegalize the scalar store once created.
This fixes CodeGen/Generic/vector.ll:test1 on non-SSE x86 targets.


---
Diffs of the changes:  (+3 -0)

 LegalizeDAG.cpp |3 +++
 1 files changed, 3 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.344 
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.345
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.344 Thu Mar 30 20:06:55 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp   Fri Mar 31 11:37:22 2006
@@ -1477,6 +1477,9 @@
   Tmp3 = PackVectorOp(Node->getOperand(1), EVT);
   Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, 
   Node->getOperand(3));
+  // The scalarized value type may not be legal, e.g. it might require
+  // promotion or expansion.  Relegalize the scalar store.
+  Result = LegalizeOp(Result);
   break;
 } else {
   SplitVectorOp(Node->getOperand(1), Lo, Hi);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.345 -> 1.346
---
Log message:

Implement PromoteOp for VEXTRACT_VECTOR_ELT.  Thsi fixes 
Generic/vector.ll:test_extract_elt on non-sse X86 systems.



---
Diffs of the changes:  (+54 -42)

 LegalizeDAG.cpp |   96 +++-
 1 files changed, 54 insertions(+), 42 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.345 
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.346
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.345 Fri Mar 31 11:37:22 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp   Fri Mar 31 11:55:51 2006
@@ -184,6 +184,8 @@
   void ExpandShiftParts(unsigned NodeOp, SDOperand Op, SDOperand Amt,
 SDOperand &Lo, SDOperand &Hi);
 
+  SDOperand LowerVEXTRACT_VECTOR_ELT(SDOperand Op);
+  
   SDOperand getIntPtrConstant(uint64_t Val) {
 return DAG.getConstant(Val, TLI.getPointerTy());
   }
@@ -910,49 +912,9 @@
 }
 break;
 
-  case ISD::VEXTRACT_VECTOR_ELT: {
-// We know that operand #0 is the Vec vector.  If the index is a constant
-// or if the invec is a supported hardware type, we can use it.  Otherwise,
-// lower to a store then an indexed load.
-Tmp1 = Node->getOperand(0);
-Tmp2 = LegalizeOp(Node->getOperand(1));
-
-SDNode *InVal = Tmp1.Val;
-unsigned NumElems = cast(*(InVal->op_end()-2))->getValue();
-MVT::ValueType EVT = cast(*(InVal->op_end()-1))->getVT();
-
-// Figure out if there is a Packed type corresponding to this Vector
-// type.  If so, convert to the packed type.
-MVT::ValueType TVT = MVT::getVectorType(EVT, NumElems);
-if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) {
-  // Turn this into a packed extract_vector_elt operation.
-  Tmp1 = PackVectorOp(Tmp1, TVT);
-  Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, Node->getValueType(0),
-   Tmp1, Tmp2);
-  break;
-} else if (NumElems == 1) {
-  // This must be an access of the only element.
-  Result = PackVectorOp(Tmp1, EVT);
-  break;
-} else if (ConstantSDNode *CIdx = dyn_cast(Tmp2)) {
-  SDOperand Lo, Hi;
-  SplitVectorOp(Tmp1, Lo, Hi);
-  if (CIdx->getValue() < NumElems/2) {
-Tmp1 = Lo;
-  } else {
-Tmp1 = Hi;
-Tmp2 = DAG.getConstant(CIdx->getValue() - NumElems/2,
-   Tmp2.getValueType());
-  }
-
-  // It's now an extract from the appropriate high or low part.
-  Result = LegalizeOp(DAG.UpdateNodeOperands(Result, Tmp1, Tmp2));
-} else {
-  // FIXME: IMPLEMENT STORE/LOAD lowering.  Need alignment of stack slot!!
-  assert(0 && "unimp!");
-}
+  case ISD::VEXTRACT_VECTOR_ELT: 
+Result = LegalizeOp(LowerVEXTRACT_VECTOR_ELT(Op));
 break;
-  }
 
   case ISD::CALLSEQ_START: {
 SDNode *CallEnd = FindCallEndFromCallStart(Node);
@@ -2999,6 +2961,9 @@
   break;
 }
 break;
+  case ISD::VEXTRACT_VECTOR_ELT:
+Result = PromoteOp(LowerVEXTRACT_VECTOR_ELT(Op));
+break;
   }
 
   assert(Result.Val && "Didn't set a result!");
@@ -3011,6 +2976,53 @@
   return Result;
 }
 
+/// LowerVEXTRACT_VECTOR_ELT - Lower a VEXTRACT_VECTOR_ELT operation into a
+/// EXTRACT_VECTOR_ELT operation, to memory operations, or to scalar code based
+/// on the vector type.  The return type of this matches the element type of 
the
+/// vector, which may not be legal for the target.
+SDOperand SelectionDAGLegalize::LowerVEXTRACT_VECTOR_ELT(SDOperand Op) {
+  // We know that operand #0 is the Vec vector.  If the index is a constant
+  // or if the invec is a supported hardware type, we can use it.  Otherwise,
+  // lower to a store then an indexed load.
+  SDOperand Vec = Op.getOperand(0);
+  SDOperand Idx = LegalizeOp(Op.getOperand(1));
+  
+  SDNode *InVal = Vec.Val;
+  unsigned NumElems = cast(*(InVal->op_end()-2))->getValue();
+  MVT::ValueType EVT = cast(*(InVal->op_end()-1))->getVT();
+  
+  // Figure out if there is a Packed type corresponding to this Vector
+  // type.  If so, convert to the packed type.
+  MVT::ValueType TVT = MVT::getVectorType(EVT, NumElems);
+  if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) {
+// Turn this into a packed extract_vector_elt operation.
+Vec = PackVectorOp(Vec, TVT);
+return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, Op.getValueType(), Vec, Idx);
+  } else if (NumElems == 1) {
+// This must be an access of the only element.  Return it.
+return PackVectorOp(Vec, EVT);
+  } else if (ConstantSDNode *CIdx = dyn_cast(Idx)) {
+SDOperand Lo, Hi;
+SplitVectorOp(Vec, Lo, Hi);
+if (CIdx->getValue() < NumElems/2) {
+  Vec = Lo;
+} else {
+  Vec = Hi;
+  Idx = DAG.getConstant(CIdx->getValue() - NumElems/2, Idx.getValueType());
+}
+
+// It's now an extract from the appropriate high or low part.  Recurse.
+O

[llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/vector.ll

2006-03-31 Thread Chris Lattner


Changes in directory llvm/test/Regression/CodeGen/Generic:

vector.ll updated: 1.7 -> 1.8
---
Log message:

Make this test harder, always check generic x86 and SSE-enabled x86.


---
Diffs of the changes:  (+10 -1)

 vector.ll |   11 ++-
 1 files changed, 10 insertions(+), 1 deletion(-)


Index: llvm/test/Regression/CodeGen/Generic/vector.ll
diff -u llvm/test/Regression/CodeGen/Generic/vector.ll:1.7 
llvm/test/Regression/CodeGen/Generic/vector.ll:1.8
--- llvm/test/Regression/CodeGen/Generic/vector.ll:1.7  Thu Mar 23 15:15:57 2006
+++ llvm/test/Regression/CodeGen/Generic/vector.ll  Fri Mar 31 11:59:16 2006
@@ -1,13 +1,16 @@
 ; Test that vectors are scalarized/lowered correctly.
 ; RUN: llvm-as < %s | llc && 
 ; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g5 &&
-; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g3
+; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g3 &&
+; RUN: llvm-as < %s | llc -march=x86 -mcpu=i386 &&
+; RUN: llvm-as < %s | llc -march=x86 -mcpu=yonah
 
 %f1 = type <1 x float>
 %f2 = type <2 x float>
 %f4 = type <4 x float>
 %i4 = type <4 x int>
 %f8 = type <8 x float>
+%d8 = type <8 x double>
 
 implementation
 
@@ -99,6 +102,12 @@
   ret float %R
 }
 
+double %test_extract_elt2(%d8 *%P) {
+  %p = load %d8* %P
+  %R = extractelement %d8 %p, uint 3
+  ret double %R
+}
+
 void %test_cast_1(<4 x float>* %b, <4 x int>* %a) {
   %tmp = load <4 x float>* %b
   %tmp2 = add <4 x float> %tmp, 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.133 -> 1.134
---
Log message:

Delete dead loads in the dag.  This allows us to compile 
vector.ll:test_extract_elt2 into:

_test_extract_elt2:
lfd f1, 32(r3)
blr

instead of:

_test_extract_elt2:
lfd f0, 56(r3)
lfd f0, 48(r3)
lfd f0, 40(r3)
lfd f1, 32(r3)
lfd f0, 24(r3)
lfd f0, 16(r3)
lfd f0, 8(r3)
lfd f0, 0(r3)
blr



---
Diffs of the changes:  (+5 -0)

 DAGCombiner.cpp |5 +
 1 files changed, 5 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.133 
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.134
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.133 Tue Mar 28 16:19:47 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp   Fri Mar 31 12:06:18 2006
@@ -2261,6 +2261,11 @@
   SDOperand Chain= N->getOperand(0);
   SDOperand Ptr  = N->getOperand(1);
   SDOperand SrcValue = N->getOperand(2);
+
+  // If there are no uses of the loaded value, change uses of the chain value
+  // into uses of the chain input (i.e. delete the dead load).
+  if (N->hasNUsesOfValue(0, 0))
+return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain);
   
   // If this load is directly stored, replace the load value with the stored
   // value.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.134 -> 1.135
---
Log message:

Remove dead *extloads.  This allows us to codegen vector.ll:test_extract_elt
to:

test_extract_elt:
alloc r3 = ar.pfs,0,1,0,0
adds r8 = 12, r32
;;
ldfs f8 = [r8]
mov ar.pfs = r3
br.ret.sptk.many rp

instead of:

test_extract_elt:
alloc r3 = ar.pfs,0,1,0,0
adds r8 = 28, r32
adds r9 = 24, r32
adds r10 = 20, r32
adds r11 = 16, r32
;;
ldfs f6 = [r8]
;;
ldfs f6 = [r9]
adds r8 = 12, r32
adds r9 = 8, r32
adds r14 = 4, r32
;;
ldfs f6 = [r10]
;;
ldfs f6 = [r11]
ldfs f8 = [r8]
;;
ldfs f6 = [r9]
;;
ldfs f6 = [r14]
;;
ldfs f6 = [r32]
mov ar.pfs = r3
br.ret.sptk.many rp



---
Diffs of the changes:  (+19 -0)

 DAGCombiner.cpp |   19 +++
 1 files changed, 19 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.134 
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.135
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.134 Fri Mar 31 12:06:18 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp   Fri Mar 31 12:10:41 2006
@@ -208,6 +208,7 @@
 SDOperand visitBRCOND(SDNode *N);
 SDOperand visitBR_CC(SDNode *N);
 SDOperand visitLOAD(SDNode *N);
+SDOperand visitXEXTLOAD(SDNode *N);
 SDOperand visitSTORE(SDNode *N);
 SDOperand visitINSERT_VECTOR_ELT(SDNode *N);
 SDOperand visitVINSERT_VECTOR_ELT(SDNode *N);
@@ -643,6 +644,9 @@
   case ISD::BRCOND: return visitBRCOND(N);
   case ISD::BR_CC:  return visitBR_CC(N);
   case ISD::LOAD:   return visitLOAD(N);
+  case ISD::EXTLOAD:
+  case ISD::SEXTLOAD:
+  case ISD::ZEXTLOAD:   return visitXEXTLOAD(N);
   case ISD::STORE:  return visitSTORE(N);
   case ISD::INSERT_VECTOR_ELT:  return visitINSERT_VECTOR_ELT(N);
   case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N);
@@ -2278,6 +2282,21 @@
   return SDOperand();
 }
 
+/// visitXEXTLOAD - Handle EXTLOAD/ZEXTLOAD/SEXTLOAD.
+SDOperand DAGCombiner::visitXEXTLOAD(SDNode *N) {
+  SDOperand Chain= N->getOperand(0);
+  SDOperand Ptr  = N->getOperand(1);
+  SDOperand SrcValue = N->getOperand(2);
+  SDOperand EVT  = N->getOperand(3);
+  
+  // If there are no uses of the loaded value, change uses of the chain value
+  // into uses of the chain input (i.e. delete the dead load).
+  if (N->hasNUsesOfValue(0, 0))
+return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain);
+  
+  return SDOperand();
+}
+
 SDOperand DAGCombiner::visitSTORE(SDNode *N) {
   SDOperand Chain= N->getOperand(0);
   SDOperand Value= N->getOperand(1);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.346 -> 1.347
---
Log message:

Do not endian swap the operands to a store if the operands came from a vector.

This fixes UnitTests/Vector/simple.c with altivec.


---
Diffs of the changes:  (+3 -3)

 LegalizeDAG.cpp |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.346 
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.347
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.346 Fri Mar 31 11:55:51 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp   Fri Mar 31 12:20:46 2006
@@ -1450,10 +1450,10 @@
   } else {
 ExpandOp(Node->getOperand(1), Lo, Hi);
 IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8;
-  }
 
-  if (!TLI.isLittleEndian())
-std::swap(Lo, Hi);
+if (!TLI.isLittleEndian())
+  std::swap(Lo, Hi);
+  }
 
   Lo = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Lo, Tmp2,
Node->getOperand(3));



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.347 -> 1.348
---
Log message:

Do not endian swap split vector loads.  This fixes 
UnitTests/Vector/sumarray-dbl on PPC.

Now all UnitTests/Vector/* tests pass on PPC.


---
Diffs of the changes:  (+0 -2)

 LegalizeDAG.cpp |2 --
 1 files changed, 2 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.347 
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.348
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.347 Fri Mar 31 12:20:46 2006
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp   Fri Mar 31 12:22:37 2006
@@ -4453,8 +4453,6 @@
 
 // Remember that we legalized the chain.
 AddLegalizedOperand(Op.getValue(1), LegalizeOp(TF));
-if (!TLI.isLittleEndian())
-  std::swap(Lo, Hi);
 break;
   }
   case ISD::VBIT_CONVERT: {



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.454 -> 1.455
---
Log message:

extractelement(undef,x) -> undef


---
Diffs of the changes:  (+8 -6)

 InstructionCombining.cpp |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.454 
llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.455
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.454   Thu Mar 30 
16:02:40 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Fri Mar 31 12:25:14 2006
@@ -6655,12 +6655,14 @@
 }
 
 Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
-  if (ConstantAggregateZero *C = 
-  dyn_cast(EI.getOperand(0))) {
-// If packed val is constant 0, replace extract with scalar 0
-const Type *Ty = cast(C->getType())->getElementType();
-return ReplaceInstUsesWith(EI, Constant::getNullValue(Ty));
-  }
+  // If packed val is undef, replace extract with scalar undef.
+  if (isa(EI.getOperand(0)))
+return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType()));
+
+  // If packed val is constant 0, replace extract with scalar 0.
+  if (isa(EI.getOperand(0)))
+return ReplaceInstUsesWith(EI, Constant::getNullValue(EI.getType()));
+  
   if (ConstantPacked *C = dyn_cast(EI.getOperand(0))) {
 // If packed val is constant with uniform operands, replace EI
 // with that operand



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/VMCore/ConstantFolding.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/VMCore:

ConstantFolding.cpp updated: 1.83 -> 1.84
---
Log message:

constant fold extractelement with undef operands.


---
Diffs of the changes:  (+7 -1)

 ConstantFolding.cpp |8 +++-
 1 files changed, 7 insertions(+), 1 deletion(-)


Index: llvm/lib/VMCore/ConstantFolding.cpp
diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.83 
llvm/lib/VMCore/ConstantFolding.cpp:1.84
--- llvm/lib/VMCore/ConstantFolding.cpp:1.83Tue Jan 17 14:07:22 2006
+++ llvm/lib/VMCore/ConstantFolding.cpp Fri Mar 31 12:31:40 2006
@@ -726,11 +726,17 @@
 
 Constant *llvm::ConstantFoldExtractElementInstruction(const Constant *Val,
   const Constant *Idx) {
+  if (isa(Val))  // ee(undef, x) -> undef
+return UndefValue::get(cast(Val->getType())->getElementType());
+  
   if (const ConstantPacked *CVal = dyn_cast(Val)) {
 if (const ConstantUInt *CIdx = dyn_cast(Idx)) {
   return const_cast(CVal->getOperand(CIdx->getValue()));
+} else if (isa(Idx)) {
+  // ee({w,x,y,z}, undef) -> w (an arbitrary value).
+  return const_cast(CVal->getOperand(0));
 }
-  } 
+  }
   return 0;
 }
 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/README_ALTIVEC.txt

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

README_ALTIVEC.txt updated: 1.8 -> 1.9
---
Log message:

add a note


---
Diffs of the changes:  (+2 -0)

 README_ALTIVEC.txt |2 ++
 1 files changed, 2 insertions(+)


Index: llvm/lib/Target/PowerPC/README_ALTIVEC.txt
diff -u llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.8 
llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.9
--- llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.8  Fri Mar 31 00:02:07 2006
+++ llvm/lib/Target/PowerPC/README_ALTIVEC.txt  Fri Mar 31 13:00:22 2006
@@ -135,3 +135,5 @@
 
 
//===--===//
 
+Handle VECTOR_SHUFFLE nodes with the appropriate shuffle mask with vsldoi,
+vpkuhum and vpkuwum.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target:

TargetSelectionDAG.td updated: 1.62 -> 1.63
---
Log message:

Add vector_extract and vector_insert nodes.


---
Diffs of the changes:  (+4 -0)

 TargetSelectionDAG.td |4 
 1 files changed, 4 insertions(+)


Index: llvm/lib/Target/TargetSelectionDAG.td
diff -u llvm/lib/Target/TargetSelectionDAG.td:1.62 
llvm/lib/Target/TargetSelectionDAG.td:1.63
--- llvm/lib/Target/TargetSelectionDAG.td:1.62  Mon Mar 27 18:40:33 2006
+++ llvm/lib/Target/TargetSelectionDAG.td   Fri Mar 31 13:21:16 2006
@@ -310,6 +310,10 @@
 def build_vector : SDNode<"ISD::BUILD_VECTOR", SDTypeProfile<1, 0, []>, []>;
 def scalar_to_vector : SDNode<"ISD::SCALAR_TO_VECTOR", SDTypeProfile<1, 1, []>,
   []>;
+def vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT",
+SDTypeProfile<1, 2, []>, []>;
+def vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT",
+SDTypeProfile<1, 3, []>, []>;
 
 // Nodes for intrinsics, you should use the intrinsic itself and let tblgen use
 // these internally.  Don't reference these directly.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86ISelLowering.h X86InstrSSE.td

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.149 -> 1.150
X86ISelLowering.h updated: 1.48 -> 1.49
X86InstrSSE.td updated: 1.50 -> 1.51
---
Log message:

Add support to use pextrw and pinsrw to extract and insert a word element
from a 128-bit vector.


---
Diffs of the changes:  (+69 -4)

 X86ISelLowering.cpp |   38 --
 X86ISelLowering.h   |4 
 X86InstrSSE.td  |   31 +--
 3 files changed, 69 insertions(+), 4 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.149 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.150
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.149   Thu Mar 30 19:30:39 2006
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri Mar 31 13:22:53 2006
@@ -255,9 +255,9 @@
 setOperationAction(ISD::SUB , (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::MUL , (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::LOAD, (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Expand);
+setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::EXTRACT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::INSERT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
+setOperationAction(ISD::INSERT_VECTOR_ELT,  (MVT::ValueType)VT, Expand);
   }
 
   if (Subtarget->hasMMX()) {
@@ -316,6 +316,8 @@
 setOperationAction(ISD::VECTOR_SHUFFLE,   MVT::v8i16, Custom);
 setOperationAction(ISD::VECTOR_SHUFFLE,   MVT::v4i32, Custom);
 setOperationAction(ISD::VECTOR_SHUFFLE,   MVT::v2i64, Custom);
+setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v8i16, Custom);
+setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
   }
 
   computeRegisterProperties();
@@ -2657,6 +2659,37 @@
 
 return SDOperand();
   }
+  case ISD::EXTRACT_VECTOR_ELT: {
+// Transform it so it match pextrw which produces a 32-bit result.
+MVT::ValueType VT = Op.getValueType();
+if (MVT::getSizeInBits(VT) == 16) {
+  MVT::ValueType EVT = (MVT::ValueType)(VT+1);
+  SDOperand Extract = DAG.getNode(X86ISD::PEXTRW, EVT,
+  Op.getOperand(0), Op.getOperand(1));
+  SDOperand Assert  = DAG.getNode(ISD::AssertZext, EVT, Extract,
+  DAG.getValueType(VT));
+  return DAG.getNode(ISD::TRUNCATE, VT, Assert);
+}
+
+return SDOperand();
+  }
+  case ISD::INSERT_VECTOR_ELT: {
+// Transform it so it match pinsrw which expects a 16-bit value in a R32
+// as its second argument.
+MVT::ValueType VT = Op.getValueType();
+MVT::ValueType BaseVT = MVT::getVectorBaseType(VT);
+if (MVT::getSizeInBits(BaseVT) == 16) {
+  SDOperand N1 = Op.getOperand(1);
+  SDOperand N2 = Op.getOperand(2);
+  if (N1.getValueType() != MVT::i32)
+N1 = DAG.getNode(ISD::ANY_EXTEND, MVT::i32, N1);
+  if (N2.getValueType() != MVT::i32)
+N2 = DAG.getConstant(cast(N2)->getValue(), MVT::i32);
+  return DAG.getNode(ISD::INSERT_VECTOR_ELT, VT, Op.getOperand(0), N1, N2);
+}
+
+return SDOperand();
+  }
   }
 }
 
@@ -2692,6 +2725,7 @@
   case X86ISD::Wrapper:return "X86ISD::Wrapper";
   case X86ISD::S2VEC:  return "X86ISD::S2VEC";
   case X86ISD::ZEXT_S2VEC: return "X86ISD::ZEXT_S2VEC";
+  case X86ISD::PEXTRW: return "X86ISD::PEXTRW";
   }
 }
 


Index: llvm/lib/Target/X86/X86ISelLowering.h
diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.48 
llvm/lib/Target/X86/X86ISelLowering.h:1.49
--- llvm/lib/Target/X86/X86ISelLowering.h:1.48  Wed Mar 29 17:07:14 2006
+++ llvm/lib/Target/X86/X86ISelLowering.h   Fri Mar 31 13:22:53 2006
@@ -153,6 +153,10 @@
   /// ZEXT_S2VEC - SCALAR_TO_VECTOR with zero extension. The destination 
base
   /// does not have to match the operand type.
   ZEXT_S2VEC,
+
+  /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to
+  /// i32, corresponds to X86::PINSRW.
+  PEXTRW,
 };
 
 // X86 specific condition code. These correspond to X86_*_COND in


Index: llvm/lib/Target/X86/X86InstrSSE.td
diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.50 
llvm/lib/Target/X86/X86InstrSSE.td:1.51
--- llvm/lib/Target/X86/X86InstrSSE.td:1.50 Thu Mar 30 13:54:57 2006
+++ llvm/lib/Target/X86/X86InstrSSE.td  Fri Mar 31 13:22:53 2006
@@ -28,8 +28,8 @@
 def X86zexts2vec : SDNode<"X86ISD::ZEXT_S2VEC",
   SDTypeProfile<1, 1, []>, []>;
 
-def SDTUnpckl : SDTypeProfile<1, 2,
-  [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>]>;
+def X86pextrw  : SDNode<"X86ISD::PEXTRW",
+SDTypeProfile<1, 2, []>, []>;
 
 
//===--===//
 // SSE pattern fragments
@@ -1409,6 +1409,33 @@
 UNPCKH_shuffle_mask)))]>

[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCISelLowering.cpp updated: 1.122 -> 1.123
---
Log message:

Add, sub and shuffle are legal for all vector types


---
Diffs of the changes:  (+9 -8)

 PPCISelLowering.cpp |   17 +
 1 files changed, 9 insertions(+), 8 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.122 
llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.123
--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.122   Fri Mar 31 00:04:53 2006
+++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Fri Mar 31 13:48:58 2006
@@ -171,12 +171,16 @@
   
   // First set operation action for all vector types to expand. Then we
   // will selectively turn on ones that can be effectively codegen'd.
-  for (unsigned VT = (unsigned)MVT::Vector + 1;
-   VT != (unsigned)MVT::LAST_VALUETYPE; VT++) {
-setOperationAction(ISD::ADD , (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::SUB , (MVT::ValueType)VT, Expand);
+  for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
+   VT != (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
+// Add and sub are legal for all supported VT's.
+setOperationAction(ISD::ADD , (MVT::ValueType)VT, Legal);
+setOperationAction(ISD::SUB , (MVT::ValueType)VT, Legal);
+setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Legal);
+
 setOperationAction(ISD::MUL , (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Expand);
+setOperationAction(ISD::DIV , (MVT::ValueType)VT, Expand);
+setOperationAction(ISD::REM , (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::EXTRACT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::INSERT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
 setOperationAction(ISD::BUILD_VECTOR, (MVT::ValueType)VT, Expand);
@@ -188,10 +192,7 @@
 addRegisterClass(MVT::v8i16, PPC::VRRCRegisterClass);
 addRegisterClass(MVT::v16i8, PPC::VRRCRegisterClass);
 
-setOperationAction(ISD::ADD, MVT::v4f32, Legal);
-setOperationAction(ISD::SUB, MVT::v4f32, Legal);
 setOperationAction(ISD::MUL, MVT::v4f32, Legal);
-setOperationAction(ISD::ADD, MVT::v4i32, Legal);
 
 setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v4i32, Custom);
 setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v4f32, Custom);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCISelLowering.cpp updated: 1.123 -> 1.124
---
Log message:

Rearrange code a bit 


---
Diffs of the changes:  (+25 -21)

 PPCISelLowering.cpp |   46 +-
 1 files changed, 25 insertions(+), 21 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.123 
llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.124
--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.123   Fri Mar 31 13:48:58 2006
+++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Fri Mar 31 13:52:36 2006
@@ -168,34 +168,38 @@
 setOperationAction(ISD::SRL, MVT::i64, Custom);
 setOperationAction(ISD::SRA, MVT::i64, Custom);
   }
-  
-  // First set operation action for all vector types to expand. Then we
-  // will selectively turn on ones that can be effectively codegen'd.
-  for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
-   VT != (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
-// Add and sub are legal for all supported VT's.
-setOperationAction(ISD::ADD , (MVT::ValueType)VT, Legal);
-setOperationAction(ISD::SUB , (MVT::ValueType)VT, Legal);
-setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Legal);
-
-setOperationAction(ISD::MUL , (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::DIV , (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::REM , (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::EXTRACT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::INSERT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
-setOperationAction(ISD::BUILD_VECTOR, (MVT::ValueType)VT, Expand);
-  }
 
   if (TM.getSubtarget().hasAltivec()) {
+// First set operation action for all vector types to expand. Then we
+// will selectively turn on ones that can be effectively codegen'd.
+for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
+ VT != (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
+  // add/sub/and/or/xor are legal for all supported vector VT's.
+  setOperationAction(ISD::ADD , (MVT::ValueType)VT, Legal);
+  setOperationAction(ISD::SUB , (MVT::ValueType)VT, Legal);
+  setOperationAction(ISD::AND , (MVT::ValueType)VT, Legal);
+  setOperationAction(ISD::OR  , (MVT::ValueType)VT, Legal);
+  setOperationAction(ISD::XOR , (MVT::ValueType)VT, Legal);
+  
+  // We can custom expand all VECTOR_SHUFFLEs to VPERM.
+  setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::ValueType)VT, Custom);
+  
+  setOperationAction(ISD::MUL , (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::SDIV, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::SREM, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::UDIV, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::UREM, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::EXTRACT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::INSERT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
+  setOperationAction(ISD::BUILD_VECTOR, (MVT::ValueType)VT, Expand);
+}
+
 addRegisterClass(MVT::v4f32, PPC::VRRCRegisterClass);
 addRegisterClass(MVT::v4i32, PPC::VRRCRegisterClass);
 addRegisterClass(MVT::v8i16, PPC::VRRCRegisterClass);
 addRegisterClass(MVT::v16i8, PPC::VRRCRegisterClass);
 
-setOperationAction(ISD::MUL, MVT::v4f32, Legal);
-
-setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v4i32, Custom);
-setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v4f32, Custom);
+setOperationAction(ISD::MUL, MVT::v4f32, Legal);
 
 setOperationAction(ISD::SCALAR_TO_VECTOR, MVT::v4f32, Custom);
 setOperationAction(ISD::SCALAR_TO_VECTOR, MVT::v4i32, Custom);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrAltivec.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrAltivec.td updated: 1.24 -> 1.25
---
Log message:

Add vperm support for all datatypes


---
Diffs of the changes:  (+13 -19)

 PPCInstrAltivec.td |   32 +---
 1 files changed, 13 insertions(+), 19 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.24 
llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.25
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.24 Thu Mar 30 23:38:32 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td  Fri Mar 31 14:00:35 2006
@@ -141,27 +141,18 @@
[(set VRRC:$vD, (fneg (fsub (fmul VRRC:$vA, VRRC:$vC),
VRRC:$vB)))]>,
Requires<[FPContractions]>;
-def VMHADDSHS  : VAForm_1a<32, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC),
-  "vmhaddshs $vD, $vA, $vB, $vC", VecFP,
-  [(set VRRC:$vD,
-   (int_ppc_altivec_vmhaddshs VRRC:$vA, VRRC:$vB, VRRC:$vC))]>;
-def VMHRADDSHS : VAForm_1a<33, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC),
-  "vmhraddshs $vD, $vA, $vB, $vC", VecFP,
-  [(set VRRC:$vD,
-   (int_ppc_altivec_vmhraddshs VRRC:$vA, VRRC:$vB, 
VRRC:$vC))]>;
-def VPERM   : VAForm_1a<43, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC),
-"vperm $vD, $vA, $vB, $vC", VecPerm,
-[(set VRRC:$vD,
- (PPCvperm (v4f32 VRRC:$vA), VRRC:$vB, 
VRRC:$vC))]>;
+def VMHADDSHS  : VA1a_Int<32, "vmhaddshs $vD, $vA, $vB, $vC",
+  int_ppc_altivec_vmhaddshs>;
+def VMHRADDSHS : VA1a_Int<33, "vmhraddshs $vD, $vA, $vB, $vC", 
+  int_ppc_altivec_vmhraddshs>;
+def VPERM   : VA1a_Int<43, "vperm $vD, $vA, $vB, $vC", int_ppc_altivec_vperm>;
+def VPERM   : VA1a_Int<42, "vsel $vD, $vA, $vB, $vC",  int_ppc_altivec_vsel>;
+
 def VSLDOI  : VAForm_2<44, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, u5imm:$SH),
"vsldoi $vD, $vA, $vB, $SH", VecFP,
[(set VRRC:$vD,
  (int_ppc_altivec_vsldoi VRRC:$vA, VRRC:$vB,
  imm:$SH))]>;
-def VSEL   : VAForm_1a<42, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, VRRC:$vC),
-   "vsel $vD, $vA, $vB, $vC", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vsel VRRC:$vA, VRRC:$vB, 
VRRC:$vC))]>;
 
 // VX-Form instructions.  AltiVec arithmetic ops.
 def VADDCUW : VXForm_1<384, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
@@ -537,11 +528,14 @@
   (VMADDFP VRRC:$A, VRRC:$B, VRRC:$C)>;
 def : Pat<(int_ppc_altivec_vnmsubfp VRRC:$A, VRRC:$B, VRRC:$C),
   (VNMSUBFP VRRC:$A, VRRC:$B, VRRC:$C)>;
-def : Pat<(int_ppc_altivec_vperm VRRC:$A, VRRC:$B, VRRC:$C),
-  (VPERM VRRC:$A, VRRC:$B, VRRC:$C)>;
 def : Pat<(vector_shuffle (v4i32 VRRC:$vB), (undef), VSPLT_shuffle_mask:$UIMM),
   (v4i32 (VSPLTW VSPLT_shuffle_mask:$UIMM, VRRC:$vB))>;
 
 def : Pat<(PPCvperm (v4i32 VRRC:$vA), VRRC:$vB, VRRC:$vC),
   (v4i32 (VPERM VRRC:$vA, VRRC:$vB, VRRC:$vC))>;
-
+def : Pat<(PPCvperm (v4f32 VRRC:$vA), VRRC:$vB, VRRC:$vC),
+  (v4f32 (VPERM VRRC:$vA, VRRC:$vB, VRRC:$vC))>;
+def : Pat<(PPCvperm (v8i16 VRRC:$vA), VRRC:$vB, VRRC:$vC),
+  (v8i16 (VPERM VRRC:$vA, VRRC:$vB, VRRC:$vC))>;
+def : Pat<(PPCvperm (v16i8 VRRC:$vA), VRRC:$vB, VRRC:$vC),
+  (v16i8 (VPERM VRRC:$vA, VRRC:$vB, VRRC:$vC))>;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/IntrinsicsX86.td

2006-03-31 Thread Evan Cheng


Changes in directory llvm/include/llvm:

IntrinsicsX86.td updated: 1.7 -> 1.8
---
Log message:

Added haddp{s|d} and hsubp{s|d} intrinsics.


---
Diffs of the changes:  (+19 -0)

 IntrinsicsX86.td |   19 +++
 1 files changed, 19 insertions(+)


Index: llvm/include/llvm/IntrinsicsX86.td
diff -u llvm/include/llvm/IntrinsicsX86.td:1.7 
llvm/include/llvm/IntrinsicsX86.td:1.8
--- llvm/include/llvm/IntrinsicsX86.td:1.7  Thu Mar 30 00:21:22 2006
+++ llvm/include/llvm/IntrinsicsX86.td  Fri Mar 31 15:28:46 2006
@@ -199,3 +199,22 @@
   def int_x86_sse2_pmovmskb_128 : GCCBuiltin<"__builtin_ia32_pmovmskb128">,
   Intrinsic<[llvm_int_ty, llvm_v16i8_ty], [InstrNoMem]>;
 }
+
+//===--===//
+// SSE3
+
+// Horizontal ops.
+let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
+  def int_x86_sse3_hadd_ps : GCCBuiltin<"__builtin_ia32_haddps">,
+  Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
+ llvm_v4f32_ty], [InstrNoMem]>;
+  def int_x86_sse3_hadd_pd : GCCBuiltin<"__builtin_ia32_haddpd">,
+  Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
+ llvm_v2f64_ty], [InstrNoMem]>;
+  def int_x86_sse3_hsub_ps : GCCBuiltin<"__builtin_ia32_hsubps">,
+  Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
+ llvm_v4f32_ty], [InstrNoMem]>;
+  def int_x86_sse3_hsub_pd : GCCBuiltin<"__builtin_ia32_hsubpd">,
+  Intrinsic<[llvm_v2f64_ty, llvm_v2f64_ty,
+ llvm_v2f64_ty], [InstrNoMem]>;
+}



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrAltivec.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrAltivec.td updated: 1.25 -> 1.26
---
Log message:

fix a pasto


---
Diffs of the changes:  (+1 -1)

 PPCInstrAltivec.td |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.25 
llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.26
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.25 Fri Mar 31 14:00:35 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td  Fri Mar 31 15:19:06 2006
@@ -146,7 +146,7 @@
 def VMHRADDSHS : VA1a_Int<33, "vmhraddshs $vD, $vA, $vB, $vC", 
   int_ppc_altivec_vmhraddshs>;
 def VPERM   : VA1a_Int<43, "vperm $vD, $vA, $vB, $vC", int_ppc_altivec_vperm>;
-def VPERM   : VA1a_Int<42, "vsel $vD, $vA, $vB, $vC",  int_ppc_altivec_vsel>;
+def VSEL: VA1a_Int<42, "vsel $vD, $vA, $vB, $vC",  int_ppc_altivec_vsel>;
 
 def VSLDOI  : VAForm_2<44, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, u5imm:$SH),
"vsldoi $vD, $vA, $vB, $SH", VecFP,



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86InstrSSE.td

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target/X86:

X86InstrSSE.td updated: 1.51 -> 1.52
---
Log message:

Added support for SSE3 horizontal ops: haddp{s|d} and hsub{s|d}.


---
Diffs of the changes:  (+43 -0)

 X86InstrSSE.td |   43 +++
 1 files changed, 43 insertions(+)


Index: llvm/lib/Target/X86/X86InstrSSE.td
diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.51 
llvm/lib/Target/X86/X86InstrSSE.td:1.52
--- llvm/lib/Target/X86/X86InstrSSE.td:1.51 Fri Mar 31 13:22:53 2006
+++ llvm/lib/Target/X86/X86InstrSSE.td  Fri Mar 31 15:29:33 2006
@@ -145,6 +145,8 @@
 // PDI - SSE2 instructions with TB and OpSize prefixes.
 // PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
 // PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
+// S3SI - SSE3 instructions with XD prefix.
+// S3DI - SSE3 instructions with TB and OpSize prefixes.
 class SSI o, Format F, dag ops, string asm, list pattern>
   : I, XS, Requires<[HasSSE1]>;
 class SDI o, Format F, dag ops, string asm, list pattern>
@@ -161,6 +163,27 @@
   : X86Inst, TB, OpSize, Requires<[HasSSE2]> {
   let Pattern = pattern;
 }
+class S3SI o, Format F, dag ops, string asm, list pattern>
+  : I, XD, Requires<[HasSSE3]>;
+class S3DI o, Format F, dag ops, string asm, list pattern>
+  : I, TB, OpSize, Requires<[HasSSE3]>;
+
+//===--===//
+// Helpers for defining instructions that directly correspond to intrinsics.
+class S3S_Intrr o, string asm, Intrinsic IntId>
+  : S3SI;
+class S3S_Intrm o, string asm, Intrinsic IntId>
+  : S3SI;
+class S3D_Intrr o, string asm, Intrinsic IntId>
+  : S3DI;
+class S3D_Intrm o, string asm, Intrinsic IntId>
+  : S3DI;
 
 // Some 'special' instructions
 def IMPLICIT_DEF_FR32 : I<0, Pseudo, (ops FR32:$dst),
@@ -1073,6 +1096,26 @@
   UNPCKL_shuffle_mask)))]>;
 }
 
+// Horizontal ops
+let isTwoAddress = 1 in {
+def HADDPSrr : S3S_Intrr<0x7C, "haddps {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hadd_ps>;
+def HADDPSrm : S3S_Intrm<0x7C, "haddps {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hadd_ps>;
+def HADDPDrr : S3D_Intrr<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hadd_pd>;
+def HADDPDrm : S3D_Intrm<0x7C, "haddpd {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hadd_pd>;
+def HSUBPSrr : S3S_Intrr<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hsub_ps>;
+def HSUBPSrm : S3S_Intrm<0x7C, "hsubps {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hsub_ps>;
+def HSUBPDrr : S3D_Intrr<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hsub_pd>;
+def HSUBPDrm : S3D_Intrm<0x7C, "hsubpd {$src2, $dst|$dst, $src2}",
+  int_x86_sse3_hsub_pd>;
+}
+
 
//===--===//
 // SSE integer instructions
 
//===--===//



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l FileParser.y Record.cpp Record.h

2006-03-31 Thread Chris Lattner


Changes in directory llvm/utils/TableGen:

FileLexer.l updated: 1.28 -> 1.29
FileParser.y updated: 1.41 -> 1.42
Record.cpp updated: 1.52 -> 1.53
Record.h updated: 1.56 -> 1.57
---
Log message:

Generalize the previous binary operator support and add a string concatenation
operation.  This implements Regression/TableGen/strconcat.td.


---
Diffs of the changes:  (+109 -38)

 FileLexer.l  |1 
 FileParser.y |   22 ---
 Record.cpp   |   84 ---
 Record.h |   40 +++-
 4 files changed, 109 insertions(+), 38 deletions(-)


Index: llvm/utils/TableGen/FileLexer.l
diff -u llvm/utils/TableGen/FileLexer.l:1.28 
llvm/utils/TableGen/FileLexer.l:1.29
--- llvm/utils/TableGen/FileLexer.l:1.28Fri Mar  3 13:34:28 2006
+++ llvm/utils/TableGen/FileLexer.l Fri Mar 31 15:53:49 2006
@@ -202,6 +202,7 @@
 !sra   { return SRATOK; }
 !srl   { return SRLTOK; }
 !shl   { return SHLTOK; }
+!strconcat { return STRCONCATTOK; }
 
 
 {Identifier}   { Filelval.StrVal = new std::string(yytext, yytext+yyleng);


Index: llvm/utils/TableGen/FileParser.y
diff -u llvm/utils/TableGen/FileParser.y:1.41 
llvm/utils/TableGen/FileParser.y:1.42
--- llvm/utils/TableGen/FileParser.y:1.41   Thu Mar 30 16:50:40 2006
+++ llvm/utils/TableGen/FileParser.yFri Mar 31 15:53:49 2006
@@ -200,7 +200,7 @@
 };
 
 %token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
-%token SHLTOK SRATOK SRLTOK
+%token SHLTOK SRATOK SRLTOK STRCONCATTOK
 %token   INTVAL
 %token   ID VARNAME STRVAL CODEFRAGMENT
 
@@ -352,23 +352,13 @@
 }
 delete $3;
   } | SHLTOK '(' Value ',' Value ')' {
-$$ = $3->getBinaryOp(Init::SHL, $5);
-if ($$ == 0) {
-  err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-  exit(1);
-}
+$$ = (new BinOpInit(BinOpInit::SHL, $3, $5))->Fold();
   } | SRATOK '(' Value ',' Value ')' {
-$$ = $3->getBinaryOp(Init::SRA, $5);
-if ($$ == 0) {
-  err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-  exit(1);
-}
+$$ = (new BinOpInit(BinOpInit::SRA, $3, $5))->Fold();
   } | SRLTOK '(' Value ',' Value ')' {
-$$ = $3->getBinaryOp(Init::SRL, $5);
-if ($$ == 0) {
-  err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-  exit(1);
-}
+$$ = (new BinOpInit(BinOpInit::SRL, $3, $5))->Fold();
+  } | STRCONCATTOK '(' Value ',' Value ')' {
+$$ = (new BinOpInit(BinOpInit::STRCONCAT, $3, $5))->Fold();
   };
 
 OptVarName : /* empty */ {


Index: llvm/utils/TableGen/Record.cpp
diff -u llvm/utils/TableGen/Record.cpp:1.52 llvm/utils/TableGen/Record.cpp:1.53
--- llvm/utils/TableGen/Record.cpp:1.52 Thu Mar 30 16:50:40 2006
+++ llvm/utils/TableGen/Record.cpp  Fri Mar 31 15:53:49 2006
@@ -7,6 +7,7 @@
 //
 
//===--===//
 //
+// Implement the tablegen record classes.
 //
 
//===--===//
 
@@ -125,6 +126,19 @@
   return 0;
 }
 
+Init *StringRecTy::convertValue(BinOpInit *BO) {
+  if (BO->getOpcode() == BinOpInit::STRCONCAT) {
+Init *L = BO->getLHS()->convertInitializerTo(this);
+Init *R = BO->getRHS()->convertInitializerTo(this);
+if (L == 0 || R == 0) return 0;
+if (L != BO->getLHS() || R != BO->getRHS())
+  return new BinOpInit(BinOpInit::STRCONCAT, L, R);
+return BO;
+  }
+  return 0;
+}
+
+
 Init *StringRecTy::convertValue(TypedInit *TI) {
   if (dynamic_cast(TI->getType()))
 return TI;  // Accept variable if already of the right type!
@@ -299,21 +313,6 @@
   return this;
 }
 
-Init *IntInit::getBinaryOp(BinaryOp Op, Init *RHS) {
-  IntInit *RHSi = dynamic_cast(RHS);
-  if (RHSi == 0) return 0;
-
-  int NewValue;
-  switch (Op) {
-  default: assert(0 && "Unknown binop");
-  case SHL: NewValue = Value << RHSi->getValue(); break;
-  case SRA: NewValue = Value >> RHSi->getValue(); break;
-  case SRL: NewValue = (unsigned)Value >> (unsigned)RHSi->getValue(); break;
-  }
-  return new IntInit(NewValue);
-}
-
-
 Init *IntInit::convertInitializerBitRange(const std::vector &Bits) {
   BitsInit *BI = new BitsInit(Bits.size());
 
@@ -368,6 +367,61 @@
   OS << "]";
 }
 
+Init *BinOpInit::Fold() {
+  switch (getOpcode()) {
+  default: assert(0 && "Unknown binop");
+  case STRCONCAT: {
+StringInit *LHSs = dynamic_cast(LHS);
+StringInit *RHSs = dynamic_cast(RHS);
+if (LHSs && RHSs)
+  return new StringInit(LHSs->getValue() + RHSs->getValue());
+break;
+  }
+  case SHL:
+  case SRA:
+  case SRL: {
+IntInit *LHSi = dynamic_cast(LHS);
+IntInit *RHSi = dynamic_cast(RHS);
+if (LHSi && RHSi) {
+  int LHSv = LHSi->getValue(), RHSv = RHSi->getValue();
+  int Result;
+  switch (getOpcode()) {
+  default: assert(0 && "Bad opcode!");
+  case SHL: Result = LHSv << RHSv; break;
+  case SRA: Result = L

[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86ISelLowering.h X86InstrSSE.td

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.150 -> 1.151
X86ISelLowering.h updated: 1.49 -> 1.50
X86InstrSSE.td updated: 1.52 -> 1.53
---
Log message:

Use a X86 target specific node X86ISD::PINSRW instead of a mal-formed 
INSERT_VECTOR_ELT to insert a 16-bit value in a 128-bit vector.


---
Diffs of the changes:  (+12 -6)

 X86ISelLowering.cpp |3 ++-
 X86ISelLowering.h   |6 +-
 X86InstrSSE.td  |9 +
 3 files changed, 12 insertions(+), 6 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.150 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.151
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.150   Fri Mar 31 13:22:53 2006
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri Mar 31 15:55:24 2006
@@ -2685,7 +2685,7 @@
 N1 = DAG.getNode(ISD::ANY_EXTEND, MVT::i32, N1);
   if (N2.getValueType() != MVT::i32)
 N2 = DAG.getConstant(cast(N2)->getValue(), MVT::i32);
-  return DAG.getNode(ISD::INSERT_VECTOR_ELT, VT, Op.getOperand(0), N1, N2);
+  return DAG.getNode(X86ISD::PINSRW, VT, Op.getOperand(0), N1, N2);
 }
 
 return SDOperand();
@@ -2726,6 +2726,7 @@
   case X86ISD::S2VEC:  return "X86ISD::S2VEC";
   case X86ISD::ZEXT_S2VEC: return "X86ISD::ZEXT_S2VEC";
   case X86ISD::PEXTRW: return "X86ISD::PEXTRW";
+  case X86ISD::PINSRW: return "X86ISD::PINSRW";
   }
 }
 


Index: llvm/lib/Target/X86/X86ISelLowering.h
diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.49 
llvm/lib/Target/X86/X86ISelLowering.h:1.50
--- llvm/lib/Target/X86/X86ISelLowering.h:1.49  Fri Mar 31 13:22:53 2006
+++ llvm/lib/Target/X86/X86ISelLowering.h   Fri Mar 31 15:55:24 2006
@@ -155,8 +155,12 @@
   ZEXT_S2VEC,
 
   /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to
-  /// i32, corresponds to X86::PINSRW.
+  /// i32, corresponds to X86::PEXTRW.
   PEXTRW,
+
+  /// PINSRW - Insert the lower 16-bits of a 32-bit value to a vector,
+  /// corresponds to X86::PINSRW.
+  PINSRW,
 };
 
 // X86 specific condition code. These correspond to X86_*_COND in


Index: llvm/lib/Target/X86/X86InstrSSE.td
diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.52 
llvm/lib/Target/X86/X86InstrSSE.td:1.53
--- llvm/lib/Target/X86/X86InstrSSE.td:1.52 Fri Mar 31 15:29:33 2006
+++ llvm/lib/Target/X86/X86InstrSSE.td  Fri Mar 31 15:55:24 2006
@@ -27,9 +27,10 @@
 SDTypeProfile<1, 1, []>, []>;
 def X86zexts2vec : SDNode<"X86ISD::ZEXT_S2VEC",
   SDTypeProfile<1, 1, []>, []>;
-
 def X86pextrw  : SDNode<"X86ISD::PEXTRW",
 SDTypeProfile<1, 2, []>, []>;
+def X86pinsrw  : SDNode<"X86ISD::PINSRW",
+SDTypeProfile<1, 3, []>, []>;
 
 
//===--===//
 // SSE pattern fragments
@@ -1468,13 +1469,13 @@
 def PINSRWrr : PDIi8<0xC4, MRMSrcReg,
  (ops VR128:$dst, VR128:$src1, R32:$src2, i32i8imm:$src3),
  "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
- [(set VR128:$dst, (v8i16 (vector_insert (v8i16 
VR128:$src1),
-   R32:$src2, (i32 imm:$src3]>;
+ [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1),
+   R32:$src2, (i32 imm:$src3]>;
 def PINSRWrm : PDIi8<0xC4, MRMSrcMem,
  (ops VR128:$dst, VR128:$src1, i16mem:$src2, 
i32i8imm:$src3),
  "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
  [(set VR128:$dst,
-   (v8i16 (vector_insert (v8i16 VR128:$src1),
+   (v8i16 (X86pinsrw (v8i16 VR128:$src1),
(i32 (anyext (loadi16 addr:$src2))),
(i32 imm:$src3]>;
 }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/test/Regression/TableGen/strconcat.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/test/Regression/TableGen:

strconcat.td added (r1.1)
---
Log message:

new testcase


---
Diffs of the changes:  (+7 -0)

 strconcat.td |7 +++
 1 files changed, 7 insertions(+)


Index: llvm/test/Regression/TableGen/strconcat.td
diff -c /dev/null llvm/test/Regression/TableGen/strconcat.td:1.1
*** /dev/null   Fri Mar 31 15:53:11 2006
--- llvm/test/Regression/TableGen/strconcat.td  Fri Mar 31 15:53:01 2006
***
*** 0 
--- 1,7 
+ // RUN: tblgen %s | grep fufoo
+ 
+ class Y {
+   string T = !strconcat(S, "foo");
+ }
+ 
+ def Z : Y<"fu">;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrAltivec.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrAltivec.td updated: 1.26 -> 1.27
---
Log message:

Fix 80 column violations :)


---
Diffs of the changes:  (+13 -14)

 PPCInstrAltivec.td |   27 +--
 1 files changed, 13 insertions(+), 14 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.26 
llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.27
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.26 Fri Mar 31 15:19:06 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td  Fri Mar 31 15:57:36 2006
@@ -64,8 +64,9 @@
 // Helpers for defining instructions that directly correspond to intrinsics.
 
 // VA1a_Int - A VAForm_1a intrinsic definition.
-class VA1a_Int xo, string asmstr, Intrinsic IntID>
-  : VAForm_1a xo, string opc, Intrinsic IntID>
+  : VAForm_1a;
 
 // VX1_Int - A VXForm_1 intrinsic definition.
@@ -141,12 +142,10 @@
[(set VRRC:$vD, (fneg (fsub (fmul VRRC:$vA, VRRC:$vC),
VRRC:$vB)))]>,
Requires<[FPContractions]>;
-def VMHADDSHS  : VA1a_Int<32, "vmhaddshs $vD, $vA, $vB, $vC",
-  int_ppc_altivec_vmhaddshs>;
-def VMHRADDSHS : VA1a_Int<33, "vmhraddshs $vD, $vA, $vB, $vC", 
-  int_ppc_altivec_vmhraddshs>;
-def VPERM   : VA1a_Int<43, "vperm $vD, $vA, $vB, $vC", int_ppc_altivec_vperm>;
-def VSEL: VA1a_Int<42, "vsel $vD, $vA, $vB, $vC",  int_ppc_altivec_vsel>;
+def VMHADDSHS  : VA1a_Int<32, "vmhaddshs",  int_ppc_altivec_vmhaddshs>;
+def VMHRADDSHS : VA1a_Int<33, "vmhraddshs", int_ppc_altivec_vmhraddshs>;
+def VPERM  : VA1a_Int<43, "vperm",  int_ppc_altivec_vperm>;
+def VSEL   : VA1a_Int<42, "vsel",   int_ppc_altivec_vsel>;
 
 def VSLDOI  : VAForm_2<44, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB, u5imm:$SH),
"vsldoi $vD, $vA, $vB, $SH", VecFP,
@@ -237,12 +236,12 @@
 def VMRGLH : VX1_Int<332, "vmrglh $vD, $vA, $vB", int_ppc_altivec_vmrglh>;
 def VMRGLW : VX1_Int<396, "vmrglw $vD, $vA, $vB", int_ppc_altivec_vmrglw>;
 
-def VMSUMMBM : VA1a_Int<37, "vmsummbm $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsummbm>;
-def VMSUMSHM : VA1a_Int<40, "vmsumshm $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsumshm>;
-def VMSUMSHS : VA1a_Int<41, "vmsumshs $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsumshs>;
-def VMSUMUBM : VA1a_Int<36, "vmsumubm $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsumubm>;
-def VMSUMUHM : VA1a_Int<38, "vmsumuhm $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsumuhm>;
-def VMSUMUHS : VA1a_Int<39, "vmsumuhs $vD, $vA, $vB, $vC", 
int_ppc_altivec_vmsumuhs>;
+def VMSUMMBM : VA1a_Int<37, "vmsummbm", int_ppc_altivec_vmsummbm>;
+def VMSUMSHM : VA1a_Int<40, "vmsumshm", int_ppc_altivec_vmsumshm>;
+def VMSUMSHS : VA1a_Int<41, "vmsumshs", int_ppc_altivec_vmsumshs>;
+def VMSUMUBM : VA1a_Int<36, "vmsumubm", int_ppc_altivec_vmsumubm>;
+def VMSUMUHM : VA1a_Int<38, "vmsumuhm", int_ppc_altivec_vmsumuhm>;
+def VMSUMUHS : VA1a_Int<39, "vmsumuhs", int_ppc_altivec_vmsumuhs>;
 
 def VMULESB : VX1_Int<776, "vmulesb $vD, $vA, $vB", int_ppc_altivec_vmulesb>;
 def VMULESH : VX1_Int<840, "vmulesh $vD, $vA, $vB", int_ppc_altivec_vmulesh>;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.135 -> 1.136
---
Log message:

Delete identity shuffles, implementing 
CodeGen/Generic/vector-identity-shuffle.ll


---
Diffs of the changes:  (+56 -2)

 DAGCombiner.cpp |   58 ++--
 1 files changed, 56 insertions(+), 2 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.135 
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.136
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.135 Fri Mar 31 12:10:41 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp   Fri Mar 31 16:16:43 2006
@@ -214,6 +214,7 @@
 SDOperand visitVINSERT_VECTOR_ELT(SDNode *N);
 SDOperand visitVBUILD_VECTOR(SDNode *N);
 SDOperand visitVECTOR_SHUFFLE(SDNode *N);
+SDOperand visitVVECTOR_SHUFFLE(SDNode *N);
 
 SDOperand ReassociateOps(unsigned Opc, SDOperand LHS, SDOperand RHS);
 
@@ -652,6 +653,7 @@
   case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N);
   case ISD::VBUILD_VECTOR:  return visitVBUILD_VECTOR(N);
   case ISD::VECTOR_SHUFFLE: return visitVECTOR_SHUFFLE(N);
+  case ISD::VVECTOR_SHUFFLE:return visitVVECTOR_SHUFFLE(N);
   }
   return SDOperand();
 }
@@ -2464,13 +2466,36 @@
 }
 
 SDOperand DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) {
+  SDOperand ShufMask = N->getOperand(2);
+  unsigned NumElts = ShufMask.getNumOperands();
+
+  // If the shuffle mask is an identity operation on the LHS, return the LHS.
+  bool isIdentity = true;
+  for (unsigned i = 0; i != NumElts; ++i) {
+if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF &&
+cast(ShufMask.getOperand(i))->getValue() != i) {
+  isIdentity = false;
+  break;
+}
+  }
+  if (isIdentity) return N->getOperand(0);
+
+  // If the shuffle mask is an identity operation on the RHS, return the RHS.
+  isIdentity = true;
+  for (unsigned i = 0; i != NumElts; ++i) {
+if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF &&
+cast(ShufMask.getOperand(i))->getValue() != i+NumElts) 
{
+  isIdentity = false;
+  break;
+}
+  }
+  if (isIdentity) return N->getOperand(1);
+  
   // If the LHS and the RHS are the same node, turn the RHS into an undef.
   if (N->getOperand(0) == N->getOperand(1)) {
 // Check the SHUFFLE mask, mapping any inputs from the 2nd operand into the
 // first operand.
 std::vector MappedOps;
-SDOperand ShufMask = N->getOperand(2);
-unsigned NumElts = ShufMask.getNumOperands();
 for (unsigned i = 0, e = ShufMask.getNumOperands(); i != e; ++i) {
   if (cast(ShufMask.getOperand(i))->getValue() >= NumElts) 
{
 unsigned NewIdx = 
@@ -2491,6 +2516,35 @@
   return SDOperand();
 }
 
+SDOperand DAGCombiner::visitVVECTOR_SHUFFLE(SDNode *N) {
+  SDOperand ShufMask = N->getOperand(2);
+  unsigned NumElts = ShufMask.getNumOperands()-2;
+  
+  // If the shuffle mask is an identity operation on the LHS, return the LHS.
+  bool isIdentity = true;
+  for (unsigned i = 0; i != NumElts; ++i) {
+if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF &&
+cast(ShufMask.getOperand(i))->getValue() != i) {
+  isIdentity = false;
+  break;
+}
+  }
+  if (isIdentity) return N->getOperand(0);
+  
+  // If the shuffle mask is an identity operation on the RHS, return the RHS.
+  isIdentity = true;
+  for (unsigned i = 0; i != NumElts; ++i) {
+if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF &&
+cast(ShufMask.getOperand(i))->getValue() != i+NumElts) 
{
+  isIdentity = false;
+  break;
+}
+  }
+  if (isIdentity) return N->getOperand(1);
+
+  return SDOperand();
+}
+
 SDOperand DAGCombiner::SimplifySelect(SDOperand N0, SDOperand N1, SDOperand 
N2){
   assert(N0.getOpcode() ==ISD::SETCC && "First argument must be a SetCC 
node!");
   



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/vector-identity-shuffle.ll

2006-03-31 Thread Chris Lattner


Changes in directory llvm/test/Regression/CodeGen/Generic:

vector-identity-shuffle.ll added (r1.1)
---
Log message:

An identity shuffle shouldn't generate any permute code.


---
Diffs of the changes:  (+16 -0)

 vector-identity-shuffle.ll |   16 
 1 files changed, 16 insertions(+)


Index: llvm/test/Regression/CodeGen/Generic/vector-identity-shuffle.ll
diff -c /dev/null 
llvm/test/Regression/CodeGen/Generic/vector-identity-shuffle.ll:1.1
*** /dev/null   Fri Mar 31 16:16:29 2006
--- llvm/test/Regression/CodeGen/Generic/vector-identity-shuffle.ll Fri Mar 
31 16:16:19 2006
***
*** 0 
--- 1,16 
+ ; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g5 | grep _test &&
+ ; RUN: llvm-as < %s | llc -march=ppc32 -mcpu=g5 | not grep vperm
+ 
+ void %test(<4 x float> *%tmp2.i) {
+   %tmp2.i = load <4x float>* %tmp2.i
+%xFloat0.48 = extractelement <4 x float> %tmp2.i, uint 0   
 ;  [#uses=1]
+ %inFloat0.49 = insertelement <4 x float> undef, float %xFloat0.48, 
uint 0   ; <<4 x float>> [#uses=1]
+ %xFloat1.50 = extractelement <4 x float> %tmp2.i, uint 1  
  ;  [#uses=1]
+ %inFloat1.52 = insertelement <4 x float> %inFloat0.49, float 
%xFloat1.50, uint 1; <<4 x float>> [#uses=1]
+ %xFloat2.53 = extractelement <4 x float> %tmp2.i, uint 2  
  ;  [#uses=1]
+ %inFloat2.55 = insertelement <4 x float> %inFloat1.52, float 
%xFloat2.53, uint 2; <<4 x float>> [#uses=1]
+ %xFloat3.56 = extractelement <4 x float> %tmp2.i, uint 3  
  ;  [#uses=1]
+ %inFloat3.58 = insertelement <4 x float> %inFloat2.55, float 
%xFloat3.56, uint 3; <<4 x float>> [#uses=4]
+   store <4 x float> %inFloat3.58, <4x float>* %tmp2.i
+   ret void
+ }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp

2006-03-31 Thread Andrew Lenharth


Changes in directory llvm-poolalloc/lib/PoolAllocate:

TransformFunctionBody.cpp updated: 1.50 -> 1.51
---
Log message:

fall back on the complete call graph to get indirect targets if needed

---
Diffs of the changes:  (+9 -0)

 TransformFunctionBody.cpp |9 +
 1 files changed, 9 insertions(+)


Index: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp
diff -u llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.50 
llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.51
--- llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.50  Wed Jan 
25 16:07:36 2006
+++ llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp   Fri Mar 31 
16:27:40 2006
@@ -509,6 +509,15 @@
   ECGraphs.getSomeCalleeForCallSite(cast(OrigInst)) :
   ECGraphs.getSomeCalleeForCallSite(cast(OrigInst));
 
+if (!CF) 
+  for (EquivClassGraphs::callee_iterator I = 
ECGraphs.callee_begin(OrigInst), 
+E = ECGraphs.callee_end(OrigInst); I != E; ++I)
+   if (I->second) {
+ CF = I->second;
+ break;
+   }
+
+
 if (!CF) {
   // FIXME: Unknown callees for a call-site. Warn and ignore.
   std::cerr << "\n***\n*** WARNING (FuncTransform::visitCallSite): "



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/TargetData.cpp

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target:

TargetData.cpp updated: 1.58 -> 1.59
---
Log message:

TargetData.cpp::getTypeInfo() was returning alignment of element type as the
alignment of a packed type. This is obviously wrong. Added a workaround that
returns the size of the packed type as its alignment. The correct fix would
be to return a target dependent alignment value provided via TargetLowering
(or some other interface).


---
Diffs of the changes:  (+3 -0)

 TargetData.cpp |3 +++
 1 files changed, 3 insertions(+)


Index: llvm/lib/Target/TargetData.cpp
diff -u llvm/lib/Target/TargetData.cpp:1.58 llvm/lib/Target/TargetData.cpp:1.59
--- llvm/lib/Target/TargetData.cpp:1.58 Fri Jan 13 18:07:34 2006
+++ llvm/lib/Target/TargetData.cpp  Fri Mar 31 16:33:42 2006
@@ -215,6 +215,9 @@
 getTypeInfo(PTy->getElementType(), TD, Size, Alignment);
 unsigned AlignedSize = (Size + Alignment - 1)/Alignment*Alignment;
 Size = AlignedSize*PTy->getNumElements();
+// FIXME: The alignments of specific packed types are target dependent.
+// For now, just set it to be equal to Size.
+Alignment = Size;
 return;
   }
   case Type::StructTyID: {



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrAltivec.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrAltivec.td updated: 1.27 -> 1.28
---
Log message:

Pull operand asm string into base class, shrinkifying intrinsic definitions.

No functionality change.


---
Diffs of the changes:  (+58 -77)

 PPCInstrAltivec.td |  135 ++---
 1 files changed, 58 insertions(+), 77 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.27 
llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.28
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.27 Fri Mar 31 15:57:36 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td  Fri Mar 31 16:34:05 2006
@@ -70,13 +70,15 @@
[(set VRRC:$vD, (IntID VRRC:$vA, VRRC:$vB, VRRC:$vC))]>;
 
 // VX1_Int - A VXForm_1 intrinsic definition.
-class VX1_Int xo, string asmstr, Intrinsic IntID>
-  : VXForm_1 xo, string opc, Intrinsic IntID>
+  : VXForm_1;
 
 // VX2_Int - A VXForm_2 intrinsic definition.
-class VX2_Int xo, string asmstr, Intrinsic IntID>
-  : VXForm_2 xo, string opc, Intrinsic IntID>
+  : VXForm_2;
 
 
//===--===//
@@ -231,10 +233,10 @@
   "vminfp $vD, $vA, $vB", VecFP,
   []>;
 
-def VMRGHH : VX1_Int<76 , "vmrghh $vD, $vA, $vB", int_ppc_altivec_vmrghh>;
-def VMRGHW : VX1_Int<140, "vmrghw $vD, $vA, $vB", int_ppc_altivec_vmrghw>;
-def VMRGLH : VX1_Int<332, "vmrglh $vD, $vA, $vB", int_ppc_altivec_vmrglh>;
-def VMRGLW : VX1_Int<396, "vmrglw $vD, $vA, $vB", int_ppc_altivec_vmrglw>;
+def VMRGHH : VX1_Int<76 , "vmrghh", int_ppc_altivec_vmrghh>;
+def VMRGHW : VX1_Int<140, "vmrghw", int_ppc_altivec_vmrghw>;
+def VMRGLH : VX1_Int<332, "vmrglh", int_ppc_altivec_vmrglh>;
+def VMRGLW : VX1_Int<396, "vmrglw", int_ppc_altivec_vmrglw>;
 
 def VMSUMMBM : VA1a_Int<37, "vmsummbm", int_ppc_altivec_vmsummbm>;
 def VMSUMSHM : VA1a_Int<40, "vmsumshm", int_ppc_altivec_vmsumshm>;
@@ -243,23 +245,23 @@
 def VMSUMUHM : VA1a_Int<38, "vmsumuhm", int_ppc_altivec_vmsumuhm>;
 def VMSUMUHS : VA1a_Int<39, "vmsumuhs", int_ppc_altivec_vmsumuhs>;
 
-def VMULESB : VX1_Int<776, "vmulesb $vD, $vA, $vB", int_ppc_altivec_vmulesb>;
-def VMULESH : VX1_Int<840, "vmulesh $vD, $vA, $vB", int_ppc_altivec_vmulesh>;
-def VMULEUB : VX1_Int<520, "vmuleub $vD, $vA, $vB", int_ppc_altivec_vmuleub>;
-def VMULEUH : VX1_Int<584, "vmuleuh $vD, $vA, $vB", int_ppc_altivec_vmuleuh>;
-def VMULOSB : VX1_Int<264, "vmulosb $vD, $vA, $vB", int_ppc_altivec_vmulosb>;
-def VMULOSH : VX1_Int<328, "vmulosh $vD, $vA, $vB", int_ppc_altivec_vmulosh>;
-def VMULOUB : VX1_Int<  8, "vmuloub $vD, $vA, $vB", int_ppc_altivec_vmuloub>;
-def VMULOUH : VX1_Int< 72, "vmulouh $vD, $vA, $vB", int_ppc_altivec_vmulouh>;
+def VMULESB : VX1_Int<776, "vmulesb", int_ppc_altivec_vmulesb>;
+def VMULESH : VX1_Int<840, "vmulesh", int_ppc_altivec_vmulesh>;
+def VMULEUB : VX1_Int<520, "vmuleub", int_ppc_altivec_vmuleub>;
+def VMULEUH : VX1_Int<584, "vmuleuh", int_ppc_altivec_vmuleuh>;
+def VMULOSB : VX1_Int<264, "vmulosb", int_ppc_altivec_vmulosb>;
+def VMULOSH : VX1_Int<328, "vmulosh", int_ppc_altivec_vmulosh>;
+def VMULOUB : VX1_Int<  8, "vmuloub", int_ppc_altivec_vmuloub>;
+def VMULOUH : VX1_Int< 72, "vmulouh", int_ppc_altivec_vmulouh>;

-def VREFP : VX2_Int<266, "vrefp $vD, $vB", int_ppc_altivec_vrefp>;
-def VRFIM : VX2_Int<714, "vrfim $vD, $vB", int_ppc_altivec_vrfim>;
-def VRFIN : VX2_Int<522, "vrfin $vD, $vB", int_ppc_altivec_vrfin>;
-def VRFIP : VX2_Int<650, "vrfip $vD, $vB", int_ppc_altivec_vrfip>;
-def VRFIZ : VX2_Int<586, "vrfiz $vD, $vB", int_ppc_altivec_vrfiz>;
-def VRSQRTEFP : VX2_Int<330, "vrsqrtefp $vD, $vB", int_ppc_altivec_vrsqrtefp>;
+def VREFP : VX2_Int<266, "vrefp", int_ppc_altivec_vrefp>;
+def VRFIM : VX2_Int<714, "vrfim", int_ppc_altivec_vrfim>;
+def VRFIN : VX2_Int<522, "vrfin", int_ppc_altivec_vrfin>;
+def VRFIP : VX2_Int<650, "vrfip", int_ppc_altivec_vrfip>;
+def VRFIZ : VX2_Int<586, "vrfiz", int_ppc_altivec_vrfiz>;
+def VRSQRTEFP : VX2_Int<330, "vrsqrtefp", int_ppc_altivec_vrsqrtefp>;
 
-def VSUBCUW : VX1_Int<74, "vsubcuw $vD, $vA, $vB", int_ppc_altivec_vsubcuw>;
+def VSUBCUW : VX1_Int<74, "vsubcuw", int_ppc_altivec_vsubcuw>;
 
 def VSUBFP  : VXForm_1<74, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
   "vsubfp $vD, $vA, $vB", VecGeneral,
@@ -274,17 +276,17 @@
   "vsubuwm $vD, $vA, $vB", VecGeneral,
   [(set VRRC:$vD, (sub (v4i32 VRRC:$vA), VRRC:$vB))]>;
   
-def VSUBSBS : VX1_Int<1792, "vsubsbs $vD, $vA, $vB", int_ppc_altivec_vsubsbs>;
-def VSUBSHS : VX1_Int<1856, "vsubshs $vD, $vA, $vB", int_ppc_altivec_vsubshs>;
-def VSUBSWS : VX1_Int<1920, "vsubsws $vD, $vA, $vB", int_ppc_altivec_vsubsws>;
-def VSUBUBS : VX1_Int<1536, "vsububs $vD, $vA, $vB", int_ppc_altivec_vsububs>;
-def VSUBUHS : VX1_Int<1

[llvm-commits] CVS: llvm/lib/Target/README.txt

2006-03-31 Thread Evan Cheng


Changes in directory llvm/lib/Target:

README.txt updated: 1.25 -> 1.26
---
Log message:

An entry about packed type alignments.


---
Diffs of the changes:  (+4 -0)

 README.txt |4 
 1 files changed, 4 insertions(+)


Index: llvm/lib/Target/README.txt
diff -u llvm/lib/Target/README.txt:1.25 llvm/lib/Target/README.txt:1.26
--- llvm/lib/Target/README.txt:1.25 Fri Mar 24 13:59:17 2006
+++ llvm/lib/Target/README.txt  Fri Mar 31 16:35:14 2006
@@ -149,4 +149,8 @@
 
 where c1/c2 are constants.
 
+//===-===//
 
+For packed types, TargetData.cpp::getTypeInfo() returns alignment that is equal
+to the type size. It works but can be overly conservative as the alignment of
+specific packed types are target dependent.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrAltivec.td

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrAltivec.td updated: 1.28 -> 1.29
---
Log message:

Shrinkify some more intrinsic definitions.


---
Diffs of the changes:  (+17 -52)

 PPCInstrAltivec.td |   69 +
 1 files changed, 17 insertions(+), 52 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.28 
llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.29
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.28 Fri Mar 31 16:34:05 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td  Fri Mar 31 16:41:56 2006
@@ -156,10 +156,6 @@
  imm:$SH))]>;
 
 // VX-Form instructions.  AltiVec arithmetic ops.
-def VADDCUW : VXForm_1<384, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vaddcuw $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vaddcuw VRRC:$vA, VRRC:$vB))]>;
 def VADDFP : VXForm_1<10, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
   "vaddfp $vD, $vA, $vB", VecFP,
   [(set VRRC:$vD, (fadd VRRC:$vA, VRRC:$vB))]>;
@@ -174,31 +170,15 @@
   "vadduwm $vD, $vA, $vB", VecGeneral,
   [(set VRRC:$vD, (add (v4i32 VRRC:$vA), VRRC:$vB))]>;
   
-def VADDSBS : VXForm_1<768, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vaddsbs $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vaddsbs VRRC:$vA, VRRC:$vB))]>;
-def VADDSHS : VXForm_1<832, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vaddshs $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vaddshs VRRC:$vA, VRRC:$vB))]>;
-def VADDSWS : VXForm_1<896, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vaddsws $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vaddsws VRRC:$vA, VRRC:$vB))]>;
+def VADDCUW : VX1_Int<384, "vaddcuw", int_ppc_altivec_vaddcuw>;
+def VADDSBS : VX1_Int<768, "vaddsbs", int_ppc_altivec_vaddsbs>;
+def VADDSHS : VX1_Int<832, "vaddshs", int_ppc_altivec_vaddshs>;
+def VADDSWS : VX1_Int<896, "vaddsws", int_ppc_altivec_vaddsws>;
+def VADDUBS : VX1_Int<512, "vaddubs", int_ppc_altivec_vaddubs>;
+def VADDUHS : VX1_Int<576, "vadduhs", int_ppc_altivec_vadduhs>;
+def VADDUWS : VX1_Int<640, "vadduws", int_ppc_altivec_vadduws>;
+ 
  
-def VADDUBS : VXForm_1<512, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vaddubs $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vaddubs VRRC:$vA, VRRC:$vB))]>;
-def VADDUHS : VXForm_1<576, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vadduhs $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vadduhs VRRC:$vA, VRRC:$vB))]>;
-def VADDUWS : VXForm_1<640, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
-   "vadduws $vD, $vA, $vB", VecFP,
-   [(set VRRC:$vD,
- (int_ppc_altivec_vadduws VRRC:$vA, VRRC:$vB))]>;
 def VAND : VXForm_1<1028, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
 "vand $vD, $vA, $vB", VecFP,
 [(set VRRC:$vD, (and (v4i32 VRRC:$vA), VRRC:$vB))]>;
@@ -220,12 +200,9 @@
 def VCTUXS : VXForm_1<906, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
   "vctuxs $vD, $vB, $UIMM", VecFP,
   []>;
-def VEXPTEFP : VXForm_2<394, (ops VRRC:$vD, VRRC:$vB),
-"vexptefp $vD, $vB", VecFP,
-[(set VRRC:$vD, (int_ppc_altivec_vexptefp VRRC:$vB))]>;
-def VLOGEFP  : VXForm_2<458, (ops VRRC:$vD, VRRC:$vB),
-"vlogefp $vD, $vB", VecFP,
-[(set VRRC:$vD, (int_ppc_altivec_vlogefp VRRC:$vB))]>;
+def VEXPTEFP : VX2_Int<394, "vexptefp", int_ppc_altivec_vexptefp>;
+def VLOGEFP  : VX2_Int<458, "vlogefp",  int_ppc_altivec_vlogefp>;
+
 def VMAXFP : VXForm_1<1034, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
   "vmaxfp $vD, $vA, $vB", VecFP,
   []>;
@@ -353,24 +330,12 @@
 def VPKUWUS : VX1_Int<206, "vpkuwus", int_ppc_altivec_vpkuwus>;
 
 // Vector Unpack.
-def VUPKHPX : VXForm_2<846, (ops VRRC:$vD, VRRC:$vB),
-   "vupkhpx $vD, $vB", VecFP,
-   [(set VRRC:$vD, (int_ppc_altivec_vupkhpx VRRC:$vB))]>;
-def VUPKHSB : VXForm_2<526, (ops VRRC:$vD, VRRC:$vB),
-   "vupkhsb $vD, $vB", VecFP,
-   [(set VRRC:$vD, (int_ppc_altivec_vupkhsb VRRC:$vB))]>;
-def VUPKHSH : VXForm_2<590, (ops VRRC:$vD, VRRC:$vB),
-   "vupkhsh $vD, $vB", VecFP,
-   [(set VRRC:$vD, (int_ppc_alti

[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.455 -> 1.456
---
Log message:

If we can look through vector operations to find the scalar version of an 
extract_element'd value, do so.


---
Diffs of the changes:  (+40 -0)

 InstructionCombining.cpp |   40 
 1 files changed, 40 insertions(+)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.455 
llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.456
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.455   Fri Mar 31 
12:25:14 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Fri Mar 31 17:01:56 2006
@@ -6654,7 +6654,41 @@
   return false;
 }
 
+/// FindScalarElement - Given a vector and an element number, see if the scalar
+/// value is already around as a register, for example if it were inserted then
+/// extracted from the vector.
+static Value *FindScalarElement(Value *V, unsigned EltNo) {
+  assert(isa(V->getType()) && "Not looking at a vector?");
+  const PackedType *PTy = cast(V->getType());
+  if (EltNo >= PTy->getNumElements())  // Out of range access.
+return UndefValue::get(PTy->getElementType());
+  
+  if (isa(V))
+return UndefValue::get(PTy->getElementType());
+  else if (isa(V))
+return Constant::getNullValue(PTy->getElementType());
+  else if (ConstantPacked *CP = dyn_cast(V))
+return CP->getOperand(EltNo);
+  else if (InsertElementInst *III = dyn_cast(V)) {
+// If this is an insert to a variable element, we don't know what it is.
+if (!isa(III->getOperand(2))) return 0;
+unsigned IIElt = cast(III->getOperand(2))->getValue();
+
+// If this is an insert to the element we are looking for, return the
+// inserted value.
+if (EltNo == IIElt) return III->getOperand(1);
+
+// Otherwise, the insertelement doesn't modify the value, recurse on its
+// vector input.
+return FindScalarElement(III->getOperand(0), EltNo);
+  }
+  
+  // Otherwise, we don't know.
+  return 0;
+}
+
 Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
+
   // If packed val is undef, replace extract with scalar undef.
   if (isa(EI.getOperand(0)))
 return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType()));
@@ -6676,6 +6710,12 @@
   return ReplaceInstUsesWith(EI, op0);
   }
   
+  // If extracting a specified index from the vector, see if we can recursively
+  // find a previously computed scalar that was inserted into the vector.
+  if (ConstantUInt *IdxC = dyn_cast(EI.getOperand(1)))
+if (Value *Elt = FindScalarElement(EI.getOperand(0), IdxC->getValue()))
+  return ReplaceInstUsesWith(EI, Elt);
+  
   if (Instruction *I = dyn_cast(EI.getOperand(0)))
 if (I->hasOneUse()) {
   // Push extractelement into predecessor operation if legal and



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/README.txt

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Target:

README.txt updated: 1.26 -> 1.27
---
Log message:

ADd a note


---
Diffs of the changes:  (+12 -0)

 README.txt |   12 
 1 files changed, 12 insertions(+)


Index: llvm/lib/Target/README.txt
diff -u llvm/lib/Target/README.txt:1.26 llvm/lib/Target/README.txt:1.27
--- llvm/lib/Target/README.txt:1.26 Fri Mar 31 16:35:14 2006
+++ llvm/lib/Target/README.txt  Fri Mar 31 22:08:29 2006
@@ -154,3 +154,15 @@
 For packed types, TargetData.cpp::getTypeInfo() returns alignment that is equal
 to the type size. It works but can be overly conservative as the alignment of
 specific packed types are target dependent.
+
+//===-===//
+
+We should add 'unaligned load/store' nodes, and produce them from code like
+this:
+
+v4sf example(float *P) {
+  return (v4sf){P[0], P[1], P[2], P[3] };
+}
+
+//===-===//
+



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/test/Regression/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll

2006-03-31 Thread Chris Lattner


Changes in directory llvm/test/Regression/Transforms/IndVarsSimplify:

2006-03-31-NegativeStride.ll added (r1.1)
---
Log message:

new testcase for PR726: http://llvm.cs.uiuc.edu/PR726 


---
Diffs of the changes:  (+21 -0)

 2006-03-31-NegativeStride.ll |   21 +
 1 files changed, 21 insertions(+)


Index: 
llvm/test/Regression/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll
diff -c /dev/null 
llvm/test/Regression/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll:1.1
*** /dev/null   Fri Mar 31 22:47:27 2006
--- 
llvm/test/Regression/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll
Fri Mar 31 22:47:17 2006
***
*** 0 
--- 1,21 
+ ; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep 'ret int 27'
+ 
+ ; Make sure to compute the right exit value based on negative strides.
+ ; PR726
+ 
+ int %test() {
+ entry:
+ br label %cond_true
+ 
+ cond_true:  ; preds = %cond_true, %entry
+ %a.0.0 = phi int [ 10, %entry ], [ %tmp4, %cond_true ]  ; 
 [#uses=2]
+ %b.0.0 = phi int [ 0, %entry ], [ %tmp2, %cond_true ]   ; 
 [#uses=1]
+ %tmp2 = add int %b.0.0, %a.0.0  ;  [#uses=2]
+ %tmp4 = add int %a.0.0, -1  ;  [#uses=2]
+ %tmp = setgt int %tmp4, 7   ;  [#uses=1]
+ br bool %tmp, label %cond_true, label %bb7
+ 
+ bb7:; preds = %cond_true
+ ret int %tmp2
+ }
+ 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/ScalarEvolution.cpp

2006-03-31 Thread Chris Lattner


Changes in directory llvm/lib/Analysis:

ScalarEvolution.cpp updated: 1.45 -> 1.46
---
Log message:

Fix Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll and
PR726: http://llvm.cs.uiuc.edu/PR726  by performing consistent signed division, 
not consistent unsigned
division when evaluating scev's.  Do not touch udivs.


---
Diffs of the changes:  (+27 -27)

 ScalarEvolution.cpp |   54 ++--
 1 files changed, 27 insertions(+), 27 deletions(-)


Index: llvm/lib/Analysis/ScalarEvolution.cpp
diff -u llvm/lib/Analysis/ScalarEvolution.cpp:1.45 
llvm/lib/Analysis/ScalarEvolution.cpp:1.46
--- llvm/lib/Analysis/ScalarEvolution.cpp:1.45  Sun Jan 22 17:19:18 2006
+++ llvm/lib/Analysis/ScalarEvolution.cpp   Fri Mar 31 22:48:52 2006
@@ -294,22 +294,22 @@
 }
 
 
-// SCEVUDivs - Only allow the creation of one SCEVUDivExpr for any particular
+// SCEVSDivs - Only allow the creation of one SCEVSDivExpr for any particular
 // input.  Don't use a SCEVHandle here, or else the object will never be
 // deleted!
-static std::map, SCEVUDivExpr*> SCEVUDivs;
+static std::map, SCEVSDivExpr*> SCEVSDivs;
 
-SCEVUDivExpr::~SCEVUDivExpr() {
-  SCEVUDivs.erase(std::make_pair(LHS, RHS));
+SCEVSDivExpr::~SCEVSDivExpr() {
+  SCEVSDivs.erase(std::make_pair(LHS, RHS));
 }
 
-void SCEVUDivExpr::print(std::ostream &OS) const {
-  OS << "(" << *LHS << " /u " << *RHS << ")";
+void SCEVSDivExpr::print(std::ostream &OS) const {
+  OS << "(" << *LHS << " /s " << *RHS << ")";
 }
 
-const Type *SCEVUDivExpr::getType() const {
+const Type *SCEVSDivExpr::getType() const {
   const Type *Ty = LHS->getType();
-  if (Ty->isSigned()) Ty = Ty->getUnsignedVersion();
+  if (Ty->isUnsigned()) Ty = Ty->getSignedVersion();
   return Ty;
 }
 
@@ -540,7 +540,7 @@
   for (unsigned i = 1, e = getNumOperands(); i != e; ++i) {
 SCEVHandle BC = PartialFact(It, i);
 Divisor *= i;
-SCEVHandle Val = SCEVUDivExpr::get(SCEVMulExpr::get(BC, getOperand(i)),
+SCEVHandle Val = SCEVSDivExpr::get(SCEVMulExpr::get(BC, getOperand(i)),

SCEVUnknown::getIntegerSCEV(Divisor,Ty));
 Result = SCEVAddExpr::get(Result, Val);
   }
@@ -982,20 +982,20 @@
   return Result;
 }
 
-SCEVHandle SCEVUDivExpr::get(const SCEVHandle &LHS, const SCEVHandle &RHS) {
+SCEVHandle SCEVSDivExpr::get(const SCEVHandle &LHS, const SCEVHandle &RHS) {
   if (SCEVConstant *RHSC = dyn_cast(RHS)) {
 if (RHSC->getValue()->equalsInt(1))
-  return LHS;// X /u 1 --> x
+  return LHS;// X /s 1 --> x
 if (RHSC->getValue()->isAllOnesValue())
-  return SCEV::getNegativeSCEV(LHS);   // X /u -1  -->  -x
+  return SCEV::getNegativeSCEV(LHS);   // X /s -1  -->  -x
 
 if (SCEVConstant *LHSC = dyn_cast(LHS)) {
   Constant *LHSCV = LHSC->getValue();
   Constant *RHSCV = RHSC->getValue();
-  if (LHSCV->getType()->isSigned())
+  if (LHSCV->getType()->isUnsigned())
 LHSCV = ConstantExpr::getCast(LHSCV,
-  LHSCV->getType()->getUnsignedVersion());
-  if (RHSCV->getType()->isSigned())
+  LHSCV->getType()->getSignedVersion());
+  if (RHSCV->getType()->isUnsigned())
 RHSCV = ConstantExpr::getCast(RHSCV, LHSCV->getType());
   return SCEVUnknown::get(ConstantExpr::getDiv(LHSCV, RHSCV));
 }
@@ -1003,8 +1003,8 @@
 
   // FIXME: implement folding of (X*4)/4 when we know X*4 doesn't overflow.
 
-  SCEVUDivExpr *&Result = SCEVUDivs[std::make_pair(LHS, RHS)];
-  if (Result == 0) Result = new SCEVUDivExpr(LHS, RHS);
+  SCEVSDivExpr *&Result = SCEVSDivs[std::make_pair(LHS, RHS)];
+  if (Result == 0) Result = new SCEVSDivExpr(LHS, RHS);
   return Result;
 }
 
@@ -1356,8 +1356,8 @@
   return SCEVMulExpr::get(getSCEV(I->getOperand(0)),
   getSCEV(I->getOperand(1)));
 case Instruction::Div:
-  if (V->getType()->isInteger() && V->getType()->isUnsigned())
-return SCEVUDivExpr::get(getSCEV(I->getOperand(0)),
+  if (V->getType()->isInteger() && V->getType()->isSigned())
+return SCEVSDivExpr::get(getSCEV(I->getOperand(0)),
  getSCEV(I->getOperand(1)));
   break;
 
@@ -1376,10 +1376,10 @@
 
 case Instruction::Shr:
   if (ConstantUInt *SA = dyn_cast(I->getOperand(1)))
-if (V->getType()->isUnsigned()) {
+if (V->getType()->isSigned()) {
   Constant *X = ConstantInt::get(V->getType(), 1);
   X = ConstantExpr::getShl(X, SA);
-  return SCEVUDivExpr::get(getSCEV(I->getOperand(0)), getSCEV(X));
+  return SCEVSDivExpr::get(getSCEV(I->getOperand(0)), getSCEV(X));
 }
   break;
 
@@ -1982,14 +1982,14 @@
 return Comm;
   }
 
-  if (SCEVUDivExpr *UDiv = dyn_cast(V)) {
-SCEVHandle LHS = getSCEVAtScope(UDiv->getLHS(), L);
+  if (SCEVSDivExpr *Div = dyn_cast(V)) {
+SCEVHandle

[llvm-commits] CVS: llvm/include/llvm/Analysis/ScalarEvolutionExpander.h ScalarEvolutionExpressions.h

2006-03-31 Thread Chris Lattner


Changes in directory llvm/include/llvm/Analysis:

ScalarEvolutionExpander.h updated: 1.4 -> 1.5
ScalarEvolutionExpressions.h updated: 1.6 -> 1.7
---
Log message:

Fix Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll and
PR726: http://llvm.cs.uiuc.edu/PR726  by performing consistent signed division, 
not consistent unsigned
division when evaluating scev's.  Do not touch udivs.


---
Diffs of the changes:  (+12 -12)

 ScalarEvolutionExpander.h|2 +-
 ScalarEvolutionExpressions.h |   22 +++---
 2 files changed, 12 insertions(+), 12 deletions(-)


Index: llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
diff -u llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.4 
llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.5
--- llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.4Sat Feb  4 
03:51:33 2006
+++ llvm/include/llvm/Analysis/ScalarEvolutionExpander.hFri Mar 31 
22:48:52 2006
@@ -136,7 +136,7 @@
 
 Value *visitMulExpr(SCEVMulExpr *S);
 
-Value *visitUDivExpr(SCEVUDivExpr *S) {
+Value *visitSDivExpr(SCEVSDivExpr *S) {
   const Type *Ty = S->getType();
   Value *LHS = expandInTy(S->getLHS(), Ty);
   Value *RHS = expandInTy(S->getRHS(), Ty);


Index: llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h
diff -u llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.6 
llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.7
--- llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.6 Thu Apr 21 
15:16:32 2005
+++ llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h Fri Mar 31 
22:48:52 2006
@@ -23,7 +23,7 @@
   enum SCEVTypes {
 // These should be ordered in terms of increasing complexity to make the
 // folders simpler.
-scConstant, scTruncate, scZeroExtend, scAddExpr, scMulExpr, scUDivExpr,
+scConstant, scTruncate, scZeroExtend, scAddExpr, scMulExpr, scSDivExpr,
 scAddRecExpr, scUnknown, scCouldNotCompute
   };
 
@@ -293,16 +293,16 @@
 
 
   
//======//
-  /// SCEVUDivExpr - This class represents a binary unsigned division 
operation.
+  /// SCEVSDivExpr - This class represents a binary unsigned division 
operation.
   ///
-  class SCEVUDivExpr : public SCEV {
+  class SCEVSDivExpr : public SCEV {
 SCEVHandle LHS, RHS;
-SCEVUDivExpr(const SCEVHandle &lhs, const SCEVHandle &rhs)
-  : SCEV(scUDivExpr), LHS(lhs), RHS(rhs) {}
+SCEVSDivExpr(const SCEVHandle &lhs, const SCEVHandle &rhs)
+  : SCEV(scSDivExpr), LHS(lhs), RHS(rhs) {}
 
-virtual ~SCEVUDivExpr();
+virtual ~SCEVSDivExpr();
   public:
-/// get method - This just gets and returns a new SCEVUDiv object.
+/// get method - This just gets and returns a new SCEVSDiv object.
 ///
 static SCEVHandle get(const SCEVHandle &LHS, const SCEVHandle &RHS);
 
@@ -334,9 +334,9 @@
 void print(std::ostream &OS) const;
 
 /// Methods for support type inquiry through isa, cast, and dyn_cast:
-static inline bool classof(const SCEVUDivExpr *S) { return true; }
+static inline bool classof(const SCEVSDivExpr *S) { return true; }
 static inline bool classof(const SCEV *S) {
-  return S->getSCEVType() == scUDivExpr;
+  return S->getSCEVType() == scSDivExpr;
 }
   };
 
@@ -496,8 +496,8 @@
 return ((SC*)this)->visitAddExpr((SCEVAddExpr*)S);
   case scMulExpr:
 return ((SC*)this)->visitMulExpr((SCEVMulExpr*)S);
-  case scUDivExpr:
-return ((SC*)this)->visitUDivExpr((SCEVUDivExpr*)S);
+  case scSDivExpr:
+return ((SC*)this)->visitSDivExpr((SCEVSDivExpr*)S);
   case scAddRecExpr:
 return ((SC*)this)->visitAddRecExpr((SCEVAddRecExpr*)S);
   case scUnknown:



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits