[PATCH 42/43] aarch64: Add support for strided register lists

Simon Marchi simon.marchi@polymtl.ca
Thu Mar 30 15:50:33 GMT 2023


On 3/30/23 06:23, Richard Sandiford wrote:
> SME2 has instructions that accept strided register lists,
> such as { z0.s, z4.s, z8.s, z12.s }.  The purpose of this
> patch is to extend binutils to support such lists.
> 
> The parsing code already had (unused) support for strides of 2.
> The idea here is instead to accept all strides during parsing
> and reject invalid strides during constraint checking.
> 
> The SME2 instructions that accept strided operands also have
> non-strided forms.  The errors about invalid strides therefore
> take a bitmask of acceptable strides, which allows multiple
> possibilities to be summed up in a single message.
> 
> I've tried to update all code that handles register lists.

Hi Richard,

In a binutils-gdb build with --enable-targets=all, I get:


make[4]: Entering directory '/home/smarchi/build/binutils-gdb-all-targets/binutils'
  CCLD     objdump
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-dis-2.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): reglist
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-dis-2.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): __odr_asan.reglist
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-opc-2.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): reglist
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-opc.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): reglist
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-opc-2.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): __odr_asan.reglist
mold: error: duplicate symbol: ../opcodes/.libs/libopcodes.a(aarch64-opc.o): ../opcodes/.libs/libopcodes.a(aarch64-dis.o): __odr_asan.reglist
collect2: error: ld returned 1 exit status

> diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h
> index 61afe561a12..ef59d531d17 100644
> --- a/include/opcode/aarch64.h
> +++ b/include/opcode/aarch64.h
> @@ -1122,6 +1122,19 @@ struct aarch64_indexed_za
>    unsigned v : 1;	/* <HV> horizontal or vertical vector indicator.  */
>  };
>  
> +/* Information about a list of registers.  */
> +struct aarch64_reglist
> +{
> +  unsigned first_regno : 8;
> +  unsigned num_regs : 8;
> +  /* The difference between the nth and the n+1th register.  */
> +  unsigned stride : 8;
> +  /* 1 if it is a list of reg element.  */
> +  unsigned has_index : 1;
> +  /* Lane index; valid only when has_index is 1.  */
> +  int64_t index;
> +} reglist;

Probably because this last "reglist" shouldn't be there.

Simon


More information about the Binutils mailing list