Skip to content

Commit

Permalink
[Clang][RISCV] Add vcreate intrinsics for RVV tuple types
Browse files Browse the repository at this point in the history
Specification PR: riscv-non-isa/rvv-intrinsic-doc#256

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D158402
  • Loading branch information
eopXD committed Aug 23, 2023
1 parent 0cb6d2f commit 0f481f2
Show file tree
Hide file tree
Showing 4 changed files with 3,106 additions and 7 deletions.
26 changes: 26 additions & 0 deletions clang/include/clang/Basic/riscv_vector.td
Original file line number Diff line number Diff line change
Expand Up @@ -2830,6 +2830,32 @@ let HasMasked = false, HasVL = false, IRName = "" in {
def : RVVBuiltin<"Uv" # T # "Uv", T # "Uv" # T # "UvKzUv", "csil">;
}
}

let Name = "vcreate_v",
UnMaskedPolicyScheme = NonePolicy,
MaskedPolicyScheme = NonePolicy,
SupportOverloading = false,
ManualCodegen = [{
{
assert(isa<StructType>(ResultType));
unsigned NF = cast<StructType>(ResultType)->getNumElements();
llvm::Value *ReturnTuple = llvm::PoisonValue::get(ResultType);
for (unsigned I = 0; I < NF; ++I) {
ReturnTuple = Builder.CreateInsertValue(ReturnTuple, Ops[I], {I});
}
return ReturnTuple;
}
}] in {
foreach nf = NFList in {
let NF = nf in {
defvar T = "(Tuple:" # nf # ")";
defvar V = VString<nf, /*signed=*/true>.S;
defvar UV = VString<nf, /*signed=*/false>.S;
def : RVVBuiltin<T # "v", T # "v" # V, "csilxfd">;
def : RVVBuiltin<T # "Uv", T # "Uv" # UV, "csil">;
}
}
}
}

multiclass RVVOutBuiltinSetZvbb {
Expand Down
11 changes: 6 additions & 5 deletions clang/lib/Sema/SemaRISCVVectorLookup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,11 +238,12 @@ void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics(
/*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF,
UnMaskedPolicyScheme, DefaultPolicy, Record.IsTuple);

llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq =
RVVIntrinsic::computeBuiltinTypes(
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
Record.IsTuple);
llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq;
if (Record.HasMasked)
ProtoMaskSeq = RVVIntrinsic::computeBuiltinTypes(
BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
Record.IsTuple);

bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone;
bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone;
Expand Down

0 comments on commit 0f481f2

Please sign in to comment.