We now have more than 32 scalar and vector float modes, so the 32-bit AARCH64_APPROX_MODE would invoke UB for some of them. Bumping to a 64-bit mask fixes that... for now.
Ideally we'd have a static assert to trap this, but logically it would go at file scope. I think it would be better to wait until the switch to C++11, so that we can use static_assert directly. Tested on aarch64-linux-gnu and aarch64_be-elf, pushed. Richard 2020-02-21 Richard Sandiford <richard.sandif...@arm.com> gcc/ * config/aarch64/aarch64-protos.h (AARCH64_APPROX_MODE): Operate on and produce uint64_ts rather than ints. (AARCH64_APPROX_NONE, AARCH64_APPROX_ALL): Change to uint64_ts. (cpu_approx_modes): Change the fields from unsigned int to uint64_t. --- gcc/config/aarch64/aarch64-protos.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index d29975a8921..d6d668ea920 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -212,20 +212,20 @@ struct cpu_branch_cost /* Control approximate alternatives to certain FP operators. */ #define AARCH64_APPROX_MODE(MODE) \ ((MIN_MODE_FLOAT <= (MODE) && (MODE) <= MAX_MODE_FLOAT) \ - ? (1 << ((MODE) - MIN_MODE_FLOAT)) \ + ? ((uint64_t) 1 << ((MODE) - MIN_MODE_FLOAT)) \ : (MIN_MODE_VECTOR_FLOAT <= (MODE) && (MODE) <= MAX_MODE_VECTOR_FLOAT) \ - ? (1 << ((MODE) - MIN_MODE_VECTOR_FLOAT \ - + MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) \ + ? ((uint64_t) 1 << ((MODE) - MIN_MODE_VECTOR_FLOAT \ + + MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) \ : (0)) -#define AARCH64_APPROX_NONE (0) -#define AARCH64_APPROX_ALL (-1) +#define AARCH64_APPROX_NONE ((uint64_t) 0) +#define AARCH64_APPROX_ALL (~(uint64_t) 0) /* Allowed modes for approximations. */ struct cpu_approx_modes { - const unsigned int division; /* Division. */ - const unsigned int sqrt; /* Square root. */ - const unsigned int recip_sqrt; /* Reciprocal square root. */ + const uint64_t division; /* Division. */ + const uint64_t sqrt; /* Square root. */ + const uint64_t recip_sqrt; /* Reciprocal square root. */ }; /* Cache prefetch settings for prefetch-loop-arrays. */