mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-19 17:24:57 +00:00
This commit moves the APSInt initialization code that's used by the LLLexer class into a new APSInt constructor that constructs APSInts from strings. This change is useful for MIR Serialization, as it would allow the MILexer class to use the same APSInt initialization as LLexer when parsing immediate machine operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240436 91177308-0d34-0410-b5e6-96231b3b80d8
166 lines
6.4 KiB
C++
166 lines
6.4 KiB
C++
//===- llvm/unittest/ADT/APSIntTest.cpp - APSInt unit tests ---------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/APSInt.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
TEST(APSIntTest, MoveTest) {
|
|
APSInt A(32, true);
|
|
EXPECT_TRUE(A.isUnsigned());
|
|
|
|
APSInt B(128, false);
|
|
A = B;
|
|
EXPECT_FALSE(A.isUnsigned());
|
|
|
|
APSInt C(B);
|
|
EXPECT_FALSE(C.isUnsigned());
|
|
|
|
APInt Wide(256, 0);
|
|
const uint64_t *Bits = Wide.getRawData();
|
|
APSInt D(std::move(Wide));
|
|
EXPECT_TRUE(D.isUnsigned());
|
|
EXPECT_EQ(Bits, D.getRawData()); // Verify that "Wide" was really moved.
|
|
|
|
A = APSInt(64, true);
|
|
EXPECT_TRUE(A.isUnsigned());
|
|
|
|
Wide = APInt(128, 1);
|
|
Bits = Wide.getRawData();
|
|
A = std::move(Wide);
|
|
EXPECT_TRUE(A.isUnsigned());
|
|
EXPECT_EQ(Bits, A.getRawData()); // Verify that "Wide" was really moved.
|
|
}
|
|
|
|
TEST(APSIntTest, get) {
|
|
EXPECT_TRUE(APSInt::get(7).isSigned());
|
|
EXPECT_EQ(64u, APSInt::get(7).getBitWidth());
|
|
EXPECT_EQ(7u, APSInt::get(7).getZExtValue());
|
|
EXPECT_EQ(7, APSInt::get(7).getSExtValue());
|
|
EXPECT_TRUE(APSInt::get(-7).isSigned());
|
|
EXPECT_EQ(64u, APSInt::get(-7).getBitWidth());
|
|
EXPECT_EQ(-7, APSInt::get(-7).getSExtValue());
|
|
EXPECT_EQ(UINT64_C(0) - 7, APSInt::get(-7).getZExtValue());
|
|
}
|
|
|
|
TEST(APSIntTest, getUnsigned) {
|
|
EXPECT_TRUE(APSInt::getUnsigned(7).isUnsigned());
|
|
EXPECT_EQ(64u, APSInt::getUnsigned(7).getBitWidth());
|
|
EXPECT_EQ(7u, APSInt::getUnsigned(7).getZExtValue());
|
|
EXPECT_EQ(7, APSInt::getUnsigned(7).getSExtValue());
|
|
EXPECT_TRUE(APSInt::getUnsigned(-7).isUnsigned());
|
|
EXPECT_EQ(64u, APSInt::getUnsigned(-7).getBitWidth());
|
|
EXPECT_EQ(-7, APSInt::getUnsigned(-7).getSExtValue());
|
|
EXPECT_EQ(UINT64_C(0) - 7, APSInt::getUnsigned(-7).getZExtValue());
|
|
}
|
|
|
|
TEST(APSIntTest, getExtValue) {
|
|
EXPECT_TRUE(APSInt(APInt(3, 7), true).isUnsigned());
|
|
EXPECT_TRUE(APSInt(APInt(3, 7), false).isSigned());
|
|
EXPECT_TRUE(APSInt(APInt(4, 7), true).isUnsigned());
|
|
EXPECT_TRUE(APSInt(APInt(4, 7), false).isSigned());
|
|
EXPECT_TRUE(APSInt(APInt(4, -7), true).isUnsigned());
|
|
EXPECT_TRUE(APSInt(APInt(4, -7), false).isSigned());
|
|
EXPECT_EQ(7, APSInt(APInt(3, 7), true).getExtValue());
|
|
EXPECT_EQ(-1, APSInt(APInt(3, 7), false).getExtValue());
|
|
EXPECT_EQ(7, APSInt(APInt(4, 7), true).getExtValue());
|
|
EXPECT_EQ(7, APSInt(APInt(4, 7), false).getExtValue());
|
|
EXPECT_EQ(9, APSInt(APInt(4, -7), true).getExtValue());
|
|
EXPECT_EQ(-7, APSInt(APInt(4, -7), false).getExtValue());
|
|
}
|
|
|
|
TEST(APSIntTest, compareValues) {
|
|
auto U = [](uint64_t V) { return APSInt::getUnsigned(V); };
|
|
auto S = [](int64_t V) { return APSInt::get(V); };
|
|
|
|
// Bit-width matches and is-signed.
|
|
EXPECT_TRUE(APSInt::compareValues(S(7), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8), S(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(7), S(7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8), S(-7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7)) == 0);
|
|
|
|
// Bit-width matches and not is-signed.
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), U(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), U(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), U(7)) == 0);
|
|
|
|
// Bit-width matches and mixed signs.
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), S(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), S(7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), S(-7)) > 0);
|
|
|
|
// Bit-width mismatch and is-signed.
|
|
EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(7).trunc(32), S(7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8).trunc(32), S(-7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-8)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-8).trunc(32), S(-7)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7).trunc(32), S(-7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(7), S(8).trunc(32)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8), S(7).trunc(32)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(7), S(7).trunc(32)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(8).trunc(32)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(8), S(-7).trunc(32)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-8).trunc(32)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-8), S(-7).trunc(32)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(S(-7), S(-7).trunc(32)) == 0);
|
|
|
|
// Bit-width mismatch and not is-signed.
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), U(8).trunc(32)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), U(7).trunc(32)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), U(7).trunc(32)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), U(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), U(7)) == 0);
|
|
|
|
// Bit-width mismatch and mixed signs.
|
|
EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(8)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7).trunc(32), S(7)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8).trunc(32), S(-7)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), S(8).trunc(32)) < 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), S(7).trunc(32)) > 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(7), S(7).trunc(32)) == 0);
|
|
EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0);
|
|
}
|
|
|
|
TEST(APSIntTest, FromString) {
|
|
EXPECT_EQ(APSInt("1").getExtValue(), 1);
|
|
EXPECT_EQ(APSInt("-1").getExtValue(), -1);
|
|
EXPECT_EQ(APSInt("0").getExtValue(), 0);
|
|
EXPECT_EQ(APSInt("56789").getExtValue(), 56789);
|
|
EXPECT_EQ(APSInt("-1234").getExtValue(), -1234);
|
|
}
|
|
|
|
#ifdef GTEST_HAS_DEATH_TEST
|
|
#ifndef NDEBUG
|
|
|
|
TEST(APSIntTest, StringDeath) {
|
|
EXPECT_DEATH(APSInt(""), "Invalid string length");
|
|
EXPECT_DEATH(APSInt("1a"), "Invalid character in digit string");
|
|
}
|
|
|
|
#endif
|
|
#endif
|
|
|
|
} // end anonymous namespace
|