]> git.proxmox.com Git - mirror_qemu.git/commitdiff
target-s390x: Avoid a loop for popcnt
authorRichard Henderson <rth@twiddle.net>
Mon, 21 Nov 2016 11:06:26 +0000 (12:06 +0100)
committerRichard Henderson <rth@twiddle.net>
Tue, 10 Jan 2017 16:48:57 +0000 (08:48 -0800)
Signed-off-by: Richard Henderson <rth@twiddle.net>
target/s390x/int_helper.c

index 5bc470bdc76789dc2adcbeeeaac618f350b1e951..f26f36a9045e24aa1d934d6220f23e8cdb7ea90d 100644 (file)
@@ -137,14 +137,11 @@ uint64_t HELPER(cvd)(int32_t reg)
     return dec;
 }
 
-uint64_t HELPER(popcnt)(uint64_t r2)
+uint64_t HELPER(popcnt)(uint64_t val)
 {
-    uint64_t ret = 0;
-    int i;
-
-    for (i = 0; i < 64; i += 8) {
-        uint64_t t = ctpop32((r2 >> i) & 0xff);
-        ret |= t << i;
-    }
-    return ret;
+    /* Note that we don't fold past bytes. */
+    val = (val & 0x5555555555555555ULL) + ((val >> 1) & 0x5555555555555555ULL);
+    val = (val & 0x3333333333333333ULL) + ((val >> 2) & 0x3333333333333333ULL);
+    val = (val + (val >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
+    return val;
 }