1 //===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "gtest/gtest.h" 11 #include "llvm/ADT/APInt.h" 12 13 using namespace llvm; 14 15 namespace { 16 17 // Test that APInt shift left works when bitwidth > 64 and shiftamt == 0 18 TEST(APIntTest, ShiftLeftByZero) { 19 APInt One = APInt::getNullValue(65) + 1; 20 APInt Shl = One.shl(0); 21 EXPECT_EQ(true, Shl[0]); 22 EXPECT_EQ(false, Shl[1]); 23 } 24 25 TEST(APIntTest, I128NegativeCount) { 26 APInt Minus3(128, (uint64_t)-3, true); 27 EXPECT_EQ(126u, Minus3.countLeadingOnes()); 28 EXPECT_EQ(-3, Minus3.getSExtValue()); 29 30 APInt Minus1(128, (uint64_t)-1, true); 31 EXPECT_EQ(0u, Minus1.countLeadingZeros()); 32 EXPECT_EQ(128u, Minus1.countLeadingOnes()); 33 EXPECT_EQ(128u, Minus1.getActiveBits()); 34 EXPECT_EQ(0u, Minus1.countTrailingZeros()); 35 EXPECT_EQ(128u, Minus1.countTrailingOnes()); 36 EXPECT_EQ(128u, Minus1.countPopulation()); 37 EXPECT_EQ(-1, Minus1.getSExtValue()); 38 } 39 40 TEST(APIntTest, I33Count) { 41 APInt i33minus2(33, -2, true); 42 EXPECT_EQ(0u, i33minus2.countLeadingZeros()); 43 EXPECT_EQ(32u, i33minus2.countLeadingOnes()); 44 EXPECT_EQ(33u, i33minus2.getActiveBits()); 45 EXPECT_EQ(1u, i33minus2.countTrailingZeros()); 46 EXPECT_EQ(32u, i33minus2.countPopulation()); 47 EXPECT_EQ(-2, i33minus2.getSExtValue()); 48 EXPECT_EQ(((uint64_t)-2)&((1ull<<33) -1), i33minus2.getZExtValue()); 49 } 50 51 TEST(APIntTest, I65Count) { 52 APInt i65minus(65, 0, true); 53 i65minus.set(64); 54 EXPECT_EQ(0u, i65minus.countLeadingZeros()); 55 EXPECT_EQ(1u, i65minus.countLeadingOnes()); 56 EXPECT_EQ(65u, i65minus.getActiveBits()); 57 EXPECT_EQ(64u, i65minus.countTrailingZeros()); 58 EXPECT_EQ(1u, i65minus.countPopulation()); 59 } 60 61 TEST(APIntTest, I128PositiveCount) { 62 APInt u128max = APInt::getAllOnesValue(128); 63 EXPECT_EQ(128u, u128max.countLeadingOnes()); 64 EXPECT_EQ(0u, u128max.countLeadingZeros()); 65 EXPECT_EQ(128u, u128max.getActiveBits()); 66 EXPECT_EQ(0u, u128max.countTrailingZeros()); 67 EXPECT_EQ(128u, u128max.countTrailingOnes()); 68 EXPECT_EQ(128u, u128max.countPopulation()); 69 70 APInt u64max(128, (uint64_t)-1, false); 71 EXPECT_EQ(64u, u64max.countLeadingZeros()); 72 EXPECT_EQ(0u, u64max.countLeadingOnes()); 73 EXPECT_EQ(64u, u64max.getActiveBits()); 74 EXPECT_EQ(0u, u64max.countTrailingZeros()); 75 EXPECT_EQ(64u, u64max.countTrailingOnes()); 76 EXPECT_EQ(64u, u64max.countPopulation()); 77 EXPECT_EQ((uint64_t)~0ull, u64max.getZExtValue()); 78 79 APInt zero(128, 0, true); 80 EXPECT_EQ(128u, zero.countLeadingZeros()); 81 EXPECT_EQ(0u, zero.countLeadingOnes()); 82 EXPECT_EQ(0u, zero.getActiveBits()); 83 EXPECT_EQ(128u, zero.countTrailingZeros()); 84 EXPECT_EQ(0u, zero.countTrailingOnes()); 85 EXPECT_EQ(0u, zero.countPopulation()); 86 EXPECT_EQ(0u, zero.getSExtValue()); 87 EXPECT_EQ(0u, zero.getZExtValue()); 88 89 APInt one(128, 1, true); 90 EXPECT_EQ(127u, one.countLeadingZeros()); 91 EXPECT_EQ(0u, one.countLeadingOnes()); 92 EXPECT_EQ(1u, one.getActiveBits()); 93 EXPECT_EQ(0u, one.countTrailingZeros()); 94 EXPECT_EQ(1u, one.countTrailingOnes()); 95 EXPECT_EQ(1u, one.countPopulation()); 96 EXPECT_EQ(1, one.getSExtValue()); 97 EXPECT_EQ(1u, one.getZExtValue()); 98 } 99 100 } 101