1#include "flang/Common/bit-population-count.h"
2#include "testing.h"
3
4using Fortran::common::BitPopulationCount;
5using Fortran::common::Parity;
6
7int main() {
8 MATCH(0, BitPopulationCount(std::uint64_t{0}));
9 MATCH(false, Parity(std::uint64_t{0}));
10 MATCH(64, BitPopulationCount(~std::uint64_t{0}));
11 MATCH(false, Parity(~std::uint64_t{0}));
12 for (int j{0}; j < 64; ++j) {
13 std::uint64_t x = std::uint64_t{1} << j;
14 MATCH(1, BitPopulationCount(x));
15 MATCH(true, Parity(x));
16 MATCH(63, BitPopulationCount(~x));
17 MATCH(true, Parity(~x));
18 for (int k{0}; k < j; ++k) {
19 std::uint64_t y = x | (std::uint64_t{1} << k);
20 MATCH(2, BitPopulationCount(y));
21 MATCH(false, Parity(y));
22 MATCH(62, BitPopulationCount(~y));
23 MATCH(false, Parity(~y));
24 }
25 }
26 MATCH(0, BitPopulationCount(std::uint32_t{0}));
27 MATCH(false, Parity(std::uint32_t{0}));
28 MATCH(32, BitPopulationCount(~std::uint32_t{0}));
29 MATCH(false, Parity(~std::uint32_t{0}));
30 for (int j{0}; j < 32; ++j) {
31 std::uint32_t x = std::uint32_t{1} << j;
32 MATCH(1, BitPopulationCount(x));
33 MATCH(true, Parity(x));
34 MATCH(31, BitPopulationCount(~x));
35 MATCH(true, Parity(~x));
36 for (int k{0}; k < j; ++k) {
37 std::uint32_t y = x | (std::uint32_t{1} << k);
38 MATCH(2, BitPopulationCount(y));
39 MATCH(false, Parity(y));
40 MATCH(30, BitPopulationCount(~y));
41 MATCH(false, Parity(~y));
42 }
43 }
44 MATCH(0, BitPopulationCount(std::uint16_t{0}));
45 MATCH(false, Parity(std::uint16_t{0}));
46 MATCH(16, BitPopulationCount(static_cast<std::uint16_t>(~0)));
47 MATCH(false, Parity(static_cast<std::uint16_t>(~0)));
48 for (int j{0}; j < 16; ++j) {
49 std::uint16_t x = std::uint16_t{1} << j;
50 MATCH(1, BitPopulationCount(x));
51 MATCH(true, Parity(x));
52 MATCH(15, BitPopulationCount(static_cast<std::uint16_t>(~x)));
53 MATCH(true, Parity(static_cast<std::uint16_t>(~x)));
54 for (int k{0}; k < j; ++k) {
55 std::uint16_t y = x | (std::uint16_t{1} << k);
56 MATCH(2, BitPopulationCount(y));
57 MATCH(false, Parity(y));
58 MATCH(14, BitPopulationCount(static_cast<std::uint16_t>(~y)));
59 MATCH(false, Parity(static_cast<std::uint16_t>(~y)));
60 }
61 }
62 MATCH(0, BitPopulationCount(std::uint8_t{0}));
63 MATCH(false, Parity(std::uint8_t{0}));
64 MATCH(8, BitPopulationCount(static_cast<std::uint8_t>(~0)));
65 MATCH(false, Parity(static_cast<std::uint8_t>(~0)));
66 for (int j{0}; j < 8; ++j) {
67 std::uint8_t x = std::uint8_t{1} << j;
68 MATCH(1, BitPopulationCount(x));
69 MATCH(true, Parity(x));
70 MATCH(7, BitPopulationCount(static_cast<std::uint8_t>(~x)));
71 MATCH(true, Parity(static_cast<std::uint8_t>(~x)));
72 for (int k{0}; k < j; ++k) {
73 std::uint8_t y = x | (std::uint8_t{1} << k);
74 MATCH(2, BitPopulationCount(y));
75 MATCH(false, Parity(y));
76 MATCH(6, BitPopulationCount(static_cast<std::uint8_t>(~y)));
77 MATCH(false, Parity(static_cast<std::uint8_t>(~y)));
78 }
79 }
80 return testing::Complete();
81}
82

source code of flang/unittests/Evaluate/bit-population-count.cpp