Skip to content

Commit 90c01f4

Browse files
authored
[RISCV] Add missing bitmask for some extensions (#135599)
According to: https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc#extension-bitmask-definitions And we sort the bitmask by group id and then bit position.
1 parent e4a672b commit 90c01f4

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

llvm/lib/Target/RISCV/RISCVFeatures.td

+24-12
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ def FeatureStdExtZihpm
154154
: RISCVExtension<2, 0, "Hardware Performance Counters",
155155
[FeatureStdExtZicsr]>;
156156

157-
def FeatureStdExtZimop : RISCVExtension<1, 0, "May-Be-Operations">;
157+
def FeatureStdExtZimop : RISCVExtension<1, 0, "May-Be-Operations">,
158+
RISCVExtensionBitmask<1, 1>;
158159
def HasStdExtZimop : Predicate<"Subtarget->hasStdExtZimop()">,
159160
AssemblerPredicate<(all_of FeatureStdExtZimop),
160161
"'Zimop' (May-Be-Operations)">;
@@ -262,7 +263,8 @@ def HasStdExtZalasr : Predicate<"Subtarget->hasStdExtZalasr()">,
262263
def FeatureStdExtZama16b
263264
: RISCVExtension<1, 0, "Atomic 16-byte misaligned loads, stores and AMOs">;
264265

265-
def FeatureStdExtZawrs : RISCVExtension<1, 0, "Wait on Reservation Set">;
266+
def FeatureStdExtZawrs : RISCVExtension<1, 0, "Wait on Reservation Set">,
267+
RISCVExtensionBitmask<1, 7>;
266268
def HasStdExtZawrs : Predicate<"Subtarget->hasStdExtZawrs()">,
267269
AssemblerPredicate<(all_of FeatureStdExtZawrs),
268270
"'Zawrs' (Wait on Reservation Set)">;
@@ -368,7 +370,8 @@ def HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">,
368370
def FeatureStdExtZca
369371
: RISCVExtension<1, 0,
370372
"part of the C extension, excluding compressed "
371-
"floating point loads/stores">;
373+
"floating point loads/stores">,
374+
RISCVExtensionBitmask<1, 2>;
372375

373376
def FeatureStdExtC
374377
: RISCVExtension<2, 0, "Compressed Instructions", [FeatureStdExtZca]>,
@@ -387,15 +390,17 @@ def HasStdExtCOrZca
387390

388391
def FeatureStdExtZcb
389392
: RISCVExtension<1, 0, "Compressed basic bit manipulation instructions",
390-
[FeatureStdExtZca]>;
393+
[FeatureStdExtZca]>,
394+
RISCVExtensionBitmask<1, 3>;
391395
def HasStdExtZcb : Predicate<"Subtarget->hasStdExtZcb()">,
392396
AssemblerPredicate<(all_of FeatureStdExtZcb),
393397
"'Zcb' (Compressed basic bit manipulation instructions)">;
394398

395399
def FeatureStdExtZcd
396400
: RISCVExtension<1, 0,
397401
"Compressed Double-Precision Floating-Point Instructions",
398-
[FeatureStdExtD, FeatureStdExtZca]>;
402+
[FeatureStdExtD, FeatureStdExtZca]>,
403+
RISCVExtensionBitmask<1, 4>;
399404

400405
def HasStdExtCOrZcd
401406
: Predicate<"Subtarget->hasStdExtCOrZcd()">,
@@ -406,7 +411,8 @@ def HasStdExtCOrZcd
406411
def FeatureStdExtZcf
407412
: RISCVExtension<1, 0,
408413
"Compressed Single-Precision Floating-Point Instructions",
409-
[FeatureStdExtF, FeatureStdExtZca]>;
414+
[FeatureStdExtF, FeatureStdExtZca]>,
415+
RISCVExtensionBitmask<1, 5>;
410416

411417
def FeatureStdExtZclsd
412418
: RISCVExtension<1, 0,
@@ -447,7 +453,8 @@ def HasStdExtCOrZcfOrZce
447453

448454
def FeatureStdExtZcmop
449455
: RISCVExtension<1, 0, "Compressed May-Be-Operations",
450-
[FeatureStdExtZca]>;
456+
[FeatureStdExtZca]>,
457+
RISCVExtensionBitmask<1, 6>;
451458
def HasStdExtZcmop : Predicate<"Subtarget->hasStdExtZcmop()">,
452459
AssemblerPredicate<(all_of FeatureStdExtZcmop),
453460
"'Zcmop' (Compressed May-Be-Operations)">;
@@ -628,32 +635,37 @@ def FeatureStdExtZve32x
628635
: RISCVExtension<1, 0,
629636
"Vector Extensions for Embedded Processors "
630637
"with maximal 32 EEW",
631-
[FeatureStdExtZicsr, FeatureStdExtZvl32b]>;
638+
[FeatureStdExtZicsr, FeatureStdExtZvl32b]>,
639+
RISCVExtensionBitmask<0, 60>;
632640

633641

634642
def FeatureStdExtZve32f
635643
: RISCVExtension<1, 0,
636644
"Vector Extensions for Embedded Processors "
637645
"with maximal 32 EEW and F extension",
638-
[FeatureStdExtZve32x, FeatureStdExtF]>;
646+
[FeatureStdExtZve32x, FeatureStdExtF]>,
647+
RISCVExtensionBitmask<0, 61>;
639648

640649
def FeatureStdExtZve64x
641650
: RISCVExtension<1, 0,
642651
"Vector Extensions for Embedded Processors "
643652
"with maximal 64 EEW",
644-
[FeatureStdExtZve32x, FeatureStdExtZvl64b]>;
653+
[FeatureStdExtZve32x, FeatureStdExtZvl64b]>,
654+
RISCVExtensionBitmask<0, 62>;
645655

646656
def FeatureStdExtZve64f
647657
: RISCVExtension<1, 0,
648658
"Vector Extensions for Embedded Processors "
649659
"with maximal 64 EEW and F extension",
650-
[FeatureStdExtZve32f, FeatureStdExtZve64x]>;
660+
[FeatureStdExtZve32f, FeatureStdExtZve64x]>,
661+
RISCVExtensionBitmask<0, 63>;
651662

652663
def FeatureStdExtZve64d
653664
: RISCVExtension<1, 0,
654665
"Vector Extensions for Embedded Processors "
655666
"with maximal 64 EEW, F and D extension",
656-
[FeatureStdExtZve64f, FeatureStdExtD]>;
667+
[FeatureStdExtZve64f, FeatureStdExtD]>,
668+
RISCVExtensionBitmask<1, 0>;
657669

658670
def FeatureStdExtV
659671
: RISCVExtension<1, 0,

llvm/utils/TableGen/Basic/RISCVTargetDefEmitter.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,12 @@ static void emitRISCVExtensionBitmask(const RecordKeeper &RK, raw_ostream &OS) {
224224
std::vector<const Record *> Extensions =
225225
RK.getAllDerivedDefinitionsIfDefined("RISCVExtensionBitmask");
226226
llvm::sort(Extensions, [](const Record *Rec1, const Record *Rec2) {
227-
return getExtensionName(Rec1) < getExtensionName(Rec2);
227+
unsigned GroupID1 = Rec1->getValueAsInt("GroupID");
228+
unsigned GroupID2 = Rec2->getValueAsInt("GroupID");
229+
if (GroupID1 != GroupID2)
230+
return GroupID1 < GroupID2;
231+
232+
return Rec1->getValueAsInt("BitPos") < Rec2->getValueAsInt("BitPos");
228233
});
229234

230235
#ifndef NDEBUG

0 commit comments

Comments
 (0)