[PATCH v2 04/12] LoongArch: Enable all instructions defaultly on LA32/LA64

WANG Xuerui i.swmail@xen0n.name
Wed Dec 3 05:30:21 GMT 2025


On 12/2/25 19:17, mengqinggang wrote:
> Glibc checks LSX/LASX support when configure.
> Kernel has float instructions but with -msoft-float option.

More detail and reasoning would be better for readers, because they may 
wonder why this suddenly becomes unbearable the moment LA32 support is 
added; the fact is that things work just as well in recent years...

Also, "by default" instead of "defaultly".

> ---
>   gas/config/tc-loongarch.c | 85 +++++++++++++++++++--------------------
>   1 file changed, 42 insertions(+), 43 deletions(-)
> 
> diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
> index dc03956d792..a37cde9b38c 100644
> --- a/gas/config/tc-loongarch.c
> +++ b/gas/config/tc-loongarch.c
> @@ -27,6 +27,7 @@
>   #include "opcode/loongarch.h"
>   #include "obj-elf.h"
>   #include "bfd/elfxx-loongarch.h"
> +#include "config.h"
>   #include <stdlib.h>
>   #include <string.h>
>   #include <stdio.h>
> @@ -181,34 +182,24 @@ int
>   md_parse_option (int c, const char *arg)
>   {
>     int ret = 1;
> -  char lp64[256] = "";
> -  char ilp32[256] = "";
> -
> -  lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
> -  lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
> -  lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
> -
> -  ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
> -  ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
> -  ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
> +  char fabi[256] = "";
> +  fabi['s'] = fabi['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
> +  fabi['f'] = fabi['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
> +  fabi['d'] = fabi['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
>   
>     switch (c)
>       {
>       case OPTION_ABI:
> -      if (strncasecmp (arg, "lp64", 4) == 0 && lp64[arg[4] & 0xff] != 0)
> +      if (strncasecmp (arg, "lp64", 4) == 0 && fabi[arg[4] & 0xff] != 0)
>   	{
>   	  LARCH_opts.ase_ilp32 = 1;
>   	  LARCH_opts.ase_lp64 = 1;
> -	  LARCH_opts.ase_lsx = 1;
> -	  LARCH_opts.ase_lasx = 1;
> -	  LARCH_opts.ase_lvz = 1;
> -	  LARCH_opts.ase_lbt = 1;
> -	  LARCH_opts.ase_abi = lp64[arg[4] & 0xff];
> +	  LARCH_opts.ase_abi = fabi[arg[4] & 0xff];
>   	}
> -      else if (strncasecmp (arg, "ilp32", 5) == 0 && ilp32[arg[5] & 0xff] != 0)
> +      else if (strncasecmp (arg, "ilp32", 5) == 0 && fabi[arg[5] & 0xff] != 0)
>   	{
> -	  LARCH_opts.ase_abi = ilp32[arg[5] & 0xff];
>   	  LARCH_opts.ase_ilp32 = 1;
> +	  LARCH_opts.ase_abi = fabi[arg[5] & 0xff];
>   	}
>         else
>   	ret = 0;
> @@ -284,43 +275,51 @@ static struct htab *cfi_f_htab = NULL;
>   void
>   loongarch_after_parse_args ()
>   {
> -  /* Set default ABI/ISA LP64D.  */
> +  /* If no -mabi specified, set ABI by default_arch.  */
>     if (!LARCH_opts.ase_ilp32)
>       {
>         if (strcmp (default_arch, "loongarch64") == 0)
>   	{
> -	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
>   	  LARCH_opts.ase_ilp32 = 1;
>   	  LARCH_opts.ase_lp64 = 1;
> -	  LARCH_opts.ase_lsx = 1;
> -	  LARCH_opts.ase_lasx = 1;
> -	  LARCH_opts.ase_lvz = 1;
> -	  LARCH_opts.ase_lbt = 1;
>   	}
>         else if (strcmp (default_arch, "loongarch32") == 0)
> -	{
> -	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
>   	  LARCH_opts.ase_ilp32 = 1;
> -	}
>         else
>   	as_bad ("unknown default architecture `%s'", default_arch);
>       }
>   
> -  LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1;
> -  /* Set default ISA double-float.  */
> -  if (!LARCH_opts.ase_nf
> -      && !LARCH_opts.ase_sf
> -      && !LARCH_opts.ase_df)
> +  /* Enable all instructions defaultly.
> +     Glibc checks LSX/LASX support when configure.
> +     Kernel has float instructions but with -msoft-float option.
> +     TODO: SPlit la32/la64 instructions.
> +     TODO: Instruction selection and macro expansion may need
> +     to be controlled by different variables.  */

Same here regarding the comment wording. Also it could be better to 
provide more details regarding motivation of the TODOs, because the next 
time we come around it would be at least several months later, and we'd 
have forgotten everything then...

> +  LARCH_opts.ase_sf = 1;
> +  LARCH_opts.ase_df = 1;
> +  LARCH_opts.ase_lsx = 1;
> +  LARCH_opts.ase_lasx = 1;
> +  LARCH_opts.ase_lvz = 1;
> +  LARCH_opts.ase_lbt = 1;
> +
> +  /* If no -mabi specified, set e_flags base ABI by target os.  */
> +  if (!LARCH_opts.ase_abi)
>       {
> -      LARCH_opts.ase_sf = 1;
> -      LARCH_opts.ase_df = 1;
> +      if (strcmp (TARGET_OS, "linux-gnusf") == 0)
> +	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SOFT_FLOAT;
> +      else if (strcmp (TARGET_OS, "linux-gnuf32") == 0)
> +	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SINGLE_FLOAT;
> +      else if (strcmp (TARGET_OS, "linux-gnu") == 0)
> +	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
> +      else
> +	as_fatal (_("unsupport TARGET_OS %s"), TARGET_OS);
>       }
>   
> -  size_t i;
> -
> -  assert(LARCH_opts.ase_ilp32);
> +  /* Set eflags ABI version to v1 (ABI 2.0).  */
> +  LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1;

Technically this is only about the object file ABI (non-support of 
stack-machine-based relocs), and not the vague "ABI2.0" or "new world" 
concept which is more closely related to the combination of Linux UAPI 
and GLIBC ELF symbol versions. I'd suggest not adding the comment at 
all, or only comment about "object file ABI" or something along the 
lines of "Signify that the object does not make use of 
stack-machine-based relocs".

-- 
Regards,
WANG "xen0n" Xuerui

Linux/LoongArch mailing list: https://lore.kernel.org/loongarch/
Unofficial Loongson OSS community: https://github.com/loongson-community


More information about the Binutils mailing list