[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang closed https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/efriedma-quic approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang updated https://github.com/llvm/llvm-project/pull/66554 >From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++ 4 files changed, 228 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f727a0d5592effd..e27e74ed7a53db0 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10779,6 +10779,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ true); +} else { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls64); + if (ArgType != Builder.getInt64Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ true); +} +Value *Result = Builder.CreateCall(F, Arg, "cls"); +if (BuiltinID == AArch64::BI_CountLeadingSigns64) + Result = Builder.CreateTrunc(Result,
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang updated https://github.com/llvm/llvm-project/pull/66554 >From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++ 4 files changed, 228 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f727a0d5592effd..e27e74ed7a53db0 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10779,6 +10779,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ true); +} else { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls64); + if (ArgType != Builder.getInt64Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ true); +} +Value *Result = Builder.CreateCall(F, Arg, "cls"); +if (BuiltinID == AArch64::BI_CountLeadingSigns64) + Result = Builder.CreateTrunc(Result,
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang resolved https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10779,6 +10779,70 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *RetTy = ConvertType(E->getType()); +return Builder.CreateBitCast(Arg, RetTy); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) amykhuang wrote: Yep, thanks. https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10779,6 +10779,70 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *RetTy = ConvertType(E->getType()); +return Builder.CreateBitCast(Arg, RetTy); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) efriedma-quic wrote: Probably the builtin was being declared with the wrong type (should be fixed by the switch to "Ni"). https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang resolved https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") amykhuang wrote: Done https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang updated https://github.com/llvm/llvm-project/pull/66554 >From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++ 4 files changed, 228 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f727a0d5592effd..e27e74ed7a53db0 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10779,6 +10779,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ true); +} else { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls64); + if (ArgType != Builder.getInt64Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ true); +} +Value *Result = Builder.CreateCall(F, Arg, "cls"); +if (BuiltinID == AArch64::BI_CountLeadingSigns64) + Result = Builder.CreateTrunc(Result,
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10779,6 +10779,70 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *RetTy = ConvertType(E->getType()); +return Builder.CreateBitCast(Arg, RetTy); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) amykhuang wrote: Yeah, I'm a bit confused by this. It was coming up in the test case when building with `-triple arm64-darwin`. It seemed everything was being converted to int64 at the beginning of the function? https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") efriedma-quic wrote: Can you use "Ni" instead of "Li" for the 32-bit variants so these have the right width even if someone somehow uses them on a non-LLP64 target? https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10779,6 +10779,70 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *RetTy = ConvertType(E->getType()); +return Builder.CreateBitCast(Arg, RetTy); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) efriedma-quic wrote: If `ArgType != Builder.getInt32Ty()` is true, something has gone wrong. The signature of the builtin should be enforced by Sema. https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang updated https://github.com/llvm/llvm-project/pull/66554 >From f0375650be09359ac1a87dd7a60a9415a55cf837 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++ 4 files changed, 228 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f727a0d5592effd..e27e74ed7a53db0 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10779,6 +10779,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ true); +} else { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls64); + if (ArgType != Builder.getInt64Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ true); +} +Value *Result = Builder.CreateCall(F, Arg, "cls"); +if (BuiltinID == AArch64::BI_CountLeadingSigns64) + Result = Builder.CreateTrunc(Result,
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); amykhuang wrote: Done https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); efriedma-quic wrote: I meant a bitcast, not an sitofp. https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); amykhuang wrote: Oh, ok -- added a int to float cast. It seems like MSVC only emits an `fmov` for this code, so for an example snippet ``` double copy_double_from_int64(__int64 w) { return _CopyDoubleFromInt64((__int64) w); } ``` MSVC assembly output looks like ``` sub sp,sp,#0x10 str x0,[sp] ldr x8,[sp] fmov d0,x8 add sp,sp,#0x10 ret ``` whereas clang assembly output (with the cast) looks like ``` sub sp, sp, #16 str x0, [sp, #8] ldr d0, [sp, #8] scvtf d0, d0 addsp, sp, #16 ret ``` https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
@@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); efriedma-quic wrote: I suspect this won't actually work correctly in general (for example, if you try to do arithmetic on the returned value); the returned value has the wrong type. https://github.com/llvm/llvm-project/pull/66554 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang updated https://github.com/llvm/llvm-project/pull/66554 >From 2f18bc9802942e5fa08181026212ea711f9f16a9 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++ 4 files changed, 228 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 037a2f9f7b15322..08d09c1c3d8e9de 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +Function *F; +if (BuiltinID == AArch64::BI_CountLeadingSigns) { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls); + if (ArgType != Builder.getInt32Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ true); +} else { + F = CGM.getIntrinsic(Intrinsic::aarch64_cls64); + if (ArgType != Builder.getInt64Ty()) +Arg = +Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ true); +} +Value *Result = Builder.CreateCall(F, Arg, "cls"); +if (BuiltinID == AArch64::BI_CountLeadingSigns64) + Result = Builder.CreateTrunc(Result,
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
llvmbot wrote: @llvm/pr-subscribers-platform-windows Changes Implement the _Count* and _Copy* Windows ARM intrinsics: ``` double _CopyDoubleFromInt64(__int64) float _CopyFloatFromInt32(__int32) __int32 _CopyInt32FromFloat(float) __int64 _CopyInt64FromDouble(double) unsigned int _CountLeadingOnes(unsigned long) unsigned int _CountLeadingOnes64(unsigned __int64) unsigned int _CountLeadingSigns(long) unsigned int _CountLeadingSigns64(__int64) unsigned int _CountLeadingZeros(unsigned long) unsigned int _CountLeadingZeros64(unsigned __int64) unsigned int _CountOneBits(unsigned long) unsigned int _CountOneBits64(unsigned __int64) ``` Full list of intrinsics here: [https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics](https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics) Bug: [65405](https://github.com/llvm/llvm-project/issues/65405) --- Full diff: https://github.com/llvm/llvm-project/pull/66554.diff 4 Files Affected: - (modified) clang/include/clang/Basic/BuiltinsAArch64.def (+14-1) - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+62) - (modified) clang/lib/Headers/intrin.h (+14) - (modified) clang/test/CodeGen/arm64-microsoft-intrinsics.c (+140) ``diff diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 037a2f9f7b15322..08d09c1c3d8e9de 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID == AArch64::BI_CountLeadingSigns || + BuiltinID == AArch64::BI_CountLeadingSigns64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +
[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)
https://github.com/amykhuang created https://github.com/llvm/llvm-project/pull/66554 Implement the _Count* and _Copy* Windows ARM intrinsics: ``` double _CopyDoubleFromInt64(__int64) float _CopyFloatFromInt32(__int32) __int32 _CopyInt32FromFloat(float) __int64 _CopyInt64FromDouble(double) unsigned int _CountLeadingOnes(unsigned long) unsigned int _CountLeadingOnes64(unsigned __int64) unsigned int _CountLeadingSigns(long) unsigned int _CountLeadingSigns64(__int64) unsigned int _CountLeadingZeros(unsigned long) unsigned int _CountLeadingZeros64(unsigned __int64) unsigned int _CountOneBits(unsigned long) unsigned int _CountOneBits64(unsigned __int64) ``` Full list of intrinsics here: [https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics](https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics) Bug: [65405](https://github.com/llvm/llvm-project/issues/65405) >From bbd538659e363e7e7e57fd5e585bc90c2bc0d88b Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 7 Sep 2023 11:32:17 -0700 Subject: [PATCH] [MSVC, ARM64] Add _Copy* and _Count* intrinsics --- clang/include/clang/Basic/BuiltinsAArch64.def | 15 +- clang/lib/CodeGen/CGBuiltin.cpp | 62 clang/lib/Headers/intrin.h| 14 ++ .../test/CodeGen/arm64-microsoft-intrinsics.c | 140 ++ 4 files changed, 230 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def index eaae6c9ad846868..c4d34f8e15e8b8d 100644 --- a/clang/include/clang/Basic/BuiltinsAArch64.def +++ b/clang/include/clang/Basic/BuiltinsAArch64.def @@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") - TARGET_HEADER_BUILTIN(__writex18byte, "vUNiUc", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18word, "vUNiUs", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") @@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word, "UsUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + +TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") +TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "") + #undef BUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 037a2f9f7b15322..08d09c1c3d8e9de 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10752,6 +10752,68 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Load; } + if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 || + BuiltinID == AArch64::BI_CopyFloatFromInt32 || + BuiltinID == AArch64::BI_CopyInt32FromFloat || + BuiltinID == AArch64::BI_CopyInt64FromDouble) { +return EmitScalarExpr(E->getArg(0)); + } + + if (BuiltinID == AArch64::BI_CountLeadingOnes || + BuiltinID == AArch64::BI_CountLeadingOnes64 || + BuiltinID == AArch64::BI_CountLeadingZeros || + BuiltinID == AArch64::BI_CountLeadingZeros64) { +Value *Arg = EmitScalarExpr(E->getArg(0)); +llvm::Type *ArgType = Arg->getType(); + +if (BuiltinID == AArch64::BI_CountLeadingOnes || +BuiltinID == AArch64::BI_CountLeadingOnes64) + Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType)); + +Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); +Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)}); + +if (BuiltinID == AArch64::BI_CountLeadingOnes64 || +BuiltinID == AArch64::BI_CountLeadingZeros64) + Result = Builder.CreateTrunc(Result, Builder.getInt32Ty()); +return Result; + } + + if (BuiltinID ==