[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-03 Thread via cfe-commits

https://github.com/SpencerAbson closed 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;

SpencerAbson wrote:

Wouldn't this restriction only be valid for `q`? We could have any modifier 
(`P`/`Q`/`U`) before `c`,`s`,`i`, and `l` - unless the intent is to check that 
the current type (if it is not `Invalid`) was set by a modifer?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread Sander de Smalen via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;

sdesmalen-arm wrote:

Sorry, for a second I must have forgotten that `Q` and `P` are also valid with 
`[csil]`. I think that even for `q`, `P` and `Q` should be valid modifiers. So 
just ignore this suggestion!

That said, `f`, `h`, `d` and `b` should require `Kind == Invalid`, as the 
typespec modifiers don't apply to them, so an assert for those would be useful.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm approved this pull request.

Thanks, LGTM!

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits

SpencerAbson wrote:

Thank you @sdesmalen-arm 

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;

SpencerAbson wrote:

Sure.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 8;
   break;
 case 's':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 16;
   break;
 case 'i':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 32;
   break;
 case 'l':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 64;
   break;
 case 'q':
+  Kind = SInt;

SpencerAbson wrote:

Ah, good spot!

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread Sander de Smalen via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 8;
   break;
 case 's':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 16;
   break;
 case 'i':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 32;
   break;
 case 'l':
+  Kind = isInvalid() ? SInt : Kind;
   ElementBitwidth = 64;
   break;
 case 'q':
+  Kind = SInt;

sdesmalen-arm wrote:

Can this not be `uint128_t` for `Uq` ?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread Sander de Smalen via cfe-commits


@@ -570,27 +579,35 @@ void SVEType::applyTypespec(StringRef TS) {
   for (char I : TS) {
 switch (I) {
 case 'Q':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Svcount;
   break;
 case 'P':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = Predicate;
   break;
 case 'U':
+  assert(Kind == Invalid && "Invalid use of modifer!");
   Kind = UInt;
   break;
 case 'c':
+  Kind = isInvalid() ? SInt : Kind;

sdesmalen-arm wrote:

nit: can you also add something like: `assert((Kind == Invalid || Kind == UInt) 
&& "Unexpected modifier used for typespec")`  ?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From 850b7c0173f47a382093ff345d9bf35ee9e1643e Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/8] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td  |   28 +-
 ...#12752a66d88e6d5bc8de5376bca6898e3e71f901# | 1874 +
 clang/utils/TableGen/SveEmitter.cpp   |  369 ++--
 3 files changed, 2048 insertions(+), 223 deletions(-)
 create mode 100644 
clang/utils/TableGen/#12752a66d88e6d5bc8de5376bca6898e3e71f901#

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index b36e592042da0b..e551d6e46b8f33 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

SpencerAbson wrote:

Ah, I see :+1: 

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread Sander de Smalen via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

sdesmalen-arm wrote:

I was more thinking about having `Invalid` as default, and `assert`'ing that 
`Kind == Invalid` whilst parsing `P`, `U`, and `Q` as an extra check.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-12-02 Thread via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

SpencerAbson wrote:

> it would allow for adding checks that something like QUi is not a valid 
> typespec

Would that be by identifying some broken typespec strings (e.g, if we are 
trying to apply `U` and the type is currently `Predicate`) as `Invalid` whilst 
parsing them? 

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-29 Thread Sander de Smalen via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

sdesmalen-arm wrote:

Right, I see what you mean!

For "default to SInt if there is currently no type set", I guess you mean doing 
something like this?
```
case 'i':
  if (Kind == Invalid)
Kind = SInt;
  ElementBitwidth = 32;
  break;
```

While it's not that different from initialising `Kind` as `SInt`, it would 
allow for adding checks that something like `QUi` is not a valid typespec, 
something that currently goes undiagnosed.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-29 Thread via cfe-commits

https://github.com/SpencerAbson edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-29 Thread via cfe-commits

https://github.com/SpencerAbson edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-29 Thread via cfe-commits

https://github.com/SpencerAbson edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-29 Thread via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

SpencerAbson wrote:

I think this is a good idea, though it's a little tricky becuase the typespecs 
`'c'`, `'s'` ,`'i'` and`'l'` are often seen following a typespec modifier in 
arm_sve.td to change the element size (e.g, for predicates/SVCounts as you 
described before), and as typespecs in their own right (referring to the signed 
integer of their size, which is where the `Kind(SInt)` default comes from). One 
way to go about this is to make `'c'`, `'s'` ,`'i'` and`'l'` default to `SInt` 
if there is currently no type set, and leave the type unmodified if otherwise. 
Any thoughts?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm commented:

One minor comment, but otherwise looks good!

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread Sander de Smalen via cfe-commits


@@ -50,20 +50,30 @@ using TypeSpec = std::string;
 
 namespace {
 class SVEType {
-  bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat;
-  bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp,
-  Svcount;
+
+  enum TypeKind {
+Void,
+Float,
+SInt,
+UInt,
+BFloat16,
+MFloat8,
+Svcount,
+PrefetchOp,
+PredicatePattern,
+Predicate
+  };
+  TypeKind Kind;
+  bool Immediate, Constant, Pointer, DefaultType, IsScalable;
   unsigned Bitwidth, ElementBitwidth, NumVectors;
 
 public:
   SVEType() : SVEType("", 'v') {}
 
   SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1)
-  : Float(false), Signed(true), Immediate(false), Void(false),
-Constant(false), Pointer(false), BFloat(false), MFloat(false),
-DefaultType(false), IsScalable(true), Predicate(false),
-PredicatePattern(false), PrefetchOp(false), Svcount(false),
-Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) {
+  : Kind(SInt), Immediate(false), Constant(false), Pointer(false),

sdesmalen-arm wrote:

On `Kind(SInt)`, is there any code that depends on this default? Or could we 
make an `Invalid` enum value (defined above `Void`) , so that we can make sure 
that all `SVEType` objects are correct initialised when we use it for 
generating tables?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From eac5704250a454ede434d4967fb88902b689fce3 Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/7] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td |  28 +--
 clang/utils/TableGen/SveEmitter.cpp  | 356 ---
 2 files changed, 167 insertions(+), 217 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index d492fae4145b92..3e4eb55213c39e 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aar

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From eac5704250a454ede434d4967fb88902b689fce3 Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/6] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td |  28 +--
 clang/utils/TableGen/SveEmitter.cpp  | 356 ---
 2 files changed, 167 insertions(+), 217 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index d492fae4145b92..3e4eb55213c39e 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aar

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread via cfe-commits

https://github.com/SpencerAbson edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread Sander de Smalen via cfe-commits


@@ -431,133 +434,130 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string OutStr;
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
+return "v";
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoid()) {
-OutStr += "v";
-if (!isPointer())
-  return OutStr;
-  } else if (isFloat()) {
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
 case 16:
-  OutStr += "h";
-  break;
+  return "h";
 case 32:
-  OutStr += "f";
-  break;
+  return "f";
 case 64:
-  OutStr += "d";
-  break;
+  return "d";
 default:
-  llvm_unreachable("Unhandled float type!");
+  llvm_unreachable("Unhandled float width!");
 }
-  } else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-OutStr += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-OutStr += "m";
-  } else {
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:

sdesmalen-arm wrote:

They have the size of an `int`, so that would be the string `"i"`.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-28 Thread Sander de Smalen via cfe-commits


@@ -423,131 +434,143 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
 return "v";
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  return "h";
+case 32:
+  return "f";
+case 64:
+  return "d";
+default:
+  llvm_unreachable("Unhandled float width!");
 }
