Skip to content

Commit 56f0ecd

Browse files
authored
[RISCV] Implement Intrinsics Support for XCValu Extension in CV32E40P (#85603)
Implement XCValu intrinsics for CV32E40P according to the specification. This commit is part of a patch-set to upstream the vendor specific extensions of CV32E40P that need LLVM intrinsics to implement Clang builtins. Contributors: @CharKeaney, @ChunyuLiao, @jeremybennett, @lewis-revill, @NandniJamnadas, @PaoloS02, @serkm, @simonpcook, @xingmingjie.
1 parent f7b09b5 commit 56f0ecd

File tree

4 files changed

+397
-7
lines changed

4 files changed

+397
-7
lines changed

llvm/include/llvm/IR/IntrinsicsRISCVXCV.td

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ class ScalarCoreVBitManipGprIntrinsic
1818
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty],
1919
[IntrNoMem, IntrSpeculatable]>;
2020

21+
class ScalarCoreVAluGprIntrinsic
22+
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty],
23+
[IntrNoMem, IntrSpeculatable]>;
24+
25+
class ScalarCoreVAluGprGprIntrinsic
26+
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
27+
[IntrNoMem, IntrSpeculatable]>;
28+
29+
class ScalarCoreVAluGprGprGprIntrinsic
30+
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
31+
[IntrNoMem, IntrSpeculatable]>;
32+
2133
let TargetPrefix = "riscv" in {
2234
def int_riscv_cv_bitmanip_extract : ScalarCoreVBitManipGprGprIntrinsic;
2335
def int_riscv_cv_bitmanip_extractu : ScalarCoreVBitManipGprGprIntrinsic;
@@ -34,4 +46,15 @@ let TargetPrefix = "riscv" in {
3446
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
3547
[IntrNoMem, IntrWillReturn, IntrSpeculatable,
3648
ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>;
49+
50+
def int_riscv_cv_alu_clip : ScalarCoreVAluGprGprIntrinsic;
51+
def int_riscv_cv_alu_clipu : ScalarCoreVAluGprGprIntrinsic;
52+
def int_riscv_cv_alu_addn : ScalarCoreVAluGprGprGprIntrinsic;
53+
def int_riscv_cv_alu_addun : ScalarCoreVAluGprGprGprIntrinsic;
54+
def int_riscv_cv_alu_addrn : ScalarCoreVAluGprGprGprIntrinsic;
55+
def int_riscv_cv_alu_addurn : ScalarCoreVAluGprGprGprIntrinsic;
56+
def int_riscv_cv_alu_subn : ScalarCoreVAluGprGprGprIntrinsic;
57+
def int_riscv_cv_alu_subun : ScalarCoreVAluGprGprGprIntrinsic;
58+
def int_riscv_cv_alu_subrn : ScalarCoreVAluGprGprGprIntrinsic;
59+
def int_riscv_cv_alu_suburn : ScalarCoreVAluGprGprGprIntrinsic;
3760
} // TargetPrefix = "riscv"

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,12 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
250250
if (RV64LegalI32 && Subtarget.is64Bit())
251251
setOperationAction(ISD::SELECT_CC, MVT::i32, Expand);
252252

253-
setCondCodeAction(ISD::SETLE, XLenVT, Expand);
253+
if (!Subtarget.hasVendorXCValu())
254+
setCondCodeAction(ISD::SETLE, XLenVT, Expand);
254255
setCondCodeAction(ISD::SETGT, XLenVT, Custom);
255256
setCondCodeAction(ISD::SETGE, XLenVT, Expand);
256-
setCondCodeAction(ISD::SETULE, XLenVT, Expand);
257+
if (!Subtarget.hasVendorXCValu())
258+
setCondCodeAction(ISD::SETULE, XLenVT, Expand);
257259
setCondCodeAction(ISD::SETUGT, XLenVT, Custom);
258260
setCondCodeAction(ISD::SETUGE, XLenVT, Expand);
259261

@@ -1458,6 +1460,16 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
14581460
setIndexedStoreAction(ISD::POST_INC, MVT::i32, Legal);
14591461
}
14601462

1463+
if (Subtarget.hasVendorXCValu()) {
1464+
setOperationAction(ISD::ABS, XLenVT, Legal);
1465+
setOperationAction(ISD::SMIN, XLenVT, Legal);
1466+
setOperationAction(ISD::UMIN, XLenVT, Legal);
1467+
setOperationAction(ISD::SMAX, XLenVT, Legal);
1468+
setOperationAction(ISD::UMAX, XLenVT, Legal);
1469+
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8, Legal);
1470+
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Legal);
1471+
}
1472+
14611473
// Function alignments.
14621474
const Align FunctionAlignment(Subtarget.hasStdExtCOrZca() ? 2 : 4);
14631475
setMinFunctionAlignment(FunctionAlignment);

llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ let DecoderNamespace = "XCValu" in {
198198

199199
} // DecoderNamespace = "XCValu"
200200

201-
let Predicates = [HasVendorXCValu],
201+
let Predicates = [HasVendorXCValu, IsRV32],
202202
hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
203203
// General ALU Operations
204204
def CV_ABS : CVInstAluR<0b0101000, 0b011, "cv.abs">,
@@ -249,10 +249,10 @@ let Predicates = [HasVendorXCValu],
249249
Sched<[]>;
250250
def CV_SUBURN : CVInstAluRRI<0b11, 0b011, "cv.suburn">,
251251
Sched<[]>;
252-
} // Predicates = [HasVendorXCValu],
252+
} // Predicates = [HasVendorXCValu, IsRV32],
253253
// hasSideEffects = 0, mayLoad = 0, mayStore = 0
254254

255-
let Predicates = [HasVendorXCValu],
255+
let Predicates = [HasVendorXCValu, IsRV32],
256256
hasSideEffects = 0, mayLoad = 0, mayStore = 0,
257257
Constraints = "$rd = $rd_wb" in {
258258
def CV_ADDNR : CVInstAluRRNR<0b1000000, 0b011, "cv.addnr">,
@@ -272,7 +272,7 @@ let Predicates = [HasVendorXCValu],
272272
def CV_SUBURNR : CVInstAluRRNR<0b1000111, 0b011, "cv.suburnr">,
273273
Sched<[]>;
274274

275-
} // Predicates = [HasVendorXCValu],
275+
} // Predicates = [HasVendorXCValu, IsRV32],
276276
// hasSideEffects = 0, mayLoad = 0, mayStore = 0,
277277
// Constraints = "$rd = $rd_wb"
278278

@@ -716,6 +716,13 @@ def CV_HI5: SDNodeXForm<imm, [{
716716
N->getValueType(0));
717717
}]>;
718718

719+
def powerOf2Minus1 : ImmLeaf<XLenVT, [{ return isPowerOf2_32(Imm+1); }]>;
720+
def trailing1sPlus1 : SDNodeXForm<imm, [{
721+
return CurDAG->getTargetConstant(
722+
llvm::countr_one(N->getZExtValue()) + 1,
723+
SDLoc(N), N->getValueType(0));
724+
}]>;
725+
719726
multiclass PatCoreVBitManip<Intrinsic intr> {
720727
def : PatGprGpr<intr, !cast<RVInst>("CV_" # NAME # "R")>;
721728
def : Pat<(intr GPR:$rs1, cv_uimm10:$imm),
@@ -748,8 +755,54 @@ let Predicates = [HasVendorXCVbitmanip, IsRV32] in {
748755
def : Pat<(bitreverse (XLenVT GPR:$rs)), (CV_BITREV GPR:$rs, 0, 0)>;
749756
}
750757

758+
class PatCoreVAluGpr<string intr, string asm> :
759+
PatGpr<!cast<Intrinsic>("int_riscv_cv_alu_" # intr),
760+
!cast<RVInst>("CV_" # asm)>;
761+
class PatCoreVAluGprGpr <string intr, string asm> :
762+
PatGprGpr<!cast<Intrinsic>("int_riscv_cv_alu_" # intr),
763+
!cast<RVInst>("CV_" # asm)>;
764+
765+
multiclass PatCoreVAluGprImm<Intrinsic intr> {
766+
def : PatGprGpr<intr, !cast<RVInst>("CV_" # NAME # "R")>;
767+
def : Pat<(intr (XLenVT GPR:$rs1), powerOf2Minus1:$upperBound),
768+
(!cast<RVInst>("CV_" # NAME) GPR:$rs1,
769+
(trailing1sPlus1 imm:$upperBound))>;
770+
}
771+
772+
multiclass PatCoreVAluGprGprImm<Intrinsic intr> {
773+
def : Pat<(intr GPR:$rs1, GPR:$rs2, GPR:$rs3),
774+
(!cast<RVInst>("CV_" # NAME # "R") GPR:$rs1, GPR:$rs2, GPR:$rs3)>;
775+
def : Pat<(intr GPR:$rs1, GPR:$rs2, uimm5:$imm),
776+
(!cast<RVInst>("CV_" # NAME) GPR:$rs1, GPR:$rs2, uimm5:$imm)>;
777+
}
778+
779+
let Predicates = [HasVendorXCValu, IsRV32], AddedComplexity = 1 in {
780+
def : PatGpr<abs, CV_ABS>;
781+
def : PatGprGpr<setle, CV_SLET>;
782+
def : PatGprGpr<setule, CV_SLETU>;
783+
def : PatGprGpr<smin, CV_MIN>;
784+
def : PatGprGpr<umin, CV_MINU>;
785+
def : PatGprGpr<smax, CV_MAX>;
786+
def : PatGprGpr<umax, CV_MAXU>;
787+
788+
def : Pat<(sext_inreg (XLenVT GPR:$rs1), i16), (CV_EXTHS GPR:$rs1)>;
789+
def : Pat<(sext_inreg (XLenVT GPR:$rs1), i8), (CV_EXTBS GPR:$rs1)>;
790+
def : Pat<(and (XLenVT GPR:$rs1), 0xffff), (CV_EXTHZ GPR:$rs1)>;
791+
792+
defm CLIP : PatCoreVAluGprImm<int_riscv_cv_alu_clip>;
793+
defm CLIPU : PatCoreVAluGprImm<int_riscv_cv_alu_clipu>;
794+
defm ADDN : PatCoreVAluGprGprImm<int_riscv_cv_alu_addn>;
795+
defm ADDUN : PatCoreVAluGprGprImm<int_riscv_cv_alu_addun>;
796+
defm ADDRN : PatCoreVAluGprGprImm<int_riscv_cv_alu_addrn>;
797+
defm ADDURN : PatCoreVAluGprGprImm<int_riscv_cv_alu_addurn>;
798+
defm SUBN : PatCoreVAluGprGprImm<int_riscv_cv_alu_subn>;
799+
defm SUBUN : PatCoreVAluGprGprImm<int_riscv_cv_alu_subun>;
800+
defm SUBRN : PatCoreVAluGprGprImm<int_riscv_cv_alu_subrn>;
801+
defm SUBURN : PatCoreVAluGprGprImm<int_riscv_cv_alu_suburn>;
802+
} // Predicates = [HasVendorXCValu, IsRV32]
803+
751804
//===----------------------------------------------------------------------===//
752-
// Patterns for immediate branching operations
805+
// Patterns for immediate branching operations
753806
//===----------------------------------------------------------------------===//
754807

755808
let Predicates = [HasVendorXCVbi, IsRV32], AddedComplexity = 2 in {

0 commit comments

Comments
 (0)