/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "managed_register_arm.h"
#include "base/globals.h"
#include "gtest/gtest.h"

namespace art {
namespace arm {

TEST(ArmManagedRegister, NoRegister) {
  ArmManagedRegister reg = ManagedRegister::NoRegister().AsArm();
  EXPECT_TRUE(reg.IsNoRegister());
  EXPECT_TRUE(!reg.Overlaps(reg));
}

TEST(ArmManagedRegister, CoreRegister) {
  ArmManagedRegister reg = ArmManagedRegister::FromCoreRegister(R0);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(R0, reg.AsCoreRegister());

  reg = ArmManagedRegister::FromCoreRegister(R1);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(R1, reg.AsCoreRegister());

  reg = ArmManagedRegister::FromCoreRegister(R8);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(R8, reg.AsCoreRegister());

  reg = ArmManagedRegister::FromCoreRegister(R15);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(R15, reg.AsCoreRegister());
}


TEST(ArmManagedRegister, SRegister) {
  ArmManagedRegister reg = ArmManagedRegister::FromSRegister(S0);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S0, reg.AsSRegister());

  reg = ArmManagedRegister::FromSRegister(S1);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S1, reg.AsSRegister());

  reg = ArmManagedRegister::FromSRegister(S3);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S3, reg.AsSRegister());

  reg = ArmManagedRegister::FromSRegister(S15);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S15, reg.AsSRegister());

  reg = ArmManagedRegister::FromSRegister(S30);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S30, reg.AsSRegister());

  reg = ArmManagedRegister::FromSRegister(S31);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(S31, reg.AsSRegister());
}


TEST(ArmManagedRegister, DRegister) {
  ArmManagedRegister reg = ArmManagedRegister::FromDRegister(D0);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D0, reg.AsDRegister());
  EXPECT_EQ(S0, reg.AsOverlappingDRegisterLow());
  EXPECT_EQ(S1, reg.AsOverlappingDRegisterHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromSRegisterPair(S0)));

  reg = ArmManagedRegister::FromDRegister(D1);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D1, reg.AsDRegister());
  EXPECT_EQ(S2, reg.AsOverlappingDRegisterLow());
  EXPECT_EQ(S3, reg.AsOverlappingDRegisterHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromSRegisterPair(S2)));

  reg = ArmManagedRegister::FromDRegister(D6);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D6, reg.AsDRegister());
  EXPECT_EQ(S12, reg.AsOverlappingDRegisterLow());
  EXPECT_EQ(S13, reg.AsOverlappingDRegisterHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromSRegisterPair(S12)));

  reg = ArmManagedRegister::FromDRegister(D14);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D14, reg.AsDRegister());
  EXPECT_EQ(S28, reg.AsOverlappingDRegisterLow());
  EXPECT_EQ(S29, reg.AsOverlappingDRegisterHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromSRegisterPair(S28)));

  reg = ArmManagedRegister::FromDRegister(D15);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D15, reg.AsDRegister());
  EXPECT_EQ(S30, reg.AsOverlappingDRegisterLow());
  EXPECT_EQ(S31, reg.AsOverlappingDRegisterHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromSRegisterPair(S30)));

#ifdef VFPv3_D32
  reg = ArmManagedRegister::FromDRegister(D16);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D16, reg.AsDRegister());

  reg = ArmManagedRegister::FromDRegister(D18);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D18, reg.AsDRegister());

  reg = ArmManagedRegister::FromDRegister(D30);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D30, reg.AsDRegister());

  reg = ArmManagedRegister::FromDRegister(D31);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(!reg.IsRegisterPair());
  EXPECT_EQ(D31, reg.AsDRegister());
#endif  // VFPv3_D32
}


TEST(ArmManagedRegister, Pair) {
  ArmManagedRegister reg = ArmManagedRegister::FromRegisterPair(R0_R1);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(reg.IsRegisterPair());
  EXPECT_EQ(R0_R1, reg.AsRegisterPair());
  EXPECT_EQ(R0, reg.AsRegisterPairLow());
  EXPECT_EQ(R1, reg.AsRegisterPairHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromCoreRegisterPair(R0)));

  reg = ArmManagedRegister::FromRegisterPair(R1_R2);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(reg.IsRegisterPair());
  EXPECT_EQ(R1_R2, reg.AsRegisterPair());
  EXPECT_EQ(R1, reg.AsRegisterPairLow());
  EXPECT_EQ(R2, reg.AsRegisterPairHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromCoreRegisterPair(R1)));

  reg = ArmManagedRegister::FromRegisterPair(R2_R3);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(reg.IsRegisterPair());
  EXPECT_EQ(R2_R3, reg.AsRegisterPair());
  EXPECT_EQ(R2, reg.AsRegisterPairLow());
  EXPECT_EQ(R3, reg.AsRegisterPairHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromCoreRegisterPair(R2)));

  reg = ArmManagedRegister::FromRegisterPair(R4_R5);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(reg.IsRegisterPair());
  EXPECT_EQ(R4_R5, reg.AsRegisterPair());
  EXPECT_EQ(R4, reg.AsRegisterPairLow());
  EXPECT_EQ(R5, reg.AsRegisterPairHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromCoreRegisterPair(R4)));

  reg = ArmManagedRegister::FromRegisterPair(R6_R7);
  EXPECT_TRUE(!reg.IsNoRegister());
  EXPECT_TRUE(!reg.IsCoreRegister());
  EXPECT_TRUE(!reg.IsSRegister());
  EXPECT_TRUE(!reg.IsDRegister());
  EXPECT_TRUE(!reg.IsOverlappingDRegister());
  EXPECT_TRUE(reg.IsRegisterPair());
  EXPECT_EQ(R6_R7, reg.AsRegisterPair());
  EXPECT_EQ(R6, reg.AsRegisterPairLow());
  EXPECT_EQ(R7, reg.AsRegisterPairHigh());
  EXPECT_TRUE(reg.Equals(ArmManagedRegister::FromCoreRegisterPair(R6)));
}


