• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "flang/Common/bit-population-count.h"
2 #include "testing.h"
3 
4 using Fortran::common::BitPopulationCount;
5 using Fortran::common::Parity;
6 
main()7 int 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