| #include <stdio.h> |
| #include <stdint.h> |
| |
| |
| static void check_popcnt(uint64_t in, uint64_t expected_result, |
| int expected_cc) |
| { |
| uint64_t out = ~expected_result; |
| int cc = ~expected_cc; |
| |
| asm volatile(".insn rre, 0xb9e10000, %[out], %[in]\n\t" |
| "ipm %[cc]\n\t" |
| "srl %[cc],28\n\t" |
| : [cc]"=d" (cc), [out]"=d" (out) |
| : [in]"d" (in) |
| : "cc"); |
| printf("popcnt %16lx -> %16lx %s cc=%d %s\n", |
| in, out, (out == expected_result ? " " : "ERR"), |
| cc, (cc == expected_cc ? " " : "ERR")); |
| } |
| |
| int main() |
| { |
| check_popcnt(0, 0, 0); |
| check_popcnt(1, 1, 1); |
| check_popcnt(0x8000000000000000ULL, 0x0100000000000000ULL, 1); |
| check_popcnt(0xffffffffffffffffULL, 0x0808080808080808ULL, 1); |
| check_popcnt(0xff427e3800556bcdULL, 0x0802060300040505ULL, 1); |
| return 0; |
| } |