arch-power: Add fixed-point logical population count instructions
authorSandipan Das <sandipan@linux.vnet.ibm.com>
Thu, 7 Jun 2018 10:38:15 +0000 (16:08 +0530)
committerSandipan Das <sandipan@linux.vnet.ibm.com>
Thu, 7 Jun 2018 11:08:42 +0000 (16:38 +0530)
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 <sandipan@linux.vnet.ibm.com>
src/arch/power/isa/decoder.isa

index 01ca336b813c279d344ff6ea3280f371fa4ea669..b2ad11a2323c294b2963e7859bba70759761ba57 100644 (file)
@@ -531,6 +531,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;