From fe4b53c1aebb3682e34c009cf0f5bdde53005bcd Mon Sep 17 00:00:00 2001 From: Sandipan Das Date: Sat, 6 Feb 2021 17:21:23 +0530 Subject: [PATCH] arch-power: Add population count instructions This adds the following instructions. * Population Count Bytes (popcntb) * Population Count Words (popcntw) * Population Count Doubleword (popcntd) Change-Id: Id15188482b45552735c1d960418d5d6ba1f2ede8 Signed-off-by: Sandipan Das --- src/arch/power/isa/decoder.isa | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/arch/power/isa/decoder.isa b/src/arch/power/isa/decoder.isa index dfad97874..08b9d10ad 100644 --- a/src/arch/power/isa/decoder.isa +++ b/src/arch/power/isa/decoder.isa @@ -515,6 +515,45 @@ decode PO default Unknown::unknown() { Ra = res; }}); + 122: popcntb({{ + // Based on "Counting bits set, in parallel" + // from https://graphics.stanford.edu/~seander/bithacks.html + const uint64_t m1 = 0x5555555555555555ULL; + const uint64_t m2 = 0x3333333333333333ULL; + const uint64_t m4 = 0x0f0f0f0f0f0f0f0fULL; + uint64_t res = Rs; + res = (res & m1) + ((res >> 1) & m1); + res = (res & m2) + ((res >> 2) & m2); + res = (res & m4) + ((res >> 4) & m4); + Ra = res; + }}); + + 378: popcntw({{ + #if defined(__GNUC__) || (defined(__clang__) && \ + __has_builtin(__builtin_popcount)) + uint64_t src = Rs; + uint64_t res = __builtin_popcount(src >> 32); + res = (res << 32) | __builtin_popcount(src); + #else + // Based on "Counting bits set, in parallel" + // from https://graphics.stanford.edu/~seander/bithacks.html + const uint64_t m1 = 0x5555555555555555ULL; + const uint64_t m2 = 0x3333333333333333ULL; + const uint64_t m4 = 0x0f0f0f0f0f0f0f0fULL; + const uint64_t m8 = 0x00ff00ff00ff00ffULL; + const uint64_t m16 = 0x0000ffff0000ffffULL; + uint64_t res = Rs; + res = (res & m1) + ((res >> 1) & m1); + res = (res & m2) + ((res >> 2) & m2); + res = (res & m4) + ((res >> 4) & m4); + res = (res & m8) + ((res >> 8) & m8); + res = (res & m16) + ((res >> 16) & m16); + #endif + Ra = res; + }}); + + 506: popcntd({{ Ra = popCount(Rs); }}); + 24: slw({{ if (Rb & 0x20) { Ra = 0; -- 2.30.2