[clang] e8dd7ec - Revert "[AArch64][SME2] Add ldr_zt, str_zt builtins and intrinsics (#71795)"

2023-11-16 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2023-11-16T11:01:27Z
New Revision: e8dd7ecbc4668cdf767478fd9b1dd666c38d0105

URL: 
https://github.com/llvm/llvm-project/commit/e8dd7ecbc4668cdf767478fd9b1dd666c38d0105
DIFF: 
https://github.com/llvm/llvm-project/commit/e8dd7ecbc4668cdf767478fd9b1dd666c38d0105.diff

LOG: Revert "[AArch64][SME2] Add ldr_zt, str_zt builtins and intrinsics 
(#71795)"

This reverts commit cc1244980b74f45a06e2002a33444ce757b577aa.

Added: 


Modified: 
clang/include/clang/Basic/arm_sme.td
llvm/include/llvm/IR/IntrinsicsAArch64.td
llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td
llvm/lib/Target/AArch64/SMEInstrFormats.td

Removed: 
clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
llvm/test/CodeGen/AArch64/sme2-intrinsics-zt0.ll



diff  --git a/clang/include/clang/Basic/arm_sme.td 
b/clang/include/clang/Basic/arm_sme.td
index fb3f54ecff95080..b5655afdf419ecf 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -298,11 +298,3 @@ multiclass ZAAddSub {
 
 defm SVADD : ZAAddSub<"add">;
 defm SVSUB : ZAAddSub<"sub">;
-
-//
-// Spill and fill of ZT0
-//
-let TargetGuard = "sme2" in {
-  def SVLDR_ZT : Inst<"svldr_zt", "viQ", "", MergeNone, "aarch64_sme_ldr_zt", 
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA], 
[ImmCheck<0, ImmCheck0_0>]>;
-  def SVSTR_ZT : Inst<"svstr_zt", "vi%", "", MergeNone, "aarch64_sme_str_zt", 
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA], 
[ImmCheck<0, ImmCheck0_0>]>;
-}

diff  --git a/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c 
b/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
deleted file mode 100644
index 7ae6769c8237f6c..000
--- a/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
+++ /dev/null
@@ -1,51 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
-
-// REQUIRES: aarch64-registered-target
-
-// RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64-none-linux-gnu 
-target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | 
opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s
-// RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64-none-linux-gnu 
-target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x 
c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s 
-check-prefix=CPP-CHECK
-// RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple 
aarch64-none-linux-gnu -target-feature +sme2 -S -disable-O0-optnone -Werror 
-Wall -emit-llvm -o - %s | opt -S -p mem2reg,instcombine,tailcallelim | 
FileCheck %s
-// RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple 
aarch64-none-linux-gnu -target-feature +sme2 -S -disable-O0-optnone -Werror 
-Wall -emit-llvm -o - -x c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | 
FileCheck %s -check-prefix=CPP-CHECK
-// RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64-none-linux-gnu 
-target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
-
-#include 
-
-#ifdef SVE_OVERLOADED_FORMS
-// A simple used,unused... macro, long enough to represent any SVE builtin.
-#define SVE_ACLE_FUNC(A1,A2_UNUSED) A1
-#else
-#define SVE_ACLE_FUNC(A1,A2) A1##A2
-#endif
-
-// LDR ZT0
-
-// CHECK-LABEL: @test_svldr_zt(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr 
[[BASE:%.*]])
-// CHECK-NEXT:ret void
-//
-// CPP-CHECK-LABEL: @_Z13test_svldr_ztPKv(
-// CPP-CHECK-NEXT:  entry:
-// CPP-CHECK-NEXT:tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr 
[[BASE:%.*]])
-// CPP-CHECK-NEXT:ret void
-//
-void test_svldr_zt(const void *base) __arm_streaming_compatible 
__arm_shared_za __arm_preserves_za {
-  svldr_zt(0, base);
-} ;
-
-
-// STR ZT0
-
-// CHECK-LABEL: @test_svstr_zt(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:tail call void @llvm.aarch64.sme.str.zt(i32 0, ptr 
[[BASE:%.*]])
-// CHECK-NEXT:ret void
-//
-// CPP-CHECK-LABEL: @_Z13test_svstr_ztPv(
-// CPP-CHECK-NEXT:  entry:
-// CPP-CHECK-NEXT:tail call void @llvm.aarch64.sme.str.zt(i32 0, ptr 
[[BASE:%.*]])
-// CPP-CHECK-NEXT:ret void
-//
-void test_svstr_zt(void *base) __arm_streaming_compatible __arm_shared_za 
__arm_preserves_za {
-  svstr_zt(0, base);
-}