-  else if (isFloat())
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 1:
+  return "b";
+case 8:
+  return "c";
+case 16:
+  return "s";
+case 32:
+  return "i";
+case 64:
+  return "Wi";
+case 128:
+  return "LLLi";
+default:
+  llvm_unreachable("Unhandled bitwidth!");
 }
-  else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
   }
+}
 
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
-}
-  }
+std::string SVEType::builtin_str() const {
 
-  // Constant indices are "int", but have the "constant expression" modifier.
-  if (isImmediate()) {
-assert(!isFloat() && "fp immediates are not supported");
-S = "I" + S;
-  }
+  std::string Prefix;
 
-  if (isScalar()) {
-if (Constant) S += "C";
-if (Pointer) S += "*";
-return S;
+  if (isScalableVector())
+Prefix = "q" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isFixedLengthVector())
+Prefix = "V" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isImmediate()) {
+assert(!isFloatingPoint() && "fp immediates are not supported");
+Prefix = "I";
   }
 
-  if (isFixedLengthVector())
-return "V" + utostr(getNumElements() * NumVectors) + S;
-  return "q" + utostr(getNumElements() * NumVectors) + S;
+  // Make chars and integer pointers explicitly signed.
+  if ((ElementBitwidth == 8 || isPointer()) && isSignedInteger())

