106c3fb27SDimitry Andric//===-- RISCVFeatures.td - RISC-V Features and Extensions --*- tablegen -*-===// 2bdd1243dSDimitry Andric// 3bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric// 7bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric 9bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 10bdd1243dSDimitry Andric// RISC-V subtarget features and instruction predicates. 11bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 12bdd1243dSDimitry Andric 1306c3fb27SDimitry Andricdef FeatureStdExtZicsr 1406c3fb27SDimitry Andric : SubtargetFeature<"zicsr", "HasStdExtZicsr", "true", 1506c3fb27SDimitry Andric "'zicsr' (CSRs)">; 1606c3fb27SDimitry Andricdef HasStdExtZicsr : Predicate<"Subtarget->hasStdExtZicsr()">, 1706c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicsr), 1806c3fb27SDimitry Andric "'Zicsr' (CSRs)">; 1906c3fb27SDimitry Andric 20bdd1243dSDimitry Andricdef FeatureStdExtM 21bdd1243dSDimitry Andric : SubtargetFeature<"m", "HasStdExtM", "true", 22bdd1243dSDimitry Andric "'M' (Integer Multiplication and Division)">; 23bdd1243dSDimitry Andricdef HasStdExtM : Predicate<"Subtarget->hasStdExtM()">, 24bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtM), 25bdd1243dSDimitry Andric "'M' (Integer Multiplication and Division)">; 26bdd1243dSDimitry Andric 27bdd1243dSDimitry Andricdef FeatureStdExtZmmul 28bdd1243dSDimitry Andric : SubtargetFeature<"zmmul", "HasStdExtZmmul", "true", 29bdd1243dSDimitry Andric "'Zmmul' (Integer Multiplication)">; 30bdd1243dSDimitry Andric 31bdd1243dSDimitry Andricdef HasStdExtMOrZmmul 32bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtM() || Subtarget->hasStdExtZmmul()">, 33bdd1243dSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtM, FeatureStdExtZmmul), 34bdd1243dSDimitry Andric "'M' (Integer Multiplication and Division) or " 35bdd1243dSDimitry Andric "'Zmmul' (Integer Multiplication)">; 36bdd1243dSDimitry Andric 37bdd1243dSDimitry Andricdef FeatureStdExtA 38bdd1243dSDimitry Andric : SubtargetFeature<"a", "HasStdExtA", "true", 39bdd1243dSDimitry Andric "'A' (Atomic Instructions)">; 40bdd1243dSDimitry Andricdef HasStdExtA : Predicate<"Subtarget->hasStdExtA()">, 41bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtA), 42bdd1243dSDimitry Andric "'A' (Atomic Instructions)">; 43bdd1243dSDimitry Andric 44bdd1243dSDimitry Andricdef FeatureStdExtF 45bdd1243dSDimitry Andric : SubtargetFeature<"f", "HasStdExtF", "true", 4606c3fb27SDimitry Andric "'F' (Single-Precision Floating-Point)", 4706c3fb27SDimitry Andric [FeatureStdExtZicsr]>; 48bdd1243dSDimitry Andricdef HasStdExtF : Predicate<"Subtarget->hasStdExtF()">, 49bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtF), 50bdd1243dSDimitry Andric "'F' (Single-Precision Floating-Point)">; 51bdd1243dSDimitry Andric 52bdd1243dSDimitry Andricdef FeatureStdExtD 53bdd1243dSDimitry Andric : SubtargetFeature<"d", "HasStdExtD", "true", 54bdd1243dSDimitry Andric "'D' (Double-Precision Floating-Point)", 55bdd1243dSDimitry Andric [FeatureStdExtF]>; 56bdd1243dSDimitry Andricdef HasStdExtD : Predicate<"Subtarget->hasStdExtD()">, 57bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtD), 58bdd1243dSDimitry Andric "'D' (Double-Precision Floating-Point)">; 59bdd1243dSDimitry Andric 60bdd1243dSDimitry Andricdef FeatureStdExtH 61bdd1243dSDimitry Andric : SubtargetFeature<"h", "HasStdExtH", "true", 62bdd1243dSDimitry Andric "'H' (Hypervisor)">; 63bdd1243dSDimitry Andric 64bdd1243dSDimitry Andricdef HasStdExtH : Predicate<"Subtarget->hasStdExtH()">, 65bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtH), 66bdd1243dSDimitry Andric "'H' (Hypervisor)">; 67bdd1243dSDimitry Andric 68bdd1243dSDimitry Andricdef FeatureStdExtZihintpause 69bdd1243dSDimitry Andric : SubtargetFeature<"zihintpause", "HasStdExtZihintpause", "true", 7006c3fb27SDimitry Andric "'Zihintpause' (Pause Hint)">; 71bdd1243dSDimitry Andricdef HasStdExtZihintpause : Predicate<"Subtarget->hasStdExtZihintpause()">, 72bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZihintpause), 73bdd1243dSDimitry Andric "'Zihintpause' (Pause Hint)">; 74bdd1243dSDimitry Andric 75bdd1243dSDimitry Andricdef FeatureStdExtZihintntl 765f757f3fSDimitry Andric : SubtargetFeature<"zihintntl", "HasStdExtZihintntl", "true", 7706c3fb27SDimitry Andric "'Zihintntl' (Non-Temporal Locality Hints)">; 78bdd1243dSDimitry Andricdef HasStdExtZihintntl : Predicate<"Subtarget->hasStdExtZihintntl()">, 79bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZihintntl), 80bdd1243dSDimitry Andric "'Zihintntl' (Non-Temporal Locality Hints)">; 81bdd1243dSDimitry Andric 8206c3fb27SDimitry Andricdef FeatureStdExtZifencei 8306c3fb27SDimitry Andric : SubtargetFeature<"zifencei", "HasStdExtZifencei", "true", 8406c3fb27SDimitry Andric "'Zifencei' (fence.i)">; 8506c3fb27SDimitry Andricdef HasStdExtZifencei : Predicate<"Subtarget->hasStdExtZifencei()">, 8606c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZifencei), 8706c3fb27SDimitry Andric "'Zifencei' (fence.i)">; 8806c3fb27SDimitry Andric 8906c3fb27SDimitry Andricdef FeatureStdExtZicntr 9006c3fb27SDimitry Andric : SubtargetFeature<"zicntr", "HasStdExtZicntr", "true", 9106c3fb27SDimitry Andric "'Zicntr' (Base Counters and Timers)", 9206c3fb27SDimitry Andric [FeatureStdExtZicsr]>; 9306c3fb27SDimitry Andric 9406c3fb27SDimitry Andricdef FeatureStdExtZihpm 9506c3fb27SDimitry Andric : SubtargetFeature<"zihpm", "HasStdExtZihpm", "true", 9606c3fb27SDimitry Andric "'Zihpm' (Hardware Performance Counters)", 9706c3fb27SDimitry Andric [FeatureStdExtZicsr]>; 9806c3fb27SDimitry Andric 99bdd1243dSDimitry Andricdef FeatureStdExtZfhmin 100bdd1243dSDimitry Andric : SubtargetFeature<"zfhmin", "HasStdExtZfhmin", "true", 101bdd1243dSDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal)", 102bdd1243dSDimitry Andric [FeatureStdExtF]>; 103bdd1243dSDimitry Andricdef HasStdExtZfhmin : Predicate<"Subtarget->hasStdExtZfhmin()">, 104bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfhmin), 105bdd1243dSDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal)">; 106bdd1243dSDimitry Andric 107bdd1243dSDimitry Andricdef FeatureStdExtZfh 108bdd1243dSDimitry Andric : SubtargetFeature<"zfh", "HasStdExtZfh", "true", 109bdd1243dSDimitry Andric "'Zfh' (Half-Precision Floating-Point)", 110cb14a3feSDimitry Andric [FeatureStdExtZfhmin]>; 111bdd1243dSDimitry Andricdef HasStdExtZfh : Predicate<"Subtarget->hasStdExtZfh()">, 112bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfh), 113bdd1243dSDimitry Andric "'Zfh' (Half-Precision Floating-Point)">; 114bdd1243dSDimitry Andricdef NoStdExtZfh : Predicate<"!Subtarget->hasStdExtZfh()">; 115bdd1243dSDimitry Andric 116bdd1243dSDimitry Andricdef HasStdExtZfhOrZfhmin 117cb14a3feSDimitry Andric : Predicate<"Subtarget->hasStdExtZfhmin()">, 118cb14a3feSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfhmin), 119bdd1243dSDimitry Andric "'Zfh' (Half-Precision Floating-Point) or " 120bdd1243dSDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal)">; 121bdd1243dSDimitry Andric 122bdd1243dSDimitry Andricdef FeatureStdExtZfinx 123bdd1243dSDimitry Andric : SubtargetFeature<"zfinx", "HasStdExtZfinx", "true", 12406c3fb27SDimitry Andric "'Zfinx' (Float in Integer)", 12506c3fb27SDimitry Andric [FeatureStdExtZicsr]>; 126bdd1243dSDimitry Andricdef HasStdExtZfinx : Predicate<"Subtarget->hasStdExtZfinx()">, 127bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfinx), 128bdd1243dSDimitry Andric "'Zfinx' (Float in Integer)">; 129bdd1243dSDimitry Andric 130bdd1243dSDimitry Andricdef FeatureStdExtZdinx 131bdd1243dSDimitry Andric : SubtargetFeature<"zdinx", "HasStdExtZdinx", "true", 132bdd1243dSDimitry Andric "'Zdinx' (Double in Integer)", 133bdd1243dSDimitry Andric [FeatureStdExtZfinx]>; 134bdd1243dSDimitry Andricdef HasStdExtZdinx : Predicate<"Subtarget->hasStdExtZdinx()">, 135bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZdinx), 136bdd1243dSDimitry Andric "'Zdinx' (Double in Integer)">; 137bdd1243dSDimitry Andric 138bdd1243dSDimitry Andricdef FeatureStdExtZhinxmin 139bdd1243dSDimitry Andric : SubtargetFeature<"zhinxmin", "HasStdExtZhinxmin", "true", 140bdd1243dSDimitry Andric "'Zhinxmin' (Half Float in Integer Minimal)", 141bdd1243dSDimitry Andric [FeatureStdExtZfinx]>; 142bdd1243dSDimitry Andricdef HasStdExtZhinxmin : Predicate<"Subtarget->hasStdExtZhinxmin()">, 143bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZhinxmin), 144bdd1243dSDimitry Andric "'Zhinxmin' (Half Float in Integer Minimal)">; 145bdd1243dSDimitry Andric 146bdd1243dSDimitry Andricdef FeatureStdExtZhinx 147bdd1243dSDimitry Andric : SubtargetFeature<"zhinx", "HasStdExtZhinx", "true", 148bdd1243dSDimitry Andric "'Zhinx' (Half Float in Integer)", 149cb14a3feSDimitry Andric [FeatureStdExtZhinxmin]>; 150bdd1243dSDimitry Andricdef HasStdExtZhinx : Predicate<"Subtarget->hasStdExtZhinx()">, 151bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZhinx), 152bdd1243dSDimitry Andric "'Zhinx' (Half Float in Integer)">; 15306c3fb27SDimitry Andricdef NoStdExtZhinx : Predicate<"!Subtarget->hasStdExtZhinx()">; 154bdd1243dSDimitry Andric 155bdd1243dSDimitry Andricdef HasStdExtZhinxOrZhinxmin 156cb14a3feSDimitry Andric : Predicate<"Subtarget->hasStdExtZhinxmin()">, 157cb14a3feSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZhinxmin), 158bdd1243dSDimitry Andric "'Zhinx' (Half Float in Integer) or " 159bdd1243dSDimitry Andric "'Zhinxmin' (Half Float in Integer Minimal)">; 160bdd1243dSDimitry Andric 16106c3fb27SDimitry Andricdef FeatureStdExtZfa 1625f757f3fSDimitry Andric : SubtargetFeature<"zfa", "HasStdExtZfa", "true", 16306c3fb27SDimitry Andric "'Zfa' (Additional Floating-Point)", 16406c3fb27SDimitry Andric [FeatureStdExtF]>; 16506c3fb27SDimitry Andricdef HasStdExtZfa : Predicate<"Subtarget->hasStdExtZfa()">, 16606c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfa), 16706c3fb27SDimitry Andric "'Zfa' (Additional Floating-Point)">; 16806c3fb27SDimitry Andric 169bdd1243dSDimitry Andricdef FeatureStdExtC 170bdd1243dSDimitry Andric : SubtargetFeature<"c", "HasStdExtC", "true", 171bdd1243dSDimitry Andric "'C' (Compressed Instructions)">; 172bdd1243dSDimitry Andricdef HasStdExtC : Predicate<"Subtarget->hasStdExtC()">, 173bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtC), 174bdd1243dSDimitry Andric "'C' (Compressed Instructions)">; 175bdd1243dSDimitry Andric 176bdd1243dSDimitry Andricdef FeatureStdExtZba 177bdd1243dSDimitry Andric : SubtargetFeature<"zba", "HasStdExtZba", "true", 178bdd1243dSDimitry Andric "'Zba' (Address Generation Instructions)">; 179bdd1243dSDimitry Andricdef HasStdExtZba : Predicate<"Subtarget->hasStdExtZba()">, 180bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZba), 181bdd1243dSDimitry Andric "'Zba' (Address Generation Instructions)">; 182bdd1243dSDimitry Andricdef NotHasStdExtZba : Predicate<"!Subtarget->hasStdExtZba()">; 183bdd1243dSDimitry Andric 184bdd1243dSDimitry Andricdef FeatureStdExtZbb 185bdd1243dSDimitry Andric : SubtargetFeature<"zbb", "HasStdExtZbb", "true", 186bdd1243dSDimitry Andric "'Zbb' (Basic Bit-Manipulation)">; 187bdd1243dSDimitry Andricdef HasStdExtZbb : Predicate<"Subtarget->hasStdExtZbb()">, 188bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbb), 189bdd1243dSDimitry Andric "'Zbb' (Basic Bit-Manipulation)">; 190bdd1243dSDimitry Andric 191bdd1243dSDimitry Andricdef FeatureStdExtZbc 192bdd1243dSDimitry Andric : SubtargetFeature<"zbc", "HasStdExtZbc", "true", 193bdd1243dSDimitry Andric "'Zbc' (Carry-Less Multiplication)">; 194bdd1243dSDimitry Andricdef HasStdExtZbc : Predicate<"Subtarget->hasStdExtZbc()">, 195bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbc), 196bdd1243dSDimitry Andric "'Zbc' (Carry-Less Multiplication)">; 197bdd1243dSDimitry Andric 198bdd1243dSDimitry Andricdef FeatureStdExtZbs 199bdd1243dSDimitry Andric : SubtargetFeature<"zbs", "HasStdExtZbs", "true", 200bdd1243dSDimitry Andric "'Zbs' (Single-Bit Instructions)">; 201bdd1243dSDimitry Andricdef HasStdExtZbs : Predicate<"Subtarget->hasStdExtZbs()">, 202bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbs), 203bdd1243dSDimitry Andric "'Zbs' (Single-Bit Instructions)">; 204bdd1243dSDimitry Andric 205bdd1243dSDimitry Andricdef FeatureStdExtZbkb 206bdd1243dSDimitry Andric : SubtargetFeature<"zbkb", "HasStdExtZbkb", "true", 207bdd1243dSDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 208bdd1243dSDimitry Andricdef HasStdExtZbkb : Predicate<"Subtarget->hasStdExtZbkb()">, 209bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkb), 210bdd1243dSDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 211bdd1243dSDimitry Andric 212bdd1243dSDimitry Andricdef FeatureStdExtZbkx 213bdd1243dSDimitry Andric : SubtargetFeature<"zbkx", "HasStdExtZbkx", "true", 214bdd1243dSDimitry Andric "'Zbkx' (Crossbar permutation instructions)">; 215bdd1243dSDimitry Andricdef HasStdExtZbkx : Predicate<"Subtarget->hasStdExtZbkx()">, 216bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkx), 217bdd1243dSDimitry Andric "'Zbkx' (Crossbar permutation instructions)">; 218bdd1243dSDimitry Andric 219bdd1243dSDimitry Andricdef HasStdExtZbbOrZbkb 220bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbkb()">, 221bdd1243dSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbkb), 222bdd1243dSDimitry Andric "'Zbb' (Basic Bit-Manipulation) or " 223bdd1243dSDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 224bdd1243dSDimitry Andric 225bdd1243dSDimitry Andric// The Carry-less multiply subextension for cryptography is a subset of basic 226bdd1243dSDimitry Andric// carry-less multiply subextension. The former should be enabled if the latter 227bdd1243dSDimitry Andric// is enabled. 228bdd1243dSDimitry Andricdef FeatureStdExtZbkc 229bdd1243dSDimitry Andric : SubtargetFeature<"zbkc", "HasStdExtZbkc", "true", 230bdd1243dSDimitry Andric "'Zbkc' (Carry-less multiply instructions for " 231bdd1243dSDimitry Andric "Cryptography)">; 232bdd1243dSDimitry Andricdef HasStdExtZbkc 233bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtZbkc()">, 234bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkc), 235bdd1243dSDimitry Andric "'Zbkc' (Carry-less multiply instructions for Cryptography)">; 236bdd1243dSDimitry Andric 237bdd1243dSDimitry Andricdef HasStdExtZbcOrZbkc 238bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtZbc() || Subtarget->hasStdExtZbkc()">, 239bdd1243dSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbc, FeatureStdExtZbkc), 240bdd1243dSDimitry Andric "'Zbc' (Carry-Less Multiplication) or " 241bdd1243dSDimitry Andric "'Zbkc' (Carry-less multiply instructions " 242bdd1243dSDimitry Andric "for Cryptography)">; 243bdd1243dSDimitry Andric 244bdd1243dSDimitry Andricdef FeatureStdExtZknd 245bdd1243dSDimitry Andric : SubtargetFeature<"zknd", "HasStdExtZknd", "true", 246bdd1243dSDimitry Andric "'Zknd' (NIST Suite: AES Decryption)">; 247bdd1243dSDimitry Andricdef HasStdExtZknd : Predicate<"Subtarget->hasStdExtZknd()">, 248bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZknd), 249bdd1243dSDimitry Andric "'Zknd' (NIST Suite: AES Decryption)">; 250bdd1243dSDimitry Andric 251bdd1243dSDimitry Andricdef FeatureStdExtZkne 252bdd1243dSDimitry Andric : SubtargetFeature<"zkne", "HasStdExtZkne", "true", 253bdd1243dSDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 254bdd1243dSDimitry Andricdef HasStdExtZkne : Predicate<"Subtarget->hasStdExtZkne()">, 255bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZkne), 256bdd1243dSDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 257bdd1243dSDimitry Andric 258bdd1243dSDimitry Andric// Some instructions belong to both Zknd and Zkne subextensions. 259bdd1243dSDimitry Andric// They should be enabled if either has been specified. 260bdd1243dSDimitry Andricdef HasStdExtZkndOrZkne 261bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtZknd() || Subtarget->hasStdExtZkne()">, 262bdd1243dSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZknd, FeatureStdExtZkne), 263bdd1243dSDimitry Andric "'Zknd' (NIST Suite: AES Decryption) or " 264bdd1243dSDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 265bdd1243dSDimitry Andric 266bdd1243dSDimitry Andricdef FeatureStdExtZknh 267bdd1243dSDimitry Andric : SubtargetFeature<"zknh", "HasStdExtZknh", "true", 268bdd1243dSDimitry Andric "'Zknh' (NIST Suite: Hash Function Instructions)">; 269bdd1243dSDimitry Andricdef HasStdExtZknh : Predicate<"Subtarget->hasStdExtZknh()">, 270bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZknh), 271bdd1243dSDimitry Andric "'Zknh' (NIST Suite: Hash Function Instructions)">; 272bdd1243dSDimitry Andric 273bdd1243dSDimitry Andricdef FeatureStdExtZksed 274bdd1243dSDimitry Andric : SubtargetFeature<"zksed", "HasStdExtZksed", "true", 275bdd1243dSDimitry Andric "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">; 276bdd1243dSDimitry Andricdef HasStdExtZksed : Predicate<"Subtarget->hasStdExtZksed()">, 277bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZksed), 278bdd1243dSDimitry Andric "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">; 279bdd1243dSDimitry Andric 280bdd1243dSDimitry Andricdef FeatureStdExtZksh 281bdd1243dSDimitry Andric : SubtargetFeature<"zksh", "HasStdExtZksh", "true", 282bdd1243dSDimitry Andric "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">; 283bdd1243dSDimitry Andricdef HasStdExtZksh : Predicate<"Subtarget->hasStdExtZksh()">, 284bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZksh), 285bdd1243dSDimitry Andric "'Zksh' (ShangMi Suite: SM3 Hash Function " 286bdd1243dSDimitry Andric "Instructions)">; 287bdd1243dSDimitry Andric 288bdd1243dSDimitry Andricdef FeatureStdExtZkr 289bdd1243dSDimitry Andric : SubtargetFeature<"zkr", "HasStdExtZkr", "true", 290bdd1243dSDimitry Andric "'Zkr' (Entropy Source Extension)">; 291bdd1243dSDimitry Andricdef HasStdExtZkr : Predicate<"Subtarget->hasStdExtZkr()">, 292bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZkr), 293bdd1243dSDimitry Andric "'Zkr' (Entropy Source Extension)">; 294bdd1243dSDimitry Andric 295bdd1243dSDimitry Andricdef FeatureStdExtZkn 296bdd1243dSDimitry Andric : SubtargetFeature<"zkn", "HasStdExtZkn", "true", 297bdd1243dSDimitry Andric "'Zkn' (NIST Algorithm Suite)", 298bdd1243dSDimitry Andric [FeatureStdExtZbkb, 299bdd1243dSDimitry Andric FeatureStdExtZbkc, 300bdd1243dSDimitry Andric FeatureStdExtZbkx, 301bdd1243dSDimitry Andric FeatureStdExtZkne, 302bdd1243dSDimitry Andric FeatureStdExtZknd, 303bdd1243dSDimitry Andric FeatureStdExtZknh]>; 304bdd1243dSDimitry Andric 305bdd1243dSDimitry Andricdef FeatureStdExtZks 306bdd1243dSDimitry Andric : SubtargetFeature<"zks", "HasStdExtZks", "true", 307bdd1243dSDimitry Andric "'Zks' (ShangMi Algorithm Suite)", 308bdd1243dSDimitry Andric [FeatureStdExtZbkb, 309bdd1243dSDimitry Andric FeatureStdExtZbkc, 310bdd1243dSDimitry Andric FeatureStdExtZbkx, 311bdd1243dSDimitry Andric FeatureStdExtZksed, 312bdd1243dSDimitry Andric FeatureStdExtZksh]>; 313bdd1243dSDimitry Andric 314bdd1243dSDimitry Andricdef FeatureStdExtZkt 315bdd1243dSDimitry Andric : SubtargetFeature<"zkt", "HasStdExtZkt", "true", 316bdd1243dSDimitry Andric "'Zkt' (Data Independent Execution Latency)">; 317bdd1243dSDimitry Andric 318bdd1243dSDimitry Andricdef FeatureStdExtZk 319bdd1243dSDimitry Andric : SubtargetFeature<"zk", "HasStdExtZk", "true", 320bdd1243dSDimitry Andric "'Zk' (Standard scalar cryptography extension)", 321bdd1243dSDimitry Andric [FeatureStdExtZkn, 322bdd1243dSDimitry Andric FeatureStdExtZkr, 323bdd1243dSDimitry Andric FeatureStdExtZkt]>; 324bdd1243dSDimitry Andric 32506c3fb27SDimitry Andricdef FeatureStdExtZca 32606c3fb27SDimitry Andric : SubtargetFeature<"zca", "HasStdExtZca", "true", 327bdd1243dSDimitry Andric "'Zca' (part of the C extension, excluding compressed " 328bdd1243dSDimitry Andric "floating point loads/stores)">; 329bdd1243dSDimitry Andric 330bdd1243dSDimitry Andricdef HasStdExtCOrZca 33106c3fb27SDimitry Andric : Predicate<"Subtarget->hasStdExtCOrZca()">, 33206c3fb27SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZca), 333bdd1243dSDimitry Andric "'C' (Compressed Instructions) or " 334bdd1243dSDimitry Andric "'Zca' (part of the C extension, excluding " 335bdd1243dSDimitry Andric "compressed floating point loads/stores)">; 336bdd1243dSDimitry Andric 33706c3fb27SDimitry Andricdef FeatureStdExtZcb 33806c3fb27SDimitry Andric : SubtargetFeature<"zcb", "HasStdExtZcb", "true", 33906c3fb27SDimitry Andric "'Zcb' (Compressed basic bit manipulation instructions)", 34006c3fb27SDimitry Andric [FeatureStdExtZca]>; 34106c3fb27SDimitry Andricdef HasStdExtZcb : Predicate<"Subtarget->hasStdExtZcb()">, 34206c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZcb), 34306c3fb27SDimitry Andric "'Zcb' (Compressed basic bit manipulation instructions)">; 34406c3fb27SDimitry Andric 34506c3fb27SDimitry Andricdef FeatureStdExtZcd 34606c3fb27SDimitry Andric : SubtargetFeature<"zcd", "HasStdExtZcd", "true", 34706c3fb27SDimitry Andric "'Zcd' (Compressed Double-Precision Floating-Point Instructions)", 34806c3fb27SDimitry Andric [FeatureStdExtZca]>; 349bdd1243dSDimitry Andric 350bdd1243dSDimitry Andricdef HasStdExtCOrZcd 351bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtC() || Subtarget->hasStdExtZcd()">, 35206c3fb27SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZcd), 353bdd1243dSDimitry Andric "'C' (Compressed Instructions) or " 354bdd1243dSDimitry Andric "'Zcd' (Compressed Double-Precision Floating-Point Instructions)">; 355bdd1243dSDimitry Andric 35606c3fb27SDimitry Andricdef FeatureStdExtZcf 35706c3fb27SDimitry Andric : SubtargetFeature<"zcf", "HasStdExtZcf", "true", 35806c3fb27SDimitry Andric "'Zcf' (Compressed Single-Precision Floating-Point Instructions)", 35906c3fb27SDimitry Andric [FeatureStdExtZca]>; 360bdd1243dSDimitry Andric 36106c3fb27SDimitry Andricdef FeatureStdExtZcmp 36206c3fb27SDimitry Andric : SubtargetFeature<"zcmp", "HasStdExtZcmp", "true", 36306c3fb27SDimitry Andric "'Zcmp' (sequenced instuctions for code-size reduction)", 36406c3fb27SDimitry Andric [FeatureStdExtZca]>; 36506c3fb27SDimitry Andricdef HasStdExtZcmp : Predicate<"Subtarget->hasStdExtZcmp() && !Subtarget->hasStdExtC()">, 36606c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZcmp), 36706c3fb27SDimitry Andric "'Zcmp' (sequenced instuctions for code-size reduction)">; 36806c3fb27SDimitry Andric 36906c3fb27SDimitry Andricdef FeatureStdExtZcmt 37006c3fb27SDimitry Andric : SubtargetFeature<"zcmt", "HasStdExtZcmt", "true", 37106c3fb27SDimitry Andric "'Zcmt' (table jump instuctions for code-size reduction)", 37206c3fb27SDimitry Andric [FeatureStdExtZca, FeatureStdExtZicsr]>; 37306c3fb27SDimitry Andricdef HasStdExtZcmt : Predicate<"Subtarget->hasStdExtZcmt()">, 37406c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZcmt), 37506c3fb27SDimitry Andric "'Zcmt' (table jump instuctions for code-size reduction)">; 37606c3fb27SDimitry Andric 37706c3fb27SDimitry Andricdef FeatureStdExtZce 37806c3fb27SDimitry Andric : SubtargetFeature<"zce", "HasStdExtZce", "true", 37906c3fb27SDimitry Andric "'Zce' (Compressed extensions for microcontrollers)", 38006c3fb27SDimitry Andric [FeatureStdExtZca, FeatureStdExtZcb, FeatureStdExtZcmp, 38106c3fb27SDimitry Andric FeatureStdExtZcmt]>; 38206c3fb27SDimitry Andric 38306c3fb27SDimitry Andricdef HasStdExtCOrZcfOrZce 38406c3fb27SDimitry Andric : Predicate<"Subtarget->hasStdExtC() || Subtarget->hasStdExtZcf() " 38506c3fb27SDimitry Andric "Subtarget->hasStdExtZce()">, 38606c3fb27SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtC, FeatureStdExtZcf, 38706c3fb27SDimitry Andric FeatureStdExtZce), 388bdd1243dSDimitry Andric "'C' (Compressed Instructions) or " 389bdd1243dSDimitry Andric "'Zcf' (Compressed Single-Precision Floating-Point Instructions)">; 390bdd1243dSDimitry Andric 391bdd1243dSDimitry Andricdef FeatureNoRVCHints 392bdd1243dSDimitry Andric : SubtargetFeature<"no-rvc-hints", "EnableRVCHintInstrs", "false", 393bdd1243dSDimitry Andric "Disable RVC Hint Instructions.">; 394bdd1243dSDimitry Andricdef HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">, 395bdd1243dSDimitry Andric AssemblerPredicate<(all_of(not FeatureNoRVCHints)), 396bdd1243dSDimitry Andric "RVC Hint Instructions">; 397bdd1243dSDimitry Andric 398bdd1243dSDimitry Andricdef FeatureStdExtZvl32b : SubtargetFeature<"zvl32b", "ZvlLen", "32", 399bdd1243dSDimitry Andric "'Zvl' (Minimum Vector Length) 32">; 400bdd1243dSDimitry Andric 401bdd1243dSDimitry Andricforeach i = { 6-16 } in { 402bdd1243dSDimitry Andric defvar I = !shl(1, i); 403bdd1243dSDimitry Andric def FeatureStdExtZvl#I#b : 404bdd1243dSDimitry Andric SubtargetFeature<"zvl"#I#"b", "ZvlLen", !cast<string>(I), 405bdd1243dSDimitry Andric "'Zvl' (Minimum Vector Length) "#I, 406bdd1243dSDimitry Andric [!cast<SubtargetFeature>("FeatureStdExtZvl"#!srl(I, 1)#"b")]>; 407bdd1243dSDimitry Andric} 408bdd1243dSDimitry Andric 409bdd1243dSDimitry Andricdef FeatureStdExtZve32x 410bdd1243dSDimitry Andric : SubtargetFeature<"zve32x", "HasStdExtZve32x", "true", 411bdd1243dSDimitry Andric "'Zve32x' (Vector Extensions for Embedded Processors " 412bdd1243dSDimitry Andric "with maximal 32 EEW)", 41306c3fb27SDimitry Andric [FeatureStdExtZicsr, FeatureStdExtZvl32b]>; 414bdd1243dSDimitry Andric 415bdd1243dSDimitry Andricdef FeatureStdExtZve32f 416bdd1243dSDimitry Andric : SubtargetFeature<"zve32f", "HasStdExtZve32f", "true", 417bdd1243dSDimitry Andric "'Zve32f' (Vector Extensions for Embedded Processors " 418bdd1243dSDimitry Andric "with maximal 32 EEW and F extension)", 41906c3fb27SDimitry Andric [FeatureStdExtZve32x, FeatureStdExtF]>; 420bdd1243dSDimitry Andric 421bdd1243dSDimitry Andricdef FeatureStdExtZve64x 422bdd1243dSDimitry Andric : SubtargetFeature<"zve64x", "HasStdExtZve64x", "true", 423bdd1243dSDimitry Andric "'Zve64x' (Vector Extensions for Embedded Processors " 424bdd1243dSDimitry Andric "with maximal 64 EEW)", 425bdd1243dSDimitry Andric [FeatureStdExtZve32x, FeatureStdExtZvl64b]>; 426bdd1243dSDimitry Andric 427bdd1243dSDimitry Andricdef FeatureStdExtZve64f 428bdd1243dSDimitry Andric : SubtargetFeature<"zve64f", "HasStdExtZve64f", "true", 429bdd1243dSDimitry Andric "'Zve64f' (Vector Extensions for Embedded Processors " 430bdd1243dSDimitry Andric "with maximal 64 EEW and F extension)", 431bdd1243dSDimitry Andric [FeatureStdExtZve32f, FeatureStdExtZve64x]>; 432bdd1243dSDimitry Andric 433bdd1243dSDimitry Andricdef FeatureStdExtZve64d 434bdd1243dSDimitry Andric : SubtargetFeature<"zve64d", "HasStdExtZve64d", "true", 435bdd1243dSDimitry Andric "'Zve64d' (Vector Extensions for Embedded Processors " 436bdd1243dSDimitry Andric "with maximal 64 EEW, F and D extension)", 43706c3fb27SDimitry Andric [FeatureStdExtZve64f, FeatureStdExtD]>; 438bdd1243dSDimitry Andric 439bdd1243dSDimitry Andricdef FeatureStdExtV 440bdd1243dSDimitry Andric : SubtargetFeature<"v", "HasStdExtV", "true", 441bdd1243dSDimitry Andric "'V' (Vector Extension for Application Processors)", 44206c3fb27SDimitry Andric [FeatureStdExtZvl128b, FeatureStdExtZve64d]>; 443bdd1243dSDimitry Andric 444bdd1243dSDimitry Andricdef HasVInstructions : Predicate<"Subtarget->hasVInstructions()">, 445bdd1243dSDimitry Andric AssemblerPredicate< 446bdd1243dSDimitry Andric (any_of FeatureStdExtZve32x), 4475f757f3fSDimitry Andric "'V' (Vector Extension for Application Processors), 'Zve32x' " 4485f757f3fSDimitry Andric "(Vector Extensions for Embedded Processors)">; 449bdd1243dSDimitry Andricdef HasVInstructionsI64 : Predicate<"Subtarget->hasVInstructionsI64()">, 450bdd1243dSDimitry Andric AssemblerPredicate< 451bdd1243dSDimitry Andric (any_of FeatureStdExtZve64x), 452bdd1243dSDimitry Andric "'V' (Vector Extension for Application Processors) or 'Zve64x' " 453bdd1243dSDimitry Andric "(Vector Extensions for Embedded Processors)">; 454bdd1243dSDimitry Andricdef HasVInstructionsAnyF : Predicate<"Subtarget->hasVInstructionsAnyF()">, 455bdd1243dSDimitry Andric AssemblerPredicate< 456bdd1243dSDimitry Andric (any_of FeatureStdExtZve32f), 4575f757f3fSDimitry Andric "'V' (Vector Extension for Application Processors), 'Zve32f' " 4585f757f3fSDimitry Andric "(Vector Extensions for Embedded Processors)">; 459bdd1243dSDimitry Andric 46006c3fb27SDimitry Andricdef HasVInstructionsF64 : Predicate<"Subtarget->hasVInstructionsF64()">; 46106c3fb27SDimitry Andric 46206c3fb27SDimitry Andricdef HasVInstructionsFullMultiply : Predicate<"Subtarget->hasVInstructionsFullMultiply()">; 46306c3fb27SDimitry Andric 4645f757f3fSDimitry Andricdef FeatureStdExtZfbfmin 4655f757f3fSDimitry Andric : SubtargetFeature<"experimental-zfbfmin", "HasStdExtZfbfmin", "true", 4665f757f3fSDimitry Andric "'Zfbfmin' (Scalar BF16 Converts)", 4675f757f3fSDimitry Andric [FeatureStdExtF]>; 4685f757f3fSDimitry Andricdef HasStdExtZfbfmin : Predicate<"Subtarget->hasStdExtZfbfmin()">, 4695f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfbfmin), 4705f757f3fSDimitry Andric "'Zfbfmin' (Scalar BF16 Converts)">; 4715f757f3fSDimitry Andric 47206c3fb27SDimitry Andricdef FeatureStdExtZvfbfmin 47306c3fb27SDimitry Andric : SubtargetFeature<"experimental-zvfbfmin", "HasStdExtZvfbfmin", "true", 47406c3fb27SDimitry Andric "'Zvbfmin' (Vector BF16 Converts)", 475cb14a3feSDimitry Andric [FeatureStdExtZve32f]>; 47606c3fb27SDimitry Andricdef HasStdExtZvfbfmin : Predicate<"Subtarget->hasStdExtZvfbfmin()">, 47706c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvfbfmin), 47806c3fb27SDimitry Andric "'Zvfbfmin' (Vector BF16 Converts)">; 47906c3fb27SDimitry Andric 48006c3fb27SDimitry Andricdef FeatureStdExtZvfbfwma 48106c3fb27SDimitry Andric : SubtargetFeature<"experimental-zvfbfwma", "HasStdExtZvfbfwma", "true", 48206c3fb27SDimitry Andric "'Zvfbfwma' (Vector BF16 widening mul-add)", 483cb14a3feSDimitry Andric [FeatureStdExtZvfbfmin, FeatureStdExtZfbfmin]>; 48406c3fb27SDimitry Andricdef HasStdExtZvfbfwma : Predicate<"Subtarget->hasStdExtZvfbfwma()">, 48506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvfbfwma), 48606c3fb27SDimitry Andric "'Zvfbfwma' (Vector BF16 widening mul-add)">; 48706c3fb27SDimitry Andric 4885f757f3fSDimitry Andricdef HasVInstructionsBF16 : Predicate<"Subtarget->hasVInstructionsBF16()">; 4895f757f3fSDimitry Andric 4905f757f3fSDimitry Andricdef FeatureStdExtZvfhmin 4915f757f3fSDimitry Andric : SubtargetFeature<"zvfhmin", "HasStdExtZvfhmin", "true", 4925f757f3fSDimitry Andric "'Zvfhmin' (Vector Half-Precision Floating-Point Minimal)", 4935f757f3fSDimitry Andric [FeatureStdExtZve32f]>; 4945f757f3fSDimitry Andric 495cb14a3feSDimitry Andricdef FeatureStdExtZvfh 496cb14a3feSDimitry Andric : SubtargetFeature<"zvfh", "HasStdExtZvfh", "true", 497cb14a3feSDimitry Andric "'Zvfh' (Vector Half-Precision Floating-Point)", 498cb14a3feSDimitry Andric [FeatureStdExtZvfhmin, FeatureStdExtZfhmin]>; 499cb14a3feSDimitry Andric 50006c3fb27SDimitry Andricdef HasVInstructionsF16 : Predicate<"Subtarget->hasVInstructionsF16()">; 50106c3fb27SDimitry Andric 5025f757f3fSDimitry Andricdef HasVInstructionsF16Minimal : Predicate<"Subtarget->hasVInstructionsF16Minimal()">, 5035f757f3fSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZvfhmin, FeatureStdExtZvfh), 5045f757f3fSDimitry Andric "'Zvfhmin' (Vector Half-Precision Floating-Point Minimal) or " 5055f757f3fSDimitry Andric "'Zvfh' (Vector Half-Precision Floating-Point)">; 5065f757f3fSDimitry Andric 50706c3fb27SDimitry Andricdef HasStdExtZfhOrZvfh 50806c3fb27SDimitry Andric : Predicate<"Subtarget->hasStdExtZfh() || Subtarget->hasStdExtZvfh()">, 50906c3fb27SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZfh, FeatureStdExtZvfh), 51006c3fb27SDimitry Andric "'Zfh' (Half-Precision Floating-Point) or " 51106c3fb27SDimitry Andric "'Zvfh' (Vector Half-Precision Floating-Point)">; 512bdd1243dSDimitry Andric 513bdd1243dSDimitry Andricdef FeatureStdExtZicbom 514bdd1243dSDimitry Andric : SubtargetFeature<"zicbom", "HasStdExtZicbom", "true", 515bdd1243dSDimitry Andric "'Zicbom' (Cache-Block Management Instructions)">; 516bdd1243dSDimitry Andricdef HasStdExtZicbom : Predicate<"Subtarget->hasStdExtZicbom()">, 517bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicbom), 518bdd1243dSDimitry Andric "'Zicbom' (Cache-Block Management Instructions)">; 519bdd1243dSDimitry Andric 520bdd1243dSDimitry Andricdef FeatureStdExtZicboz 521bdd1243dSDimitry Andric : SubtargetFeature<"zicboz", "HasStdExtZicboz", "true", 522bdd1243dSDimitry Andric "'Zicboz' (Cache-Block Zero Instructions)">; 523bdd1243dSDimitry Andricdef HasStdExtZicboz : Predicate<"Subtarget->hasStdExtZicboz()">, 524bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicboz), 525bdd1243dSDimitry Andric "'Zicboz' (Cache-Block Zero Instructions)">; 526bdd1243dSDimitry Andric 527bdd1243dSDimitry Andricdef FeatureStdExtZicbop 528bdd1243dSDimitry Andric : SubtargetFeature<"zicbop", "HasStdExtZicbop", "true", 529bdd1243dSDimitry Andric "'Zicbop' (Cache-Block Prefetch Instructions)">; 530bdd1243dSDimitry Andricdef HasStdExtZicbop : Predicate<"Subtarget->hasStdExtZicbop()">, 531bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicbop), 532bdd1243dSDimitry Andric "'Zicbop' (Cache-Block Prefetch Instructions)">; 533bdd1243dSDimitry Andric 534bdd1243dSDimitry Andricdef FeatureStdExtSvnapot 535bdd1243dSDimitry Andric : SubtargetFeature<"svnapot", "HasStdExtSvnapot", "true", 536bdd1243dSDimitry Andric "'Svnapot' (NAPOT Translation Contiguity)">; 537bdd1243dSDimitry Andric 538bdd1243dSDimitry Andricdef FeatureStdExtSvpbmt 539bdd1243dSDimitry Andric : SubtargetFeature<"svpbmt", "HasStdExtSvpbmt", "true", 540bdd1243dSDimitry Andric "'Svpbmt' (Page-Based Memory Types)">; 541bdd1243dSDimitry Andric 542bdd1243dSDimitry Andricdef FeatureStdExtSvinval 543bdd1243dSDimitry Andric : SubtargetFeature<"svinval", "HasStdExtSvinval", "true", 544bdd1243dSDimitry Andric "'Svinval' (Fine-Grained Address-Translation Cache Invalidation)">; 545bdd1243dSDimitry Andricdef HasStdExtSvinval : Predicate<"Subtarget->hasStdExtSvinval()">, 546bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtSvinval), 547bdd1243dSDimitry Andric "'Svinval' (Fine-Grained Address-Translation Cache Invalidation)">; 548bdd1243dSDimitry Andric 549bdd1243dSDimitry Andricdef FeatureStdExtZtso 550bdd1243dSDimitry Andric : SubtargetFeature<"experimental-ztso", "HasStdExtZtso", "true", 551bdd1243dSDimitry Andric "'Ztso' (Memory Model - Total Store Order)">; 5525f757f3fSDimitry Andricdef HasStdExtZtso : Predicate<"Subtarget->hasStdExtZtso()">, 553bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZtso), 554bdd1243dSDimitry Andric "'Ztso' (Memory Model - Total Store Order)">; 5555f757f3fSDimitry Andricdef NotHasStdExtZtso : Predicate<"!Subtarget->hasStdExtZtso()">; 556bdd1243dSDimitry Andric 55706c3fb27SDimitry Andricdef FeatureStdExtZawrs : SubtargetFeature<"zawrs", "HasStdExtZawrs", "true", 558bdd1243dSDimitry Andric "'Zawrs' (Wait on Reservation Set)">; 559bdd1243dSDimitry Andricdef HasStdExtZawrs : Predicate<"Subtarget->hasStdExtZawrs()">, 560bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZawrs), 561bdd1243dSDimitry Andric "'Zawrs' (Wait on Reservation Set)">; 562bdd1243dSDimitry Andric 5635f757f3fSDimitry Andricdef FeatureStdExtZvkb 564cb14a3feSDimitry Andric : SubtargetFeature<"zvkb", "HasStdExtZvkb", "true", 5655f757f3fSDimitry Andric "'Zvkb' (Vector Bit-manipulation used in Cryptography)">; 5665f757f3fSDimitry Andricdef HasStdExtZvkb : Predicate<"Subtarget->hasStdExtZvkb()">, 5675f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvkb), 5685f757f3fSDimitry Andric "'Zvkb' (Vector Bit-manipulation used in Cryptography)">; 5695f757f3fSDimitry Andric 57006c3fb27SDimitry Andricdef FeatureStdExtZvbb 571cb14a3feSDimitry Andric : SubtargetFeature<"zvbb", "HasStdExtZvbb", "true", 5725f757f3fSDimitry Andric "'Zvbb' (Vector basic bit-manipulation instructions.)", 5735f757f3fSDimitry Andric [FeatureStdExtZvkb]>; 57406c3fb27SDimitry Andricdef HasStdExtZvbb : Predicate<"Subtarget->hasStdExtZvbb()">, 57506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvbb), 5765f757f3fSDimitry Andric "'Zvbb' (Vector basic bit-manipulation instructions.)">; 57706c3fb27SDimitry Andric 57806c3fb27SDimitry Andricdef FeatureStdExtZvbc 579cb14a3feSDimitry Andric : SubtargetFeature<"zvbc", "HasStdExtZvbc", "true", 58006c3fb27SDimitry Andric "'Zvbc' (Vector Carryless Multiplication)">; 58106c3fb27SDimitry Andricdef HasStdExtZvbc : Predicate<"Subtarget->hasStdExtZvbc()">, 58206c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvbc), 58306c3fb27SDimitry Andric "'Zvbc' (Vector Carryless Multiplication)">; 58406c3fb27SDimitry Andric 58506c3fb27SDimitry Andricdef FeatureStdExtZvkg 586cb14a3feSDimitry Andric : SubtargetFeature<"zvkg", "HasStdExtZvkg", "true", 58706c3fb27SDimitry Andric "'Zvkg' (Vector GCM instructions for Cryptography)">; 58806c3fb27SDimitry Andricdef HasStdExtZvkg : Predicate<"Subtarget->hasStdExtZvkg()">, 58906c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvkg), 59006c3fb27SDimitry Andric "'Zvkg' (Vector GCM instructions for Cryptography)">; 59106c3fb27SDimitry Andric 59206c3fb27SDimitry Andricdef FeatureStdExtZvkned 593cb14a3feSDimitry Andric : SubtargetFeature<"zvkned", "HasStdExtZvkned", "true", 59406c3fb27SDimitry Andric "'Zvkned' (Vector AES Encryption & Decryption (Single Round))">; 59506c3fb27SDimitry Andricdef HasStdExtZvkned : Predicate<"Subtarget->hasStdExtZvkned()">, 59606c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvkned), 59706c3fb27SDimitry Andric "'Zvkned' (Vector AES Encryption & Decryption (Single Round))">; 59806c3fb27SDimitry Andric 59906c3fb27SDimitry Andricdef FeatureStdExtZvknha 600cb14a3feSDimitry Andric : SubtargetFeature<"zvknha", "HasStdExtZvknha", "true", 60106c3fb27SDimitry Andric "'Zvknha' (Vector SHA-2 (SHA-256 only))">; 6025f757f3fSDimitry Andricdef HasStdExtZvknha : Predicate<"Subtarget->hasStdExtZvknha()">, 6035f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvknha), 6045f757f3fSDimitry Andric "'Zvknha' (Vector SHA-2 (SHA-256 only))">; 60506c3fb27SDimitry Andric 60606c3fb27SDimitry Andricdef FeatureStdExtZvknhb 607cb14a3feSDimitry Andric : SubtargetFeature<"zvknhb", "HasStdExtZvknhb", "true", 60806c3fb27SDimitry Andric "'Zvknhb' (Vector SHA-2 (SHA-256 and SHA-512))", 6095f757f3fSDimitry Andric [FeatureStdExtZve64x]>; 6105f757f3fSDimitry Andricdef HasStdExtZvknhb : Predicate<"Subtarget->hasStdExtZvknhb()">, 6115f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvknhb), 6125f757f3fSDimitry Andric "'Zvknhb' (Vector SHA-2 (SHA-256 and SHA-512))">; 61306c3fb27SDimitry Andric 6145f757f3fSDimitry Andricdef HasStdExtZvknhaOrZvknhb : Predicate<"Subtarget->hasStdExtZvknha() || Subtarget->hasStdExtZvknhb()">, 6155f757f3fSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZvknha, FeatureStdExtZvknhb), 6165f757f3fSDimitry Andric "'Zvknha' or 'Zvknhb' (Vector SHA-2)">; 61706c3fb27SDimitry Andric 61806c3fb27SDimitry Andricdef FeatureStdExtZvksed 619cb14a3feSDimitry Andric : SubtargetFeature<"zvksed", "HasStdExtZvksed", "true", 62006c3fb27SDimitry Andric "'Zvksed' (SM4 Block Cipher Instructions)">; 62106c3fb27SDimitry Andricdef HasStdExtZvksed : Predicate<"Subtarget->hasStdExtZvksed()">, 62206c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvksed), 62306c3fb27SDimitry Andric "'Zvksed' (SM4 Block Cipher Instructions)">; 62406c3fb27SDimitry Andric 62506c3fb27SDimitry Andricdef FeatureStdExtZvksh 626cb14a3feSDimitry Andric : SubtargetFeature<"zvksh", "HasStdExtZvksh", "true", 62706c3fb27SDimitry Andric "'Zvksh' (SM3 Hash Function Instructions)">; 62806c3fb27SDimitry Andricdef HasStdExtZvksh : Predicate<"Subtarget->hasStdExtZvksh()">, 62906c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZvksh), 63006c3fb27SDimitry Andric "'Zvksh' (SM3 Hash Function Instructions)">; 63106c3fb27SDimitry Andric 63206c3fb27SDimitry Andricdef FeatureStdExtZvkt 633cb14a3feSDimitry Andric : SubtargetFeature<"zvkt", "HasStdExtZvkt", "true", 63406c3fb27SDimitry Andric "'Zvkt' (Vector Data-Independent Execution Latency)">; 63506c3fb27SDimitry Andric 6365f757f3fSDimitry Andric// Zvk short-hand extensions 6375f757f3fSDimitry Andric 6385f757f3fSDimitry Andricdef FeatureStdExtZvkn 639cb14a3feSDimitry Andric : SubtargetFeature<"zvkn", "HasStdExtZvkn", "true", 6405f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6415f757f3fSDimitry Andric "other extensions: Zvkned, Zvknhb, Zvkb and Zvkt.", 6425f757f3fSDimitry Andric [FeatureStdExtZvkned, FeatureStdExtZvknhb, 6435f757f3fSDimitry Andric FeatureStdExtZvkb, FeatureStdExtZvkt]>; 6445f757f3fSDimitry Andric 6455f757f3fSDimitry Andricdef FeatureStdExtZvknc 646cb14a3feSDimitry Andric : SubtargetFeature<"zvknc", "HasStdExtZvknc", "true", 6475f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6485f757f3fSDimitry Andric "other extensions: Zvkn and Zvbc.", 6495f757f3fSDimitry Andric [FeatureStdExtZvkn, FeatureStdExtZvbc]>; 6505f757f3fSDimitry Andric 6515f757f3fSDimitry Andricdef FeatureStdExtZvkng 652cb14a3feSDimitry Andric : SubtargetFeature<"zvkng", "HasStdExtZvkng", "true", 6535f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6545f757f3fSDimitry Andric "other extensions: Zvkn and Zvkg.", 6555f757f3fSDimitry Andric [FeatureStdExtZvkn, FeatureStdExtZvkg]>; 6565f757f3fSDimitry Andric 6575f757f3fSDimitry Andricdef FeatureStdExtZvks 658cb14a3feSDimitry Andric : SubtargetFeature<"zvks", "HasStdExtZvks", "true", 6595f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6605f757f3fSDimitry Andric "other extensions: Zvksed, Zvksh, Zvkb and Zvkt.", 6615f757f3fSDimitry Andric [FeatureStdExtZvksed, FeatureStdExtZvksh, 6625f757f3fSDimitry Andric FeatureStdExtZvkb, FeatureStdExtZvkt]>; 6635f757f3fSDimitry Andric 6645f757f3fSDimitry Andricdef FeatureStdExtZvksc 665cb14a3feSDimitry Andric : SubtargetFeature<"zvksc", "HasStdExtZvksc", "true", 6665f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6675f757f3fSDimitry Andric "other extensions: Zvks and Zvbc.", 6685f757f3fSDimitry Andric [FeatureStdExtZvks, FeatureStdExtZvbc]>; 6695f757f3fSDimitry Andric 6705f757f3fSDimitry Andricdef FeatureStdExtZvksg 671cb14a3feSDimitry Andric : SubtargetFeature<"zvksg", "HasStdExtZvksg", "true", 6725f757f3fSDimitry Andric "This extension is shorthand for the following set of " 6735f757f3fSDimitry Andric "other extensions: Zvks and Zvkg.", 6745f757f3fSDimitry Andric [FeatureStdExtZvks, FeatureStdExtZvkg]>; 6755f757f3fSDimitry Andric 6765f757f3fSDimitry Andricdef FeatureStdExtZicfilp 6775f757f3fSDimitry Andric : SubtargetFeature<"experimental-zicfilp", "HasStdExtZicfilp", "true", 6785f757f3fSDimitry Andric "'Zicfilp' (Landing pad)">; 6795f757f3fSDimitry Andricdef HasStdExtZicfilp : Predicate<"Subtarget->hasStdExtZicfilp()">, 6805f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicfilp), 6815f757f3fSDimitry Andric "'Zicfilp' (Landing pad)">; 6825f757f3fSDimitry Andric 68306c3fb27SDimitry Andricdef FeatureStdExtZicond 68406c3fb27SDimitry Andric : SubtargetFeature<"experimental-zicond", "HasStdExtZicond", "true", 68506c3fb27SDimitry Andric "'Zicond' (Integer Conditional Operations)">; 68606c3fb27SDimitry Andricdef HasStdExtZicond : Predicate<"Subtarget->hasStdExtZicond()">, 68706c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicond), 68806c3fb27SDimitry Andric "'Zicond' (Integer Conditional Operations)">; 68906c3fb27SDimitry Andric 690647cbc5dSDimitry Andricdef FeatureStdExtZimop : SubtargetFeature<"experimental-zimop", "HasStdExtZimop", "true", 691647cbc5dSDimitry Andric "'Zimop' (May-Be-Operations)">; 692647cbc5dSDimitry Andricdef HasStdExtZimop : Predicate<"Subtarget->hasStdExtZimop()">, 693647cbc5dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZimop), 694647cbc5dSDimitry Andric "'Zimop' (May-Be-Operations)">; 695647cbc5dSDimitry Andric 696647cbc5dSDimitry Andricdef FeatureStdExtZcmop : SubtargetFeature<"experimental-zcmop", "HasStdExtZcmop", "true", 697647cbc5dSDimitry Andric "'Zcmop' (Compressed May-Be-Operations)", 698647cbc5dSDimitry Andric [FeatureStdExtZca]>; 699647cbc5dSDimitry Andricdef HasStdExtZcmop : Predicate<"Subtarget->hasStdExtZcmop()">, 700647cbc5dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZcmop), 701647cbc5dSDimitry Andric "'Zcmop' (Compressed May-Be-Operations)">; 702647cbc5dSDimitry Andric 703647cbc5dSDimitry Andricdef FeatureStdExtZicfiss 704647cbc5dSDimitry Andric : SubtargetFeature<"experimental-zicfiss", "HasStdExtZicfiss", "true", 705647cbc5dSDimitry Andric "'Zicfiss' (Shadow stack)", 706647cbc5dSDimitry Andric [FeatureStdExtZicsr, FeatureStdExtZimop]>; 707647cbc5dSDimitry Andricdef HasStdExtZicfiss : Predicate<"Subtarget->hasStdExtZicfiss()">, 708647cbc5dSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZicfiss), 709647cbc5dSDimitry Andric "'Zicfiss' (Shadow stack)">; 710647cbc5dSDimitry Andricdef NoHasStdExtZicfiss : Predicate<"!Subtarget->hasStdExtZicfiss()">; 711647cbc5dSDimitry Andric 71206c3fb27SDimitry Andricdef FeatureStdExtSmaia 7135f757f3fSDimitry Andric : SubtargetFeature<"smaia", "HasStdExtSmaia", "true", 71406c3fb27SDimitry Andric "'Smaia' (Smaia encompasses all added CSRs and all " 71506c3fb27SDimitry Andric "modifications to interrupt response behavior that the " 71606c3fb27SDimitry Andric "AIA specifies for a hart, over all privilege levels.)", 71706c3fb27SDimitry Andric []>; 71806c3fb27SDimitry Andric 71906c3fb27SDimitry Andricdef FeatureStdExtSsaia 7205f757f3fSDimitry Andric : SubtargetFeature<"ssaia", "HasStdExtSsaia", "true", 72106c3fb27SDimitry Andric "'Ssaia' (Ssaia is essentially the same as Smaia except " 72206c3fb27SDimitry Andric "excluding the machine-level CSRs and behavior not " 72306c3fb27SDimitry Andric "directly visible to supervisor level.)", []>; 72406c3fb27SDimitry Andric 72506c3fb27SDimitry Andricdef HasHalfFPLoadStoreMove 72606c3fb27SDimitry Andric : Predicate<"Subtarget->hasHalfFPLoadStoreMove()">, 72706c3fb27SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZfh, FeatureStdExtZfhmin, 7285f757f3fSDimitry Andric FeatureStdExtZfbfmin), 72906c3fb27SDimitry Andric "'Zfh' (Half-Precision Floating-Point) or " 73006c3fb27SDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal) or " 7315f757f3fSDimitry Andric "'Zfbfmin' (Scalar BF16 Converts)">; 73206c3fb27SDimitry Andric 73306c3fb27SDimitry Andricdef FeatureStdExtZacas 73406c3fb27SDimitry Andric : SubtargetFeature<"experimental-zacas", "HasStdExtZacas", "true", 73506c3fb27SDimitry Andric "'Zacas' (Atomic Compare-And-Swap Instructions)">; 73606c3fb27SDimitry Andricdef HasStdExtZacas : Predicate<"Subtarget->hasStdExtZacas()">, 73706c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZacas), 73806c3fb27SDimitry Andric "'Zacas' (Atomic Compare-And-Swap Instructions)">; 73906c3fb27SDimitry Andric 740bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 741bdd1243dSDimitry Andric// Vendor extensions 742bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 743bdd1243dSDimitry Andric 744bdd1243dSDimitry Andricdef FeatureVendorXVentanaCondOps 745bdd1243dSDimitry Andric : SubtargetFeature<"xventanacondops", "HasVendorXVentanaCondOps", "true", 746bdd1243dSDimitry Andric "'XVentanaCondOps' (Ventana Conditional Ops)">; 747bdd1243dSDimitry Andricdef HasVendorXVentanaCondOps : Predicate<"Subtarget->hasVendorXVentanaCondOps()">, 748bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXVentanaCondOps), 749bdd1243dSDimitry Andric "'XVentanaCondOps' (Ventana Conditional Ops)">; 750bdd1243dSDimitry Andric 75106c3fb27SDimitry Andricdef FeatureVendorXTHeadBa 75206c3fb27SDimitry Andric : SubtargetFeature<"xtheadba", "HasVendorXTHeadBa", "true", 75306c3fb27SDimitry Andric "'xtheadba' (T-Head address calculation instructions)">; 75406c3fb27SDimitry Andricdef HasVendorXTHeadBa : Predicate<"Subtarget->hasVendorXTHeadBa()">, 75506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadBa), 75606c3fb27SDimitry Andric "'xtheadba' (T-Head address calculation instructions)">; 75706c3fb27SDimitry Andric 75806c3fb27SDimitry Andricdef FeatureVendorXTHeadBb 75906c3fb27SDimitry Andric : SubtargetFeature<"xtheadbb", "HasVendorXTHeadBb", "true", 76006c3fb27SDimitry Andric "'xtheadbb' (T-Head basic bit-manipulation instructions)">; 76106c3fb27SDimitry Andricdef HasVendorXTHeadBb : Predicate<"Subtarget->hasVendorXTHeadBb()">, 76206c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadBb), 76306c3fb27SDimitry Andric "'xtheadbb' (T-Head basic bit-manipulation instructions)">; 76406c3fb27SDimitry Andric 76506c3fb27SDimitry Andricdef FeatureVendorXTHeadBs 76606c3fb27SDimitry Andric : SubtargetFeature<"xtheadbs", "HasVendorXTHeadBs", "true", 76706c3fb27SDimitry Andric "'xtheadbs' (T-Head single-bit instructions)">; 76806c3fb27SDimitry Andricdef HasVendorXTHeadBs : Predicate<"Subtarget->hasVendorXTHeadBs()">, 76906c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadBs), 77006c3fb27SDimitry Andric "'xtheadbs' (T-Head single-bit instructions)">; 77106c3fb27SDimitry Andric 77206c3fb27SDimitry Andricdef FeatureVendorXTHeadCondMov 77306c3fb27SDimitry Andric : SubtargetFeature<"xtheadcondmov", "HasVendorXTHeadCondMov", "true", 77406c3fb27SDimitry Andric "'xtheadcondmov' (T-Head conditional move instructions)">; 77506c3fb27SDimitry Andricdef HasVendorXTHeadCondMov : Predicate<"Subtarget->hasVendorXTHeadCondMov()">, 77606c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadCondMov), 77706c3fb27SDimitry Andric "'xtheadcondmov' (T-Head conditional move instructions)">; 77806c3fb27SDimitry Andric 77906c3fb27SDimitry Andricdef FeatureVendorXTHeadCmo 78006c3fb27SDimitry Andric : SubtargetFeature<"xtheadcmo", "HasVendorXTHeadCmo", "true", 78106c3fb27SDimitry Andric "'xtheadcmo' (T-Head cache management instructions)">; 78206c3fb27SDimitry Andricdef HasVendorXTHeadCmo : Predicate<"Subtarget->hasVendorXTHeadCmo()">, 78306c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadCmo), 78406c3fb27SDimitry Andric "'xtheadcmo' (T-Head cache management instructions)">; 78506c3fb27SDimitry Andric 78606c3fb27SDimitry Andricdef FeatureVendorXTHeadFMemIdx 78706c3fb27SDimitry Andric : SubtargetFeature<"xtheadfmemidx", "HasVendorXTHeadFMemIdx", "true", 78806c3fb27SDimitry Andric "'xtheadfmemidx' (T-Head FP Indexed Memory Operations)", 78906c3fb27SDimitry Andric [FeatureStdExtF]>; 79006c3fb27SDimitry Andricdef HasVendorXTHeadFMemIdx : Predicate<"Subtarget->hasVendorXTHeadFMemIdx()">, 79106c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadFMemIdx), 79206c3fb27SDimitry Andric "'xtheadfmemidx' (T-Head FP Indexed Memory Operations)">; 79306c3fb27SDimitry Andric 79406c3fb27SDimitry Andricdef FeatureVendorXTHeadMac 79506c3fb27SDimitry Andric : SubtargetFeature<"xtheadmac", "HasVendorXTHeadMac", "true", 79606c3fb27SDimitry Andric "'xtheadmac' (T-Head Multiply-Accumulate Instructions)">; 79706c3fb27SDimitry Andricdef HasVendorXTHeadMac : Predicate<"Subtarget->hasVendorXTHeadMac()">, 79806c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadMac), 79906c3fb27SDimitry Andric "'xtheadmac' (T-Head Multiply-Accumulate Instructions)">; 80006c3fb27SDimitry Andric 80106c3fb27SDimitry Andricdef FeatureVendorXTHeadMemIdx 80206c3fb27SDimitry Andric : SubtargetFeature<"xtheadmemidx", "HasVendorXTHeadMemIdx", "true", 80306c3fb27SDimitry Andric "'xtheadmemidx' (T-Head Indexed Memory Operations)">; 80406c3fb27SDimitry Andricdef HasVendorXTHeadMemIdx : Predicate<"Subtarget->hasVendorXTHeadMemIdx()">, 80506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadMemIdx), 80606c3fb27SDimitry Andric "'xtheadmemidx' (T-Head Indexed Memory Operations)">; 80706c3fb27SDimitry Andric 80806c3fb27SDimitry Andricdef FeatureVendorXTHeadMemPair 80906c3fb27SDimitry Andric : SubtargetFeature<"xtheadmempair", "HasVendorXTHeadMemPair", "true", 81006c3fb27SDimitry Andric "'xtheadmempair' (T-Head two-GPR Memory Operations)">; 81106c3fb27SDimitry Andricdef HasVendorXTHeadMemPair : Predicate<"Subtarget->hasVendorXTHeadMemPair()">, 81206c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadMemPair), 81306c3fb27SDimitry Andric "'xtheadmempair' (T-Head two-GPR Memory Operations)">; 81406c3fb27SDimitry Andric 81506c3fb27SDimitry Andricdef FeatureVendorXTHeadSync 81606c3fb27SDimitry Andric : SubtargetFeature<"xtheadsync", "HasVendorXTHeadSync", "true", 81706c3fb27SDimitry Andric "'xtheadsync' (T-Head multicore synchronization instructions)">; 81806c3fb27SDimitry Andricdef HasVendorXTHeadSync : Predicate<"Subtarget->hasVendorXTHeadSync()">, 81906c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadSync), 82006c3fb27SDimitry Andric "'xtheadsync' (T-Head multicore synchronization instructions)">; 82106c3fb27SDimitry Andric 822bdd1243dSDimitry Andricdef FeatureVendorXTHeadVdot 823bdd1243dSDimitry Andric : SubtargetFeature<"xtheadvdot", "HasVendorXTHeadVdot", "true", 824bdd1243dSDimitry Andric "'xtheadvdot' (T-Head Vector Extensions for Dot)", 825bdd1243dSDimitry Andric [FeatureStdExtV]>; 826bdd1243dSDimitry Andricdef HasVendorXTHeadVdot : Predicate<"Subtarget->hasVendorXTHeadVdot()">, 827bdd1243dSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXTHeadVdot), 828bdd1243dSDimitry Andric "'xtheadvdot' (T-Head Vector Extensions for Dot)">; 829bdd1243dSDimitry Andric 83006c3fb27SDimitry Andricdef FeatureVendorXSfvcp 83106c3fb27SDimitry Andric : SubtargetFeature<"xsfvcp", "HasVendorXSfvcp", "true", 83206c3fb27SDimitry Andric "'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)", 83306c3fb27SDimitry Andric [FeatureStdExtZve32x]>; 83406c3fb27SDimitry Andricdef HasVendorXSfvcp : Predicate<"Subtarget->hasVendorXSfvcp()">, 83506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXSfvcp), 83606c3fb27SDimitry Andric "'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)">; 83706c3fb27SDimitry Andric 8385f757f3fSDimitry Andricdef FeatureVendorXSfvqmaccdod 8395f757f3fSDimitry Andric : SubtargetFeature<"xsfvqmaccdod", "HasVendorXSfvqmaccdod", "true", 8405f757f3fSDimitry Andric "'XSfvqmaccdod' (SiFive Int8 Matrix Multiplication Instructions (2-by-8 and 8-by-2))", 8415f757f3fSDimitry Andric [FeatureStdExtZve32x]>; 8425f757f3fSDimitry Andricdef HasVendorXSfvqmaccdod : Predicate<"Subtarget->hasVendorXSfvqmaccdod()">, 8435f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXSfvqmaccdod), 8445f757f3fSDimitry Andric "'XSfvqmaccdod' (SiFive Int8 Matrix Multiplication Instructions (2-by-8 and 8-by-2))">; 8455f757f3fSDimitry Andric 8465f757f3fSDimitry Andricdef FeatureVendorXSfvqmaccqoq 8475f757f3fSDimitry Andric : SubtargetFeature<"xsfvqmaccqoq", "HasVendorXSfvqmaccqoq", "true", 8485f757f3fSDimitry Andric "'XSfvqmaccqoq' (SiFive Int8 Matrix Multiplication Instructions (4-by-8 and 8-by-4))", 8495f757f3fSDimitry Andric [FeatureStdExtZve32x]>; 8505f757f3fSDimitry Andricdef HasVendorXSfvqmaccqoq : Predicate<"Subtarget->hasVendorXSfvqmaccqoq()">, 8515f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXSfvqmaccqoq), 8525f757f3fSDimitry Andric "'XSfvqmaccqoq' (SiFive Int8 Matrix Multiplication Instructions (4-by-8 and 8-by-4))">; 8535f757f3fSDimitry Andric 8545f757f3fSDimitry Andricdef FeatureVendorXSfvfwmaccqqq 8555f757f3fSDimitry Andric : SubtargetFeature<"xsfvfwmaccqqq", "HasVendorXSfvfwmaccqqq", "true", 8565f757f3fSDimitry Andric "'XSfvfwmaccqqq' (SiFive Matrix Multiply Accumulate Instruction and 4-by-4))", 8575f757f3fSDimitry Andric [FeatureStdExtZve32f, FeatureStdExtZvfbfmin]>; 8585f757f3fSDimitry Andricdef HasVendorXSfvfwmaccqqq : Predicate<"Subtarget->hasVendorXSfvfwmaccqqq()">, 8595f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXSfvfwmaccqqq), 8605f757f3fSDimitry Andric "'XSfvfwmaccqqq' (SiFive Matrix Multiply Accumulate Instruction and 4-by-4))">; 8615f757f3fSDimitry Andric 8625f757f3fSDimitry Andricdef FeatureVendorXSfvfnrclipxfqf 8635f757f3fSDimitry Andric : SubtargetFeature<"xsfvfnrclipxfqf", "HasVendorXSfvfnrclipxfqf", "true", 8645f757f3fSDimitry Andric "'XSfvfnrclipxfqf' (SiFive FP32-to-int8 Ranged Clip Instructions)", 8655f757f3fSDimitry Andric [FeatureStdExtZve32f]>; 8665f757f3fSDimitry Andricdef HasVendorXSfvfnrclipxfqf : Predicate<"Subtarget->hasVendorXSfvfnrclipxfqf()">, 8675f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXSfvfnrclipxfqf), 8685f757f3fSDimitry Andric "'XSfvfnrclipxfqf' (SiFive FP32-to-int8 Ranged Clip Instructions)">; 8695f757f3fSDimitry Andricdef FeatureVendorXCVelw 8705f757f3fSDimitry Andric : SubtargetFeature<"xcvelw", "HasVendorXCVelw", "true", 8715f757f3fSDimitry Andric "'XCVelw' (CORE-V Event Load Word)">; 8725f757f3fSDimitry Andricdef HasVendorXCVelw 8735f757f3fSDimitry Andric : Predicate<"Subtarget->hasVendorXCVelw()">, 8745f757f3fSDimitry Andric AssemblerPredicate<(any_of FeatureVendorXCVelw), 8755f757f3fSDimitry Andric "'XCVelw' (CORE-V Event Load Word)">; 8765f757f3fSDimitry Andric 87706c3fb27SDimitry Andricdef FeatureVendorXCVbitmanip 87806c3fb27SDimitry Andric : SubtargetFeature<"xcvbitmanip", "HasVendorXCVbitmanip", "true", 87906c3fb27SDimitry Andric "'XCVbitmanip' (CORE-V Bit Manipulation)">; 88006c3fb27SDimitry Andricdef HasVendorXCVbitmanip : Predicate<"Subtarget->hasVendorXCVbitmanip()">, 88106c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXCVbitmanip), 88206c3fb27SDimitry Andric "'XCVbitmanip' (CORE-V Bit Manipulation)">; 88306c3fb27SDimitry Andric 88406c3fb27SDimitry Andricdef FeatureVendorXCVmac 88506c3fb27SDimitry Andric : SubtargetFeature<"xcvmac", "HasVendorXCVmac", "true", 88606c3fb27SDimitry Andric "'XCVmac' (CORE-V Multiply-Accumulate)">; 88706c3fb27SDimitry Andricdef HasVendorXCVmac : Predicate<"Subtarget->hasVendorXCVmac()">, 88806c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureVendorXCVmac), 88906c3fb27SDimitry Andric "'XCVmac' (CORE-V Multiply-Accumulate)">; 89006c3fb27SDimitry Andric 8915f757f3fSDimitry Andricdef FeatureVendorXCVmem 8925f757f3fSDimitry Andric : SubtargetFeature<"xcvmem", "HasVendorXCVmem", "true", 8935f757f3fSDimitry Andric "'XCVmem' (CORE-V Post-incrementing Load & Store)">; 8945f757f3fSDimitry Andricdef HasVendorXCVmem 8955f757f3fSDimitry Andric : Predicate<"Subtarget->hasVendorXCVmem()">, 8965f757f3fSDimitry Andric AssemblerPredicate<(any_of FeatureVendorXCVmem), 8975f757f3fSDimitry Andric "'XCVmem' (CORE-V Post-incrementing Load & Store)">; 8985f757f3fSDimitry Andric 8995f757f3fSDimitry Andricdef FeatureVendorXCValu 9005f757f3fSDimitry Andric : SubtargetFeature<"xcvalu", "HasVendorXCValu", "true", 9015f757f3fSDimitry Andric "'XCValu' (CORE-V ALU Operations)">; 9025f757f3fSDimitry Andricdef HasVendorXCValu : Predicate<"Subtarget->hasVendorXCValu()">, 9035f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXCValu), 9045f757f3fSDimitry Andric "'XCValu' (CORE-V ALU Operations)">; 9055f757f3fSDimitry Andric 9065f757f3fSDimitry Andricdef FeatureVendorXCVsimd 9075f757f3fSDimitry Andric : SubtargetFeature<"xcvsimd", "HasVendorXCvsimd", "true", 9085f757f3fSDimitry Andric "'XCVsimd' (CORE-V SIMD ALU)">; 9095f757f3fSDimitry Andricdef HasVendorXCVsimd 9105f757f3fSDimitry Andric : Predicate<"Subtarget->hasVendorXCVsimd()">, 9115f757f3fSDimitry Andric AssemblerPredicate<(any_of FeatureVendorXCVsimd), 9125f757f3fSDimitry Andric "'XCVsimd' (CORE-V SIMD ALU)">; 9135f757f3fSDimitry Andric 9145f757f3fSDimitry Andricdef FeatureVendorXCVbi 9155f757f3fSDimitry Andric : SubtargetFeature<"xcvbi", "HasVendorXCVbi", "true", 9165f757f3fSDimitry Andric "'XCVbi' (CORE-V Immediate Branching)">; 9175f757f3fSDimitry Andricdef HasVendorXCVbi : Predicate<"Subtarget->hasVendorXCVbi()">, 9185f757f3fSDimitry Andric AssemblerPredicate<(all_of FeatureVendorXCVbi), 9195f757f3fSDimitry Andric "'XCVbi' (CORE-V Immediate Branching)">; 9205f757f3fSDimitry Andric 921bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 922bdd1243dSDimitry Andric// LLVM specific features and extensions 923bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 924bdd1243dSDimitry Andric 925bdd1243dSDimitry Andric// Feature32Bit exists to mark CPUs that support RV32 to distinquish them from 926bdd1243dSDimitry Andric// tuning CPU names. 927bdd1243dSDimitry Andricdef Feature32Bit 92806c3fb27SDimitry Andric : SubtargetFeature<"32bit", "IsRV32", "true", "Implements RV32">; 929bdd1243dSDimitry Andricdef Feature64Bit 93006c3fb27SDimitry Andric : SubtargetFeature<"64bit", "IsRV64", "true", "Implements RV64">; 931bdd1243dSDimitry Andricdef IsRV64 : Predicate<"Subtarget->is64Bit()">, 932bdd1243dSDimitry Andric AssemblerPredicate<(all_of Feature64Bit), 933bdd1243dSDimitry Andric "RV64I Base Instruction Set">; 934bdd1243dSDimitry Andricdef IsRV32 : Predicate<"!Subtarget->is64Bit()">, 935bdd1243dSDimitry Andric AssemblerPredicate<(all_of (not Feature64Bit)), 936bdd1243dSDimitry Andric "RV32I Base Instruction Set">; 937bdd1243dSDimitry Andric 938bdd1243dSDimitry Andricdefvar RV32 = DefaultMode; 93906c3fb27SDimitry Andricdef RV64 : HwMode<"+64bit", [IsRV64]>; 940bdd1243dSDimitry Andric 94106c3fb27SDimitry Andricdef FeatureRVE 94206c3fb27SDimitry Andric : SubtargetFeature<"e", "IsRVE", "true", 94306c3fb27SDimitry Andric "Implements RV{32,64}E (provides 16 rather than 32 GPRs)">; 94406c3fb27SDimitry Andricdef IsRVE : Predicate<"Subtarget->isRVE()">, 94506c3fb27SDimitry Andric AssemblerPredicate<(all_of FeatureRVE)>; 946bdd1243dSDimitry Andric 947bdd1243dSDimitry Andricdef FeatureRelax 948bdd1243dSDimitry Andric : SubtargetFeature<"relax", "EnableLinkerRelax", "true", 949bdd1243dSDimitry Andric "Enable Linker relaxation.">; 950bdd1243dSDimitry Andric 951bdd1243dSDimitry Andricforeach i = {1-31} in 952bdd1243dSDimitry Andric def FeatureReserveX#i : 953bdd1243dSDimitry Andric SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]", 954bdd1243dSDimitry Andric "true", "Reserve X"#i>; 955bdd1243dSDimitry Andric 956bdd1243dSDimitry Andricdef FeatureSaveRestore : SubtargetFeature<"save-restore", "EnableSaveRestore", 957bdd1243dSDimitry Andric "true", "Enable save/restore.">; 958bdd1243dSDimitry Andric 95906c3fb27SDimitry Andricdef FeatureTrailingSeqCstFence : SubtargetFeature<"seq-cst-trailing-fence", 96006c3fb27SDimitry Andric "EnableSeqCstTrailingFence", 96106c3fb27SDimitry Andric "true", 96206c3fb27SDimitry Andric "Enable trailing fence for seq-cst store.">; 96306c3fb27SDimitry Andric 9645f757f3fSDimitry Andricdef FeatureFastUnalignedAccess 9655f757f3fSDimitry Andric : SubtargetFeature<"fast-unaligned-access", "HasFastUnalignedAccess", 9665f757f3fSDimitry Andric "true", "Has reasonably performant unaligned " 9675f757f3fSDimitry Andric "loads and stores (both scalar and vector)">; 968bdd1243dSDimitry Andric 9695f757f3fSDimitry Andricdef FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler", 9705f757f3fSDimitry Andric "UsePostRAScheduler", "true", "Schedule again after register allocation">; 97106c3fb27SDimitry Andric 972bdd1243dSDimitry Andricdef TuneNoOptimizedZeroStrideLoad 973bdd1243dSDimitry Andric : SubtargetFeature<"no-optimized-zero-stride-load", "HasOptimizedZeroStrideLoad", 974bdd1243dSDimitry Andric "false", "Hasn't optimized (perform fewer memory operations)" 975bdd1243dSDimitry Andric "zero-stride vector load">; 976bdd1243dSDimitry Andric 977cb14a3feSDimitry Andricdef Experimental 978cb14a3feSDimitry Andric : SubtargetFeature<"experimental", "HasExperimental", 979cb14a3feSDimitry Andric "true", "Experimental intrinsics">; 980cb14a3feSDimitry Andric 98106c3fb27SDimitry Andric// Some vector hardware implementations do not process all VLEN bits in parallel 98206c3fb27SDimitry Andric// and instead split over multiple cycles. DLEN refers to the datapath width 98306c3fb27SDimitry Andric// that can be done in parallel. 98406c3fb27SDimitry Andricdef TuneDLenFactor2 98506c3fb27SDimitry Andric : SubtargetFeature<"dlen-factor-2", "DLenFactor2", "true", 98606c3fb27SDimitry Andric "Vector unit DLEN(data path width) is half of VLEN">; 98706c3fb27SDimitry Andric 988bdd1243dSDimitry Andricdef TuneLUIADDIFusion 989bdd1243dSDimitry Andric : SubtargetFeature<"lui-addi-fusion", "HasLUIADDIFusion", 990bdd1243dSDimitry Andric "true", "Enable LUI+ADDI macrofusion">; 991bdd1243dSDimitry Andric 9925f757f3fSDimitry Andricdef TuneAUIPCADDIFusion 9935f757f3fSDimitry Andric : SubtargetFeature<"auipc-addi-fusion", "HasAUIPCADDIFusion", 9945f757f3fSDimitry Andric "true", "Enable AUIPC+ADDI macrofusion">; 995cb14a3feSDimitry Andric 996cb14a3feSDimitry Andricdef TuneZExtHFusion 997cb14a3feSDimitry Andric : SubtargetFeature<"zexth-fusion", "HasZExtHFusion", 998cb14a3feSDimitry Andric "true", "Enable SLLI+SRLI to be fused to zero extension of halfword">; 999cb14a3feSDimitry Andric 1000cb14a3feSDimitry Andricdef TuneZExtWFusion 1001cb14a3feSDimitry Andric : SubtargetFeature<"zextw-fusion", "HasZExtWFusion", 1002cb14a3feSDimitry Andric "true", "Enable SLLI+SRLI to be fused to zero extension of word">; 1003cb14a3feSDimitry Andric 1004cb14a3feSDimitry Andricdef TuneShiftedZExtWFusion 1005cb14a3feSDimitry Andric : SubtargetFeature<"shifted-zextw-fusion", "HasShiftedZExtWFusion", 1006cb14a3feSDimitry Andric "true", "Enable SLLI+SRLI to be fused when computing (shifted) zero extension of word">; 1007cb14a3feSDimitry Andric 10085f757f3fSDimitry Andricdef TuneLDADDFusion 10095f757f3fSDimitry Andric : SubtargetFeature<"ld-add-fusion", "HasLDADDFusion", 10105f757f3fSDimitry Andric "true", "Enable LD+ADD macrofusion.">; 10115f757f3fSDimitry Andric 1012bdd1243dSDimitry Andricdef TuneNoDefaultUnroll 1013bdd1243dSDimitry Andric : SubtargetFeature<"no-default-unroll", "EnableDefaultUnroll", "false", 1014bdd1243dSDimitry Andric "Disable default unroll preference.">; 1015bdd1243dSDimitry Andric 1016bdd1243dSDimitry Andric// SiFive 7 is able to fuse integer ALU operations with a preceding branch 1017bdd1243dSDimitry Andric// instruction. 1018bdd1243dSDimitry Andricdef TuneShortForwardBranchOpt 1019bdd1243dSDimitry Andric : SubtargetFeature<"short-forward-branch-opt", "HasShortForwardBranchOpt", 1020bdd1243dSDimitry Andric "true", "Enable short forward branch optimization">; 1021bdd1243dSDimitry Andricdef HasShortForwardBranchOpt : Predicate<"Subtarget->hasShortForwardBranchOpt()">; 1022bdd1243dSDimitry Andricdef NoShortForwardBranchOpt : Predicate<"!Subtarget->hasShortForwardBranchOpt()">; 1023bdd1243dSDimitry Andric 1024*1db9f3b2SDimitry Andricdef TuneConditionalCompressedMoveFusion 1025*1db9f3b2SDimitry Andric : SubtargetFeature<"conditional-cmv-fusion", "HasConditionalCompressedMoveFusion", 1026*1db9f3b2SDimitry Andric "true", "Enable branch+c.mv fusion">; 1027*1db9f3b2SDimitry Andricdef HasConditionalMoveFusion : Predicate<"Subtarget->hasConditionalMoveFusion()">; 1028*1db9f3b2SDimitry Andricdef NoConditionalMoveFusion : Predicate<"!Subtarget->hasConditionalMoveFusion()">; 1029*1db9f3b2SDimitry Andric 1030bdd1243dSDimitry Andricdef TuneSiFive7 : SubtargetFeature<"sifive7", "RISCVProcFamily", "SiFive7", 1031bdd1243dSDimitry Andric "SiFive 7-Series processors", 1032bdd1243dSDimitry Andric [TuneNoDefaultUnroll, 1033bdd1243dSDimitry Andric TuneShortForwardBranchOpt]>; 1034bdd1243dSDimitry Andric 1035cb14a3feSDimitry Andricdef TuneVentanaVeyron : SubtargetFeature<"ventana-veyron", "RISCVProcFamily", "VentanaVeyron", 1036cb14a3feSDimitry Andric "Ventana Veyron-Series processors">; 10375f757f3fSDimitry Andric 1038bdd1243dSDimitry Andric// Assume that lock-free native-width atomics are available, even if the target 1039bdd1243dSDimitry Andric// and operating system combination would not usually provide them. The user 1040bdd1243dSDimitry Andric// is responsible for providing any necessary __sync implementations. Code 1041bdd1243dSDimitry Andric// built with this feature is not ABI-compatible with code built without this 1042bdd1243dSDimitry Andric// feature, if atomic variables are exposed across the ABI boundary. 1043bdd1243dSDimitry Andricdef FeatureForcedAtomics : SubtargetFeature< 1044bdd1243dSDimitry Andric "forced-atomics", "HasForcedAtomics", "true", 1045bdd1243dSDimitry Andric "Assume that lock-free native-width atomics are available">; 1046bdd1243dSDimitry Andricdef HasAtomicLdSt 1047bdd1243dSDimitry Andric : Predicate<"Subtarget->hasStdExtA() || Subtarget->hasForcedAtomics()">; 1048bdd1243dSDimitry Andric 1049bdd1243dSDimitry Andricdef FeatureTaggedGlobals : SubtargetFeature<"tagged-globals", 1050bdd1243dSDimitry Andric "AllowTaggedGlobals", 1051bdd1243dSDimitry Andric "true", "Use an instruction sequence for taking the address of a global " 1052bdd1243dSDimitry Andric "that allows a memory tag in the upper address bits">; 1053