1c08dabb0SCullen Rhodes #include "AArch64Subtarget.h" 289b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h" 3c08dabb0SCullen Rhodes #include "llvm/Support/TargetSelect.h" 4c08dabb0SCullen Rhodes 5c08dabb0SCullen Rhodes #include "gtest/gtest.h" 6c08dabb0SCullen Rhodes 7c08dabb0SCullen Rhodes using namespace llvm; 8c08dabb0SCullen Rhodes 9c08dabb0SCullen Rhodes namespace { 10*bb3f5e1fSMatin Raayai std::unique_ptr<TargetMachine> createTargetMachine() { 11c08dabb0SCullen Rhodes auto TT(Triple::normalize("aarch64--")); 12c08dabb0SCullen Rhodes std::string CPU("generic"); 13c08dabb0SCullen Rhodes std::string FS("+sme"); 14c08dabb0SCullen Rhodes 15c08dabb0SCullen Rhodes LLVMInitializeAArch64TargetInfo(); 16c08dabb0SCullen Rhodes LLVMInitializeAArch64Target(); 17c08dabb0SCullen Rhodes LLVMInitializeAArch64TargetMC(); 18c08dabb0SCullen Rhodes 19c08dabb0SCullen Rhodes std::string Error; 20c08dabb0SCullen Rhodes const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error); 21c08dabb0SCullen Rhodes 22*bb3f5e1fSMatin Raayai return std::unique_ptr<TargetMachine>( 23b6a01caaSKazu Hirata TheTarget->createTargetMachine(TT, CPU, FS, TargetOptions(), std::nullopt, 24*bb3f5e1fSMatin Raayai std::nullopt, CodeGenOptLevel::Default)); 25c08dabb0SCullen Rhodes } 26c08dabb0SCullen Rhodes 27c08dabb0SCullen Rhodes std::unique_ptr<AArch64InstrInfo> createInstrInfo(TargetMachine *TM) { 28c08dabb0SCullen Rhodes AArch64Subtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()), 29607fb1bbSDavid Sherwood std::string(TM->getTargetCPU()), 30c08dabb0SCullen Rhodes std::string(TM->getTargetFeatureString()), *TM, 31c08dabb0SCullen Rhodes /* isLittle */ false); 32c08dabb0SCullen Rhodes return std::make_unique<AArch64InstrInfo>(ST); 33c08dabb0SCullen Rhodes } 34c08dabb0SCullen Rhodes 35c08dabb0SCullen Rhodes TEST(MatrixRegisterAliasing, Aliasing) { 36*bb3f5e1fSMatin Raayai std::unique_ptr<TargetMachine> TM = createTargetMachine(); 37c08dabb0SCullen Rhodes ASSERT_TRUE(TM); 38c08dabb0SCullen Rhodes std::unique_ptr<AArch64InstrInfo> II = createInstrInfo(TM.get()); 39c08dabb0SCullen Rhodes 40c08dabb0SCullen Rhodes const AArch64RegisterInfo &TRI = II->getRegisterInfo(); 41c08dabb0SCullen Rhodes 42c08dabb0SCullen Rhodes // za overlaps with za.b 43c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZA, AArch64::ZAB0)); 44c08dabb0SCullen Rhodes 45c08dabb0SCullen Rhodes // za0.b overlaps with all tiles 46c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAQ0)); 47c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAQ15)); 48c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAD0)); 49c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAD7)); 50c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAS0)); 51c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAS3)); 52c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAH0)); 53c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAH1)); 54c08dabb0SCullen Rhodes 55c08dabb0SCullen Rhodes // za0.h aliases with za0.q, za2.q, .. 56c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ0)); 57c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ2)); 58c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ4)); 59c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ6)); 60c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ8)); 61c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ10)); 62c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ12)); 63c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ14)); 64c08dabb0SCullen Rhodes 65c08dabb0SCullen Rhodes // za1.h aliases with za1.q, za3.q, ... 66c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ1)); 67c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ3)); 68c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ5)); 69c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ7)); 70c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ9)); 71c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ11)); 72c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ13)); 73c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ15)); 74c08dabb0SCullen Rhodes 75c08dabb0SCullen Rhodes // za1.h doesn't alias with za0.q, za2.q, .. 76c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ0)); 77c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ2)); 78c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ4)); 79c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ6)); 80c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ8)); 81c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ10)); 82c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ12)); 83c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ14)); 84c08dabb0SCullen Rhodes 85c08dabb0SCullen Rhodes // za0.h doesn't alias with za1.q, za3.q, .. 86c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ1)); 87c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ3)); 88c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ5)); 89c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ7)); 90c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ9)); 91c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ11)); 92c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ13)); 93c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ15)); 94c08dabb0SCullen Rhodes 95c08dabb0SCullen Rhodes // za0.s aliases with za0.q, za4.q, za8.q, za12.q 96c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ0)); 97c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ4)); 98c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ8)); 99c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ12)); 100c08dabb0SCullen Rhodes 101c08dabb0SCullen Rhodes // za1.s aliases with za1.q, za5.q, za9.q, za13.q 102c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ1)); 103c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ5)); 104c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ9)); 105c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ13)); 106c08dabb0SCullen Rhodes 107c08dabb0SCullen Rhodes // za0.s doesn't alias with za1.q, za5.q, za9.q, za13.q 108c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ1)); 109c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ5)); 110c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ9)); 111c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ13)); 112c08dabb0SCullen Rhodes 113c08dabb0SCullen Rhodes // za1.s doesn't alias with za0.q, za4.q, za8.q, za12.q 114c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ0)); 115c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ4)); 116c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ8)); 117c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ12)); 118c08dabb0SCullen Rhodes 119c08dabb0SCullen Rhodes // za0.d aliases za0.q and za8.q 120c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ0)); 121c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ8)); 122c08dabb0SCullen Rhodes 123c08dabb0SCullen Rhodes // za1.d aliases za1.q and za9.q 124c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ1)); 125c08dabb0SCullen Rhodes ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ9)); 126c08dabb0SCullen Rhodes 127c08dabb0SCullen Rhodes // za0.d doesn't alias with za1.q and za9.q 128c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ1)); 129c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ9)); 130c08dabb0SCullen Rhodes 131c08dabb0SCullen Rhodes // za1.d doesn't alias with za0.q and za8.q 132c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ0)); 133c08dabb0SCullen Rhodes ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ8)); 134c08dabb0SCullen Rhodes } 135c08dabb0SCullen Rhodes 136c08dabb0SCullen Rhodes } // end anonymous namespace 137