On Tue, 11 Jul 2023, Robin Dapp wrote:
> Attached is v2 that does not switch to uint64_t but stays within
> 32 bits by shifting the optab by 20 and the mode(s) by 10 bits.
LGTM.
> Regards
> Robin
>
> Upcoming changes for RISC-V will have us exceed 255 modes or 8 bits.
> This patch increases the limit to 10 bits and adjusts the hashing
> function for the gen* and optabs-query lookups accordingly.
> Consequently, the number of optabs is limited to 4095.
>
> gcc/ChangeLog:
>
> * genopinit.cc (main): Adjust maximal number of optabs and
> machine modes.
> * gensupport.cc (find_optab): Shift optab by 20 and mode by
> 10 bits.
> * optabs-query.h (optab_handler): Ditto.
> (convert_optab_handler): Ditto.
> ---
> gcc/genopinit.cc | 5 ++---
> gcc/gensupport.cc | 2 +-
> gcc/optabs-query.h | 4 ++--
> 3 files changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/genopinit.cc b/gcc/genopinit.cc
> index 6bd8858a1d9..2a841006884 100644
> --- a/gcc/genopinit.cc
> +++ b/gcc/genopinit.cc
> @@ -182,8 +182,7 @@ main (int argc, const char **argv)
>
> progname = "genopinit";
>
> - if (NUM_OPTABS > 0xffff
> - || MAX_MACHINE_MODE >= ((1 << MACHINE_MODE_BITSIZE) - 1))
> + if (NUM_OPTABS > 0xfff || NUM_MACHINE_MODES > 0x3ff)
> fatal ("genopinit range assumptions invalid");
>
> if (!init_rtx_reader_args_cb (argc, argv, handle_arg))
> @@ -439,7 +438,7 @@ main (int argc, const char **argv)
> "bool\n"
> "swap_optab_enable (optab op, machine_mode m, bool set)\n"
> "{\n"
> - " unsigned scode = (op << 16) | m;\n"
> + " unsigned scode = (op << 20) | m;\n"
> " int i = lookup_handler (scode);\n"
> " if (i >= 0)\n"
> " {\n"
> diff --git a/gcc/gensupport.cc b/gcc/gensupport.cc
> index e39e6dacce2..959d1d9c83c 100644
> --- a/gcc/gensupport.cc
> +++ b/gcc/gensupport.cc
> @@ -3806,7 +3806,7 @@ find_optab (optab_pattern *p, const char *name)
> {
> p->name = name;
> p->op = optabs[pindex].op;
> - p->sort_num = (p->op << 16) | (p->m2 << 8) | p->m1;
> + p->sort_num = (p->op << 20) | (p->m2 << 10) | p->m1;
> return true;
> }
> }
> diff --git a/gcc/optabs-query.h b/gcc/optabs-query.h
> index 043e9791bc1..920eb6a1b67 100644
> --- a/gcc/optabs-query.h
> +++ b/gcc/optabs-query.h
> @@ -37,7 +37,7 @@ convert_optab_p (optab op)
> inline enum insn_code
> optab_handler (optab op, machine_mode mode)
> {
> - unsigned scode = (op << 16) | mode;
> + unsigned scode = (op << 20) | mode;
> gcc_assert (op > LAST_CONV_OPTAB);
> return raw_optab_handler (scode);
> }
> @@ -50,7 +50,7 @@ inline enum insn_code
> convert_optab_handler (convert_optab op, machine_mode to_mode,
> machine_mode from_mode)
> {
> - unsigned scode = (op << 16) | (from_mode << 8) | to_mode;
> + unsigned scode = (op << 20) | (from_mode << 10) | to_mode;
> gcc_assert (convert_optab_p (op));
> return raw_optab_handler (scode);
> }
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)