Skip to content

Commit 0f481f2

Browse files
committed
[Clang][RISCV] Add vcreate intrinsics for RVV tuple types
Specification PR: riscv-non-isa/rvv-intrinsic-doc#256 Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D158402
1 parent 0cb6d2f commit 0f481f2

File tree

4 files changed

+3106
-7
lines changed

4 files changed

+3106
-7
lines changed

clang/include/clang/Basic/riscv_vector.td

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2830,6 +2830,32 @@ let HasMasked = false, HasVL = false, IRName = "" in {
28302830
def : RVVBuiltin<"Uv" # T # "Uv", T # "Uv" # T # "UvKzUv", "csil">;
28312831
}
28322832
}
2833+
2834+
let Name = "vcreate_v",
2835+
UnMaskedPolicyScheme = NonePolicy,
2836+
MaskedPolicyScheme = NonePolicy,
2837+
SupportOverloading = false,
2838+
ManualCodegen = [{
2839+
{
2840+
assert(isa<StructType>(ResultType));
2841+
unsigned NF = cast<StructType>(ResultType)->getNumElements();
2842+
llvm::Value *ReturnTuple = llvm::PoisonValue::get(ResultType);
2843+
for (unsigned I = 0; I < NF; ++I) {
2844+
ReturnTuple = Builder.CreateInsertValue(ReturnTuple, Ops[I], {I});
2845+
}
2846+
return ReturnTuple;
2847+
}
2848+
}] in {
2849+
foreach nf = NFList in {
2850+
let NF = nf in {
2851+
defvar T = "(Tuple:" # nf # ")";
2852+
defvar V = VString<nf, /*signed=*/true>.S;
2853+
defvar UV = VString<nf, /*signed=*/false>.S;
2854+
def : RVVBuiltin<T # "v", T # "v" # V, "csilxfd">;
2855+
def : RVVBuiltin<T # "Uv", T # "Uv" # UV, "csil">;
2856+
}
2857+
}
2858+
}
28332859
}
28342860

28352861
multiclass RVVOutBuiltinSetZvbb {

clang/lib/Sema/SemaRISCVVectorLookup.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,12 @@ void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics(
238238
/*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF,
239239
UnMaskedPolicyScheme, DefaultPolicy, Record.IsTuple);
240240

241-
llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq =
242-
RVVIntrinsic::computeBuiltinTypes(
243-
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
244-
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
245-
Record.IsTuple);
241+
llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq;
242+
if (Record.HasMasked)
243+
ProtoMaskSeq = RVVIntrinsic::computeBuiltinTypes(
244+
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
245+
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
246+
Record.IsTuple);
246247

247248
bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone;
248249
bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone;

0 commit comments

Comments
 (0)