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


Reply via email to