diff  --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td 
b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index 9164604f7d78cbc..a42e2c49cb477ba 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -2679,10 +2679,10 @@ let TargetPrefix = "aarch64" in {
   def int_aarch64_sme_st1q_vert  : SME_Load_Store_Int

[clang] 5fe7ae8 - [AArch64][SME2] Add ldr_zt, str_zt builtins and intrinsics (#72849)

2023-12-01 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2023-12-01T09:34:38Z
New Revision: 5fe7ae848cc6cb2afc3aab332743ffa2bb635fc3

URL: 
https://github.com/llvm/llvm-project/commit/5fe7ae848cc6cb2afc3aab332743ffa2bb635fc3
DIFF: 
https://github.com/llvm/llvm-project/commit/5fe7ae848cc6cb2afc3aab332743ffa2bb635fc3.diff

LOG: [AArch64][SME2] Add ldr_zt, str_zt builtins and intrinsics (#72849)

Adds the builtins:
void svldr_zt(uint64_t zt, const void *rn)
void svstr_zt(uint64_t zt, void *rn)

And the intrinsics:
call void @llvm.aarch64.sme.ldr.zt(i32, ptr)
tail call void @llvm.aarch64.sme.str.zt(i32, ptr)

Patch by: Kerry McLaughlin kerry.mclaugh...@arm.com

Added: 
clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
llvm/test/CodeGen/AArch64/sme2-intrinsics-zt0.ll

Modified: 
clang/include/clang/Basic/arm_sme.td
clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp
llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td
llvm/lib/Target/AArch64/SMEInstrFormats.td

Removed: 




diff  --git a/clang/include/clang/Basic/arm_sme.td 
b/clang/include/clang/Basic/arm_sme.td
index d55deeaa40bbcd5..7aae3c832bb1fe2 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -314,3 +314,11 @@ let TargetGuard = "sme2" in {
 
   def SVBMOPS : Inst<"svbmops_za32[_{d}]_m", "viPPdd", "iUi", MergeNone, 
"aarch64_sme_bmops_za32", [IsSharedZA, IsStreaming], [ImmCheck<0, 
ImmCheck0_3>]>;
 }
+
+//
+// Spill and fill of ZT0
+//
+let TargetGuard = "sme2" in {
+  def SVLDR_ZT : Inst<"svldr_zt", "viQ", "", MergeNone, "aarch64_sme_ldr_zt", 
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA], 
[ImmCheck<0, ImmCheck0_0>]>;
+  def SVSTR_ZT : Inst<"svstr_zt", "vi%", "", MergeNone, "aarch64_sme_str_zt", 
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA], 
[ImmCheck<0, ImmCheck0_0>]>;
+}

diff  --git a/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c 
b/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
new file mode 100644
index 000..126a4fc1045853f
--- /dev/null
+++ b/clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_ldr_str_zt.c
@@ -0,0 +1,41 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+
+// REQUIRES: aarch64-registered-target
+
+// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sme2 -S 
-disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p 
mem2reg,instcombine,tailcallelim | FileCheck %s
+// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sme2 -S 
-disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -p 
mem2reg,instcombine,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
+// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sme2 -S 
-disable-O0-optnone -Werror -Wall -o /dev/null %s
+
+#include 
+
+// LDR ZT0
+
+// CHECK-LABEL: @test_svldr_zt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr 
[[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
+// CPP-CHECK-LABEL: @_Z13test_svldr_ztPKv(
+// CPP-CHECK-NEXT:  entry:
+// CPP-CHECK-NEXT:tail call void @llvm.aarch64.sme.ldr.zt(i32 0, ptr 
[[BASE:%.*]])
+// CPP-CHECK-NEXT:ret void
+//
+void test_svldr_zt(const void *base) __arm_streaming_compatible 
__arm_shared_za __arm_preserves_za {
+  svldr_zt(0, base);
+}
+
+// STR ZT0
+
+// CHECK-LABEL: @test_svstr_zt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:tail call void @llvm.aarch64.sme.str.zt(i32 0, ptr 
[[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
+// CPP-CHECK-LABEL: @_Z13test_svstr_ztPv(
+// CPP-CHECK-NEXT:  entry:
+// CPP-CHECK-NEXT:tail call void @llvm.aarch64.sme.str.zt(i32 0, ptr 
[[BASE:%.*]])
+// CPP-CHECK-NEXT:ret void
+//
+void test_svstr_zt(void *base) __arm_streaming_compatible __arm_shared_za 
__arm_preserves_za {
+  svstr_zt(0, base);
+}

diff  --git a/clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp 
b/clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp
index 4c35a238d9f9e2c..70987ad395f735a 100644
--- a/clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp
+++ b/clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu \
-// RUN:-target-feature +sve2 -target-feature +sme2 -target-feature +sve 
-fsyntax-only -verify %s
+// RUN:-target-feature +sve2 -target-feature +sme2 -target-feature 
+sme-i16i64 -target-feature +sme-f64f64 -fsyntax-only -verify %s
 
 // REQUIRES: aarch64-registered-target
 
@@ -19,3 +19,8 @@ void test_outer_product(svbool_t pred, svint16_t s16, 
svuint16_t u16, svint32_t
   svbmops_za32_u32_m(4, pred, pred, u32, u32); // expected-error {{argument

[clang] 6c5da88 - [AArch64][SVE][Clang] Fix crash for incorrect svptrue and svcnt parameters

2022-03-11 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2022-03-11T11:19:53Z
New Revision: 6c5da880e03cafc49008612eb687910f3f805057

URL: 
https://github.com/llvm/llvm-project/commit/6c5da880e03cafc49008612eb687910f3f805057
DIFF: 
https://github.com/llvm/llvm-project/commit/6c5da880e03cafc49008612eb687910f3f805057.diff

LOG: [AArch64][SVE][Clang] Fix crash for incorrect svptrue and svcnt parameters

Giving an int parameter to SVE intrinsics svptrue and svcnt caused Clang
to crash on compilation. Changing their parameter types to void instead of
omitting args results in a diagnostic error message instead.

Differential Revision: https://reviews.llvm.org/D121294

Added: 
clang/test/CodeGen/aarch64-sve-intrinsics/negative/acle_sve_svcnt.c
clang/test/CodeGen/aarch64-sve-intrinsics/negative/acle_sve_svptrue.c

Modified: 
clang/include/clang/Basic/arm_sve.td

Removed: 




diff  --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index 5e9d1c96558b9..220b830c368fe 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -1263,10 +1263,10 @@ def SVZIP2_B  : SInst<"svzip2_{d}", "PPP",  
"PcPsPiPl", MergeNone, "aarch64_
 

 // Predicate creation
 
-def SVPFALSE : SInst<"svpfalse[_b]", "P", "", MergeNone, "", [IsOverloadNone]>;
+def SVPFALSE : SInst<"svpfalse[_b]", "Pv", "", MergeNone, "", 
[IsOverloadNone]>;
 
 def SVPTRUE_PAT : SInst<"svptrue_pat_{d}", "PI", "PcPsPiPl", MergeNone, 
"aarch64_sve_ptrue">;
-def SVPTRUE : SInst<"svptrue_{d}", "P",  "PcPsPiPl", MergeNone, 
"aarch64_sve_ptrue", [IsAppendSVALL]>;
+def SVPTRUE : SInst<"svptrue_{d}", "Pv",  "PcPsPiPl", MergeNone, 
"aarch64_sve_ptrue", [IsAppendSVALL]>;
 
 def SVDUPQ_B8  : SInst<"svdupq[_n]_{d}",  "P",  "Pc", 
MergeNone>;
 def SVDUPQ_B16 : SInst<"svdupq[_n]_{d}", "P",  "Ps", MergeNone>;
@@ -1309,9 +1309,9 @@ def SVPTEST_LAST  : SInst<"svptest_last",  "sPP", "Pc", 
MergeNone, "aarch64_sve_
 

 // FFR manipulation
 
-def SVRDFFR   : SInst<"svrdffr",   "P",  "Pc", MergeNone, "", 
[IsOverloadNone]>;
+def SVRDFFR   : SInst<"svrdffr",   "Pv",  "Pc", MergeNone, "", 
[IsOverloadNone]>;
 def SVRDFFR_Z : SInst<"svrdffr_z", "PP", "Pc", MergeNone, "", 
[IsOverloadNone]>;
-def SVSETFFR  : SInst<"svsetffr",  "v",  "",   MergeNone, "", 
[IsOverloadNone]>;
+def SVSETFFR  : SInst<"svsetffr",  "vv",  "",   MergeNone, "", 
[IsOverloadNone]>;
 def SVWRFFR   : SInst<"svwrffr",   "vP", "Pc", MergeNone, "", 
[IsOverloadNone]>;
 
 

@@ -1322,10 +1322,10 @@ def SVCNTH_PAT : SInst<"svcnth_pat", "nI", "", 
MergeNone, "aarch64_sve_cnth", [I
 def SVCNTW_PAT : SInst<"svcntw_pat", "nI", "", MergeNone, "aarch64_sve_cntw", 
[IsOverloadNone]>;
 def SVCNTD_PAT : SInst<"svcntd_pat", "nI", "", MergeNone, "aarch64_sve_cntd", 
[IsOverloadNone]>;
 
-def SVCNTB : SInst<"svcntb", "n", "", MergeNone, "aarch64_sve_cntb", 
[IsAppendSVALL, IsOverloadNone]>;
-def SVCNTH : SInst<"svcnth", "n", "", MergeNone, "aarch64_sve_cnth", 
[IsAppendSVALL, IsOverloadNone]>;
-def SVCNTW : SInst<"svcntw", "n", "", MergeNone, "aarch64_sve_cntw", 
[IsAppendSVALL, IsOverloadNone]>;
-def SVCNTD : SInst<"svcntd", "n", "", MergeNone, "aarch64_sve_cntd", 
[IsAppendSVALL, IsOverloadNone]>;
+def SVCNTB : SInst<"svcntb", "nv", "", MergeNone, "aarch64_sve_cntb", 
[IsAppendSVALL, IsOverloadNone]>;
+def SVCNTH : SInst<"svcnth", "nv", "", MergeNone, "aarch64_sve_cnth", 
[IsAppendSVALL, IsOverloadNone]>;
+def SVCNTW : SInst<"svcntw", "nv", "", MergeNone, "aarch64_sve_cntw", 
[IsAppendSVALL, IsOverloadNone]>;
+def SVCNTD : SInst<"svcntd", "nv", "", MergeNone, "aarch64_sve_cntd", 
[IsAppendSVALL, IsOverloadNone]>;
 
 def SVCNTP : SInst<"svcntp_{d}",  "nPP", "PcPsPiPl",MergeNone, 
"aarch64_sve_cntp">;
 def SVLEN  : SInst<"svlen[_{d}]", "nd",  "csilUcUsUiUlhfd", MergeNone>;
@@ -1435,20 +1435,20 @@ def SVZIP2Q_BF16  : SInst<"svzip2q[_{d}]", 
"ddd",  "b", MergeNone, "aarc
 
 

 // Vector creation
-def SVUNDEF_1 : SInst<"svundef_{d}",  "d", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
-def SVUNDEF_2 : SInst<"svundef2_{d}", "2", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
-def SVUNDEF_3 : SInst<"svundef3_{d}", "3", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
-def SVUNDEF_4 : SInst<"svundef4_{d}", "4", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
+def SVUNDEF_1 : SInst<"svundef_{d}",  "dv", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
+def SVUNDEF_2 : SInst<"svundef2_{d}", "2v", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUndef]>;
+def SVUNDEF_3 : SInst<"svundef3_{d}", "3v", "csilUcUsUiUlhfd", MergeNone, "", 
[IsUnde

[clang] 75bb815 - [AArch64][SVE] Add aarch64_sve_pcs attribute to Clang

2022-05-11 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2022-05-11T13:33:56Z
New Revision: 75bb815231f6967bd5f4e24143141b9fe69d01f8

URL: 
https://github.com/llvm/llvm-project/commit/75bb815231f6967bd5f4e24143141b9fe69d01f8
DIFF: 
https://github.com/llvm/llvm-project/commit/75bb815231f6967bd5f4e24143141b9fe69d01f8.diff

LOG: [AArch64][SVE] Add aarch64_sve_pcs attribute to Clang

Enable function attribute aarch64_sve_pcs at the C level, which correspondes to
aarch64_sve_vector_pcs at the LLVM IR level.

This requirement was created by this addition to the ARM C Language Extension:
https://github.com/ARM-software/acle/pull/194

Differential Revision: https://reviews.llvm.org/D124998

Added: 
clang/test/CodeGen/aarch64-svepcs.c
clang/test/Sema/aarch64-svepcs.c

Modified: 
clang/include/clang-c/Index.h
clang/include/clang/Basic/Attr.td
clang/include/clang/Basic/AttrDocs.td
clang/include/clang/Basic/Specifiers.h
clang/lib/AST/ItaniumMangle.cpp
clang/lib/AST/Type.cpp
clang/lib/AST/TypePrinter.cpp
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/CodeGen/CGCall.cpp
clang/lib/CodeGen/CGDebugInfo.cpp
clang/lib/Sema/SemaDeclAttr.cpp
clang/lib/Sema/SemaType.cpp
clang/test/Sema/callingconv.c
clang/tools/libclang/CXType.cpp

Removed: 




diff  --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index f28601c37d8ef..c4da7df6595d1 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -3445,6 +3445,7 @@ enum CXCallingConv {
   CXCallingConv_PreserveAll = 15,
   CXCallingConv_AArch64VectorCall = 16,
   CXCallingConv_SwiftAsync = 17,
+  CXCallingConv_AArch64SVEPCS = 18,
 
   CXCallingConv_Invalid = 100,
   CXCallingConv_Unexposed = 200

diff  --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 39359f414ae78..3c41edb474e89 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -2313,6 +2313,11 @@ def AArch64VectorPcs: DeclOrTypeAttr {
   let Documentation = [AArch64VectorPcsDocs];
 }
 
+def AArch64SVEPcs: DeclOrTypeAttr {
+  let Spellings = [Clang<"aarch64_sve_pcs">];
+  let Documentation = [AArch64SVEPcsDocs];
+}
+
 def Pure : InheritableAttr {
   let Spellings = [GCC<"pure">];
   let Documentation = [Undocumented];

diff  --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index c7ef52f67afa3..b389ff9c02c45 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -2551,6 +2551,32 @@ the Arm Developer website.
   }];
 }
 
+def AArch64SVEPcsDocs : Documentation {
+  let Category = DocCatCallingConvs;
+  let Content = [{
+On AArch64 targets, this attribute changes the calling convention of a
+function to preserve additional Scalable Vector registers and Scalable
+Predicate registers relative to the default calling convention used for
+AArch64.
+
+This means it is more efficient to call such functions from code that performs
+extensive scalable vector and scalable predicate calculations, because fewer
+live SVE registers need to be saved. This property makes it well-suited for SVE
+math library functions, which are typically leaf functions that require a small
+number of registers.
+
+However, using this attribute also means that it is more expensive to call
+a function that adheres to the default calling convention from within such
+a function. Therefore, it is recommended that this attribute is only used
+for leaf functions.
+
+For more information, see the documentation for `aarch64_sve_pcs` in the
+ARM C Language Extension (ACLE) documentation.
+
+.. _`aarch64_sve_pcs`: 
https://github.com/ARM-software/acle/blob/main/main/acle.md#scalable-vector-extension-procedure-call-standard-attribute
+  }];
+}
+
 def RegparmDocs : Documentation {
   let Category = DocCatCallingConvs;
   let Content = [{

diff  --git a/clang/include/clang/Basic/Specifiers.h 
b/clang/include/clang/Basic/Specifiers.h
index 52ca7cce9d961..7a727e7088deb 100644
--- a/clang/include/clang/Basic/Specifiers.h
+++ b/clang/include/clang/Basic/Specifiers.h
@@ -280,6 +280,7 @@ namespace clang {
 CC_PreserveMost, // __attribute__((preserve_most))
 CC_PreserveAll,  // __attribute__((preserve_all))
 CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs))
+CC_AArch64SVEPCS, // __attribute__((aarch64_sve_pcs))
   };
 
   /// Checks whether the given calling convention supports variadic

diff  --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 8d90575385fc4..1be70487c1b4e 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3149,6 +3149,7 @@ StringRef 
CXXNameMangler::getCallingConvQualifierName(CallingConv CC) {
   case CC_AAPCS:
   case CC_AAPCS_VFP:
   case CC_AArch64VectorCall:
+  case CC_AArch64SVEPCS:
   case CC_IntelOclBicc:
   case CC_SpirFunction:
   case CC_OpenCLKernel:

diff

[clang] 485c193 - Regenerate acle_st1*.c tests

2021-11-15 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2021-11-15T15:07:52Z
New Revision: 485c193aa12addea13a0db12f4c6bc6252244319

URL: 
https://github.com/llvm/llvm-project/commit/485c193aa12addea13a0db12f4c6bc6252244319
DIFF: 
https://github.com/llvm/llvm-project/commit/485c193aa12addea13a0db12f4c6bc6252244319.diff

LOG: Regenerate acle_st1*.c tests

Regenerate acle_st1*.c tests using update_cc_test_checks.py

Added: 


Modified: 
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1b.c
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1h.c
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1w.c

Removed: 




diff  --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1b.c 
b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1b.c
index 2ae45552b13b..957add02437c 100644
--- a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1b.c
+++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1b.c
@@ -12,294 +12,350 @@
 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
 #endif
 
+// CHECK-LABEL: @test_svst1b_s16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv8i1( [[PG:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = trunc  [[DATA:%.*]] to 

+// CHECK-NEXT:call void @llvm.aarch64.sve.st1.nxv8i8( 
[[TMP1]],  [[TMP0]], i8* [[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
 void test_svst1b_s16(svbool_t pg, int8_t *base, svint16_t data)
 {
-  // CHECK-LABEL: test_svst1b_s16
-  // CHECK-DAG: %[[PG:.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg)
-  // CHECK-DAG: %[[DATA:.*]] = trunc  %data to 
-  // CHECK: call void @llvm.aarch64.sve.st1.nxv8i8( 
%[[DATA]],  %[[PG]], i8* %base)
-  // CHECK: ret void
   return SVE_ACLE_FUNC(svst1b,_s16,,)(pg, base, data);
 }
 
+// CHECK-LABEL: @test_svst1b_s32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv4i1( [[PG:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = trunc  [[DATA:%.*]] to 

+// CHECK-NEXT:call void @llvm.aarch64.sve.st1.nxv4i8( 
[[TMP1]],  [[TMP0]], i8* [[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
 void test_svst1b_s32(svbool_t pg, int8_t *base, svint32_t data)
 {
-  // CHECK-LABEL: test_svst1b_s32
-  // CHECK-DAG: %[[PG:.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg)
-  // CHECK-DAG: %[[DATA:.*]] = trunc  %data to 
-  // CHECK: call void @llvm.aarch64.sve.st1.nxv4i8( 
%[[DATA]],  %[[PG]], i8* %base)
-  // CHECK: ret void
   return SVE_ACLE_FUNC(svst1b,_s32,,)(pg, base, data);
 }
 
+// CHECK-LABEL: @test_svst1b_s64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv2i1( [[PG:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = trunc  [[DATA:%.*]] to 

+// CHECK-NEXT:call void @llvm.aarch64.sve.st1.nxv2i8( 
[[TMP1]],  [[TMP0]], i8* [[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
 void test_svst1b_s64(svbool_t pg, int8_t *base, svint64_t data)
 {
-  // CHECK-LABEL: test_svst1b_s64
-  // CHECK-DAG: %[[PG:.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv2i1( %pg)
-  // CHECK-DAG: %[[DATA:.*]] = trunc  %data to 
-  // CHECK: call void @llvm.aarch64.sve.st1.nxv2i8( 
%[[DATA]],  %[[PG]], i8* %base)
-  // CHECK: ret void
   return SVE_ACLE_FUNC(svst1b,_s64,,)(pg, base, data);
 }
 
+// CHECK-LABEL: @test_svst1b_u16(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv8i1( [[PG:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = trunc  [[DATA:%.*]] to 

+// CHECK-NEXT:call void @llvm.aarch64.sve.st1.nxv8i8( 
[[TMP1]],  [[TMP0]], i8* [[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
 void test_svst1b_u16(svbool_t pg, uint8_t *base, svuint16_t data)
 {
-  // CHECK-LABEL: test_svst1b_u16
-  // CHECK-DAG: %[[PG:.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg)
-  // CHECK-DAG: %[[DATA:.*]] = trunc  %data to 
-  // CHECK: call void @llvm.aarch64.sve.st1.nxv8i8( 
%[[DATA]],  %[[PG]], i8* %base)
-  // CHECK: ret void
   return SVE_ACLE_FUNC(svst1b,_u16,,)(pg, base, data);
 }
 
+// CHECK-LABEL: @test_svst1b_u32(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv4i1( [[PG:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = trunc  [[DATA:%.*]] to 

+// CHECK-NEXT:call void @llvm.aarch64.sve.st1.nxv4i8( 
[[TMP1]],  [[TMP0]], i8* [[BASE:%.*]])
+// CHECK-NEXT:ret void
+//
 void test_svst1b_u32(svbool_t pg, uint8_t *base, svuint32_t data)
 {
-  // CHECK-LABEL: test_svst1b_u32
-  // CHECK-DAG: %[[PG:.*]] = call  
@llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg)
-  // CHECK-DAG: %[[DATA:.*]] = trunc  %data to 
-  // CHECK: call void @llvm.aarch64.sve.st1.nxv4i8( 
%[[DATA]],  %[[PG]], i8* %base)
-  // CHECK: ret void
   return SVE_ACLE_FUNC(svst1b,_u32,,)(pg, base, data);
 }
 
+// CHECK-LABEL: @test_svst1b_u64(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = call  
@llvm.aarch64.sve.convert

[clang] 83727f2 - [AArch64][SVE] Remove arm-registered-target requirement on bfloat tests

2021-11-16 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2021-11-16T14:38:21Z
New Revision: 83727f27719d3f319f746b473ce09be7e1d99b32

URL: 
https://github.com/llvm/llvm-project/commit/83727f27719d3f319f746b473ce09be7e1d99b32
DIFF: 
https://github.com/llvm/llvm-project/commit/83727f27719d3f319f746b473ce09be7e1d99b32.diff

LOG: [AArch64][SVE] Remove arm-registered-target requirement on bfloat tests

Changes in https://reviews.llvm.org/D113489 caused buildbot failures

Added: 


Modified: 
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_ld1-bfloat.c
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1-bfloat.c

Removed: 




diff  --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_ld1-bfloat.c 
b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_ld1-bfloat.c
index f2dc5c1d4d6d..38a959fc2917 100644
--- a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_ld1-bfloat.c
+++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_ld1-bfloat.c
@@ -5,7 +5,7 @@
 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu 
-target-feature +sve -target-feature +bf16 -fallow-half-arguments-and-returns 
-S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s 
-check-prefix=CPP-CHECK
 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve 
-fallow-half-arguments-and-returns -fsyntax-only -verify 
-verify-ignore-unexpected=error -verify-ignore-unexpected=note %s
 
-// REQUIRES: aarch64-registered-target || arm-registered-target
+// REQUIRES: aarch64-registered-target
 
 #include 
 

diff  --git a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1-bfloat.c 
b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1-bfloat.c
index a05da764de44..7a57a3ebf354 100644
--- a/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1-bfloat.c
+++ b/clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_st1-bfloat.c
@@ -5,7 +5,7 @@
 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu 
-target-feature +sve -target-feature +bf16 -fallow-half-arguments-and-returns 
-S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s 
-check-prefix=CPP-CHECK
 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve 
-fallow-half-arguments-and-returns -fsyntax-only -verify 
-verify-ignore-unexpected=error -verify-ignore-unexpected=note %s
 
-// REQUIRES: aarch64-registered-target || arm-registered-target
+// REQUIRES: aarch64-registered-target
 
 #include 
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] c52d950 - [AArch64][SVE] Add asm predicate constraint Uph

2023-08-11 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2023-08-11T14:48:19Z
New Revision: c52d9509d40d3048914b144618232213e6076e05

URL: 
https://github.com/llvm/llvm-project/commit/c52d9509d40d3048914b144618232213e6076e05
DIFF: 
https://github.com/llvm/llvm-project/commit/c52d9509d40d3048914b144618232213e6076e05.diff

LOG: [AArch64][SVE] Add asm predicate constraint Uph

Some instructions such as multi-vector LD1 only accept a range
of PN8-PN15 predicate-as-counter. This new constraint allows more
refined parsing and better decision making when parsing these
instructions from ASM, instead of defaulting to Upa which incorrectly
uses the whole range of registers P0-P15 from the register class PPR.

Differential Revision: https://reviews.llvm.org/D157517

Added: 


Modified: 
clang/lib/Basic/Targets/AArch64.cpp
clang/test/CodeGen/aarch64-sve-inline-asm-datatypes.c
llvm/docs/LangRef.rst
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/test/CodeGen/AArch64/aarch64-sve-asm.ll

Removed: 




diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 7c4cc5fb33f886..6c43c8b592622d 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1288,8 +1288,9 @@ bool AArch64TargetInfo::validateAsmConstraint(
 Info.setAllowsRegister();
 return true;
   case 'U':
-if (Name[1] == 'p' && (Name[2] == 'l' || Name[2] == 'a')) {
-  // SVE predicate registers ("Upa"=P0-15, "Upl"=P0-P7)
+if (Name[1] == 'p' &&
+(Name[2] == 'l' || Name[2] == 'a' || Name[2] == 'h')) {
+  // SVE predicate registers ("Upa"=P0-15, "Upl"=P0-P7, "Uph"=P8-P15)
   Info.setAllowsRegister();
   Name += 2;
   return true;

diff  --git a/clang/test/CodeGen/aarch64-sve-inline-asm-datatypes.c 
b/clang/test/CodeGen/aarch64-sve-inline-asm-datatypes.c
index 5c1e931a727124..14a29dfac2c7bd 100644
--- a/clang/test/CodeGen/aarch64-sve-inline-asm-datatypes.c
+++ b/clang/test/CodeGen/aarch64-sve-inline-asm-datatypes.c
@@ -168,6 +168,30 @@ SVBOOL_TEST_UPL(__SVInt32_t, s) ;
 SVBOOL_TEST_UPL(__SVInt64_t, d) ;
 // CHECK: call  asm sideeffect "fadd $0.d, $1.d, $2.d, 
$3.d\0A", "=w,@3Upl,w,w"( %in1,  %in2, 
 %in3)
 
+#define SVBOOL_TEST_UPH(DT, KIND)\
+__SVBool_t func_bool_uph_##KIND(__SVBool_t in1, DT in2, DT in3)\
+{\
+  __SVBool_t out;\
+  asm volatile (\
+"fadd %[out]." #KIND ", %[in1]." #KIND ", %[in2]." #KIND ", %[in3]." #KIND 
"\n"\
+: [out] "=w" (out)\
+:  [in1] "Uph" (in1),\
+  [in2] "w" (in2),\
+  [in3] "w" (in3)\
+:);\
+  return out;\
+}
+
+SVBOOL_TEST_UPH(__SVInt8_t, b) ;
+// CHECK: call  asm sideeffect "fadd $0.b, $1.b, $2.b, 
$3.b\0A", "=w,@3Uph,w,w"( %in1,  %in2, 
 %in3)
+SVBOOL_TEST_UPH(__SVInt16_t, h) ;
+// CHECK: call  asm sideeffect "fadd $0.h, $1.h, $2.h, 
$3.h\0A", "=w,@3Uph,w,w"( %in1,  %in2, 
 %in3)
+SVBOOL_TEST_UPH(__SVInt32_t, s) ;
+// CHECK: call  asm sideeffect "fadd $0.s, $1.s, $2.s, 
$3.s\0A", "=w,@3Uph,w,w"( %in1,  %in2, 
 %in3)
+SVBOOL_TEST_UPH(__SVInt64_t, d) ;
+// CHECK: call  asm sideeffect "fadd $0.d, $1.d, $2.d, 
$3.d\0A", "=w,@3Uph,w,w"( %in1,  %in2, 
 %in3)
+
+
 #define SVFLOAT_TEST(DT,KIND)\
 DT func_float_##DT##KIND(DT inout1, DT in2)\
 {\

diff  --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index f024d009966a8d..f7f5cc193a149c 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -4997,7 +4997,8 @@ AArch64:
 - ``w``: A 32, 64, or 128-bit floating-point, SIMD or SVE vector register.
 - ``x``: Like w, but restricted to registers 0 to 15 inclusive.
 - ``y``: Like w, but restricted to SVE vector registers Z0 to Z7 inclusive.
-- ``Upl``: One of the low eight SVE predicate registers (P0 to P7)
+- ``Uph``: One of the upper eight SVE predicate registers (P8 to P15)
+- ``Upl``: One of the lower eight SVE predicate registers (P0 to P7)
 - ``Upa``: Any of the SVE predicate registers (P0 to P15)
 
 AMDGPU:

diff  --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp 
b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 948419f29b48e9..d0f4789d198058 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -9987,19 +9987,31 @@ const char *AArch64TargetLowering::LowerXConstraint(EVT 
ConstraintVT) const {
   return "r";
 }
 
-enum PredicateConstraint {
-  Upl,
-  Upa,
-  Invalid
-};
+enum PredicateConstraint { Uph, Upl, Upa, Invalid };
 
 static PredicateConstraint parsePredicateConstraint(StringRef Constraint) {
-  PredicateConstraint P = PredicateConstraint::Invalid;
-  if (Constraint == "Upa")
-P = PredicateConstraint::Upa;
-  if (Constraint == "Upl")
-P = PredicateConstraint::Upl;
-  return P;
+  return StringSwitch(Constraint)
+  .Case("Uph", PredicateConstraint::Uph)
+  .Case("Upl", PredicateConstraint::Upl)
+  .Case("Upa", PredicateConstraint::Upa)
+  .Default(PredicateConstraint::Invalid);
+}
+
+static const Tar

[clang] 533997b - Fix DISABLE-NOT: cc1 check in debug-info-codeview-buildinfo.c test

2023-03-07 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2023-03-07T13:22:18Z
New Revision: 533997b026bab9994209d07ab6297d1482289f2d

URL: 
https://github.com/llvm/llvm-project/commit/533997b026bab9994209d07ab6297d1482289f2d
DIFF: 
https://github.com/llvm/llvm-project/commit/533997b026bab9994209d07ab6297d1482289f2d.diff

LOG: Fix DISABLE-NOT: cc1 check in debug-info-codeview-buildinfo.c test

This check is checking for the cc1 flag but this test has been seen to fail
when FILEPATHVAL has contained cc1 in generated SHAs

Added: 


Modified: 
clang/test/CodeGen/debug-info-codeview-buildinfo.c

Removed: 




diff  --git a/clang/test/CodeGen/debug-info-codeview-buildinfo.c 
b/clang/test/CodeGen/debug-info-codeview-buildinfo.c
index 4096fac5f7437..4fc55af10a6e2 100644
--- a/clang/test/CodeGen/debug-info-codeview-buildinfo.c
+++ b/clang/test/CodeGen/debug-info-codeview-buildinfo.c
@@ -33,7 +33,7 @@ int main(void) { return 42; }
 // RELATIVE: 0x{{.+}} | LF_BUILDINFO [size = {{.+}}]
 // RELATIVE:  0x{{.+}}: `.`
 
-// DISABLE-NOT: cc1
+// DISABLE-NOT: "-cc1"
 // DISABLE: 0x{{.+}} | LF_BUILDINFO [size = {{.+}}]
 // DISABLE-NEXT:  0x{{.+}}: `{{.*}}`
 // DISABLE-NEXT:  : ``



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] a1fae98 - [AArch64] Add svboolx2_t and svboolx4_t tuple types

2023-03-14 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2023-03-14T10:16:51Z
New Revision: a1fae98ba95c18ea6b673fc3c177b917e0f5aa56

URL: 
https://github.com/llvm/llvm-project/commit/a1fae98ba95c18ea6b673fc3c177b917e0f5aa56
DIFF: 
https://github.com/llvm/llvm-project/commit/a1fae98ba95c18ea6b673fc3c177b917e0f5aa56.diff

LOG: [AArch64] Add svboolx2_t and svboolx4_t tuple types

https://reviews.llvm.org/D145505

Added: 
clang/test/CodeGen/svboolx2_t.cpp
clang/test/CodeGen/svboolx4_t.cpp

Modified: 
clang/include/clang/Basic/AArch64SVEACLETypes.def
clang/lib/AST/ASTContext.cpp
clang/lib/AST/Type.cpp
clang/lib/CodeGen/CodeGenTypes.cpp
clang/test/CodeGenCXX/aarch64-mangle-sve-vectors.cpp
clang/utils/TableGen/SveEmitter.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/AArch64SVEACLETypes.def 
b/clang/include/clang/Basic/AArch64SVEACLETypes.def
index cb2f673af06d5..56af270e1d10a 100644
--- a/clang/include/clang/Basic/AArch64SVEACLETypes.def
+++ b/clang/include/clang/Basic/AArch64SVEACLETypes.def
@@ -129,6 +129,8 @@ SVE_VECTOR_TYPE("__clang_svfloat64x4_t", "svfloat64x4_t", 
SveFloat64x4, SveFloat
 SVE_VECTOR_TYPE("__clang_svbfloat16x4_t", "svbfloat16x4_t", SveBFloat16x4, 
SveBFloat16x4Ty, 32, 16, true, false, true)
 
 SVE_PREDICATE_TYPE("__SVBool_t", "__SVBool_t", SveBool, SveBoolTy, 16)
+SVE_PREDICATE_TYPE("__clang_svboolx2_t", "svboolx2_t", SveBoolx2, SveBoolx2Ty, 
32)
+SVE_PREDICATE_TYPE("__clang_svboolx4_t", "svboolx4_t", SveBoolx4, SveBoolx4Ty, 
64)
 
 SVE_OPAQUE_TYPE("__SVCount_t", "__SVCount_t", SveCount, SveCountTy)
 

diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 90448c378458b..14c9ab9c31a88 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -4041,6 +4041,10 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType 
*Ty) const {
 return SVE_INT_ELTTY(64, 2, false, 4);
   case BuiltinType::SveBool:
 return SVE_ELTTY(BoolTy, 16, 1);
+  case BuiltinType::SveBoolx2:
+return SVE_ELTTY(BoolTy, 16, 2);
+  case BuiltinType::SveBoolx4:
+return SVE_ELTTY(BoolTy, 16, 4);
   case BuiltinType::SveFloat16:
 return SVE_ELTTY(HalfTy, 8, 1);
   case BuiltinType::SveFloat16x2:

diff  --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 7710adbb274ae..96e611968ca18 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -2401,6 +2401,8 @@ bool Type::isVLSTBuiltinType() const {
 case BuiltinType::SveFloat64:
 case BuiltinType::SveBFloat16:
 case BuiltinType::SveBool:
+case BuiltinType::SveBoolx2:
+case BuiltinType::SveBoolx4:
   return true;
 default:
   return false;

diff  --git a/clang/lib/CodeGen/CodeGenTypes.cpp 
b/clang/lib/CodeGen/CodeGenTypes.cpp
index c31a3f0edf6d5..be9516925da25 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -596,6 +596,8 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
 case BuiltinType::SveInt64x4:
 case BuiltinType::SveUint64x4:
 case BuiltinType::SveBool:
+case BuiltinType::SveBoolx2:
+case BuiltinType::SveBoolx4:
 case BuiltinType::SveFloat16:
 case BuiltinType::SveFloat16x2:
 case BuiltinType::SveFloat16x3:

diff  --git a/clang/test/CodeGen/svboolx2_t.cpp 
b/clang/test/CodeGen/svboolx2_t.cpp
new file mode 100644
index 0..060940d8755f5
--- /dev/null
+++ b/clang/test/CodeGen/svboolx2_t.cpp
@@ -0,0 +1,31 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve 
-target-feature +bf16 -S -emit-llvm -o - %s | FileCheck %s
+
+// CHECK-LABEL: @_Z3foo10svboolx2_t(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ARG_ADDR:%.*]] = alloca , align 2
+// CHECK-NEXT:store  [[ARG:%.*]], ptr [[ARG_ADDR]], 
align 2
+// CHECK-NEXT:[[TMP0:%.*]] = load , ptr [[ARG_ADDR]], 
align 2
+// CHECK-NEXT:ret  [[TMP0]]
+//
+__clang_svboolx2_t foo(__clang_svboolx2_t arg) { return arg; }
+
+__clang_svboolx2_t bar();
+// CHECK-LABEL: @_Z4foo2v(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[CALL:%.*]] = call  @_Z3barv()
+// CHECK-NEXT:ret  [[CALL]]
+//
+__clang_svboolx2_t foo2() { return bar(); }
+
+__clang_svboolx2_t bar2(__clang_svboolx2_t);
+// CHECK-LABEL: @_Z4foo310svboolx2_t(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[ARG_ADDR:%.*]] = alloca , align 2
+// CHECK-NEXT:store  [[ARG:%.*]], ptr [[ARG_ADDR]], 
align 2
+// CHECK-NEXT:[[TMP0:%.*]] = load , ptr [[ARG_ADDR]], 
align 2
+// CHECK-NEXT:[[CALL:%.*]] = call  
@_Z4bar210svboolx2_t( [[TMP0]])
+// CHECK-NEXT:ret  [[CALL]]
+//
+__clang_svboolx2_t foo3(__clang_svboolx2_t arg) { return bar2(arg); }
+

diff  --git a/clang/test/CodeGen/svboolx4_t.cpp 
b/clang/test/CodeGen/svboolx4_t.cpp
new file mode 100644
index 0..8360786c06d70
--- /dev/null
+++ b/clang/test/CodeGen/svboolx4_t.cpp
@@ -0,0 +1,31 @@
+// NOTE: Assertio

[clang] 41def32 - [AArch64][SVE][NEON] Add NEON-SVE-Bridge intrinsics

2021-12-13 Thread Matt Devereau via cfe-commits

Author: Matt Devereau
Date: 2021-12-13T11:31:57Z
New Revision: 41def32040787e917b52279cc30231b27f2f02f7

URL: 
https://github.com/llvm/llvm-project/commit/41def32040787e917b52279cc30231b27f2f02f7
DIFF: 
https://github.com/llvm/llvm-project/commit/41def32040787e917b52279cc30231b27f2f02f7.diff

LOG: [AArch64][SVE][NEON] Add NEON-SVE-Bridge intrinsics

Adds svset_neonq, svget_neonq, svdup_neonq AArch64 intrinsics.

These are described in the ACLE specification:
https://github.com/ARM-software/acle/pull/72

https://reviews.llvm.org/D114713

Added: 
clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def
clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def
clang/lib/Headers/arm_neon_sve_bridge.h

clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_dup_neonq.c

clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_get_neonq.c

clang/test/CodeGen/aarch64_neon_sve_bridge_intrinsics/acle_neon_sve_bridge_set_neonq.c

Modified: 
clang/include/clang/Basic/BuiltinsSVE.def
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/CodeGen/CGBuiltin.cpp
clang/lib/Headers/CMakeLists.txt
llvm/utils/gn/secondary/clang/lib/Headers/BUILD.gn

Removed: 




diff  --git a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def 
b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def
new file mode 100644
index 0..8e3229984d8b7
--- /dev/null
+++ b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge.def
@@ -0,0 +1,39 @@
+#ifdef GET_SVE_BUILTINS
+BUILTIN(__builtin_sve_svget_neonq_s8, "V16Scq16Sc", "n")
+BUILTIN(__builtin_sve_svget_neonq_s16, "V8sq8s", "n")
+BUILTIN(__builtin_sve_svget_neonq_s32, "V4iq4i", "n")
+BUILTIN(__builtin_sve_svget_neonq_s64, "V2Wiq2Wi", "n")
+BUILTIN(__builtin_sve_svget_neonq_u8, "V16Ucq16Uc", "n")
+BUILTIN(__builtin_sve_svget_neonq_u16, "V16Usq16Us", "n")
+BUILTIN(__builtin_sve_svget_neonq_u32, "V4Uiq4Ui", "n")
+BUILTIN(__builtin_sve_svget_neonq_u64, "V2UWiq2UWi", "n")
+BUILTIN(__builtin_sve_svget_neonq_f16, "V8hq8h", "n")
+BUILTIN(__builtin_sve_svget_neonq_f32, "V4fq4f", "n")
+BUILTIN(__builtin_sve_svget_neonq_f64, "V2dq2d", "n")
+BUILTIN(__builtin_sve_svget_neonq_bf16, "V8yq8y", "n")
+BUILTIN(__builtin_sve_svset_neonq_s8, "q16Scq16ScV16Sc", "n")
+BUILTIN(__builtin_sve_svset_neonq_s16, "q8sq8sV8s", "n")
+BUILTIN(__builtin_sve_svset_neonq_s32, "q4iq4iV4i", "n")
+BUILTIN(__builtin_sve_svset_neonq_s64, "q2Wiq2WiV2Wi", "n")
+BUILTIN(__builtin_sve_svset_neonq_u8, "q16Ucq16UcV16Uc", "n")
+BUILTIN(__builtin_sve_svset_neonq_u16, "q8Usq8UsV8s", "n")
+BUILTIN(__builtin_sve_svset_neonq_u32, "q4Uiq4UiV4Ui", "n")
+BUILTIN(__builtin_sve_svset_neonq_u64, "q2UWiq2UWiV2UWi", "n")
+BUILTIN(__builtin_sve_svset_neonq_f16, "q8hq8hV8h", "n")
+BUILTIN(__builtin_sve_svset_neonq_f32, "q4fq4fV4f", "n")
+BUILTIN(__builtin_sve_svset_neonq_f64, "q2dq2dV2d", "n")
+BUILTIN(__builtin_sve_svset_neonq_bf16, "q8yq8yV8y", "n")
+BUILTIN(__builtin_sve_svdup_neonq_s8, "q16ScV16Sc", "n")
+BUILTIN(__builtin_sve_svdup_neonq_s16, "q8sV8s", "n")
+BUILTIN(__builtin_sve_svdup_neonq_s32, "q4iV4i", "n")
+BUILTIN(__builtin_sve_svdup_neonq_s64, "q4iV4i", "n")
+BUILTIN(__builtin_sve_svdup_neonq_u8, "q16UcV16Uc", "n")
+BUILTIN(__builtin_sve_svdup_neonq_u16, "q8UsV8Us", "n")
+BUILTIN(__builtin_sve_svdup_neonq_u32, "q4UiV4Ui", "n")
+BUILTIN(__builtin_sve_svdup_neonq_u64, "q2UWiV2UWi", "n")
+BUILTIN(__builtin_sve_svdup_neonq_f16, "q8hV8h", "n")
+BUILTIN(__builtin_sve_svdup_neonq_f32, "q4fV4f", "n")
+BUILTIN(__builtin_sve_svdup_neonq_f64, "q2dV2d", "n")
+BUILTIN(__builtin_sve_svdup_neonq_bf16, "q8yV8y", "n")
+#endif
+

diff  --git a/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def 
b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def
new file mode 100644
index 0..7717ba67b4279
--- /dev/null
+++ b/clang/include/clang/Basic/BuiltinsAArch64NeonSVEBridge_cg.def
@@ -0,0 +1,39 @@
+#ifdef GET_SVE_LLVM_INTRINSIC_MAP
+SVEMAP2(svget_neonq_s8, SVETypeFlags::EltTyInt8),
+SVEMAP2(svget_neonq_s16, SVETypeFlags::EltTyInt16),
+SVEMAP2(svget_neonq_s32, SVETypeFlags::EltTyInt32),
+SVEMAP2(svget_neonq_s64, SVETypeFlags::EltTyInt64),
+SVEMAP2(svget_neonq_u8, SVETypeFlags::EltTyInt8),
+SVEMAP2(svget_neonq_u16, SVETypeFlags::EltTyInt16),
+SVEMAP2(svget_neonq_u32, SVETypeFlags::EltTyInt32),
+SVEMAP2(svget_neonq_u64, SVETypeFlags::EltTyInt64),
+SVEMAP2(svget_neonq_f16, SVETypeFlags::EltTyFloat16),
+SVEMAP2(svget_neonq_f32, SVETypeFlags::EltTyFloat32),
+SVEMAP2(svget_neonq_f64, SVETypeFlags::EltTyFloat64),
+SVEMAP2(svget_neonq_bf16, SVETypeFlags::EltTyBFloat16),
+SVEMAP2(svset_neonq_s8, SVETypeFlags::EltTyInt8),
+SVEMAP2(svset_neonq_s16, SVETypeFlags::EltTyInt16),
+SVEMAP2(svset_neonq_s32, SVETypeFlags::EltTyInt32),
+SVEMAP2(svset_neonq_s64, SVETypeFlags::EltTyInt64),
+SVEMAP2(svset_neonq_u8, SVETypeFlags::EltTyInt8),
+SVEMAP2(svset_neonq_u16, SVETypeFlags::E