10b57cec5SDimitry Andric//===-- RISCV.td - Describe the RISCV Target Machine -------*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andricinclude "llvm/Target/Target.td" 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric// RISC-V subtarget features and instruction predicates. 130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andricdef FeatureStdExtM 160b57cec5SDimitry Andric : SubtargetFeature<"m", "HasStdExtM", "true", 170b57cec5SDimitry Andric "'M' (Integer Multiplication and Division)">; 180b57cec5SDimitry Andricdef HasStdExtM : Predicate<"Subtarget->hasStdExtM()">, 195ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtM), 20480093f4SDimitry Andric "'M' (Integer Multiplication and Division)">; 210b57cec5SDimitry Andric 220b57cec5SDimitry Andricdef FeatureStdExtA 230b57cec5SDimitry Andric : SubtargetFeature<"a", "HasStdExtA", "true", 240b57cec5SDimitry Andric "'A' (Atomic Instructions)">; 250b57cec5SDimitry Andricdef HasStdExtA : Predicate<"Subtarget->hasStdExtA()">, 265ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtA), 27480093f4SDimitry Andric "'A' (Atomic Instructions)">; 280b57cec5SDimitry Andric 290b57cec5SDimitry Andricdef FeatureStdExtF 300b57cec5SDimitry Andric : SubtargetFeature<"f", "HasStdExtF", "true", 310b57cec5SDimitry Andric "'F' (Single-Precision Floating-Point)">; 320b57cec5SDimitry Andricdef HasStdExtF : Predicate<"Subtarget->hasStdExtF()">, 335ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtF), 34480093f4SDimitry Andric "'F' (Single-Precision Floating-Point)">; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andricdef FeatureStdExtD 370b57cec5SDimitry Andric : SubtargetFeature<"d", "HasStdExtD", "true", 380b57cec5SDimitry Andric "'D' (Double-Precision Floating-Point)", 390b57cec5SDimitry Andric [FeatureStdExtF]>; 400b57cec5SDimitry Andricdef HasStdExtD : Predicate<"Subtarget->hasStdExtD()">, 415ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtD), 42480093f4SDimitry Andric "'D' (Double-Precision Floating-Point)">; 430b57cec5SDimitry Andric 44349cc55cSDimitry Andricdef FeatureStdExtZfhmin 45*04eeddc0SDimitry Andric : SubtargetFeature<"zfhmin", "HasStdExtZfhmin", "true", 46349cc55cSDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal)", 47349cc55cSDimitry Andric [FeatureStdExtF]>; 48349cc55cSDimitry Andricdef HasStdExtZfhmin : Predicate<"Subtarget->hasStdExtZfhmin()">, 49349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfhmin), 50349cc55cSDimitry Andric "'Zfhmin' (Half-Precision Floating-Point Minimal)">; 51349cc55cSDimitry Andric 52349cc55cSDimitry Andricdef FeatureStdExtZfh 53*04eeddc0SDimitry Andric : SubtargetFeature<"zfh", "HasStdExtZfh", "true", 54e8d8bef9SDimitry Andric "'Zfh' (Half-Precision Floating-Point)", 55349cc55cSDimitry Andric [FeatureStdExtZfhmin, FeatureStdExtF]>; 56e8d8bef9SDimitry Andricdef HasStdExtZfh : Predicate<"Subtarget->hasStdExtZfh()">, 57349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZfh), 58e8d8bef9SDimitry Andric "'Zfh' (Half-Precision Floating-Point)">; 59e8d8bef9SDimitry Andric 600b57cec5SDimitry Andricdef FeatureStdExtC 610b57cec5SDimitry Andric : SubtargetFeature<"c", "HasStdExtC", "true", 620b57cec5SDimitry Andric "'C' (Compressed Instructions)">; 630b57cec5SDimitry Andricdef HasStdExtC : Predicate<"Subtarget->hasStdExtC()">, 645ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtC), 65480093f4SDimitry Andric "'C' (Compressed Instructions)">; 660b57cec5SDimitry Andric 67349cc55cSDimitry Andricdef FeatureStdExtZba 68*04eeddc0SDimitry Andric : SubtargetFeature<"zba", "HasStdExtZba", "true", 69*04eeddc0SDimitry Andric "'Zba' (Address Generation Instructions)">; 70e8d8bef9SDimitry Andricdef HasStdExtZba : Predicate<"Subtarget->hasStdExtZba()">, 71349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZba), 72*04eeddc0SDimitry Andric "'Zba' (Address Generation Instructions)">; 73e8d8bef9SDimitry Andricdef NotHasStdExtZba : Predicate<"!Subtarget->hasStdExtZba()">; 74e8d8bef9SDimitry Andric 75349cc55cSDimitry Andricdef FeatureStdExtZbb 76*04eeddc0SDimitry Andric : SubtargetFeature<"zbb", "HasStdExtZbb", "true", 77*04eeddc0SDimitry Andric "'Zbb' (Basic Bit-Manipulation)">; 785ffd83dbSDimitry Andricdef HasStdExtZbb : Predicate<"Subtarget->hasStdExtZbb()">, 79349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbb), 80*04eeddc0SDimitry Andric "'Zbb' (Basic Bit-Manipulation)">; 815ffd83dbSDimitry Andric 82349cc55cSDimitry Andricdef FeatureStdExtZbc 83*04eeddc0SDimitry Andric : SubtargetFeature<"zbc", "HasStdExtZbc", "true", 84*04eeddc0SDimitry Andric "'Zbc' (Carry-Less Multiplication)">; 855ffd83dbSDimitry Andricdef HasStdExtZbc : Predicate<"Subtarget->hasStdExtZbc()">, 86349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbc), 87*04eeddc0SDimitry Andric "'Zbc' (Carry-Less Multiplication)">; 885ffd83dbSDimitry Andric 89349cc55cSDimitry Andricdef FeatureStdExtZbe 905ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbe", "HasStdExtZbe", "true", 91*04eeddc0SDimitry Andric "'Zbe' (Extract-Deposit 'Zb' Instructions)">; 925ffd83dbSDimitry Andricdef HasStdExtZbe : Predicate<"Subtarget->hasStdExtZbe()">, 93349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbe), 94*04eeddc0SDimitry Andric "'Zbe' (Extract-Deposit 'Zb' Instructions)">; 955ffd83dbSDimitry Andric 96349cc55cSDimitry Andricdef FeatureStdExtZbf 975ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbf", "HasStdExtZbf", "true", 98*04eeddc0SDimitry Andric "'Zbf' (Bit-Field 'Zb' Instructions)">; 995ffd83dbSDimitry Andricdef HasStdExtZbf : Predicate<"Subtarget->hasStdExtZbf()">, 100349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbf), 101*04eeddc0SDimitry Andric "'Zbf' (Bit-Field 'Zb' Instructions)">; 1025ffd83dbSDimitry Andric 103349cc55cSDimitry Andricdef FeatureStdExtZbm 1045ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbm", "HasStdExtZbm", "true", 105*04eeddc0SDimitry Andric "'Zbm' (Matrix 'Zb' Instructions)">; 1065ffd83dbSDimitry Andricdef HasStdExtZbm : Predicate<"Subtarget->hasStdExtZbm()">, 107349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbm), 108*04eeddc0SDimitry Andric "'Zbm' (Matrix 'Zb' Instructions)">; 1095ffd83dbSDimitry Andric 110349cc55cSDimitry Andricdef FeatureStdExtZbp 1115ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbp", "HasStdExtZbp", "true", 112*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions)">; 1135ffd83dbSDimitry Andricdef HasStdExtZbp : Predicate<"Subtarget->hasStdExtZbp()">, 114349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbp), 115*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions)">; 1165ffd83dbSDimitry Andric 117349cc55cSDimitry Andricdef FeatureStdExtZbr 1185ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbr", "HasStdExtZbr", "true", 119*04eeddc0SDimitry Andric "'Zbr' (Polynomial Reduction 'Zb' Instructions)">; 1205ffd83dbSDimitry Andricdef HasStdExtZbr : Predicate<"Subtarget->hasStdExtZbr()">, 121349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbr), 122*04eeddc0SDimitry Andric "'Zbr' (Polynomial Reduction 'Zb' Instructions)">; 1235ffd83dbSDimitry Andric 124349cc55cSDimitry Andricdef FeatureStdExtZbs 125*04eeddc0SDimitry Andric : SubtargetFeature<"zbs", "HasStdExtZbs", "true", 126*04eeddc0SDimitry Andric "'Zbs' (Single-Bit Instructions)">; 1275ffd83dbSDimitry Andricdef HasStdExtZbs : Predicate<"Subtarget->hasStdExtZbs()">, 128349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbs), 129*04eeddc0SDimitry Andric "'Zbs' (Single-Bit Instructions)">; 1305ffd83dbSDimitry Andric 131349cc55cSDimitry Andricdef FeatureStdExtZbt 1325ffd83dbSDimitry Andric : SubtargetFeature<"experimental-zbt", "HasStdExtZbt", "true", 133*04eeddc0SDimitry Andric "'Zbt' (Ternary 'Zb' Instructions)">; 1345ffd83dbSDimitry Andricdef HasStdExtZbt : Predicate<"Subtarget->hasStdExtZbt()">, 135349cc55cSDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbt), 136*04eeddc0SDimitry Andric "'Zbt' (Ternary 'Zb' Instructions)">; 1375ffd83dbSDimitry Andric 1385ffd83dbSDimitry Andric// Some instructions belong to both the basic and the permutation 1395ffd83dbSDimitry Andric// subextensions. They should be enabled if either has been specified. 1405ffd83dbSDimitry Andricdef HasStdExtZbbOrZbp 1415ffd83dbSDimitry Andric : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbp()">, 142349cc55cSDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbp), 143*04eeddc0SDimitry Andric "'Zbb' (Basic Bit-Manipulation) or " 144*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions)">; 145*04eeddc0SDimitry Andric 146*04eeddc0SDimitry Andricdef FeatureStdExtZbkb 147*04eeddc0SDimitry Andric : SubtargetFeature<"zbkb", "HasStdExtZbkb", "true", 148*04eeddc0SDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 149*04eeddc0SDimitry Andricdef HasStdExtZbkb : Predicate<"Subtarget->hasStdExtZbkb()">, 150*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkb), 151*04eeddc0SDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 152*04eeddc0SDimitry Andric 153*04eeddc0SDimitry Andricdef FeatureStdExtZbkx 154*04eeddc0SDimitry Andric : SubtargetFeature<"zbkx", "HasStdExtZbkx", "true", 155*04eeddc0SDimitry Andric "'Zbkx' (Crossbar permutation instructions)">; 156*04eeddc0SDimitry Andricdef HasStdExtZbkx : Predicate<"Subtarget->hasStdExtZbkx()">, 157*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkx), 158*04eeddc0SDimitry Andric "'Zbkx' (Crossbar permutation instructions)">; 159*04eeddc0SDimitry Andric 160*04eeddc0SDimitry Andricdef HasStdExtZbpOrZbkx 161*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkx()">, 162*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbp, FeatureStdExtZbkx), 163*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions) or " 164*04eeddc0SDimitry Andric "'Zbkx' (Crossbar permutation instructions)">; 165*04eeddc0SDimitry Andric 166*04eeddc0SDimitry Andricdef HasStdExtZbpOrZbkb 167*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkb()">, 168*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbp, FeatureStdExtZbkb), 169*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions) or " 170*04eeddc0SDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 171*04eeddc0SDimitry Andric 172*04eeddc0SDimitry Andricdef HasStdExtZbbOrZbkb 173*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbkb()">, 174*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbkb), 175*04eeddc0SDimitry Andric "'Zbb' (Basic Bit-Manipulation) or " 176*04eeddc0SDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 177*04eeddc0SDimitry Andric 178*04eeddc0SDimitry Andricdef HasStdExtZbbOrZbpOrZbkb 179*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbp() || Subtarget->hasStdExtZbkb()">, 180*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbb, FeatureStdExtZbp, FeatureStdExtZbkb), 181*04eeddc0SDimitry Andric "'Zbb' (Basic Bit-Manipulation) or " 182*04eeddc0SDimitry Andric "'Zbp' (Permutation 'Zb' Instructions) or " 183*04eeddc0SDimitry Andric "'Zbkb' (Bitmanip instructions for Cryptography)">; 184*04eeddc0SDimitry Andric 185*04eeddc0SDimitry Andric// The Carry-less multiply subextension for cryptography is a subset of basic carry-less multiply subextension. The former should be enabled if the latter is enabled. 186*04eeddc0SDimitry Andricdef FeatureStdExtZbkc 187*04eeddc0SDimitry Andric : SubtargetFeature<"zbkc", "HasStdExtZbkc", "true", 188*04eeddc0SDimitry Andric "'Zbkc' (Carry-less multiply instructions for Cryptography)">; 189*04eeddc0SDimitry Andricdef HasStdExtZbkc 190*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbkc()">, 191*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZbkc), 192*04eeddc0SDimitry Andric "'Zbkc' (Carry-less multiply instructions for Cryptography)">; 193*04eeddc0SDimitry Andric 194*04eeddc0SDimitry Andricdef HasStdExtZbcOrZbkc 195*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZbc() || Subtarget->hasStdExtZbkc()">, 196*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZbc, FeatureStdExtZbkc), 197*04eeddc0SDimitry Andric "'Zbc' (Carry-Less Multiplication) or " 198*04eeddc0SDimitry Andric "'Zbkc' (Carry-less multiply instructions for Cryptography)">; 199*04eeddc0SDimitry Andric 200*04eeddc0SDimitry Andricdef FeatureStdExtZknd 201*04eeddc0SDimitry Andric : SubtargetFeature<"zknd", "HasStdExtZknd", "true", 202*04eeddc0SDimitry Andric "'Zknd' (NIST Suite: AES Decryption)">; 203*04eeddc0SDimitry Andricdef HasStdExtZknd : Predicate<"Subtarget->hasStdExtZknd()">, 204*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZknd), 205*04eeddc0SDimitry Andric "'Zknd' (NIST Suite: AES Decryption)">; 206*04eeddc0SDimitry Andric 207*04eeddc0SDimitry Andricdef FeatureStdExtZkne 208*04eeddc0SDimitry Andric : SubtargetFeature<"zkne", "HasStdExtZkne", "true", 209*04eeddc0SDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 210*04eeddc0SDimitry Andricdef HasStdExtZkne : Predicate<"Subtarget->hasStdExtZkne()">, 211*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZkne), 212*04eeddc0SDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 213*04eeddc0SDimitry Andric 214*04eeddc0SDimitry Andric// Some instructions belong to both Zknd and Zkne subextensions. 215*04eeddc0SDimitry Andric// They should be enabled if either has been specified. 216*04eeddc0SDimitry Andricdef HasStdExtZkndOrZkne 217*04eeddc0SDimitry Andric : Predicate<"Subtarget->hasStdExtZknd() || Subtarget->hasStdExtZkne()">, 218*04eeddc0SDimitry Andric AssemblerPredicate<(any_of FeatureStdExtZknd, FeatureStdExtZkne), 219*04eeddc0SDimitry Andric "'Zknd' (NIST Suite: AES Decryption) or " 220*04eeddc0SDimitry Andric "'Zkne' (NIST Suite: AES Encryption)">; 221*04eeddc0SDimitry Andric 222*04eeddc0SDimitry Andricdef FeatureStdExtZknh 223*04eeddc0SDimitry Andric : SubtargetFeature<"zknh", "HasStdExtZknh", "true", 224*04eeddc0SDimitry Andric "'Zknh' (NIST Suite: Hash Function Instructions)">; 225*04eeddc0SDimitry Andricdef HasStdExtZknh : Predicate<"Subtarget->hasStdExtZknh()">, 226*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZknh), 227*04eeddc0SDimitry Andric "'Zknh' (NIST Suite: Hash Function Instructions)">; 228*04eeddc0SDimitry Andric 229*04eeddc0SDimitry Andricdef FeatureStdExtZksed 230*04eeddc0SDimitry Andric : SubtargetFeature<"zksed", "HasStdExtZksed", "true", 231*04eeddc0SDimitry Andric "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">; 232*04eeddc0SDimitry Andricdef HasStdExtZksed : Predicate<"Subtarget->hasStdExtZksed()">, 233*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZksed), 234*04eeddc0SDimitry Andric "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)">; 235*04eeddc0SDimitry Andric 236*04eeddc0SDimitry Andricdef FeatureStdExtZksh 237*04eeddc0SDimitry Andric : SubtargetFeature<"zksh", "HasStdExtZksh", "true", 238*04eeddc0SDimitry Andric "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">; 239*04eeddc0SDimitry Andricdef HasStdExtZksh : Predicate<"Subtarget->hasStdExtZksh()">, 240*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZksh), 241*04eeddc0SDimitry Andric "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)">; 242*04eeddc0SDimitry Andric 243*04eeddc0SDimitry Andricdef FeatureStdExtZkr 244*04eeddc0SDimitry Andric : SubtargetFeature<"zkr", "HasStdExtZkr", "true", 245*04eeddc0SDimitry Andric "'Zkr' (Entropy Source Extension)">; 246*04eeddc0SDimitry Andricdef HasStdExtZkr : Predicate<"Subtarget->hasStdExtZkr()">, 247*04eeddc0SDimitry Andric AssemblerPredicate<(all_of FeatureStdExtZkr), 248*04eeddc0SDimitry Andric "'Zkr' (Entropy Source Extension)">; 249*04eeddc0SDimitry Andric 250*04eeddc0SDimitry Andricdef FeatureStdExtZkn 251*04eeddc0SDimitry Andric : SubtargetFeature<"zkn", "HasStdExtZkn", "true", 252*04eeddc0SDimitry Andric "'Zkn' (NIST Algorithm Suite)", 253*04eeddc0SDimitry Andric [FeatureStdExtZbkb, 254*04eeddc0SDimitry Andric FeatureStdExtZbkc, 255*04eeddc0SDimitry Andric FeatureStdExtZbkx, 256*04eeddc0SDimitry Andric FeatureStdExtZkne, 257*04eeddc0SDimitry Andric FeatureStdExtZknd, 258*04eeddc0SDimitry Andric FeatureStdExtZknh]>; 259*04eeddc0SDimitry Andric 260*04eeddc0SDimitry Andricdef FeatureStdExtZks 261*04eeddc0SDimitry Andric : SubtargetFeature<"zks", "HasStdExtZks", "true", 262*04eeddc0SDimitry Andric "'Zks' (ShangMi Algorithm Suite)", 263*04eeddc0SDimitry Andric [FeatureStdExtZbkb, 264*04eeddc0SDimitry Andric FeatureStdExtZbkc, 265*04eeddc0SDimitry Andric FeatureStdExtZbkx, 266*04eeddc0SDimitry Andric FeatureStdExtZksed, 267*04eeddc0SDimitry Andric FeatureStdExtZksh]>; 268*04eeddc0SDimitry Andric 269*04eeddc0SDimitry Andricdef FeatureStdExtZkt 270*04eeddc0SDimitry Andric : SubtargetFeature<"zkt", "HasStdExtZkt", "true", 271*04eeddc0SDimitry Andric "'Zkt' (Data Independent Execution Latency)">; 272*04eeddc0SDimitry Andric 273*04eeddc0SDimitry Andricdef FeatureStdExtZk 274*04eeddc0SDimitry Andric : SubtargetFeature<"zk", "HasStdExtZk", "true", 275*04eeddc0SDimitry Andric "'Zk' (Standard scalar cryptography extension)", 276*04eeddc0SDimitry Andric [FeatureStdExtZkn, 277*04eeddc0SDimitry Andric FeatureStdExtZkr, 278*04eeddc0SDimitry Andric FeatureStdExtZkt]>; 2795ffd83dbSDimitry Andric 2805ffd83dbSDimitry Andricdef FeatureNoRVCHints 2815ffd83dbSDimitry Andric : SubtargetFeature<"no-rvc-hints", "EnableRVCHintInstrs", "false", 2825ffd83dbSDimitry Andric "Disable RVC Hint Instructions.">; 2838bcb0991SDimitry Andricdef HasRVCHints : Predicate<"Subtarget->enableRVCHintInstrs()">, 2845ffd83dbSDimitry Andric AssemblerPredicate<(all_of(not FeatureNoRVCHints)), 285480093f4SDimitry Andric "RVC Hint Instructions">; 2860b57cec5SDimitry Andric 287*04eeddc0SDimitry Andricdef FeatureStdExtZvl32b : SubtargetFeature<"zvl32b", "ZvlLen", "ExtZvl::Zvl32b", 288*04eeddc0SDimitry Andric "'Zvl' (Minimum Vector Length) 32">; 289*04eeddc0SDimitry Andric 290*04eeddc0SDimitry Andricforeach i = { 6-15 } in { 291*04eeddc0SDimitry Andric defvar I = !shl(1, i); 292*04eeddc0SDimitry Andric def FeatureStdExtZvl#I#b : 293*04eeddc0SDimitry Andric SubtargetFeature<"zvl"#I#"b", "ZvlLen", "ExtZvl::Zvl"#I#"b", 294*04eeddc0SDimitry Andric "'Zvl' (Minimum Vector Length) "#I, 295*04eeddc0SDimitry Andric [!cast<SubtargetFeature>("FeatureStdExtZvl"#!srl(I, 1)#"b")]>; 296*04eeddc0SDimitry Andric} 297*04eeddc0SDimitry Andric 298*04eeddc0SDimitry Andricdef FeatureStdExtZve32x 299*04eeddc0SDimitry Andric : SubtargetFeature<"zve32x", "HasStdExtZve32x", "true", 300*04eeddc0SDimitry Andric "'Zve32x' (Vector Extensions for Embedded Processors " 301*04eeddc0SDimitry Andric "with maximal 32 EEW)", 302*04eeddc0SDimitry Andric [FeatureStdExtZvl32b]>; 303*04eeddc0SDimitry Andric 304*04eeddc0SDimitry Andricdef FeatureStdExtZve32f 305*04eeddc0SDimitry Andric : SubtargetFeature<"zve32f", "HasStdExtZve32f", "true", 306*04eeddc0SDimitry Andric "'Zve32f' (Vector Extensions for Embedded Processors " 307*04eeddc0SDimitry Andric "with maximal 32 EEW and F extension)", 308*04eeddc0SDimitry Andric [FeatureStdExtZve32x]>; 309*04eeddc0SDimitry Andric 310*04eeddc0SDimitry Andricdef FeatureStdExtZve64x 311*04eeddc0SDimitry Andric : SubtargetFeature<"zve64x", "HasStdExtZve64x", "true", 312*04eeddc0SDimitry Andric "'Zve64x' (Vector Extensions for Embedded Processors " 313*04eeddc0SDimitry Andric "with maximal 64 EEW)", [FeatureStdExtZve32x, FeatureStdExtZvl64b]>; 314*04eeddc0SDimitry Andric 315*04eeddc0SDimitry Andricdef FeatureStdExtZve64f 316*04eeddc0SDimitry Andric : SubtargetFeature<"zve64f", "HasStdExtZve64f", "true", 317*04eeddc0SDimitry Andric "'Zve64f' (Vector Extensions for Embedded Processors " 318*04eeddc0SDimitry Andric "with maximal 64 EEW and F extension)", 319*04eeddc0SDimitry Andric [FeatureStdExtZve32f, FeatureStdExtZve64x]>; 320*04eeddc0SDimitry Andric 321*04eeddc0SDimitry Andricdef FeatureStdExtZve64d 322*04eeddc0SDimitry Andric : SubtargetFeature<"zve64d", "HasStdExtZve64d", "true", 323*04eeddc0SDimitry Andric "'Zve64d' (Vector Extensions for Embedded Processors " 324*04eeddc0SDimitry Andric "with maximal 64 EEW, F and D extension)", 325*04eeddc0SDimitry Andric [FeatureStdExtZve64f]>; 326*04eeddc0SDimitry Andric 3275ffd83dbSDimitry Andricdef FeatureStdExtV 328*04eeddc0SDimitry Andric : SubtargetFeature<"v", "HasStdExtV", "true", 329*04eeddc0SDimitry Andric "'V' (Vector Extension for Application Processors)", 330*04eeddc0SDimitry Andric [FeatureStdExtZvl128b, FeatureStdExtF, FeatureStdExtD]>; 3315ffd83dbSDimitry Andric 332*04eeddc0SDimitry Andricdef HasVInstructions : Predicate<"Subtarget->hasVInstructions()">, 333*04eeddc0SDimitry Andric AssemblerPredicate< 334*04eeddc0SDimitry Andric (any_of FeatureStdExtZve32x, FeatureStdExtV), 335*04eeddc0SDimitry Andric "'V' (Vector Extension for Application Processors), 'Zve32x' or " 336*04eeddc0SDimitry Andric "'Zve64x' (Vector Extensions for Embedded Processors)">; 337*04eeddc0SDimitry Andricdef HasVInstructionsI64 : Predicate<"Subtarget->hasVInstructionsI64()">, 338*04eeddc0SDimitry Andric AssemblerPredicate< 339*04eeddc0SDimitry Andric (any_of FeatureStdExtZve64x, FeatureStdExtV), 340*04eeddc0SDimitry Andric "'V' (Vector Extension for Application Processors) or 'Zve64x' " 341*04eeddc0SDimitry Andric "(Vector Extensions for Embedded Processors)">; 342*04eeddc0SDimitry Andricdef HasVInstructionsAnyF : Predicate<"Subtarget->hasVInstructionsAnyF()">, 343*04eeddc0SDimitry Andric AssemblerPredicate< 344*04eeddc0SDimitry Andric (any_of FeatureStdExtZve32f, FeatureStdExtV), 345*04eeddc0SDimitry Andric "'V' (Vector Extension for Application Processors), 'Zve32f', " 346*04eeddc0SDimitry Andric "'Zve64f' or 'Zve64d' (Vector Extensions for Embedded Processors)">; 347fe6060f1SDimitry Andric 3480b57cec5SDimitry Andricdef Feature64Bit 3490b57cec5SDimitry Andric : SubtargetFeature<"64bit", "HasRV64", "true", "Implements RV64">; 3500b57cec5SDimitry Andricdef IsRV64 : Predicate<"Subtarget->is64Bit()">, 3515ffd83dbSDimitry Andric AssemblerPredicate<(all_of Feature64Bit), 352480093f4SDimitry Andric "RV64I Base Instruction Set">; 3530b57cec5SDimitry Andricdef IsRV32 : Predicate<"!Subtarget->is64Bit()">, 3545ffd83dbSDimitry Andric AssemblerPredicate<(all_of (not Feature64Bit)), 355480093f4SDimitry Andric "RV32I Base Instruction Set">; 3560b57cec5SDimitry Andric 357e8d8bef9SDimitry Andricdefvar RV32 = DefaultMode; 3580b57cec5SDimitry Andricdef RV64 : HwMode<"+64bit">; 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andricdef FeatureRV32E 3610b57cec5SDimitry Andric : SubtargetFeature<"e", "IsRV32E", "true", 3620b57cec5SDimitry Andric "Implements RV32E (provides 16 rather than 32 GPRs)">; 3630b57cec5SDimitry Andricdef IsRV32E : Predicate<"Subtarget->isRV32E()">, 3645ffd83dbSDimitry Andric AssemblerPredicate<(all_of FeatureRV32E)>; 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andricdef FeatureRelax 3670b57cec5SDimitry Andric : SubtargetFeature<"relax", "EnableLinkerRelax", "true", 3680b57cec5SDimitry Andric "Enable Linker relaxation.">; 3690b57cec5SDimitry Andric 370480093f4SDimitry Andricforeach i = {1-31} in 371480093f4SDimitry Andric def FeatureReserveX#i : 372480093f4SDimitry Andric SubtargetFeature<"reserve-x"#i, "UserReservedRegister[RISCV::X"#i#"]", 373480093f4SDimitry Andric "true", "Reserve X"#i>; 374480093f4SDimitry Andric 3755ffd83dbSDimitry Andricdef FeatureSaveRestore : SubtargetFeature<"save-restore", "EnableSaveRestore", 3765ffd83dbSDimitry Andric "true", "Enable save/restore.">; 3775ffd83dbSDimitry Andric 378*04eeddc0SDimitry Andricdef TuneSiFive7 : SubtargetFeature<"sifive7", "RISCVProcFamily", "SiFive7", 379*04eeddc0SDimitry Andric "SiFive 7-Series processors">; 380*04eeddc0SDimitry Andric 3810b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3820b57cec5SDimitry Andric// Named operands for CSR instructions. 3830b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andricinclude "RISCVSystemOperands.td" 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3880b57cec5SDimitry Andric// Registers, calling conventions, instruction descriptions. 3890b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3900b57cec5SDimitry Andric 39113138422SDimitry Andricinclude "RISCVSchedule.td" 3920b57cec5SDimitry Andricinclude "RISCVRegisterInfo.td" 3930b57cec5SDimitry Andricinclude "RISCVCallingConv.td" 3940b57cec5SDimitry Andricinclude "RISCVInstrInfo.td" 3958bcb0991SDimitry Andricinclude "RISCVRegisterBanks.td" 396e8d8bef9SDimitry Andricinclude "RISCVSchedRocket.td" 397e8d8bef9SDimitry Andricinclude "RISCVSchedSiFive7.td" 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4000b57cec5SDimitry Andric// RISC-V processors supported. 4010b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4020b57cec5SDimitry Andric 4035ffd83dbSDimitry Andricdef : ProcessorModel<"generic-rv32", NoSchedModel, []>; 4045ffd83dbSDimitry Andricdef : ProcessorModel<"generic-rv64", NoSchedModel, [Feature64Bit]>; 4050b57cec5SDimitry Andric 406e8d8bef9SDimitry Andricdef : ProcessorModel<"rocket-rv32", RocketModel, []>; 407e8d8bef9SDimitry Andricdef : ProcessorModel<"rocket-rv64", RocketModel, [Feature64Bit]>; 40813138422SDimitry Andric 409*04eeddc0SDimitry Andricdef : ProcessorModel<"sifive-7-rv32", SiFive7Model, [], 410*04eeddc0SDimitry Andric [TuneSiFive7]>; 411*04eeddc0SDimitry Andricdef : ProcessorModel<"sifive-7-rv64", SiFive7Model, [Feature64Bit], 412*04eeddc0SDimitry Andric [TuneSiFive7]>; 41313138422SDimitry Andric 414349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e20", RocketModel, [FeatureStdExtM, 415349cc55cSDimitry Andric FeatureStdExtC]>; 416349cc55cSDimitry Andric 417349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e21", RocketModel, [FeatureStdExtM, 418349cc55cSDimitry Andric FeatureStdExtA, 419349cc55cSDimitry Andric FeatureStdExtC]>; 420349cc55cSDimitry Andric 421349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e24", RocketModel, [FeatureStdExtM, 422349cc55cSDimitry Andric FeatureStdExtA, 423349cc55cSDimitry Andric FeatureStdExtF, 424349cc55cSDimitry Andric FeatureStdExtC]>; 425349cc55cSDimitry Andric 426e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-e31", RocketModel, [FeatureStdExtM, 427590d96feSDimitry Andric FeatureStdExtA, 428590d96feSDimitry Andric FeatureStdExtC]>; 429590d96feSDimitry Andric 430349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e34", RocketModel, [FeatureStdExtM, 431349cc55cSDimitry Andric FeatureStdExtA, 432349cc55cSDimitry Andric FeatureStdExtF, 433349cc55cSDimitry Andric FeatureStdExtC]>; 434349cc55cSDimitry Andric 435349cc55cSDimitry Andricdef : ProcessorModel<"sifive-e76", SiFive7Model, [FeatureStdExtM, 436349cc55cSDimitry Andric FeatureStdExtA, 437349cc55cSDimitry Andric FeatureStdExtF, 438*04eeddc0SDimitry Andric FeatureStdExtC], 439*04eeddc0SDimitry Andric [TuneSiFive7]>; 440349cc55cSDimitry Andric 441349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s21", RocketModel, [Feature64Bit, 442349cc55cSDimitry Andric FeatureStdExtM, 443349cc55cSDimitry Andric FeatureStdExtA, 444349cc55cSDimitry Andric FeatureStdExtC]>; 445349cc55cSDimitry Andric 446349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s51", RocketModel, [Feature64Bit, 447349cc55cSDimitry Andric FeatureStdExtM, 448349cc55cSDimitry Andric FeatureStdExtA, 449349cc55cSDimitry Andric FeatureStdExtC]>; 450349cc55cSDimitry Andric 451349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s54", RocketModel, [Feature64Bit, 452349cc55cSDimitry Andric FeatureStdExtM, 453349cc55cSDimitry Andric FeatureStdExtA, 454349cc55cSDimitry Andric FeatureStdExtF, 455349cc55cSDimitry Andric FeatureStdExtD, 456349cc55cSDimitry Andric FeatureStdExtC]>; 457349cc55cSDimitry Andric 458349cc55cSDimitry Andricdef : ProcessorModel<"sifive-s76", SiFive7Model, [Feature64Bit, 459349cc55cSDimitry Andric FeatureStdExtM, 460349cc55cSDimitry Andric FeatureStdExtA, 461349cc55cSDimitry Andric FeatureStdExtF, 462349cc55cSDimitry Andric FeatureStdExtD, 463*04eeddc0SDimitry Andric FeatureStdExtC], 464*04eeddc0SDimitry Andric [TuneSiFive7]>; 465349cc55cSDimitry Andric 466e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-u54", RocketModel, [Feature64Bit, 467e8d8bef9SDimitry Andric FeatureStdExtM, 468e8d8bef9SDimitry Andric FeatureStdExtA, 469e8d8bef9SDimitry Andric FeatureStdExtF, 470e8d8bef9SDimitry Andric FeatureStdExtD, 471e8d8bef9SDimitry Andric FeatureStdExtC]>; 472e8d8bef9SDimitry Andric 473e8d8bef9SDimitry Andricdef : ProcessorModel<"sifive-u74", SiFive7Model, [Feature64Bit, 474590d96feSDimitry Andric FeatureStdExtM, 475590d96feSDimitry Andric FeatureStdExtA, 476590d96feSDimitry Andric FeatureStdExtF, 477590d96feSDimitry Andric FeatureStdExtD, 478*04eeddc0SDimitry Andric FeatureStdExtC], 479*04eeddc0SDimitry Andric [TuneSiFive7]>; 48013138422SDimitry Andric 4810b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4820b57cec5SDimitry Andric// Define the RISC-V target. 4830b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4840b57cec5SDimitry Andric 4850b57cec5SDimitry Andricdef RISCVInstrInfo : InstrInfo { 4860b57cec5SDimitry Andric let guessInstructionProperties = 0; 4870b57cec5SDimitry Andric} 4880b57cec5SDimitry Andric 4890b57cec5SDimitry Andricdef RISCVAsmParser : AsmParser { 4900b57cec5SDimitry Andric let ShouldEmitMatchRegisterAltName = 1; 4910b57cec5SDimitry Andric let AllowDuplicateRegisterNames = 1; 4920b57cec5SDimitry Andric} 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andricdef RISCVAsmWriter : AsmWriter { 4950b57cec5SDimitry Andric int PassSubtarget = 1; 4960b57cec5SDimitry Andric} 4970b57cec5SDimitry Andric 4980b57cec5SDimitry Andricdef RISCV : Target { 4990b57cec5SDimitry Andric let InstructionSet = RISCVInstrInfo; 5000b57cec5SDimitry Andric let AssemblyParsers = [RISCVAsmParser]; 5010b57cec5SDimitry Andric let AssemblyWriters = [RISCVAsmWriter]; 5020b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 5030b57cec5SDimitry Andric} 504