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

Andrew Lenharth alenhar2 at cs.uiuc.edu
Wed May 4 12:11:18 PDT 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.94 -> 1.95
---
Log message:

Make promoteOp work for CT*

Proof?

ubyte %bar(ubyte %x) {
entry:
        %tmp.1 = call ubyte %llvm.ctlz( ubyte %x ) 
        ret ubyte %tmp.1
}

==>

zapnot $16,1,$0
CTLZ $0,$0
subq $0,56,$0
zapnot $0,1,$0
ret $31,($26),1




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

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


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.94 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.95
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.94	Tue May  3 12:19:29 2005
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp	Wed May  4 14:11:05 2005
@@ -1534,6 +1534,34 @@
     AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
     break;
   }
+  case ISD::CTPOP:
+  case ISD::CTTZ:
+  case ISD::CTLZ:
+    Tmp1 = Node->getOperand(0);
+    //Zero extend the argument
+    Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, NVT, Tmp1);
+    // Perform the larger operation, then subtract if needed.
+    Tmp1 = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
+    switch(Node->getOpcode())
+    {
+    case ISD::CTPOP:
+      Result = Tmp1;
+      break;
+    case ISD::CTTZ:
+      //if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT)
+      Tmp2 = DAG.getSetCC(ISD::SETEQ, MVT::i1, Tmp1, 
+                          DAG.getConstant(getSizeInBits(NVT), NVT));
+      Result = DAG.getNode(ISD::SELECT, NVT, Tmp2, 
+                           DAG.getConstant(getSizeInBits(VT),NVT), Tmp1);
+      break;
+    case ISD::CTLZ:
+      //Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
+      Result = DAG.getNode(ISD::SUB, NVT, Tmp1, 
+                           DAG.getConstant(getSizeInBits(NVT) - 
+                                           getSizeInBits(VT), NVT));
+      break;
+    }
+    break;
   }
 
   assert(Result.Val && "Didn't set a result!");






More information about the llvm-commits mailing list