simon_tatham created this revision. simon_tatham added a reviewer: dmgreen. Herald added subscribers: cfe-commits, kristof.beyls. Herald added a project: clang. simon_tatham added a child revision: D69791: [ARM,MVE] Add intrinsics for gather/scatter load/stores..
A few integer types in the ACLE definitions of MVE intrinsics are given as 'int' or 'unsigned' instead of <stdint.h> fixed-size types like uint32_t. Usually these are the ones where the size isn't that important, such as immediate offsets in loads (which have a range limited by the instruction encoding) or the carry flag in vadcq which can only be 0 or 1 anyway. With this change, <arm_mve.h> follows that exact type naming, so that the function prototypes look identical to the ones in ACLE, instead of replacing int and unsigned with int32_t and uint32_t. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D69790 Files: clang/include/clang/Basic/arm_mve.td clang/include/clang/Basic/arm_mve_defs.td clang/utils/TableGen/MveEmitter.cpp
Index: clang/utils/TableGen/MveEmitter.cpp =================================================================== --- clang/utils/TableGen/MveEmitter.cpp +++ clang/utils/TableGen/MveEmitter.cpp @@ -204,6 +204,9 @@ Name = "const " + Name; return Name + " *"; } + std::string llvmName() const override { + return "llvm::PointerType::getUnqual(" + Pointee->llvmName() + ")"; + } static bool classof(const Type *T) { return T->typeKind() == TypeKind::Pointer; @@ -229,6 +232,7 @@ class ScalarType : public CRegularNamedType { ScalarTypeKind Kind; unsigned Bits; + std::string NameOverride; public: ScalarType(const Record *Record) : CRegularNamedType(TypeKind::Scalar) { @@ -237,6 +241,7 @@ .Case("u", ScalarTypeKind::UnsignedInt) .Case("f", ScalarTypeKind::Float); Bits = Record->getValueAsInt("size"); + NameOverride = Record->getValueAsString("nameOverride"); } unsigned sizeInBits() const override { return Bits; } ScalarTypeKind kind() const { return Kind; } @@ -244,6 +249,11 @@ std::string cNameBase() const override { return toCPrefix(Kind) + utostr(Bits); } + std::string cName() const override { + if (NameOverride.empty()) + return CRegularNamedType::cName(); + return NameOverride; + } std::string llvmName() const override { if (Kind == ScalarTypeKind::Float) { if (Bits == 16) @@ -261,6 +271,7 @@ } bool isInteger() const { return Kind != ScalarTypeKind::Float; } bool requiresFloat() const override { return !isInteger(); } + bool hasNonstandardName() const { return !NameOverride.empty(); } static bool classof(const Type *T) { return T->typeKind() == TypeKind::Scalar; @@ -504,6 +515,11 @@ void setVarname(const StringRef s) { VarName = s; } bool varnameUsed() const { return VarNameUsed; } + // Emit code to generate this result as a Value *. + virtual std::string asValue() { + return varname(); + } + // Code generation happens in multiple passes. This method tracks whether a // Result has yet been visited in a given pass, without the need for a // tedious loop in between passes that goes through and resets a 'visited' @@ -539,6 +555,12 @@ std::string typeName() const override { return AddressType ? "Address" : Result::typeName(); } + // Emit code to generate this result as a Value *. + std::string asValue() override { + if (AddressType) + return "(" + varname() + ".getPointer())"; + return Result::asValue(); + } }; // Result subclass for an integer literal appearing in Tablegen. This may need @@ -657,7 +679,7 @@ OS << "), llvm::SmallVector<Value *, " << Args.size() << "> {"; const char *Sep = ""; for (auto Arg : Args) { - OS << Sep << Arg->varname(); + OS << Sep << Arg->asValue(); Sep = ", "; } OS << "})"; @@ -1263,6 +1285,8 @@ "typedef float float32_t;\n"; for (const auto &kv : ScalarTypes) { const ScalarType *ST = kv.second.get(); + if (ST->hasNonstandardName()) + continue; raw_ostream &OS = parts[ST->requiresFloat() ? Float : 0]; const VectorType *VT = getVectorType(ST); Index: clang/include/clang/Basic/arm_mve_defs.td =================================================================== --- clang/include/clang/Basic/arm_mve_defs.td +++ clang/include/clang/Basic/arm_mve_defs.td @@ -125,7 +125,9 @@ class PrimitiveType<string kind_, int size_>: Type { string kind = kind_; int size = size_; + string nameOverride = ""; } + // The type records defined by these foreaches have names like s32, f16, u8. foreach size = [8, 16, 32, 64] in foreach kind = ["u", "s"] in @@ -134,6 +136,12 @@ foreach kind = ["f"] in def kind # size: PrimitiveType<kind, size>; +// Sometimes we need to refer to a type by a different name in C, when +// ACLE defines a function parameter to be something like 'unsigned' +// rather than uint32_t. +def uint: PrimitiveType<"u", 32> { let nameOverride = "unsigned"; } +def sint: PrimitiveType<"s", 32> { let nameOverride = "int"; } + // VecOf<t> expects t to be a scalar, and gives a 128-bit vector of whatever it // is. class VecOf<Type t>: ComplexType<(CTO_Vec t)>; @@ -222,7 +230,7 @@ // memory access size is n bytes (e.g. 1 for vldrb_[whatever], 2 for vldrh, // ...). The set of valid immediates for these is {0*n, 1*n, ..., 127*n}. class imm_mem7bit<int membytes> - : Immediate<u32, IB_ConstRange<0, !mul(membytes, 127)>> { + : Immediate<sint, IB_ConstRange<0, !mul(membytes, 127)>> { let extra = !if(!eq(membytes, 1), ?, "Multiple"); let extraarg = !cast<string>(membytes); } Index: clang/include/clang/Basic/arm_mve.td =================================================================== --- clang/include/clang/Basic/arm_mve.td +++ clang/include/clang/Basic/arm_mve.td @@ -98,22 +98,22 @@ (u64 (xval $pair, 0))))>; let params = T.Int32 in { -def vadcq: Intrinsic<Vector, (args Vector:$a, Vector:$b, Ptr<u32>:$carry), +def vadcq: Intrinsic<Vector, (args Vector:$a, Vector:$b, Ptr<uint>:$carry), (seq (IRInt<"vadc", [Vector]> $a, $b, (shl (load $carry), 29)):$pair, (store (and 1, (lshr (xval $pair, 1), 29)), $carry), (xval $pair, 0))>; -def vadciq: Intrinsic<Vector, (args Vector:$a, Vector:$b, Ptr<u32>:$carry), +def vadciq: Intrinsic<Vector, (args Vector:$a, Vector:$b, Ptr<uint>:$carry), (seq (IRInt<"vadc", [Vector]> $a, $b, 0):$pair, (store (and 1, (lshr (xval $pair, 1), 29)), $carry), (xval $pair, 0))>; def vadcq_m: Intrinsic<Vector, (args Vector:$inactive, Vector:$a, Vector:$b, - Ptr<u32>:$carry, Predicate:$pred), + Ptr<uint>:$carry, Predicate:$pred), (seq (IRInt<"vadc_predicated", [Vector, Predicate]> $inactive, $a, $b, (shl (load $carry), 29), $pred):$pair, (store (and 1, (lshr (xval $pair, 1), 29)), $carry), (xval $pair, 0))>; def vadciq_m: Intrinsic<Vector, (args Vector:$inactive, Vector:$a, Vector:$b, - Ptr<u32>:$carry, Predicate:$pred), + Ptr<uint>:$carry, Predicate:$pred), (seq (IRInt<"vadc_predicated", [Vector, Predicate]> $inactive, $a, $b, 0, $pred):$pair, (store (and 1, (lshr (xval $pair, 1), 29)), $carry),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits