[PATCH] RISC-V: remove indirection from register tables

Nelson Chu nelson@rivosinc.com
Tue Aug 15 06:14:43 GMT 2023


Thanks, looks good.  I don't have any strong naming opinions here, so it's
up to the author of patch :-)

Nelson

On Fri, Aug 11, 2023 at 9:18 PM Jan Beulich <jbeulich@suse.com> wrote:

> The longest register name is 4 characters (plus a nul one), so using a
> 4- or 8-byte pointer to get at it is neither space nor time efficient.
> Embed the names right into the array. For PIE this also reduces the
> number of base relocations in the final image.
>
> To avoid old gcc, when generating 32-bit code, bogusly warning about
> bounds being exceeded in the code processing Cs/Cw, Ct/Cx, and CD,
> an adjustment to EXTRACT_BITS() is needed: This macro shouldn't supply
> a 64-bit value, and it also doesn't need to - all operand fields to
> date are far more narrow than 32 bits. This in turn allows dropping a
> number of casts elsewhere.
> ---
> Of course this way the array items aren't a power of 2 in size anymore.
> While adding padding would still keep overall size below the original
> for 64-bit code, in 32-bit code the space savings would likely be lost.
> The alternative of setting NRC to 4 and hence omitting the nul character
> in some of the slots may not be liked, for requiring all use sites to
> then be aware of that aspect and using %.4s instead of plain %s.
>
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -951,7 +951,7 @@ hash_reg_name (enum reg_class class, con
>  }
>
>  static void
> -hash_reg_names (enum reg_class class, const char * const names[],
> unsigned n)
> +hash_reg_names (enum reg_class class, const char names[][NRC], unsigned n)
>  {
>    unsigned i;
>
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -355,7 +355,7 @@ static inline unsigned int riscv_insn_le
>
>  /* Extract the operand given by FIELD from integer INSN.  */
>  #define EXTRACT_OPERAND(FIELD, INSN) \
> -  EXTRACT_BITS ((INSN), OP_MASK_##FIELD, OP_SH_##FIELD)
> +  ((unsigned int) EXTRACT_BITS ((INSN), OP_MASK_##FIELD, OP_SH_##FIELD))
>
>  /* Extract an unsigned immediate operand on position s with n bits.  */
>  #define EXTRACT_U_IMM(n, s, l) \
> @@ -575,14 +575,16 @@ enum riscv_seg_mstate
>    MAP_INSN,            /* Instructions.  */
>  };
>
> -extern const char * const riscv_gpr_names_numeric[NGPR];
> -extern const char * const riscv_gpr_names_abi[NGPR];
> -extern const char * const riscv_fpr_names_numeric[NFPR];
> -extern const char * const riscv_fpr_names_abi[NFPR];
> +#define NRC 5           /* Max characters in register names, incl nul.  */
> +
> +extern const char riscv_gpr_names_numeric[NGPR][NRC];
> +extern const char riscv_gpr_names_abi[NGPR][NRC];
> +extern const char riscv_fpr_names_numeric[NFPR][NRC];
> +extern const char riscv_fpr_names_abi[NFPR][NRC];
>  extern const char * const riscv_rm[8];
>  extern const char * const riscv_pred_succ[16];
> -extern const char * const riscv_vecr_names_numeric[NVECR];
> -extern const char * const riscv_vecm_names_numeric[NVECM];
> +extern const char riscv_vecr_names_numeric[NVECR][NRC];
> +extern const char riscv_vecm_names_numeric[NVECM][NRC];
>  extern const char * const riscv_vsew[8];
>  extern const char * const riscv_vlmul[8];
>  extern const char * const riscv_vta[2];
> --- a/opcodes/riscv-dis.c
> +++ b/opcodes/riscv-dis.c
> @@ -69,8 +69,8 @@ static enum riscv_seg_mstate last_map_st
>  static asection *last_map_section = NULL;
>
>  /* Register names as used by the disassembler.  */
> -static const char * const *riscv_gpr_names;
> -static const char * const *riscv_fpr_names;
> +static const char (*riscv_gpr_names)[NRC];
> +static const char (*riscv_fpr_names)[NRC];
>
>  /* If set, disassemble as most general instruction.  */
>  static bool no_aliases = false;
> @@ -502,7 +502,7 @@ print_insn_args (const char *oparg, insn
>
>         case 'y':
>           print (info->stream, dis_style_immediate, "0x%x",
> -                (unsigned)EXTRACT_OPERAND (BS, l));
> +                EXTRACT_OPERAND (BS, l));
>           break;
>
>         case 'z':
> @@ -511,12 +511,12 @@ print_insn_args (const char *oparg, insn
>
>         case '>':
>           print (info->stream, dis_style_immediate, "0x%x",
> -                (unsigned)EXTRACT_OPERAND (SHAMT, l));
> +                EXTRACT_OPERAND (SHAMT, l));
>           break;
>
>         case '<':
>           print (info->stream, dis_style_immediate, "0x%x",
> -                (unsigned)EXTRACT_OPERAND (SHAMTW, l));
> +                EXTRACT_OPERAND (SHAMTW, l));
>           break;
>
>         case 'S':
> @@ -577,7 +577,7 @@ print_insn_args (const char *oparg, insn
>
>         case 'Y':
>           print (info->stream, dis_style_immediate, "0x%x",
> -                (unsigned) EXTRACT_OPERAND (RNUM, l));
> +                EXTRACT_OPERAND (RNUM, l));
>           break;
>
>         case 'Z':
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -26,7 +26,7 @@
>
>  /* Register names used by gas and objdump.  */
>
> -const char * const riscv_gpr_names_numeric[NGPR] =
> +const char riscv_gpr_names_numeric[NGPR][NRC] =
>  {
>    "x0",   "x1",   "x2",   "x3",   "x4",   "x5",   "x6",   "x7",
>    "x8",   "x9",   "x10",  "x11",  "x12",  "x13",  "x14",  "x15",
> @@ -34,7 +34,7 @@ const char * const riscv_gpr_names_numer
>    "x24",  "x25",  "x26",  "x27",  "x28",  "x29",  "x30",  "x31"
>  };
>
> -const char * const riscv_gpr_names_abi[NGPR] =
> +const char riscv_gpr_names_abi[NGPR][NRC] =
>  {
>    "zero", "ra",   "sp",   "gp",   "tp",   "t0",   "t1",   "t2",
>    "s0",   "s1",   "a0",   "a1",   "a2",   "a3",   "a4",   "a5",
> @@ -42,7 +42,7 @@ const char * const riscv_gpr_names_abi[N
>    "s8",   "s9",   "s10",  "s11",  "t3",   "t4",   "t5",   "t6"
>  };
>
> -const char * const riscv_fpr_names_numeric[NFPR] =
> +const char riscv_fpr_names_numeric[NFPR][NRC] =
>  {
>    "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
>    "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
> @@ -50,7 +50,7 @@ const char * const riscv_fpr_names_numer
>    "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31"
>  };
>
> -const char * const riscv_fpr_names_abi[NFPR] =
> +const char riscv_fpr_names_abi[NFPR][NRC] =
>  {
>    "ft0",  "ft1",  "ft2",  "ft3",  "ft4",  "ft5",  "ft6",  "ft7",
>    "fs0",  "fs1",  "fa0",  "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
> @@ -72,7 +72,7 @@ const char * const riscv_pred_succ[16] =
>  };
>
>  /* RVV registers.  */
> -const char * const riscv_vecr_names_numeric[NVECR] =
> +const char riscv_vecr_names_numeric[NVECR][NRC] =
>  {
>    "v0",   "v1",   "v2",   "v3",   "v4",   "v5",   "v6",   "v7",
>    "v8",   "v9",   "v10",  "v11",  "v12",  "v13",  "v14",  "v15",
> @@ -81,7 +81,7 @@ const char * const riscv_vecr_names_nume
>  };
>
>  /* RVV mask registers.  */
> -const char * const riscv_vecm_names_numeric[NVECM] =
> +const char riscv_vecm_names_numeric[NVECM][NRC] =
>  {
>    "v0.t"
>  };
>


More information about the Binutils mailing list