Ping
On 31/07/2025 13:36, Tejas Belagod wrote:
This is a follow-up to a series posted earlier this year:
https://gcc.gnu.org/pipermail/gcc-patches/2025-March/677053.html
Sorry to have dropped the ball on this. I've separated out the index operator
into a separate patch which I post subsequently. Tested and bootstrapped on
aarch64-linux-gnu and x86_64. OK for trunk?
This patch series implements C/C++ operators on SVE's svbool_t ACLE type.
Following is a spec that describes the semantics when operators are applied to
svbool_t.
svbool_t is an SVE ACLE type that is a vector of non-standard booleans.
svbool_t[i] is a boolean type.
Initialization:
svbool_t pg = {c0, c1, c2, ..., cn}; // ci is either a compile-time constant
or a runtime expression.
This is equivalent to
pg[0] = c0;
pg[1] = c1;
..
pg[n] = cn;
etc.
This is similar to writing:
_Bool p[4] = {1, 4.2, 0, ..., 'a'};
Eg.
svbool_t pg = {1, 4.2, 0, ..., 'a'};
will be translated to:
pg[0] = 1;
pg[1] = 1;
pg[2] = 0;
...
pg[n] = 1;
IoW, ci implicitly converts to boolean.
For SVE sizeless types, num of elements in the initializer cannot exceed
minimum vector length (16bits).
Bitwise ops: &, |, ~, ^
svbool_t = svbool_t <op> svbool_t
svbool_t = svbool_t <op> c // c is a scalar
svbool_t temp = {c, c, ..., c}
svbool_t = svbool_t <op> temp
Logical Ops: ==, !=
The result of a logical operation between 2 svbool_t is another vector svbool_t
i.e.
svbool_t = svbool_t <op> svbool_t
svbool_t <op> scalar eg. svbool_t != <constant> is equiv to:
_Bool temp1 = <constant> != 0 // Compile-time constant.
_Bool temp2 = temp1
svbool_t temp3 = {temp2, temp2, ... }
svbool_t = svbool_t <op> temp3
Ternary op:
svbool_t_expr ? svbool_t : svbool_t;
c ? svbool_t : svbool_t; // c is a scalar
The operation is similar to the GNU vector ternary op:
res = {svbool_t[0] != 0 ? v1[0] : v2[0], svbool_t[1] != 0 ? v1[1] : v2[1],
..}
svbool_t_expr ? t1 : t2; // Here, even if t1, t2 and svbool_t_expr have the
same
number of elements, it will be diagnosed as error if t1 and t2 sizes are
different
from svbool_t.
Conditional ops:
Result of svbool_t conditional ops is a vector of type svbool_t just like in the
case of a GNU vector.
!svbool_t is equivalent to
svbool_t == 0
svbool_t && svbool_t is equivalent to:
svbool_t != 0 & svbool_t != 0
svbool_t || svbool_t is equiv to:
svbool_t != 0 | svbool_t != 0
Address-of: & on svbool_t[i] is not allowed.
sizeof(): sizeof (svbool_t[i]) is precision / 8 + 1
Tejas Belagod (3):
AArch64: Support C/C++ operations on svbool_t
AArch64: Update existing test with svbool_t operations
AArch64: Update test to reflect new message
gcc/c-family/c-common.cc | 25 +-
gcc/c-family/c-common.h | 1 +
gcc/c/c-typeck.cc | 27 +-
gcc/config/aarch64/aarch64-sve-builtins.cc | 5 +-
gcc/config/aarch64/aarch64-sve.md | 62 ++++
gcc/config/aarch64/aarch64.cc | 94 +++++-
gcc/cp/call.cc | 3 +-
gcc/cp/cvt.cc | 11 +-
gcc/cp/typeck.cc | 28 +-
gcc/testsuite/g++.dg/ext/sve-sizeless-1.C | 10 +
gcc/testsuite/g++.dg/ext/sve-sizeless-2.C | 21 ++
.../sve/acle/general-c++/gnu_vectors_1.C | 133 +++++++-
.../sve/acle/general-c++/gnu_vectors_2.C | 133 +++++++-
.../sve/acle/general-c/gnu_vectors_1.c | 128 +++++++-
.../sve/acle/general-c/gnu_vectors_2.c | 128 +++++++-
.../aarch64/sve/acle/general-c/sizeless-1.c | 14 +-
.../aarch64/sve/acle/general-c/sizeless-2.c | 32 ++
.../aarch64/sve/acle/general-c/svcount_1.c | 2 +-
.../aarch64/sve/acle/general/cops_bool.c | 301 ++++++++++++++++++
19 files changed, 1114 insertions(+), 44 deletions(-)
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general/cops_bool.c