From 63bbed536c609d02b04339963a1f24de3632b421 Mon Sep 17 00:00:00 2001 From: Duraid Madina Date: Wed, 11 May 2005 05:16:09 +0000 Subject: [PATCH] add the popcount instruction and support this in the isel 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 | 7 ++++++- lib/Target/IA64/IA64InstrInfo.td | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Target/IA64/IA64ISelPattern.cpp b/lib/Target/IA64/IA64ISelPattern.cpp index 06be6ab2e0f..2d00c3be472 100644 --- a/lib/Target/IA64/IA64ISelPattern.cpp +++ b/lib/Target/IA64/IA64ISelPattern.cpp @@ -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(N.getOperand(1))) { diff --git a/lib/Target/IA64/IA64InstrInfo.td b/lib/Target/IA64/IA64InstrInfo.td index 92e68eb02c4..cd1dea7a9f2 100644 --- a/lib/Target/IA64/IA64InstrInfo.td +++ b/lib/Target/IA64/IA64InstrInfo.td @@ -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;;">;