diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h --- a/llvm/include/llvm-c/Core.h +++ b/llvm/include/llvm-c/Core.h @@ -163,7 +163,8 @@ LLVMX86_AMXTypeKind, /**< X86 AMX */ LLVMTokenTypeKind, /**< Tokens */ LLVMScalableVectorTypeKind, /**< Scalable SIMD vector type */ - LLVMBFloatTypeKind /**< 16 bit brain floating point type */ + LLVMBFloatTypeKind, /**< 16 bit brain floating point type */ + LLVMAArch64_LS64TypeKind, /**< 8 Consecutive GPRs (AArch64) */ } LLVMTypeKind; typedef enum { @@ -1500,6 +1501,11 @@ LLVMTypeRef LLVMX86AMXTypeInContext(LLVMContextRef C); /** + * Create an AArch64 LS64 type in a context. + */ +LLVMTypeRef LLVMAArch64_LS64TypeInContext(LLVMContextRef C); + +/** * Create a token type in a context. */ LLVMTypeRef LLVMTokenTypeInContext(LLVMContextRef C); @@ -1517,7 +1523,7 @@ LLVMTypeRef LLVMLabelType(void); LLVMTypeRef LLVMX86MMXType(void); LLVMTypeRef LLVMX86AMXType(void); - +LLVMTypeRef LLVMAArch64_LS64Type(void); /** * @} */ diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h --- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h +++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h @@ -169,7 +169,8 @@ TYPE_CODE_TOKEN = 22, // TOKEN TYPE_CODE_BFLOAT = 23, // BRAIN FLOATING POINT - TYPE_CODE_X86_AMX = 24 // X86 AMX + TYPE_CODE_X86_AMX = 24, // X86 AMX + TYPE_CODE_AARCH64_LS64 = 25 // 8 Consecutive GPRs (AArch64) }; enum OperandBundleTagCode { diff --git a/llvm/include/llvm/IR/DataLayout.h b/llvm/include/llvm/IR/DataLayout.h --- a/llvm/include/llvm/IR/DataLayout.h +++ b/llvm/include/llvm/IR/DataLayout.h @@ -687,6 +687,8 @@ case Type::DoubleTyID: case Type::X86_MMXTyID: return TypeSize::Fixed(64); + case Type::AArch64_LS64TyID: + return TypeSize::Fixed(512); case Type::PPC_FP128TyID: case Type::FP128TyID: return TypeSize::Fixed(128); diff --git a/llvm/include/llvm/IR/Type.h b/llvm/include/llvm/IR/Type.h --- a/llvm/include/llvm/IR/Type.h +++ b/llvm/include/llvm/IR/Type.h @@ -66,6 +66,7 @@ MetadataTyID, ///< Metadata X86_MMXTyID, ///< MMX vectors (64 bits, X86 specific) X86_AMXTyID, ///< AMX vectors (8192 bits, X86 specific) + AArch64_LS64TyID, ///< 8 consecutive GPRs (AArch64) TokenTyID, ///< Tokens // Derived types... see DerivedTypes.h file. @@ -186,6 +187,8 @@ /// Return true if this is X86 AMX. bool isX86_AMXTy() const { return getTypeID() == X86_AMXTyID; } + bool isAArch64_LS64Ty() const { return getTypeID() == AArch64_LS64TyID; } + /// Return true if this is a FP type or a vector of FP. bool isFPOrFPVectorTy() const { return getScalarType()->isFloatingPointTy(); } @@ -273,7 +276,7 @@ // If it's a primitive, it is always sized. if (getTypeID() == IntegerTyID || isFloatingPointTy() || getTypeID() == PointerTyID || getTypeID() == X86_MMXTyID || - getTypeID() == X86_AMXTyID) + getTypeID() == X86_AMXTyID || getTypeID() == AArch64_LS64TyID) return true; // If it is not something that can have a size (e.g. a function or label), // it doesn't have a size. @@ -410,6 +413,7 @@ static Type *getPPC_FP128Ty(LLVMContext &C); static Type *getX86_MMXTy(LLVMContext &C); static Type *getX86_AMXTy(LLVMContext &C); + static Type *getAArch64_LS64Ty(LLVMContext &C); static Type *getTokenTy(LLVMContext &C); static IntegerType *getIntNTy(LLVMContext &C, unsigned N); static IntegerType *getInt1Ty(LLVMContext &C); @@ -466,6 +470,7 @@ static PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0); static PointerType *getX86_MMXPtrTy(LLVMContext &C, unsigned AS = 0); static PointerType *getX86_AMXPtrTy(LLVMContext &C, unsigned AS = 0); + static PointerType *getAArch64_LS64PtrTy(LLVMContext &C, unsigned AS = 0); static PointerType *getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS = 0); static PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0); static PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0); diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -841,6 +841,7 @@ TYPEKEYWORD("metadata", Type::getMetadataTy(Context)); TYPEKEYWORD("x86_mmx", Type::getX86_MMXTy(Context)); TYPEKEYWORD("x86_amx", Type::getX86_AMXTy(Context)); + TYPEKEYWORD("aarch64_ls64", Type::getAArch64_LS64Ty(Context)); TYPEKEYWORD("token", Type::getTokenTy(Context)); #undef TYPEKEYWORD diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1766,6 +1766,9 @@ case bitc::TYPE_CODE_X86_AMX: // X86_AMX ResultTy = Type::getX86_AMXTy(Context); break; + case bitc::TYPE_CODE_AARCH64_LS64: // AArch64 LS64 + ResultTy = Type::getAArch64_LS64Ty(Context); + break; case bitc::TYPE_CODE_TOKEN: // TOKEN ResultTy = Type::getTokenTy(Context); break; diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -914,6 +914,7 @@ case Type::MetadataTyID: Code = bitc::TYPE_CODE_METADATA; break; case Type::X86_MMXTyID: Code = bitc::TYPE_CODE_X86_MMX; break; case Type::X86_AMXTyID: Code = bitc::TYPE_CODE_X86_AMX; break; + case Type::AArch64_LS64TyID: Code = bitc::TYPE_CODE_AARCH64_LS64; break; case Type::TokenTyID: Code = bitc::TYPE_CODE_TOKEN; break; case Type::IntegerTyID: // INTEGER: [width] diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -610,6 +610,7 @@ case Type::MetadataTyID: OS << "metadata"; return; case Type::X86_MMXTyID: OS << "x86_mmx"; return; case Type::X86_AMXTyID: OS << "x86_amx"; return; + case Type::AArch64_LS64TyID: OS << "aarch64_ls64"; return; case Type::TokenTyID: OS << "token"; return; case Type::IntegerTyID: OS << 'i' << cast(Ty)->getBitWidth(); diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -514,6 +514,8 @@ return LLVMX86_MMXTypeKind; case Type::X86_AMXTyID: return LLVMX86_AMXTypeKind; + case Type::AArch64_LS64TyID: + return LLVMAArch64_LS64TypeKind; case Type::TokenTyID: return LLVMTokenTypeKind; case Type::ScalableVectorTyID: @@ -820,6 +822,9 @@ LLVMTypeRef LLVMMetadataTypeInContext(LLVMContextRef C) { return wrap(Type::getMetadataTy(*unwrap(C))); } +LLVMTypeRef LLVMAArch64_LS64TypeInContext(LLVMContextRef C) { + return (LLVMTypeRef) Type::getAArch64_LS64Ty(*unwrap(C)); +} LLVMTypeRef LLVMVoidType(void) { return LLVMVoidTypeInContext(LLVMGetGlobalContext()); @@ -827,6 +832,10 @@ LLVMTypeRef LLVMLabelType(void) { return LLVMLabelTypeInContext(LLVMGetGlobalContext()); } +LLVMTypeRef LLVMAArch64_LS64Type(void) { + return LLVMAArch64_LS64TypeInContext(LLVMGetGlobalContext()); +} + /*===-- Operations on values ----------------------------------------------===*/ diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp --- a/llvm/lib/IR/DataLayout.cpp +++ b/llvm/lib/IR/DataLayout.cpp @@ -812,6 +812,8 @@ } case Type::X86_AMXTyID: return Align(64); + case Type::AArch64_LS64TyID: + return Align(64); default: llvm_unreachable("Bad type for getAlignment!!!"); } diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -1418,7 +1418,7 @@ // Basic type instances. Type VoidTy, LabelTy, HalfTy, BFloatTy, FloatTy, DoubleTy, MetadataTy, TokenTy; - Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy, X86_AMXTy; + Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy, X86_AMXTy, AArch64_LS64Ty; IntegerType Int1Ty, Int8Ty, Int16Ty, Int32Ty, Int64Ty, Int128Ty; BumpPtrAllocator Alloc; diff --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp --- a/llvm/lib/IR/LLVMContextImpl.cpp +++ b/llvm/lib/IR/LLVMContextImpl.cpp @@ -36,6 +36,7 @@ PPC_FP128Ty(C, Type::PPC_FP128TyID), X86_MMXTy(C, Type::X86_MMXTyID), X86_AMXTy(C, Type::X86_AMXTyID), + AArch64_LS64Ty(C, Type::AArch64_LS64TyID), Int1Ty(C, 1), Int8Ty(C, 8), Int16Ty(C, 16), diff --git a/llvm/lib/IR/Type.cpp b/llvm/lib/IR/Type.cpp --- a/llvm/lib/IR/Type.cpp +++ b/llvm/lib/IR/Type.cpp @@ -50,6 +50,7 @@ case MetadataTyID : return getMetadataTy(C); case X86_MMXTyID : return getX86_MMXTy(C); case X86_AMXTyID : return getX86_AMXTy(C); + case AArch64_LS64TyID : return getAArch64_LS64Ty(C); case TokenTyID : return getTokenTy(C); default: return nullptr; @@ -130,6 +131,7 @@ case Type::PPC_FP128TyID: return TypeSize::Fixed(128); case Type::X86_MMXTyID: return TypeSize::Fixed(64); case Type::X86_AMXTyID: return TypeSize::Fixed(8192); + case Type::AArch64_LS64TyID: return TypeSize::Fixed(512); case Type::IntegerTyID: return TypeSize::Fixed(cast(this)->getBitWidth()); case Type::FixedVectorTyID: @@ -190,6 +192,7 @@ Type *Type::getPPC_FP128Ty(LLVMContext &C) { return &C.pImpl->PPC_FP128Ty; } Type *Type::getX86_MMXTy(LLVMContext &C) { return &C.pImpl->X86_MMXTy; } Type *Type::getX86_AMXTy(LLVMContext &C) { return &C.pImpl->X86_AMXTy; } +Type *Type::getAArch64_LS64Ty(LLVMContext &C) { return &C.pImpl->AArch64_LS64Ty; } IntegerType *Type::getInt1Ty(LLVMContext &C) { return &C.pImpl->Int1Ty; } IntegerType *Type::getInt8Ty(LLVMContext &C) { return &C.pImpl->Int8Ty; } @@ -238,6 +241,10 @@ return getX86_AMXTy(C)->getPointerTo(AS); } +PointerType *Type::getAArch64_LS64PtrTy(LLVMContext &C, unsigned AS) { + return getAArch64_LS64Ty(C)->getPointerTo(AS); +} + PointerType *Type::getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS) { return getIntNTy(C, N)->getPointerTo(AS); } diff --git a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp --- a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp +++ b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp @@ -326,6 +326,7 @@ case Type::VoidTyID: case Type::BFloatTyID: case Type::X86_FP80TyID: + case Type::AArch64_LS64TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: case Type::LabelTyID: diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -153,6 +153,8 @@ return LLVMX86AMXTypeInContext(Ctx); case LLVMX86_MMXTypeKind: return LLVMX86MMXTypeInContext(Ctx); + case LLVMAArch64_LS64TypeKind: + return LLVMAArch64_LS64TypeInContext(Ctx); case LLVMTokenTypeKind: return LLVMTokenTypeInContext(Ctx); }