mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-14 09:25:25 +00:00
[TableGen] Allow intrinsics to have up to 8 return values.
Differential Revision: https://reviews.llvm.org/D38633 llvm-svn: 315598
This commit is contained in:
parent
02880d247a
commit
db5b3a9018
@ -649,7 +649,10 @@ enum IIT_Info {
|
||||
IIT_VEC_OF_ANYPTRS_TO_ELT = 34,
|
||||
IIT_I128 = 35,
|
||||
IIT_V512 = 36,
|
||||
IIT_V1024 = 37
|
||||
IIT_V1024 = 37,
|
||||
IIT_STRUCT6 = 38,
|
||||
IIT_STRUCT7 = 39,
|
||||
IIT_STRUCT8 = 40
|
||||
};
|
||||
|
||||
static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
|
||||
@ -798,6 +801,9 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
|
||||
case IIT_EMPTYSTRUCT:
|
||||
OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0));
|
||||
return;
|
||||
case IIT_STRUCT8: ++StructElts; LLVM_FALLTHROUGH;
|
||||
case IIT_STRUCT7: ++StructElts; LLVM_FALLTHROUGH;
|
||||
case IIT_STRUCT6: ++StructElts; LLVM_FALLTHROUGH;
|
||||
case IIT_STRUCT5: ++StructElts; LLVM_FALLTHROUGH;
|
||||
case IIT_STRUCT4: ++StructElts; LLVM_FALLTHROUGH;
|
||||
case IIT_STRUCT3: ++StructElts; LLVM_FALLTHROUGH;
|
||||
@ -874,11 +880,10 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
|
||||
return PointerType::get(DecodeFixedType(Infos, Tys, Context),
|
||||
D.Pointer_AddressSpace);
|
||||
case IITDescriptor::Struct: {
|
||||
Type *Elts[5];
|
||||
assert(D.Struct_NumElements <= 5 && "Can't handle this yet");
|
||||
SmallVector<Type *, 8> Elts;
|
||||
for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i)
|
||||
Elts[i] = DecodeFixedType(Infos, Tys, Context);
|
||||
return StructType::get(Context, makeArrayRef(Elts,D.Struct_NumElements));
|
||||
Elts.push_back(DecodeFixedType(Infos, Tys, Context));
|
||||
return StructType::get(Context, Elts);
|
||||
}
|
||||
case IITDescriptor::Argument:
|
||||
return Tys[D.getArgumentNumber()];
|
||||
|
32
test/TableGen/intrinsic-struct.td
Normal file
32
test/TableGen/intrinsic-struct.td
Normal file
@ -0,0 +1,32 @@
|
||||
// RUN: llvm-tblgen -gen-intrinsic %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
class IntrinsicProperty;
|
||||
|
||||
class ValueType<int size, int value> {
|
||||
string Namespace = "MVT";
|
||||
int Size = size;
|
||||
int Value = value;
|
||||
}
|
||||
|
||||
class LLVMType<ValueType vt> {
|
||||
ValueType VT = vt;
|
||||
}
|
||||
|
||||
class Intrinsic<string name, list<LLVMType> ret_types = []> {
|
||||
string LLVMName = name;
|
||||
bit isTarget = 0;
|
||||
string TargetPrefix = "";
|
||||
list<LLVMType> RetTypes = ret_types;
|
||||
list<LLVMType> ParamTypes = [];
|
||||
list<IntrinsicProperty> IntrProperties = [];
|
||||
}
|
||||
|
||||
def iAny : ValueType<0, 253>;
|
||||
def llvm_anyint_ty : LLVMType<iAny>;
|
||||
|
||||
// Make sure we can return up to 8 values
|
||||
// CHECK: returns_8_results // llvm.returns.8.results
|
||||
def int_returns_8_results : Intrinsic<"llvm.returns.8.results",
|
||||
[llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty,
|
||||
llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty]>;
|
@ -214,7 +214,10 @@ enum IIT_Info {
|
||||
IIT_VEC_OF_ANYPTRS_TO_ELT = 34,
|
||||
IIT_I128 = 35,
|
||||
IIT_V512 = 36,
|
||||
IIT_V1024 = 37
|
||||
IIT_V1024 = 37,
|
||||
IIT_STRUCT6 = 38,
|
||||
IIT_STRUCT7 = 39,
|
||||
IIT_STRUCT8 = 40
|
||||
};
|
||||
|
||||
static void EncodeFixedValueType(MVT::SimpleValueType VT,
|
||||
@ -369,6 +372,9 @@ static void ComputeFixedEncoding(const CodeGenIntrinsic &Int,
|
||||
case 3: TypeSig.push_back(IIT_STRUCT3); break;
|
||||
case 4: TypeSig.push_back(IIT_STRUCT4); break;
|
||||
case 5: TypeSig.push_back(IIT_STRUCT5); break;
|
||||
case 6: TypeSig.push_back(IIT_STRUCT6); break;
|
||||
case 7: TypeSig.push_back(IIT_STRUCT7); break;
|
||||
case 8: TypeSig.push_back(IIT_STRUCT8); break;
|
||||
default: llvm_unreachable("Unhandled case in struct");
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user