[llvm] [AArch64] Define high bits of FPR and GPR registers. (PR #114263)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 30 10:01:54 PDT 2024
================
@@ -0,0 +1,148 @@
+#include "AArch64InstrInfo.h"
+#include "AArch64Subtarget.h"
+#include "AArch64TargetMachine.h"
+#include "AArch64RegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/MC/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetOptions.h"
+
+#include "gtest/gtest.h"
+
+#define GET_COMPUTE_FEATURES
+#include "AArch64GenInstrInfo.inc"
+
+using namespace llvm;
+
+namespace {
+
+std::unique_ptr<LLVMTargetMachine> createTargetMachine(const std::string &CPU) {
+ auto TT(Triple::normalize("aarch64--"));
+
+ LLVMInitializeAArch64TargetInfo();
+ LLVMInitializeAArch64Target();
+ LLVMInitializeAArch64TargetMC();
+
+ std::string Error;
+ const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);
+
+ return std::unique_ptr<LLVMTargetMachine>(static_cast<LLVMTargetMachine *>(
+ TheTarget->createTargetMachine(TT, CPU, "", TargetOptions(), std::nullopt,
+ std::nullopt, CodeGenOptLevel::Default)));
+}
+
+std::unique_ptr<AArch64InstrInfo> createInstrInfo(TargetMachine *TM) {
+ AArch64Subtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
+ std::string(TM->getTargetCPU()),
+ std::string(TM->getTargetFeatureString()), *TM, true);
+ return std::make_unique<AArch64InstrInfo>(ST);
+}
+
+TEST(AArch64LaneBitmasks, SubRegs) {
+ std::unique_ptr<LLVMTargetMachine> TM = createTargetMachine("");
+ ASSERT_TRUE(TM);
+
+ std::unique_ptr<AArch64InstrInfo> II = createInstrInfo(TM.get());
+ ASSERT_TRUE(II);
+
+ const AArch64RegisterInfo &TRI = II->getRegisterInfo();
+
+ // Test that the lane masks for the subregisters 'bsub, hsub, ssub, etc'
+ // are composed correctly.
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::bsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::bsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::hsub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::hsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::hsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::ssub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::ssub) |
+ TRI.getSubRegIndexLaneMask(AArch64::ssub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::dsub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::dsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::zsub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::zsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::zsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::zsub0));
+
+ // Test that the lane masks for tuples are composed correctly.
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_bsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_bsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_hsub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_hsub) |
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_hsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_ssub));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_ssub) |
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1_then_ssub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::dsub1));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub1) |
+ TRI.getSubRegIndexLaneMask(AArch64::qsub1_then_dsub_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::qsub1));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::sub_32) |
+ TRI.getSubRegIndexLaneMask(AArch64::sub_32_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::sube64));
+
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::subo64_then_sub_32) |
+ TRI.getSubRegIndexLaneMask(AArch64::subo64_then_sub_32_hi),
+ TRI.getSubRegIndexLaneMask(AArch64::subo64));
+
+ // Test that there is no overlap between different (sub)registers
+ // in a tuple.
+ ASSERT_EQ(TRI.getSubRegIndexLaneMask(AArch64::dsub0) &
----------------
arsenm wrote:
EXPECT_EQ throughout
https://github.com/llvm/llvm-project/pull/114263
More information about the llvm-commits
mailing list