[clang] [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (PR #117717)
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)
@@ -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)
@@ -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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
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)
@@ -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)
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)
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)
@@ -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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
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)
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)
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)
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