1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * ORACLE PROPRIETARY/CONFIDENTIAL.  Use is subject to license terms.
   4  */
   5 
   6 #include "precompiled.hpp"
   7 #include "gc/z/zUtils.inline.hpp"
   8 #include "unittest.hpp"
   9 
  10 #include <limits>
  11 
  12 template <typename T>
  13 static T max_alignment() {
  14   T max = std::numeric_limits<T>::max();
  15   return max ^ (max >> 1);
  16 }
  17 
  18 TEST(ZUtilsTest, round_up_power_of_2) {
  19   EXPECT_EQ(ZUtils::round_up_power_of_2(1u), 1u);
  20   EXPECT_EQ(ZUtils::round_up_power_of_2(2u), 2u);
  21   EXPECT_EQ(ZUtils::round_up_power_of_2(3u), 4u);
  22   EXPECT_EQ(ZUtils::round_up_power_of_2(4u), 4u);
  23   EXPECT_EQ(ZUtils::round_up_power_of_2(5u), 8u);
  24   EXPECT_EQ(ZUtils::round_up_power_of_2(6u), 8u);
  25   EXPECT_EQ(ZUtils::round_up_power_of_2(7u), 8u);
  26   EXPECT_EQ(ZUtils::round_up_power_of_2(8u), 8u);
  27   EXPECT_EQ(ZUtils::round_up_power_of_2(9u), 16u);
  28   EXPECT_EQ(ZUtils::round_up_power_of_2(10u), 16u);
  29   EXPECT_EQ(ZUtils::round_up_power_of_2(1023u), 1024u);
  30   EXPECT_EQ(ZUtils::round_up_power_of_2(1024u), 1024u);
  31   EXPECT_EQ(ZUtils::round_up_power_of_2(1025u), 2048u);
  32 
  33   const size_t max = max_alignment<size_t>();
  34   EXPECT_EQ(ZUtils::round_up_power_of_2(max - 1), max);
  35   EXPECT_EQ(ZUtils::round_up_power_of_2(max), max);
  36 }
  37 
  38 TEST(ZUtilsTest, round_down_power_of_2) {
  39   EXPECT_EQ(ZUtils::round_down_power_of_2(1u), 1u);
  40   EXPECT_EQ(ZUtils::round_down_power_of_2(2u), 2u);
  41   EXPECT_EQ(ZUtils::round_down_power_of_2(3u), 2u);
  42   EXPECT_EQ(ZUtils::round_down_power_of_2(4u), 4u);
  43   EXPECT_EQ(ZUtils::round_down_power_of_2(5u), 4u);
  44   EXPECT_EQ(ZUtils::round_down_power_of_2(6u), 4u);
  45   EXPECT_EQ(ZUtils::round_down_power_of_2(7u), 4u);
  46   EXPECT_EQ(ZUtils::round_down_power_of_2(8u), 8u);
  47   EXPECT_EQ(ZUtils::round_down_power_of_2(9u), 8u);
  48   EXPECT_EQ(ZUtils::round_down_power_of_2(10u), 8u);
  49   EXPECT_EQ(ZUtils::round_down_power_of_2(1023u), 512u);
  50   EXPECT_EQ(ZUtils::round_down_power_of_2(1024u), 1024u);
  51   EXPECT_EQ(ZUtils::round_down_power_of_2(1025u), 1024u);
  52 
  53   const size_t max = max_alignment<size_t>();
  54   EXPECT_EQ(ZUtils::round_down_power_of_2(max), max);
  55   EXPECT_EQ(ZUtils::round_down_power_of_2(max - 1), max / 2);
  56 }