add the popcount instruction and support this in the isel
authorDuraid Madina <duraid@octopus.com.au>
Wed, 11 May 2005 05:16:09 +0000 (05:16 +0000)
committerDuraid Madina <duraid@octopus.com.au>
Wed, 11 May 2005 05:16:09 +0000 (05:16 +0000)
the primary user of this will probably end up being find-first-set-bit/find-
last-set-bit, which i'll get around to...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21860 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/IA64/IA64ISelPattern.cpp
lib/Target/IA64/IA64InstrInfo.td

index 06be6ab2e0f8079bf2d69676bd9e14add95f9d8e..2d00c3be4724deaf2c48b111aba61b31ae3520a7 100644 (file)
@@ -90,7 +90,6 @@ namespace {
       setOperationAction(ISD::FSQRT, MVT::f32, Expand);
 
       //IA64 has these, but they are not implemented
-      setOperationAction(ISD::CTPOP, MVT::i64  , Expand);
       setOperationAction(ISD::CTTZ , MVT::i64  , Expand);
       setOperationAction(ISD::CTLZ , MVT::i64  , Expand);
 
@@ -1600,6 +1599,12 @@ pC = pA OR pB
     return Result;
   }
 
+  case ISD::CTPOP: {
+    Tmp1 = SelectExpr(N.getOperand(0));
+    BuildMI(BB, IA64::POPCNT, 1, Result).addReg(Tmp1);
+    return Result;
+  }
+
   case ISD::SHL: {
     Tmp1 = SelectExpr(N.getOperand(0));
     if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
index 92e68eb02c42842e9017691da25ecb051fd27f26..cd1dea7a9f2867deb8bb302d0961697c8b9b15a0 100644 (file)
@@ -227,6 +227,8 @@ def LD4 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
 def LD8 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
   "ld8 $dst = [$srcPtr];;">;
 
+def POPCNT : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src), "popcnt $dst = $src;;">;
+
 // some FP stuff:
 def FADD : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2),
   "fadd $dst = $src1, $src2;;">;