From 9fd8d03eb09e1c51e782fb8ce5b0a8a9a3b05e8d Mon Sep 17 00:00:00 2001 From: Sandipan Das Date: Thu, 7 Jun 2018 16:08:15 +0530 Subject: [PATCH] arch-power: Add fixed-point logical population count instructions This adds the following logical instructions: * Population Count Bytes (popcntb) * Population Count Words (popcntw) * Population Count Doubleword (popcntd) Change-Id: I946d1f8b270b4c75849cdfb7e413974ae8748494 Signed-off-by: Sandipan Das --- src/arch/power/isa/decoder.isa | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/arch/power/isa/decoder.isa b/src/arch/power/isa/decoder.isa index c605b697d..deaea7041 100644 --- a/src/arch/power/isa/decoder.isa +++ b/src/arch/power/isa/decoder.isa @@ -529,6 +529,34 @@ decode PO default Unknown::unknown() { Ra = res; }}); + 122: popcntb({{ + 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({{ + 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); + Ra = res; + }}); + + 506: popcntd({{ Ra = popCount(Rs); }}); + 24: slw({{ if (Rb & 0x20) { Ra = 0; -- 2.30.2