Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions clang/test/Driver/aarch64-v97a.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@
// GENERICV97A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+v9.7a"{{.*}}

// ===== Features supported on aarch64 =====

// RUN: %clang -target aarch64 -march=armv9.7a+cmh -### -c %s 2>&1 | FileCheck -check-prefix=V97A-CMH %s
// RUN: %clang -target aarch64 -march=armv9.7-a+cmh -### -c %s 2>&1 | FileCheck -check-prefix=V97A-CMH %s
// V97A-CMH: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+v9.7a"{{.*}} "-target-feature" "+cmh"

// RUN: %clang -target aarch64 -march=armv9.7a+lscp -### -c %s 2>&1 | FileCheck -check-prefix=V97A-LSCP %s
// RUN: %clang -target aarch64 -march=armv9.7-a+lscp -### -c %s 2>&1 | FileCheck -check-prefix=V97A-LSCP %s
// V97A-LSCP: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+v9.7a"{{.*}} "-target-feature" "+lscp"
2 changes: 2 additions & 0 deletions clang/test/Driver/print-supported-extensions-aarch64.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
// CHECK-NEXT: bf16 FEAT_BF16 Enable BFloat16 Extension
// CHECK-NEXT: brbe FEAT_BRBE Enable Branch Record Buffer Extension
// CHECK-NEXT: bti FEAT_BTI Enable Branch Target Identification
// CHECK-NEXT: cmh FEAT_CMH Enable Armv9.7-A Contention Management Hints
// CHECK-NEXT: cmpbr FEAT_CMPBR Enable Armv9.6-A base compare and branch instructions
// CHECK-NEXT: fcma FEAT_FCMA Enable Armv8.3-A Floating-point complex number support
// CHECK-NEXT: cpa FEAT_CPA Enable Armv9.5-A Checked Pointer Arithmetic
Expand Down Expand Up @@ -37,6 +38,7 @@
// CHECK-NEXT: ite FEAT_ITE Enable Armv9.4-A Instrumentation Extension
// CHECK-NEXT: jscvt FEAT_JSCVT Enable Armv8.3-A JavaScript FP conversion instructions
// CHECK-NEXT: ls64 FEAT_LS64, FEAT_LS64_V, FEAT_LS64_ACCDATA Enable Armv8.7-A LD64B/ST64B Accelerator Extension
// CHECK-NEXT: lscp FEAT_LSCP Enable Armv9.7-A Load-acquire and store-release pair extension
// CHECK-NEXT: lse FEAT_LSE Enable Armv8.1-A Large System Extension (LSE) atomic instructions
// CHECK-NEXT: lse128 FEAT_LSE128 Enable Armv9.4-A 128-bit Atomic instructions
// CHECK-NEXT: lsfe FEAT_LSFE Enable Armv9.6-A base Atomic floating-point in-memory instructions
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Target/AArch64/AArch64Features.td
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,11 @@ def FeatureSSVE_FEXPA : ExtensionWithMArch<"ssve-fexpa", "SSVE_FEXPA", "FEAT_SSV
// Armv9.7 Architecture Extensions
//===----------------------------------------------------------------------===//

def FeatureCMH : ExtensionWithMArch<"cmh", "CMH", "FEAT_CMH",
"Enable Armv9.7-A Contention Management Hints">;

def FeatureLSCP : ExtensionWithMArch<"lscp", "LSCP", "FEAT_LSCP",
"Enable Armv9.7-A Load-acquire and store-release pair extension">;

//===----------------------------------------------------------------------===//
// Other Features
Expand Down
78 changes: 78 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -1894,6 +1894,21 @@ def btihint_op : Operand<i32> {
}];
}

def CMHPriorityHintOperand : AsmOperandClass {
let Name = "CMHPriorityHint";
let ParserMethod = "tryParseCMHPriorityHint";
}

def CMHPriorityHint_op : Operand<i32> {
let ParserMatchClass = CMHPriorityHintOperand;
let PrintMethod = "printCMHPriorityHintOp";
let MCOperandPredicate = [{
if (!MCOp.isImm())
return false;
return AArch64CMHPriorityHint::lookupCMHPriorityHintByEncoding(MCOp.getImm()) != nullptr;
}];
}

class MRSI : RtSystemI<1, (outs GPR64:$Rt), (ins mrs_sysreg_op:$systemreg),
"mrs", "\t$Rt, $systemreg"> {
bits<16> systemreg;
Expand Down Expand Up @@ -4636,6 +4651,48 @@ multiclass StorePairOffset<bits<2> opc, bit V, RegisterOperand regtype,
GPR64sp:$Rn, 0)>;
}