sdesmalen-arm wrote:

This code just makes the decision that chars are by default signed.

The reason that predicates are described having an element type is to 
distinguish between for example `_b` and `_b8`, but that's only for their 
representation in arm_sve.h. For the builtin descriptions in e.g. 
`arm_sve_builtins.inc` they should use `q16b`, which represent a ``, because `q16Sc` represents ``.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -431,133 +434,130 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string OutStr;
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
+return "v";
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoid()) {
-OutStr += "v";
-if (!isPointer())
-  return OutStr;
-  } else if (isFloat()) {
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
 case 16:
-  OutStr += "h";
-  break;
+  return "h";
 case 32:
-  OutStr += "f";
-  break;
+  return "f";
 case 64:
-  OutStr += "d";
-  break;
+  return "d";
 default:
-  llvm_unreachable("Unhandled float type!");
+  llvm_unreachable("Unhandled float width!");
 }
-  } else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-OutStr += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-OutStr += "m";
-  } else {
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:

SpencerAbson wrote:

Good point, these should only be 32-bit - best handled in a similar way to 
`BFloat16`/`MFloat8` above?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -423,131 +434,143 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
 return "v";
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  return "h";
+case 32:
+  return "f";
+case 64:
+  return "d";
+default:
+  llvm_unreachable("Unhandled float width!");
 }
-  else if (isFloat())
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 1:
+  return "b";
+case 8:
+  return "c";
+case 16:
+  return "s";
+case 32:
+  return "i";
+case 64:
+  return "Wi";
+case 128:
+  return "LLLi";
+default:
+  llvm_unreachable("Unhandled bitwidth!");
 }
-  else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
   }
+}
 
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
-}
-  }
+std::string SVEType::builtin_str() const {
 
-  // Constant indices are "int", but have the "constant expression" modifier.
-  if (isImmediate()) {
-assert(!isFloat() && "fp immediates are not supported");
-S = "I" + S;
-  }
+  std::string Prefix;
 
-  if (isScalar()) {
-if (Constant) S += "C";
-if (Pointer) S += "*";
-return S;
+  if (isScalableVector())
+Prefix = "q" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isFixedLengthVector())
+Prefix = "V" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isImmediate()) {
+assert(!isFloatingPoint() && "fp immediates are not supported");
+Prefix = "I";
   }
 
-  if (isFixedLengthVector())
-return "V" + utostr(getNumElements() * NumVectors) + S;
-  return "q" + utostr(getNumElements() * NumVectors) + S;
+  // Make chars and integer pointers explicitly signed.
+  if ((ElementBitwidth == 8 || isPointer()) && isSignedInteger())

SpencerAbson wrote:

For the most part it is, but in many cases it is not and I assumed there was a 
reason for it. For example: `__builtin_sve_svget4_b`, 
`__builtin_sve_svwhilegt_b8_s64_x2` - perhaps there is a bug I can fix here?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits


@@ -423,131 +434,143 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
 return "v";
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  return "h";
+case 32:
+  return "f";
+case 64:
+  return "d";
+default:
+  llvm_unreachable("Unhandled float width!");
 }
-  else if (isFloat())
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 1:
+  return "b";
+case 8:
+  return "c";
+case 16:
+  return "s";
+case 32:
+  return "i";
+case 64:
+  return "Wi";
+case 128:
+  return "LLLi";
+default:
+  llvm_unreachable("Unhandled bitwidth!");
 }
-  else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
   }
+}
 
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
-}
-  }
+std::string SVEType::builtin_str() const {
 
-  // Constant indices are "int", but have the "constant expression" modifier.
-  if (isImmediate()) {
-assert(!isFloat() && "fp immediates are not supported");
-S = "I" + S;
-  }
+  std::string Prefix;
 
-  if (isScalar()) {
-if (Constant) S += "C";
-if (Pointer) S += "*";
-return S;
+  if (isScalableVector())
+Prefix = "q" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isFixedLengthVector())
+Prefix = "V" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isImmediate()) {
+assert(!isFloatingPoint() && "fp immediates are not supported");
+Prefix = "I";
   }
 
