APInt's countLeadingOnes() was broken for negative i128 values,
[oota-llvm.git] / unittests / ADT / APInt.cpp
1 //===- llvm/unittest/ADT/APInt.cpp - APInt unit tests -----------*- C++ -*-===//
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 }