TEST(ArmManagedRegister, Equals) {
  ManagedRegister no_reg = ManagedRegister::NoRegister();
  EXPECT_TRUE(no_reg.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!no_reg.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!no_reg.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!no_reg.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!no_reg.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!no_reg.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_R0 = ArmManagedRegister::FromCoreRegister(R0);
  EXPECT_TRUE(!reg_R0.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(reg_R0.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_R0.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_R0.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R0.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R0.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_R1 = ArmManagedRegister::FromCoreRegister(R1);
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(reg_R1.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_R1.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_R8 = ArmManagedRegister::FromCoreRegister(R8);
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(reg_R8.Equals(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_R8.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_S0 = ArmManagedRegister::FromSRegister(S0);
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(reg_S0.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_S0.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_S1 = ArmManagedRegister::FromSRegister(S1);
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(reg_S1.Equals(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_S1.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_S31 = ArmManagedRegister::FromSRegister(S31);
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(reg_S31.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_S31.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_D0 = ArmManagedRegister::FromDRegister(D0);
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(reg_D0.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_D0.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_D15 = ArmManagedRegister::FromDRegister(D15);
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(reg_D15.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg_D15.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

#ifdef VFPv3_D32
  ArmManagedRegister reg_D16 = ArmManagedRegister::FromDRegister(D16);
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(reg_D16.Equals(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg_D16.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_D30 = ArmManagedRegister::FromDRegister(D30);
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(reg_D30.Equals(ArmManagedRegister::FromDRegister(D30)));
  EXPECT_TRUE(!reg_D30.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));

  ArmManagedRegister reg_D31 = ArmManagedRegister::FromDRegister(D30);
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromDRegister(D30)));
  EXPECT_TRUE(reg_D31.Equals(ArmManagedRegister::FromDRegister(D31)));
  EXPECT_TRUE(!reg_D31.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));
#endif  // VFPv3_D32

  ArmManagedRegister reg_R0R1 = ArmManagedRegister::FromRegisterPair(R0_R1);
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(reg_R0R1.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg_R0R1.Equals(ArmManagedRegister::FromRegisterPair(R2_R3)));

  ArmManagedRegister reg_R4R5 = ArmManagedRegister::FromRegisterPair(R4_R5);
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(reg_R4R5.Equals(ArmManagedRegister::FromRegisterPair(R4_R5)));
  EXPECT_TRUE(!reg_R4R5.Equals(ArmManagedRegister::FromRegisterPair(R6_R7)));

  ArmManagedRegister reg_R6R7 = ArmManagedRegister::FromRegisterPair(R6_R7);
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::NoRegister()));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg_R6R7.Equals(ArmManagedRegister::FromRegisterPair(R4_R5)));
  EXPECT_TRUE(reg_R6R7.Equals(ArmManagedRegister::FromRegisterPair(R6_R7)));
}


TEST(ArmManagedRegister, Overlaps) {
  ArmManagedRegister reg = ArmManagedRegister::FromCoreRegister(R0);
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromCoreRegister(R1);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromCoreRegister(R7);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromSRegister(S0);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromSRegister(S1);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromSRegister(S15);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromSRegister(S31);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromDRegister(D0);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromDRegister(D7);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromDRegister(D15);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

#ifdef VFPv3_D32
  reg = ArmManagedRegister::FromDRegister(D16);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromDRegister(D31);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));
#endif  // VFPv3_D32

  reg = ArmManagedRegister::FromRegisterPair(R0_R1);
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));

  reg = ArmManagedRegister::FromRegisterPair(R4_R5);
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromCoreRegister(R8)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S2)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S15)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S30)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromSRegister(S31)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D0)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D1)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D7)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D15)));
#ifdef VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D16)));
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromDRegister(D31)));
#endif  // VFPv3_D32
  EXPECT_TRUE(!reg.Overlaps(ArmManagedRegister::FromRegisterPair(R0_R1)));
  EXPECT_TRUE(reg.Overlaps(ArmManagedRegister::FromRegisterPair(R4_R5)));
}

}  // namespace arm
}  // namespace art