-  if (isFixedLengthVector())
-return "V" + utostr(getNumElements() * NumVectors) + S;
-  return "q" + utostr(getNumElements() * NumVectors) + S;
+  // Make chars and integer pointers explicitly signed.
+  if ((ElementBitwidth == 8 || isPointer()) && isSignedInteger())

sdesmalen-arm wrote:

For the example you give here, shouldn't this be `q16b` ? (given that it 
relates to a predicate)

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits


@@ -431,133 +434,130 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string OutStr;
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
+return "v";
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoid()) {
-OutStr += "v";
-if (!isPointer())
-  return OutStr;
-  } else if (isFloat()) {
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
 case 16:
-  OutStr += "h";
-  break;
+  return "h";
 case 32:
-  OutStr += "f";
-  break;
+  return "f";
 case 64:
-  OutStr += "d";
-  break;
+  return "d";
 default:
-  llvm_unreachable("Unhandled float type!");
+  llvm_unreachable("Unhandled float width!");
 }
-  } else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-OutStr += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-OutStr += "m";
-  } else {
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:

sdesmalen-arm wrote:

Can you expand these explicitly, rather than using `default`?

I'm also surprised that PredicatePattern or PrefetchOp take an argument based 
on the element bitwidth, because both just end up just being an enum value in 
the builtin. I suspect something else is missing.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -424,72 +432,87 @@ const std::array 
SVEEmitter::Reinterprets =
 
//===--===//
 
 std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
-return "v";
+  std::string OutStr;
 
   if (isScalarPredicate())
 return "b";
 
   if (isSvcount())
 return "Qa";
 
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
-switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
-}
-  else if (isFloat())
+  if (isVoid()) {
+OutStr += "v";
+if (!isPointer())
+  return OutStr;
+  } else if (isFloat()) {
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  OutStr += "h";
+  break;
+case 32:
+  OutStr += "f";
+  break;
+case 64:
+  OutStr += "d";
+  break;
+default:
+  llvm_unreachable("Unhandled float type!");
 }
-  else if (isBFloat()) {
+  } else if (isBFloat()) {
 assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
+OutStr += "y";
   } else if (isMFloat()) {
 assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
-  }
-
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
+OutStr += "m";
+  } else {

SpencerAbson wrote:

Turns out we're sticking with `c` for the time being.

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -423,131 +434,143 @@ const std::array 
SVEEmitter::Reinterprets =
 // Type implementation
 
//===--===//
 
-std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
+std::string SVEType::builtinBaseType() const {
+  switch (Kind) {
+  case TypeKind::Void:
 return "v";
-
-  if (isScalarPredicate())
-return "b";
-
-  if (isSvcount())
+  case TypeKind::Svcount:
 return "Qa";
-
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
+  case TypeKind::BFloat16:
+assert(ElementBitwidth == 16 && "Invalid BFloat16!");
+return "y";
+  case TypeKind::MFloat8:
+assert(ElementBitwidth == 8 && "Invalid MFloat8!");
+return "c";
+  case TypeKind::Float:
 switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  return "h";
+case 32:
+  return "f";
+case 64:
+  return "d";
+default:
+  llvm_unreachable("Unhandled float width!");
 }
-  else if (isFloat())
+  case TypeKind::Predicate:
+if (isScalar())
+  return "b";
+[[fallthrough]];
+  // SInt/UInt, PredicatePattern, PrefetchOp.
+  default:
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 1:
+  return "b";
+case 8:
+  return "c";
+case 16:
+  return "s";
+case 32:
+  return "i";
+case 64:
+  return "Wi";
+case 128:
+  return "LLLi";
+default:
+  llvm_unreachable("Unhandled bitwidth!");
 }
-  else if (isBFloat()) {
-assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
-  } else if (isMFloat()) {
-assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
   }
+}
 
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
-}
-  }
+std::string SVEType::builtin_str() const {
 
-  // Constant indices are "int", but have the "constant expression" modifier.
-  if (isImmediate()) {
-assert(!isFloat() && "fp immediates are not supported");
-S = "I" + S;
-  }
+  std::string Prefix;
 
-  if (isScalar()) {
-if (Constant) S += "C";
-if (Pointer) S += "*";
-return S;
+  if (isScalableVector())
+Prefix = "q" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isFixedLengthVector())
+Prefix = "V" + llvm::utostr(getNumElements() * NumVectors);
+  else if (isImmediate()) {
+assert(!isFloatingPoint() && "fp immediates are not supported");
+Prefix = "I";
   }
 
-  if (isFixedLengthVector())
-return "V" + utostr(getNumElements() * NumVectors) + S;
-  return "q" + utostr(getNumElements() * NumVectors) + S;
+  // Make chars and integer pointers explicitly signed.
+  if ((ElementBitwidth == 8 || isPointer()) && isSignedInteger())

SpencerAbson wrote:

Before this patch, the code that performed `// Make chars explicitly typed` 
deduced that a type was a `char` from `!isFloatingPoint()` and `ElementBitWidth 
== 8`. One effect of this is that the builtin string for a the type `Pc` would 
be `q16Sc` (vector of signed chars). The change that I have made here will 
ignore sign information for predicates. @sdesmalen-arm do you know if this was 
the intent of the original code?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From eac5704250a454ede434d4967fb88902b689fce3 Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/5] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td |  28 +--
 clang/utils/TableGen/SveEmitter.cpp  | 356 ---
 2 files changed, 167 insertions(+), 217 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index d492fae4145b92..3e4eb55213c39e 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aar

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -424,72 +432,87 @@ const std::array 
SVEEmitter::Reinterprets =
 