class BaseLoadStoreAcquirePairOffset<bits<4> opc, bit L, dag oops, dag iops,
string asm>
: I<oops, iops, asm, "\t$Rt, $Rt2, [$Rn, #0]", "", []> {
bits<5> Rt;
bits<5> Rt2;
bits<5> Rn;
let Inst{31-23} = 0b110110010;
let Inst{22} = L;
let Inst{21} = 0b0;
let Inst{20-16} = Rt2;
let Inst{15-12} = opc;
let Inst{11-10} = 0b10;
let Inst{9-5} = Rn;
let Inst{4-0} = Rt;
}

multiclass LoadAcquirePairOffset<bits<4> opc, string asm> {
let hasSideEffects = 0, mayStore = 0, mayLoad = 1 in
def i : BaseLoadStoreAcquirePairOffset<opc, 0b1,
(outs GPR64:$Rt, GPR64:$Rt2),
(ins GPR64sp:$Rn), asm>,
Sched<[WriteAtomic, WriteLDHi]>;

def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]",
(!cast<Instruction>(NAME # "i") GPR64:$Rt, GPR64:$Rt2,
GPR64sp:$Rn)>;
}


multiclass StoreAcquirePairOffset<bits<4> opc, string asm> {
let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
def i : BaseLoadStoreAcquirePairOffset<opc, 0b0, (outs),
(ins GPR64:$Rt, GPR64:$Rt2,
GPR64sp:$Rn),
asm>,
Sched<[WriteSTP]>;

def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]",
(!cast<Instruction>(NAME # "i") GPR64:$Rt, GPR64:$Rt2,
GPR64sp:$Rn)>;
}

// (pre-indexed)
class BaseLoadStorePairPreIdx<bits<2> opc, bit V, bit L, dag oops, dag iops,
string asm>
Expand Down Expand Up @@ -13227,3 +13284,24 @@ multiclass SIMDThreeSameVectorFP8MatrixMul<string asm>{
let Predicates = [HasNEON, HasF8F32MM];
}
}

//----------------------------------------------------------------------------
// Contention Management Hints - FEAT_CMH
//----------------------------------------------------------------------------

class SHUHInst<string asm> : I<
(outs),
(ins CMHPriorityHint_op:$priority),
asm, "\t$priority", "", []>, Sched<[]> {
bits<1> priority;
let Inst{31-12} = 0b11010101000000110010;
let Inst{11-8} = 0b0110;
let Inst{7-6} = 0b01;
let Inst{5} = priority;
let Inst{4-0} = 0b11111;
}

multiclass SHUH<string asm> {
def NAME : SHUHInst<asm>;
def : InstAlias<asm, (!cast<Instruction>(NAME) 0), 1>;
}
19 changes: 19 additions & 0 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,11 @@ def HasLSUI : Predicate<"Subtarget->hasLSUI()">,
def HasOCCMO : Predicate<"Subtarget->hasOCCMO()">,
AssemblerPredicateWithAll<(all_of FeatureOCCMO), "occmo">;

def HasCMH : Predicate<"Subtarget->hasCMH()">,
AssemblerPredicateWithAll<(all_of FeatureCMH), "cmh">;
def HasLSCP : Predicate<"Subtarget->hasLSCP()">,
AssemblerPredicateWithAll<(all_of FeatureLSCP), "lscp">;

// A subset of SVE(2) instructions are legal in Streaming SVE execution mode,
// they should be enabled if either has been specified.
def HasSVE_or_SME
Expand Down Expand Up @@ -3692,6 +3697,12 @@ def UDF : UDFType<0, "udf">;
// Load instructions.
//===----------------------------------------------------------------------===//

let Predicates = [HasLSCP] in {
defm LDAP : LoadAcquirePairOffset<0b0101, "ldap">;
defm LDAPP : LoadAcquirePairOffset<0b0111, "ldapp">;
defm STLP : StoreAcquirePairOffset<0b0101, "stlp">;
}

// Pair (indexed, offset)
defm LDPW : LoadPairOffset<0b00, 0, GPR32z, simm7s4, "ldp">;
defm LDPX : LoadPairOffset<0b10, 0, GPR64z, simm7s8, "ldp">;
Expand Down Expand Up @@ -11251,6 +11262,14 @@ let Predicates = [HasLSFE] in {
let Uses = [FPMR, FPCR] in
defm FMMLA : SIMDThreeSameVectorFP8MatrixMul<"fmmla">;

//===----------------------------------------------------------------------===//
// Contention Management Hints (FEAT_CMH)
//===----------------------------------------------------------------------===//

let Predicates = [HasCMH] in {
defm SHUH : SHUH<"shuh">; // Shared Update Hint instruction
}

include "AArch64InstrAtomics.td"
include "AArch64SVEInstrInfo.td"
include "AArch64SMEInstrInfo.td"
Expand Down
15 changes: 15 additions & 0 deletions llvm/lib/Target/AArch64/AArch64SystemOperands.td
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,21 @@ def : BTI<"c", 0b010>;
def : BTI<"j", 0b100>;
def : BTI<"jc", 0b110>;

//===----------------------------------------------------------------------===//
// CMHPriority instruction options.
//===----------------------------------------------------------------------===//

class CMHPriorityHint<string name, bits<1> encoding> : SearchableTable {
let SearchableFields = ["Name", "Encoding"];
let EnumValueField = "Encoding";

string Name = name;
bits<1> Encoding;
let Encoding = encoding;
}

def : CMHPriorityHint<"ph", 0b1>;

//===----------------------------------------------------------------------===//
// TLBI (translation lookaside buffer invalidate) instruction options.
//===----------------------------------------------------------------------===//
Expand Down
61 changes: 61 additions & 0 deletions llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ class AArch64AsmParser : public MCTargetAsmParser {
ParseStatus tryParseRPRFMOperand(OperandVector &Operands);
ParseStatus tryParsePSBHint(OperandVector &Operands);
ParseStatus tryParseBTIHint(OperandVector &Operands);
ParseStatus tryParseCMHPriorityHint(OperandVector &Operands);
ParseStatus tryParseAdrpLabel(OperandVector &Operands);
ParseStatus tryParseAdrLabel(OperandVector &Operands);
template <bool AddFPZeroAsLiteral>
Expand Down Expand Up @@ -370,6 +371,7 @@ class AArch64Operand : public MCParsedAsmOperand {
k_PSBHint,
k_PHint,
k_BTIHint,
k_CMHPriorityHint,
} Kind;

SMLoc StartLoc, EndLoc;
Expand Down Expand Up @@ -499,6 +501,11 @@ class AArch64Operand : public MCParsedAsmOperand {
unsigned Length;
unsigned Val;
};
struct CMHPriorityHintOp {
const char *Data;
unsigned Length;
unsigned Val;
};

struct SVCROp {
const char *Data;
Expand All @@ -525,6 +532,7 @@ class AArch64Operand : public MCParsedAsmOperand {
struct PSBHintOp PSBHint;
struct PHintOp PHint;
struct BTIHintOp BTIHint;
struct CMHPriorityHintOp CMHPriorityHint;
struct ShiftExtendOp ShiftExtend;
struct SVCROp SVCR;
};
Expand Down Expand Up @@ -595,6 +603,9 @@ class AArch64Operand : public MCParsedAsmOperand {
case k_BTIHint:
BTIHint = o.BTIHint;
break;
case k_CMHPriorityHint:
CMHPriorityHint = o.CMHPriorityHint;
break;
case k_ShiftExtend:
ShiftExtend = o.ShiftExtend;
break;
Expand Down Expand Up @@ -769,6 +780,16 @@ class AArch64Operand : public MCParsedAsmOperand {
return StringRef(BTIHint.Data, BTIHint.Length);
}

unsigned getCMHPriorityHint() const {
assert(Kind == k_CMHPriorityHint && "Invalid access!");
return CMHPriorityHint.Val;
}

StringRef getCMHPriorityHintName() const {
assert(Kind == k_CMHPriorityHint && "Invalid access!");
return StringRef(CMHPriorityHint.Data, CMHPriorityHint.Length);
}

StringRef getSVCR() const {
assert(Kind == k_SVCR && "Invalid access!");
return StringRef(SVCR.Data, SVCR.Length);
Expand Down Expand Up @@ -1511,6 +1532,7 @@ class AArch64Operand : public MCParsedAsmOperand {
bool isPSBHint() const { return Kind == k_PSBHint; }
bool isPHint() const { return Kind == k_PHint; }
bool isBTIHint() const { return Kind == k_BTIHint; }
bool isCMHPriorityHint() const { return Kind == k_CMHPriorityHint; }
bool isShiftExtend() const { return Kind == k_ShiftExtend; }
bool isShifter() const {
if (!isShiftExtend())
Expand Down Expand Up @@ -2196,6 +2218,11 @@ class AArch64Operand : public MCParsedAsmOperand {
Inst.addOperand(MCOperand::createImm(getBTIHint()));
}

void addCMHPriorityHintOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
Inst.addOperand(MCOperand::createImm(getCMHPriorityHint()));
}

void addShifterOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
unsigned Imm =
Expand Down Expand Up @@ -2546,6 +2573,17 @@ class AArch64Operand : public MCParsedAsmOperand {
return Op;
}

static std::unique_ptr<AArch64Operand>
CreateCMHPriorityHint(unsigned Val, StringRef Str, SMLoc S, MCContext &Ctx) {
auto Op = std::make_unique<AArch64Operand>(k_CMHPriorityHint, Ctx);
Op->CMHPriorityHint.Val = Val;
Op->CMHPriorityHint.Data = Str.data();
Op->CMHPriorityHint.Length = Str.size();
Op->StartLoc = S;
Op->EndLoc = S;
return Op;
}

static std::unique_ptr<AArch64Operand>
CreateMatrixRegister(unsigned RegNum, unsigned ElementWidth, MatrixKind Kind,
SMLoc S, SMLoc E, MCContext &Ctx) {
Expand Down Expand Up @@ -2656,6 +2694,9 @@ void AArch64Operand::print(raw_ostream &OS, const MCAsmInfo &MAI) const {
case k_BTIHint:
OS << getBTIHintName();
break;
case k_CMHPriorityHint:
OS << getCMHPriorityHintName();
break;
case k_MatrixRegister:
OS << "<matrix " << getMatrixReg() << ">";
break;
Expand Down Expand Up @@ -3279,6 +3320,24 @@ ParseStatus AArch64AsmParser::tryParseBTIHint(OperandVector &Operands) {
return ParseStatus::Success;
}

/// tryParseCMHPriorityHint - Try to parse a CMHPriority operand
ParseStatus AArch64AsmParser::tryParseCMHPriorityHint(OperandVector &Operands) {
SMLoc S = getLoc();
const AsmToken &Tok = getTok();
if (Tok.isNot(AsmToken::Identifier))
return TokError("invalid operand for instruction");

auto CMHPriority =
AArch64CMHPriorityHint::lookupCMHPriorityHintByName(Tok.getString());
if (!CMHPriority)
return TokError("invalid operand for instruction");

Operands.push_back(AArch64Operand::CreateCMHPriorityHint(
CMHPriority->Encoding, Tok.getString(), S, getContext()));
Lex(); // Eat identifier token.
return ParseStatus::Success;
}

/// tryParseAdrpLabel - Parse and validate a source label for the ADRP
/// instruction.
ParseStatus AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
Expand Down Expand Up @@ -3824,6 +3883,8 @@ static const struct Extension {
{"ssve-bitperm", {AArch64::FeatureSSVE_BitPerm}},
{"sme-mop4", {AArch64::FeatureSME_MOP4}},
{"sme-tmop", {AArch64::FeatureSME_TMOP}},
{"cmh", {AArch64::FeatureCMH}},
{"lscp", {AArch64::FeatureLSCP}},
};

static void setRequiredFeatureString(FeatureBitset FBS, std::string &Str) {
Expand Down
11 changes: 11 additions & 0 deletions llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,17 @@ void AArch64InstPrinter::printBTIHintOp(const MCInst *MI, unsigned OpNum,
markup(O, Markup::Immediate) << '#' << formatImm(btihintop);
}

void AArch64InstPrinter::printCMHPriorityHintOp(const MCInst *MI,
unsigned OpNum,
const MCSubtargetInfo &STI,
raw_ostream &O) {
unsigned priorityhint_op = MI->getOperand(OpNum).getImm();
auto PHint =
AArch64CMHPriorityHint::lookupCMHPriorityHintByEncoding(priorityhint_op);
if (PHint)
O << PHint->Name;
}

void AArch64InstPrinter::printFPImmOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI,
raw_ostream &O) {
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ class AArch64InstPrinter : public MCInstPrinter {
void printBTIHintOp(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);

void printCMHPriorityHintOp(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);

void printFPImmOperand(const MCInst *MI, unsigned OpNum,
const MCSubtargetInfo &STI, raw_ostream &O);

Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,13 @@ namespace llvm {
}
}

namespace llvm {
namespace AArch64CMHPriorityHint {
#define GET_CMHPRIORITYHINT_IMPL
#include "AArch64GenSystemOperands.inc"
} // namespace AArch64CMHPriorityHint
} // namespace llvm

namespace llvm {
namespace AArch64SysReg {
#define GET_SysRegsList_IMPL
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,14 @@ namespace AArch64BTIHint {
#include "AArch64GenSystemOperands.inc"
}

namespace AArch64CMHPriorityHint {
struct CMHPriorityHint : SysAlias {
using SysAlias::SysAlias;
};
#define GET_CMHPRIORITYHINT_DECL
#include "AArch64GenSystemOperands.inc"
} // namespace AArch64CMHPriorityHint

namespace AArch64SME {
enum ToggleCondition : unsigned {
Always,
Expand Down
Loading