diff options
author | Lukacma <Marian.Lukac@arm.com> | 2025-05-15 14:01:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-15 14:01:41 +0100 |
commit | 6fc031291955d5d3c69f7df9b9f7460c473d114a (patch) | |
tree | 04b5c528930fbc9fd403d45dbe1f137b8dc1c954 /clang/lib | |
parent | 43db72d56d6491e5b826172f9dea706aec92693c (diff) | |
download | llvm-6fc031291955d5d3c69f7df9b9f7460c473d114a.zip llvm-6fc031291955d5d3c69f7df9b9f7460c473d114a.tar.gz llvm-6fc031291955d5d3c69f7df9b9f7460c473d114a.tar.bz2 |
[Clang][AArch64] Add fp8 variants for untyped NEON intrinsics (#128019)
This patch adds fp8 variants to existing intrinsics, whose operation
doesn't depend on arguments being a specific type.
It also changes mfloat8 type representation in memory from `i8` to
`<1xi8>`
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/Type.cpp | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenTypes.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetBuiltins/ARM.cpp | 43 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 2 |
4 files changed, 48 insertions, 5 deletions
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 82a8cc9..aee1e9a 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -2833,6 +2833,11 @@ static bool isTriviallyCopyableTypeImpl(const QualType &type, if (CanonicalType->isScalarType() || CanonicalType->isVectorType()) return true; + // Mfloat8 type is a special case as it not scalar, but is still trivially + // copyable. + if (CanonicalType->isMFloat8Type()) + return true; + if (const auto *RT = CanonicalType->getAs<RecordType>()) { if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { if (IsCopyConstructible) { diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index d1b292f..843733b 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -108,9 +108,6 @@ llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T) { MT->getNumRows() * MT->getNumColumns()); } - if (T->isMFloat8Type()) - return llvm::Type::getInt8Ty(getLLVMContext()); - llvm::Type *R = ConvertType(T); // Check for the boolean vector case. diff --git a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp index d37e685..1cf8f68 100644 --- a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp @@ -2624,22 +2624,26 @@ static bool HasExtraNeonArgument(unsigned BuiltinID) { case NEON::BI__builtin_neon_vget_lane_bf16: case NEON::BI__builtin_neon_vget_lane_i32: case NEON::BI__builtin_neon_vget_lane_i64: + case NEON::BI__builtin_neon_vget_lane_mf8: case NEON::BI__builtin_neon_vget_lane_f32: case NEON::BI__builtin_neon_vgetq_lane_i8: case NEON::BI__builtin_neon_vgetq_lane_i16: case NEON::BI__builtin_neon_vgetq_lane_bf16: case NEON::BI__builtin_neon_vgetq_lane_i32: case NEON::BI__builtin_neon_vgetq_lane_i64: + case NEON::BI__builtin_neon_vgetq_lane_mf8: case NEON::BI__builtin_neon_vgetq_lane_f32: case NEON::BI__builtin_neon_vduph_lane_bf16: case NEON::BI__builtin_neon_vduph_laneq_bf16: case NEON::BI__builtin_neon_vset_lane_i8: + case NEON::BI__builtin_neon_vset_lane_mf8: case NEON::BI__builtin_neon_vset_lane_i16: case NEON::BI__builtin_neon_vset_lane_bf16: case NEON::BI__builtin_neon_vset_lane_i32: case NEON::BI__builtin_neon_vset_lane_i64: case NEON::BI__builtin_neon_vset_lane_f32: case NEON::BI__builtin_neon_vsetq_lane_i8: + case NEON::BI__builtin_neon_vsetq_lane_mf8: case NEON::BI__builtin_neon_vsetq_lane_i16: case NEON::BI__builtin_neon_vsetq_lane_bf16: case NEON::BI__builtin_neon_vsetq_lane_i32: @@ -4179,9 +4183,17 @@ Value *CodeGenFunction::EmitSVEMaskedLoad(const CallExpr *E, unsigned IntrinsicID, bool IsZExtReturn) { QualType LangPTy = E->getArg(1)->getType(); - llvm::Type *MemEltTy = CGM.getTypes().ConvertTypeForMem( + llvm::Type *MemEltTy = CGM.getTypes().ConvertType( LangPTy->castAs<PointerType>()->getPointeeType()); + // Mfloat8 types is stored as a vector, so extra work + // to extract sclar element type is necessary. + if (MemEltTy->isVectorTy()) { + assert(MemEltTy == FixedVectorType::get(Int8Ty, 1) && + "Only <1 x i8> expected"); + MemEltTy = cast<llvm::VectorType>(MemEltTy)->getElementType(); + } + // The vector type that is returned may be different from the // eventual type loaded from memory. auto VectorTy = cast<llvm::ScalableVectorType>(ReturnTy); @@ -4226,9 +4238,17 @@ Value *CodeGenFunction::EmitSVEMaskedStore(const CallExpr *E, SmallVectorImpl<Value *> &Ops, unsigned IntrinsicID) { QualType LangPTy = E->getArg(1)->getType(); - llvm::Type *MemEltTy = CGM.getTypes().ConvertTypeForMem( + llvm::Type *MemEltTy = CGM.getTypes().ConvertType( LangPTy->castAs<PointerType>()->getPointeeType()); + // Mfloat8 types is stored as a vector, so extra work + // to extract sclar element type is necessary. + if (MemEltTy->isVectorTy()) { + assert(MemEltTy == FixedVectorType::get(Int8Ty, 1) && + "Only <1 x i8> expected"); + MemEltTy = cast<llvm::VectorType>(MemEltTy)->getElementType(); + } + // The vector type that is stored may be different from the // eventual type stored to memory. auto VectorTy = cast<llvm::ScalableVectorType>(Ops.back()->getType()); @@ -6162,6 +6182,13 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Builder.CreateBitCast(Ops[1], llvm::FixedVectorType::get(DoubleTy, 1)); Ops.push_back(EmitScalarExpr(E->getArg(2))); return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); + case NEON::BI__builtin_neon_vset_lane_mf8: + case NEON::BI__builtin_neon_vsetq_lane_mf8: + Ops.push_back(EmitScalarExpr(E->getArg(2))); + // The input vector type needs a cast to scalar type. + Ops[0] = + Builder.CreateBitCast(Ops[0], llvm::Type::getInt8Ty(getLLVMContext())); + return Builder.CreateInsertElement(Ops[1], Ops[0], Ops[2], "vset_lane"); case NEON::BI__builtin_neon_vsetq_lane_f64: // The vector type needs a cast for the v2f64 variant. Ops[1] = @@ -6181,6 +6208,12 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, Builder.CreateBitCast(Ops[0], llvm::FixedVectorType::get(Int8Ty, 16)); return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), "vgetq_lane"); + case NEON::BI__builtin_neon_vget_lane_mf8: + case NEON::BI__builtin_neon_vdupb_lane_mf8: + case NEON::BI__builtin_neon_vgetq_lane_mf8: + case NEON::BI__builtin_neon_vdupb_laneq_mf8: + return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), + "vget_lane"); case NEON::BI__builtin_neon_vget_lane_i16: case NEON::BI__builtin_neon_vduph_lane_i16: Ops[0] = @@ -7630,6 +7663,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd"); } + case NEON::BI__builtin_neon_vluti2_laneq_mf8: case NEON::BI__builtin_neon_vluti2_laneq_bf16: case NEON::BI__builtin_neon_vluti2_laneq_f16: case NEON::BI__builtin_neon_vluti2_laneq_p16: @@ -7645,6 +7679,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, /*isQuad*/ false)); return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vluti2_laneq"); } + case NEON::BI__builtin_neon_vluti2q_laneq_mf8: case NEON::BI__builtin_neon_vluti2q_laneq_bf16: case NEON::BI__builtin_neon_vluti2q_laneq_f16: case NEON::BI__builtin_neon_vluti2q_laneq_p16: @@ -7660,6 +7695,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, /*isQuad*/ true)); return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vluti2_laneq"); } + case NEON::BI__builtin_neon_vluti2_lane_mf8: case NEON::BI__builtin_neon_vluti2_lane_bf16: case NEON::BI__builtin_neon_vluti2_lane_f16: case NEON::BI__builtin_neon_vluti2_lane_p16: @@ -7675,6 +7711,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, /*isQuad*/ false)); return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vluti2_lane"); } + case NEON::BI__builtin_neon_vluti2q_lane_mf8: case NEON::BI__builtin_neon_vluti2q_lane_bf16: case NEON::BI__builtin_neon_vluti2q_lane_f16: case NEON::BI__builtin_neon_vluti2q_lane_p16: @@ -7690,12 +7727,14 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, /*isQuad*/ true)); return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vluti2_lane"); } + case NEON::BI__builtin_neon_vluti4q_lane_mf8: case NEON::BI__builtin_neon_vluti4q_lane_p8: case NEON::BI__builtin_neon_vluti4q_lane_s8: case NEON::BI__builtin_neon_vluti4q_lane_u8: { Int = Intrinsic::aarch64_neon_vluti4q_lane; return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vluti4q_lane"); } + case NEON::BI__builtin_neon_vluti4q_laneq_mf8: case NEON::BI__builtin_neon_vluti4q_laneq_p8: case NEON::BI__builtin_neon_vluti4q_laneq_s8: case NEON::BI__builtin_neon_vluti4q_laneq_u8: { diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index dc12bac..adce0a1 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1976,6 +1976,8 @@ void InitListChecker::CheckVectorType(const InitializedEntity &Entity, typeCode = "s"; else if (elementType->isUnsignedIntegerType()) typeCode = "u"; + else if (elementType->isMFloat8Type()) + typeCode = "mf"; else llvm_unreachable("Invalid element type!"); |