[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-21 Thread Amy Huang via cfe-commits

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)

2023-09-20 Thread Eli Friedman via cfe-commits

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)

2023-09-20 Thread Amy Huang via cfe-commits

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)

2023-09-20 Thread Amy Huang via cfe-commits

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)

2023-09-20 Thread Amy Huang via cfe-commits

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)

2023-09-20 Thread Amy Huang via cfe-commits


@@ -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)

2023-09-20 Thread Eli Friedman via cfe-commits


@@ -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)

2023-09-19 Thread Amy Huang via cfe-commits

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)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -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)

2023-09-19 Thread Amy Huang via cfe-commits

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)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -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)

2023-09-19 Thread Eli Friedman via cfe-commits


@@ -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)

2023-09-19 Thread Eli Friedman via cfe-commits


@@ -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)

2023-09-19 Thread Amy Huang via cfe-commits

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)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -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)

2023-09-18 Thread Eli Friedman via cfe-commits


@@ -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)

2023-09-18 Thread Amy Huang via cfe-commits


@@ -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)

2023-09-15 Thread Eli Friedman via cfe-commits


@@ -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)

2023-09-15 Thread Amy Huang via cfe-commits

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)

2023-09-15 Thread via cfe-commits

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)

2023-09-15 Thread Amy Huang via cfe-commits

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 ==