@@ -11,9 +11,17 @@ def TestTarget : Target {
1111 let InstructionSet = TestTargetInstrInfo;
1212}
1313
14- def TestMode : HwMode<"+feat", []>;
15- def TestMode1 : HwMode<"+feat1", []>;
16- def TestMode2 : HwMode<"+feat2", []>;
14+ def Feat1 : SubtargetFeature<"feat1", "HasFeat1", "true", "enable feature 1">;
15+ def Feat2 : SubtargetFeature<"feat2", "HasFeat2", "true", "enable feature 2">;
16+
17+ def HasFeat1 : Predicate<"Subtarget->hasFeat1()">,
18+ AssemblerPredicate<(all_of Feat1)>;
19+ def HasFeat2 : Predicate<"Subtarget->hasFeat2()">,
20+ AssemblerPredicate<(all_of Feat1)>;
21+
22+ def TestMode : HwMode<[HasFeat1]>;
23+ def TestMode1 : HwMode<[HasFeat2]>;
24+ def TestMode2 : HwMode<[HasFeat1, HasFeat2]>;
1725
1826class MyReg<string n>
1927 : Register<n> {
@@ -120,13 +128,26 @@ def foo : Instruction {
120128 let AsmString = "foo $factor";
121129}
122130
131+ // CHECK-SUBTARGET-LABEL: unsigned TestTargetGenMCSubtargetInfo::getHwModeSet() const {
132+ // CHECK-SUBTARGET{LITERAL}:[[maybe_unused]] const FeatureBitset &FB = getFeatureBits();
133+ // CHECK-SUBTARGET-NEXT: // Collect HwModes and store them as a bit set.
134+ // CHECK-SUBTARGET-NEXT: unsigned Modes = 0;
135+ // CHECK-SUBTARGET-NEXT: if (FB[TestTarget::Feat1]) Modes |= (1 << 0);
136+ // CHECK-SUBTARGET-NEXT: if (FB[TestTarget::Feat1]) Modes |= (1 << 1);
137+ // CHECK-SUBTARGET-NEXT: if (FB[TestTarget::Feat1] && FB[TestTarget::Feat1]) Modes |= (1 << 2);
138+ // CHECK-SUBTARGET-NEXT: return Modes;
139+ // CHECK-SUBTARGET-NEXT: }
140+
123141// CHECK-SUBTARGET-LABEL: unsigned TestTargetGenSubtargetInfo::getHwModeSet() const {
124- // CHECK-SUBTARGET: unsigned Modes = 0;
125- // CHECK-SUBTARGET: if (checkFeatures("+feat")) Modes |= (1 << 0);
126- // CHECK-SUBTARGET: if (checkFeatures("+feat1")) Modes |= (1 << 1);
127- // CHECK-SUBTARGET: if (checkFeatures("+feat2")) Modes |= (1 << 2);
128- // CHECK-SUBTARGET: return Modes;
129- // CHECK-SUBTARGET: }
142+ // CHECK-SUBTARGET{LITERAL}:[[maybe_unused]] const auto *Subtarget =
143+ // CHECK-SUBTARGET-NEXT: static_cast<const TestTargetSubtarget *>(this);
144+ // CHECK-SUBTARGET-NEXT: // Collect HwModes and store them as a bit set.
145+ // CHECK-SUBTARGET-NEXT: unsigned Modes = 0;
146+ // CHECK-SUBTARGET-NEXT: if ((Subtarget->hasFeat1())) Modes |= (1 << 0);
147+ // CHECK-SUBTARGET-NEXT: if ((Subtarget->hasFeat2())) Modes |= (1 << 1);
148+ // CHECK-SUBTARGET-NEXT: if ((Subtarget->hasFeat1()) && (Subtarget->hasFeat2())) Modes |= (1 << 2);
149+ // CHECK-SUBTARGET-NEXT: return Modes;
150+ // CHECK-SUBTARGET-NEXT: }
130151// CHECK-SUBTARGET-LABEL: unsigned TestTargetGenSubtargetInfo::getHwMode(enum HwModeType type) const {
131152// CHECK-SUBTARGET: unsigned Modes = getHwModeSet();
132153// CHECK-SUBTARGET: if (!Modes)
0 commit comments