diff options
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 148 |
1 files changed, 140 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 0c2ee446aa30..7fe80b0cbdfb 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -756,9 +756,7 @@ static WidthAndSignedness getIntegerWidthAndSignedness(const clang::ASTContext &context, const clang::QualType Type) { assert(Type->isIntegerType() && "Given type is not an integer."); - unsigned Width = Type->isBooleanType() ? 1 - : Type->isBitIntType() ? context.getIntWidth(Type) - : context.getTypeInfo(Type).Width; + unsigned Width = context.getIntWidth(Type); bool Signed = Type->isSignedIntegerType(); return {Width, Signed}; } @@ -996,7 +994,7 @@ CodeGenFunction::emitFlexibleArrayMemberSize(const Expr *E, unsigned Type, // Build a load of the counted_by field. bool IsSigned = CountedByFD->getType()->isSignedIntegerType(); - Value *CountedByInst = EmitCountedByFieldExpr(Base, FAMDecl, CountedByFD); + Value *CountedByInst = EmitLoadOfCountedByField(Base, FAMDecl, CountedByFD); if (!CountedByInst) return getDefaultBuiltinObjectSizeResult(Type, ResType); @@ -13938,6 +13936,54 @@ static Value *EmitX86FMAExpr(CodeGenFunction &CGF, const CallExpr *E, case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3: IID = llvm::Intrinsic::x86_avx512_vfmaddsub_pd_512; break; + case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddph256; + break; + case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddsubph256; + break; + case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddps256; + break; + case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddpd256; + break; + case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddsubps256; + break; + case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3: + Subtract = true; + LLVM_FALLTHROUGH; + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3: + IID = llvm::Intrinsic::x86_avx10_vfmaddsubpd256; + break; } Value *A = Ops[0]; @@ -13977,6 +14023,12 @@ static Value *EmitX86FMAExpr(CodeGenFunction &CGF, const CallExpr *E, case clang::X86::BI__builtin_ia32_vfmaddsubph512_mask: case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask: case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask: + case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask: + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask: MaskFalseVal = Ops[0]; break; case clang::X86::BI__builtin_ia32_vfmaddph512_maskz: @@ -13985,6 +14037,12 @@ static Value *EmitX86FMAExpr(CodeGenFunction &CGF, const CallExpr *E, case clang::X86::BI__builtin_ia32_vfmaddsubph512_maskz: case clang::X86::BI__builtin_ia32_vfmaddsubps512_maskz: case clang::X86::BI__builtin_ia32_vfmaddsubpd512_maskz: + case clang::X86::BI__builtin_ia32_vfmaddph256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddps256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_maskz: + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz: MaskFalseVal = Constant::getNullValue(Ops[0]->getType()); break; case clang::X86::BI__builtin_ia32_vfmsubph512_mask3: @@ -13999,6 +14057,18 @@ static Value *EmitX86FMAExpr(CodeGenFunction &CGF, const CallExpr *E, case clang::X86::BI__builtin_ia32_vfmaddsubps512_mask3: case clang::X86::BI__builtin_ia32_vfmsubaddpd512_mask3: case clang::X86::BI__builtin_ia32_vfmaddsubpd512_mask3: + case clang::X86::BI__builtin_ia32_vfmsubph256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddph256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmsubps256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddps256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmsubpd256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddpd256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmsubaddph256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddsubph256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmsubaddps256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddsubps256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3: + case clang::X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3: MaskFalseVal = Ops[2]; break; } @@ -14390,10 +14460,10 @@ Value *CodeGenFunction::EmitRISCVCpuSupports(const CallExpr *E) { return FeaturesBit; }; - int BitPos = RISCVISAInfo::getRISCVFeaturesBitPosition(FeatureStr); + auto [GroupID, BitPos] = RISCVISAInfo::getRISCVFeaturesBitsInfo(FeatureStr); assert(BitPos != -1 && "validation should have rejected this feature"); Value *MaskV = Builder.getInt64(1ULL << BitPos); - Value *Bitset = Builder.CreateAnd(LoadFeatureBit(0), MaskV); + Value *Bitset = Builder.CreateAnd(LoadFeatureBit(GroupID), MaskV); return Builder.CreateICmpEQ(Bitset, MaskV); } @@ -14686,6 +14756,12 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_vcvtw2ph512_mask: case X86::BI__builtin_ia32_vcvtdq2ph512_mask: case X86::BI__builtin_ia32_vcvtqq2ph512_mask: + case X86::BI__builtin_ia32_vcvtdq2ph256_round_mask: + case X86::BI__builtin_ia32_vcvtdq2ps256_round_mask: + case X86::BI__builtin_ia32_vcvtqq2pd256_round_mask: + case X86::BI__builtin_ia32_vcvtqq2ph256_round_mask: + case X86::BI__builtin_ia32_vcvtqq2ps256_round_mask: + case X86::BI__builtin_ia32_vcvtw2ph256_round_mask: return EmitX86ConvertIntToFp(*this, E, Ops, /*IsSigned*/ true); case X86::BI__builtin_ia32_cvtudq2ps512_mask: case X86::BI__builtin_ia32_cvtuqq2ps512_mask: @@ -14693,6 +14769,12 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_vcvtuw2ph512_mask: case X86::BI__builtin_ia32_vcvtudq2ph512_mask: case X86::BI__builtin_ia32_vcvtuqq2ph512_mask: + case X86::BI__builtin_ia32_vcvtudq2ph256_round_mask: + case X86::BI__builtin_ia32_vcvtudq2ps256_round_mask: + case X86::BI__builtin_ia32_vcvtuqq2pd256_round_mask: + case X86::BI__builtin_ia32_vcvtuqq2ph256_round_mask: + case X86::BI__builtin_ia32_vcvtuqq2ps256_round_mask: + case X86::BI__builtin_ia32_vcvtuw2ph256_round_mask: return EmitX86ConvertIntToFp(*this, E, Ops, /*IsSigned*/ false); case X86::BI__builtin_ia32_vfmaddss3: @@ -14736,6 +14818,18 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_vfmaddpd512_mask3: case X86::BI__builtin_ia32_vfmsubpd512_mask3: case X86::BI__builtin_ia32_vfmsubph512_mask3: + case X86::BI__builtin_ia32_vfmaddph256_round_mask: + case X86::BI__builtin_ia32_vfmaddph256_round_maskz: + case X86::BI__builtin_ia32_vfmaddph256_round_mask3: + case X86::BI__builtin_ia32_vfmaddps256_round_mask: + case X86::BI__builtin_ia32_vfmaddps256_round_maskz: + case X86::BI__builtin_ia32_vfmaddps256_round_mask3: + case X86::BI__builtin_ia32_vfmsubps256_round_mask3: + case X86::BI__builtin_ia32_vfmaddpd256_round_mask: + case X86::BI__builtin_ia32_vfmaddpd256_round_maskz: + case X86::BI__builtin_ia32_vfmaddpd256_round_mask3: + case X86::BI__builtin_ia32_vfmsubpd256_round_mask3: + case X86::BI__builtin_ia32_vfmsubph256_round_mask3: return EmitX86FMAExpr(*this, E, Ops, BuiltinID, /*IsAddSub*/ false); case X86::BI__builtin_ia32_vfmaddsubph512_mask: case X86::BI__builtin_ia32_vfmaddsubph512_maskz: @@ -14749,6 +14843,18 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_vfmaddsubpd512_maskz: case X86::BI__builtin_ia32_vfmaddsubpd512_mask3: case X86::BI__builtin_ia32_vfmsubaddpd512_mask3: + case X86::BI__builtin_ia32_vfmaddsubph256_round_mask: + case X86::BI__builtin_ia32_vfmaddsubph256_round_maskz: + case X86::BI__builtin_ia32_vfmaddsubph256_round_mask3: + case X86::BI__builtin_ia32_vfmsubaddph256_round_mask3: + case X86::BI__builtin_ia32_vfmaddsubps256_round_mask: + case X86::BI__builtin_ia32_vfmaddsubps256_round_maskz: + case X86::BI__builtin_ia32_vfmaddsubps256_round_mask3: + case X86::BI__builtin_ia32_vfmsubaddps256_round_mask3: + case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask: + case X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz: + case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3: + case X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3: return EmitX86FMAExpr(*this, E, Ops, BuiltinID, /*IsAddSub*/ true); case X86::BI__builtin_ia32_movdqa32store128_mask: @@ -16329,6 +16435,9 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_cmppd128_mask: case X86::BI__builtin_ia32_cmppd256_mask: case X86::BI__builtin_ia32_cmppd512_mask: + case X86::BI__builtin_ia32_vcmppd256_round_mask: + case X86::BI__builtin_ia32_vcmpps256_round_mask: + case X86::BI__builtin_ia32_vcmpph256_round_mask: IsMaskFCmp = true; [[fallthrough]]; case X86::BI__builtin_ia32_cmpps: @@ -16832,6 +16941,15 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), Ops); return EmitX86Select(*this, Ops[3], Call, Ops[0]); } + case X86::BI__builtin_ia32_vfcmaddcph256_round_mask: + IsConjFMA = true; + LLVM_FALLTHROUGH; + case X86::BI__builtin_ia32_vfmaddcph256_round_mask: { + Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx10_mask_vfcmaddcph256 + : Intrinsic::x86_avx10_mask_vfmaddcph256; + Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), Ops); + return EmitX86Select(*this, Ops[3], Call, Ops[0]); + } case X86::BI__builtin_ia32_vfcmaddcsh_round_mask: IsConjFMA = true; [[fallthrough]]; @@ -18376,14 +18494,14 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, return nullptr; switch (BuiltinID) { - case Builtin::BI__builtin_hlsl_elementwise_all: { + case Builtin::BI__builtin_hlsl_all: { Value *Op0 = EmitScalarExpr(E->getArg(0)); return Builder.CreateIntrinsic( /*ReturnType=*/llvm::Type::getInt1Ty(getLLVMContext()), CGM.getHLSLRuntime().getAllIntrinsic(), ArrayRef<Value *>{Op0}, nullptr, "hlsl.all"); } - case Builtin::BI__builtin_hlsl_elementwise_any: { + case Builtin::BI__builtin_hlsl_any: { Value *Op0 = EmitScalarExpr(E->getArg(0)); return Builder.CreateIntrinsic( /*ReturnType=*/llvm::Type::getInt1Ty(getLLVMContext()), @@ -18452,6 +18570,20 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, /*ReturnType=*/X->getType(), CGM.getHLSLRuntime().getLerpIntrinsic(), ArrayRef<Value *>{X, Y, S}, nullptr, "hlsl.lerp"); } + case Builtin::BI__builtin_hlsl_length: { + Value *X = EmitScalarExpr(E->getArg(0)); + + assert(E->getArg(0)->getType()->hasFloatingRepresentation() && + "length operand must have a float representation"); + // if the operand is a scalar, we can use the fabs llvm intrinsic directly + if (!E->getArg(0)->getType()->isVectorType()) + return EmitFAbs(*this, X); + + return Builder.CreateIntrinsic( + /*ReturnType=*/X->getType()->getScalarType(), + CGM.getHLSLRuntime().getLengthIntrinsic(), ArrayRef<Value *>{X}, + nullptr, "hlsl.length"); + } case Builtin::BI__builtin_hlsl_elementwise_frac: { Value *Op0 = EmitScalarExpr(E->getArg(0)); if (!E->getArg(0)->getType()->hasFloatingRepresentation()) |
