[COMMITTED] a68: add TEST operator for bits to expanded prelude

Iain Buclaw ibuclaw@gdcproject.org
Sun Feb 1 09:08:30 GMT 2026


Excerpts from Jose E. Marchesi's message of Januar 31, 2026 6:58 pm:
> This patch adds support for a TEST operator for L bits.  Documentation
> and tests are included.
> 
> Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
> 
> gcc/algol68/ChangeLog
> 
> 	* a68.h: Prototypes for a68_bits_test and a68_lower_test3.
> 	* a68-low-bits.cc (a68_bits_test): New function.
> 	* a68-low-prelude.cc (a68_lower_test3): Likewise.
> 	* a68-parser-prelude.cc (gnu_prelude): Declare TEST operators and
> 	their priority.
> 	* ga68.texi (Extended bits operators): New section.
> 
> gcc/testsuite/ChangeLog
> 
> 	* algol68/execute/bits-test-1.a68: New test.
> ---
>  gcc/algol68/a68-low-bits.cc                   | 40 +++++++++++++++++++
>  gcc/algol68/a68-low-prelude.cc                |  8 ++++
>  gcc/algol68/a68-parser-prelude.cc             | 11 +++++
>  gcc/algol68/a68.h                             |  2 +
>  gcc/algol68/ga68.texi                         |  6 +++
>  gcc/testsuite/algol68/execute/bits-test-1.a68 |  5 +++
>  6 files changed, 72 insertions(+)
>  create mode 100644 gcc/testsuite/algol68/execute/bits-test-1.a68
> 
> diff --git a/gcc/algol68/a68-low-bits.cc b/gcc/algol68/a68-low-bits.cc
> index 6a272ca633d..16205fa6351 100644
> --- a/gcc/algol68/a68-low-bits.cc
> +++ b/gcc/algol68/a68-low-bits.cc
> @@ -367,3 +367,43 @@ a68_bits_clear (MOID_T *m, tree bits, tree numbit, location_t loc)
>  			  bits_type,
>  			  in_range, res, bits);
>  }
> +
> +/* Test the bit NUMBIT in BITS.
> +
> +   NUMBIT is one based and counts bits from least significative to most
> +   significative, i.e. from "right" to "left".  If NUMBIT is not in range then
> +   the operator yields false.  */
> +
> +tree
> +a68_bits_test (MOID_T *m ATTRIBUTE_UNUSED,
> +	       tree bits, tree numbit, location_t loc)
> +{
> +  tree bits_type = TREE_TYPE (bits);
> +  tree int_type = TREE_TYPE (numbit);
> +
> +  bits = save_expr (bits);
> +  numbit = save_expr (numbit);
> +
> +  tree numbit_minus_one = fold_build2 (MINUS_EXPR, int_type,
> +				       numbit, build_one_cst (int_type));
> +  tree mask = fold_build2 (BIT_AND_EXPR, bits_type,
> +			   bits,
> +			   fold_build2 (LSHIFT_EXPR,
> +					bits_type,
> +					build_one_cst (bits_type),
> +					fold_convert (bits_type, numbit_minus_one)));
> +  tree res = fold_build2 (NE_EXPR,
> +			  a68_bool_type,

LGTM.

Should the use of a68_bool_type be replaced with CTYPE (m)?

Iain.


More information about the Algol68 mailing list