Skip to content

Commit 18e79ef

Browse files
eopXDfanghuaqi
authored andcommitted
[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 59c0869 commit 18e79ef

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
@@ -2817,4 +2817,30 @@ let HasMasked = false, HasVL = false, IRName = "" in {
28172817
def : RVVBuiltin<"Uv" # T # "Uv", T # "Uv" # T # "UvKzUv", "csil">;
28182818
}
28192819
}
2820+
2821+
let Name = "vcreate_v",
2822+
UnMaskedPolicyScheme = NonePolicy,
2823+
MaskedPolicyScheme = NonePolicy,
2824+
SupportOverloading = false,
2825+
ManualCodegen = [{
2826+
{
2827+
assert(isa<StructType>(ResultType));
2828+
unsigned NF = cast<StructType>(ResultType)->getNumElements();
2829+
llvm::Value *ReturnTuple = llvm::PoisonValue::get(ResultType);
2830+
for (unsigned I = 0; I < NF; ++I) {
2831+
ReturnTuple = Builder.CreateInsertValue(ReturnTuple, Ops[I], {I});
2832+
}
2833+
return ReturnTuple;
2834+
}
2835+
}] in {
2836+
foreach nf = NFList in {
2837+
let NF = nf in {
2838+
defvar T = "(Tuple:" # nf # ")";
2839+
defvar V = VString<nf, /*signed=*/true>.S;
2840+
defvar UV = VString<nf, /*signed=*/false>.S;
2841+
def : RVVBuiltin<T # "v", T # "v" # V, "csilxfd">;
2842+
def : RVVBuiltin<T # "Uv", T # "Uv" # UV, "csil">;
2843+
}
2844+
}
2845+
}
28202846
}

clang/lib/Sema/SemaRISCVVectorLookup.cpp

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

230-
llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq =
231-
RVVIntrinsic::computeBuiltinTypes(
232-
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
233-
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
234-
Record.IsTuple);
230+
llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq;
231+
if (Record.HasMasked)
232+
ProtoMaskSeq = RVVIntrinsic::computeBuiltinTypes(
233+
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
234+
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
235+
Record.IsTuple);
235236

236237
bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone;
237238
bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone;

0 commit comments

Comments
 (0)