//===--===//
 
 std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
-return "v";
+  std::string OutStr;
 
   if (isScalarPredicate())
 return "b";
 
   if (isSvcount())
 return "Qa";
 
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
-switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
-}
-  else if (isFloat())
+  if (isVoid()) {
+OutStr += "v";
+if (!isPointer())
+  return OutStr;
+  } else if (isFloat()) {
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  OutStr += "h";
+  break;
+case 32:
+  OutStr += "f";
+  break;
+case 64:
+  OutStr += "d";
+  break;
+default:
+  llvm_unreachable("Unhandled float type!");
 }
-  else if (isBFloat()) {
+  } else if (isBFloat()) {
 assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
+OutStr += "y";
   } else if (isMFloat()) {
 assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
-  }
-
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
+OutStr += "m";
+  } else {

SpencerAbson wrote:

Having looked at it again, it looks like is a bug with how we emit `MFloat8`. 
Since in the existing code, it also satisfies `!isFloatingPoint`, it would be 
emitted as `'c'` and not `'m'`, and there is no code in ASTContext to handle 
`'m'` anyway, so this patch would break something like 
https://github.com/llvm/llvm-project/pull/116959 - I'll need to check what our 
intended approach is. Thanks!

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits


@@ -424,72 +432,87 @@ const std::array 
SVEEmitter::Reinterprets =
 
//===--===//
 
 std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
-return "v";
+  std::string OutStr;
 
   if (isScalarPredicate())
 return "b";
 
   if (isSvcount())
 return "Qa";
 
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
-switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
-}
-  else if (isFloat())
+  if (isVoid()) {

sdesmalen-arm wrote:

Could you change this `if-else if-else if...else` into a switch statement, 
preferably without a `default` statement (so that it is clear what types the 
`else` case applies to, see my question below)

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread via cfe-commits


@@ -424,72 +432,87 @@ const std::array 
SVEEmitter::Reinterprets =
 
//===--===//
 
 std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
-return "v";
+  std::string OutStr;
 
   if (isScalarPredicate())
 return "b";
 
   if (isSvcount())
 return "Qa";
 
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
-switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
-}
-  else if (isFloat())
+  if (isVoid()) {
+OutStr += "v";
+if (!isPointer())
+  return OutStr;
+  } else if (isFloat()) {
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  OutStr += "h";
+  break;
+case 32:
+  OutStr += "f";
+  break;
+case 64:
+  OutStr += "d";
+  break;
+default:
+  llvm_unreachable("Unhandled float type!");
 }
-  else if (isBFloat()) {
+  } else if (isBFloat()) {
 assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
+OutStr += "y";
   } else if (isMFloat()) {
 assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
-  }
-
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
+OutStr += "m";
+  } else {

SpencerAbson wrote:

`MFloat8`, `BFloat16`, and `Svcount` are already handled before this point 
(albeit it is not that clear so I'll make this a switch as you've suggested), 
the existing implementation emitted `PrefetchOp`, `PredicatePattern` and 
`Predicate` using this switch as they satisfied `!isFloatingPoint()`, so I have 
kept this behavior the same.


https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits


@@ -424,72 +432,87 @@ const std::array 
SVEEmitter::Reinterprets =
 
//===--===//
 
 std::string SVEType::builtin_str() const {
-  std::string S;
-  if (isVoid())
-return "v";
+  std::string OutStr;
 
   if (isScalarPredicate())
 return "b";
 
   if (isSvcount())
 return "Qa";
 
-  if (isVoidPointer())
-S += "v";
-  else if (!isFloatingPoint())
-switch (ElementBitwidth) {
-case 1: S += "b"; break;
-case 8: S += "c"; break;
-case 16: S += "s"; break;
-case 32: S += "i"; break;
-case 64: S += "Wi"; break;
-case 128: S += "LLLi"; break;
-default: llvm_unreachable("Unhandled case!");
-}
-  else if (isFloat())
+  if (isVoid()) {
+OutStr += "v";
+if (!isPointer())
+  return OutStr;
+  } else if (isFloat()) {
 switch (ElementBitwidth) {
-case 16: S += "h"; break;
-case 32: S += "f"; break;
-case 64: S += "d"; break;
-default: llvm_unreachable("Unhandled case!");
+case 16:
+  OutStr += "h";
+  break;
+case 32:
+  OutStr += "f";
+  break;
+case 64:
+  OutStr += "d";
+  break;
+default:
+  llvm_unreachable("Unhandled float type!");
 }
-  else if (isBFloat()) {
+  } else if (isBFloat()) {
 assert(ElementBitwidth == 16 && "Not a valid BFloat.");
-S += "y";
+OutStr += "y";
   } else if (isMFloat()) {
 assert(ElementBitwidth == 8 && "Not a valid MFloat.");
-S += "m";
-  }
-
-  if (!isFloatingPoint()) {
-if ((isChar() || isPointer()) && !isVoidPointer()) {
-  // Make chars and typed pointers explicitly signed.
-  if (Signed)
-S = "S" + S;
-  else if (!Signed)
-S = "U" + S;
-} else if (!isVoidPointer() && !Signed) {
-  S = "U" + S;
+OutStr += "m";
+  } else {

sdesmalen-arm wrote:

Does this make sense for all other types like `MFloat8, Svcount, PrefetchOp, 
PredicatePattern, ...` ?
Or is this hiding some implicit assumption?

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-27 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm commented:

Thanks for cleaning this up, this part was always quite messy!

https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-26 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From eac5704250a454ede434d4967fb88902b689fce3 Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/3] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td |  28 +--
 clang/utils/TableGen/SveEmitter.cpp  | 356 ---
 2 files changed, 167 insertions(+), 217 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index d492fae4145b92..3e4eb55213c39e 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aar

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-26 Thread via cfe-commits

https://github.com/SpencerAbson updated 
https://github.com/llvm/llvm-project/pull/117717

>From eac5704250a454ede434d4967fb88902b689fce3 Mon Sep 17 00:00:00 2001
From: Spencer Abson 
Date: Tue, 26 Nov 2024 13:49:12 +
Subject: [PATCH 1/2] Refactor parts of SveEmitter.cpp

---
 clang/include/clang/Basic/arm_sve.td |  28 +--
 clang/utils/TableGen/SveEmitter.cpp  | 356 ---
 2 files changed, 167 insertions(+), 217 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sve.td 
b/clang/include/clang/Basic/arm_sve.td
index d492fae4145b92..3e4eb55213c39e 100644
--- a/clang/include/clang/Basic/arm_sve.td
+++ b/clang/include/clang/Basic/arm_sve.td
@@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", 
"PPdj", "UcUsUi", MergeNone,
 

 // While comparisons
 
-def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
 
 

 // Counting bit
@@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", 
"PcPsPiPl", MergeNon
 def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
 def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", 
MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
-def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", 
MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, 
VerifyRuntimeMode]>;
+def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, 
"aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>;
+def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, 
"aar

[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)

2024-11-26 Thread via cfe-commits

https://github.com/SpencerAbson edited 
https://github.com/llvm/llvm-project/pull/117717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits