[PATCH v1 4/4] LoongArch: Enable LSX, LASX on float ABI

mengqinggang mengqinggang@loongson.cn
Tue Jun 10 08:42:41 GMT 2025


---
 gas/config/tc-loongarch.c | 123 +++++++++++++++++---------------------
 1 file changed, 56 insertions(+), 67 deletions(-)

diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
index 4949d1759e4..ef47047ebf6 100644
--- a/gas/config/tc-loongarch.c
+++ b/gas/config/tc-loongarch.c
@@ -181,36 +181,26 @@ int
 md_parse_option (int c, const char *arg)
 {
   int ret = 1;
-  char lp64[256] = "";
-  char ilp32[256] = "";
-  unsigned char *suf = (unsigned char *)arg;
-
-  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;
 
   switch (c)
     {
     case OPTION_ABI:
-      if (strncasecmp (arg, "lp64", 4) == 0 && lp64[suf[4]] != 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[suf[4]];
-	}
-      else if (strncasecmp (arg, "ilp32", 5) == 0 && ilp32[suf[5]] != 0)
-	{
-	  LARCH_opts.ase_abi = ilp32[suf[5]];
-	  LARCH_opts.ase_ilp32 = 1;
-	}
+      if (strcasecmp (arg, "lp64") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
+      else if (strcasecmp (arg, "lp64d") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
+      else if (strcasecmp (arg, "lp64f") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SINGLE_FLOAT;
+      else if (strcasecmp (arg, "lp64s") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SOFT_FLOAT;
+      else if (strcasecmp (arg, "ilp32") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
+      else if (strcasecmp (arg, "ilp32d") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
+      else if (strcasecmp (arg, "ilp32f") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SINGLE_FLOAT;
+      else if (strcasecmp (arg, "ilp32s") == 0)
+	LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SOFT_FLOAT;
       else
 	ret = 0;
       break;
@@ -285,48 +275,50 @@ static struct htab *cfi_f_htab = NULL;
 void
 loongarch_after_parse_args ()
 {
-  /* Set default ABI/ISA LP64D.  */
-  if (!LARCH_opts.ase_ilp32)
+  if (strcmp (default_arch, "loongarch64") == 0)
     {
-      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_ilp32 = 1;
+      LARCH_opts.ase_lp64 = 1;
     }
+  else if (strcmp (default_arch, "loongarch32") == 0)
+    {
+      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)
+  /* Set default double-float ABI.  */
+  if (!LARCH_opts.ase_abi)
+    LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
+
+  if (LARCH_opts.ase_abi == EF_LOONGARCH_ABI_SOFT_FLOAT)
+    LARCH_opts.ase_nf = 1;
+  else if (LARCH_opts.ase_abi == EF_LOONGARCH_ABI_SINGLE_FLOAT)
     {
       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;
     }
+  else if (LARCH_opts.ase_abi == EF_LOONGARCH_ABI_DOUBLE_FLOAT)
+   {
+      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;
+   }
 
-  size_t i;
+  LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1;
 
-  assert(LARCH_opts.ase_ilp32);
+  size_t i;
 
-  /* Init ilp32/lp64 registers names.  */
   if (!r_htab)
     r_htab = str_htab_create ();
   if (!r_deprecated_htab)
     r_deprecated_htab = str_htab_create ();
-  /* Init cfi registers alias.  */
   if (!cfi_r_htab)
     cfi_r_htab = str_htab_create ();
 
@@ -336,7 +328,7 @@ loongarch_after_parse_args ()
       str_hash_insert_int (r_htab, loongarch_r_normal_name[i], i, 0);
       str_hash_insert_int (cfi_r_htab, loongarch_r_normal_name[i], i, 0);
     }
-  /* Init ilp32/lp64 registers alias.  */
+
   r_abi_names = loongarch_r_alias;
   for (i = 0; i < ARRAY_SIZE (loongarch_r_alias); i++)
     {
@@ -351,7 +343,6 @@ loongarch_after_parse_args ()
     str_hash_insert_int (r_deprecated_htab, loongarch_r_alias_deprecated[i],
 			 i, 0);
 
-  /* The .cfi directive supports register aliases without the "$" prefix.  */
   for (i = 0; i < ARRAY_SIZE (loongarch_r_cfi_name); i++)
     {
       str_hash_insert_int (cfi_r_htab, loongarch_r_cfi_name[i], i, 0);
@@ -380,7 +371,7 @@ loongarch_after_parse_args ()
 	  str_hash_insert_int (f_htab, loongarch_f_normal_name[i], i, 0);
 	  str_hash_insert_int (cfi_f_htab, loongarch_f_normal_name[i], i, 0);
 	}
-      /* Init float-ilp32/lp64 registers alias.  */
+
       f_abi_names = loongarch_f_alias;
       for (i = 0; i < ARRAY_SIZE (loongarch_f_alias); i++)
 	{
@@ -391,12 +382,12 @@ loongarch_after_parse_args ()
 	str_hash_insert_int (f_deprecated_htab, loongarch_f_alias_deprecated[i],
 			     i, 0);
 
-  /* The .cfi directive supports register aliases without the "$" prefix.  */
-  for (i = 0; i < ARRAY_SIZE (loongarch_f_cfi_name); i++)
-    {
-      str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name[i], i, 0);
-      str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name_alias[i], i, 0);
-    }
+      /* The .cfi directive supports register aliases without the "$" prefix.  */
+      for (i = 0; i < ARRAY_SIZE (loongarch_f_cfi_name); i++)
+	{
+	  str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name[i], i, 0);
+	  str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name_alias[i], i, 0);
+	}
 
       if (!fc_htab)
 	fc_htab = str_htab_create ();
@@ -415,7 +406,6 @@ loongarch_after_parse_args ()
 
       for (i = 0; i < ARRAY_SIZE (loongarch_c_normal_name); i++)
 	str_hash_insert_int (c_htab, loongarch_c_normal_name[i], i, 0);
-
     }
 
   /* Init lsx registers names.  */
@@ -427,7 +417,7 @@ loongarch_after_parse_args ()
 	str_hash_insert_int (v_htab, loongarch_v_normal_name[i], i, 0);
     }
 
-  /* Init lasx registers names.  */
+  /* Init lssx registers names.  */
   if (LARCH_opts.ase_lasx)
     {
       if (!x_htab)
@@ -435,7 +425,6 @@ loongarch_after_parse_args ()
       for (i = 0; i < ARRAY_SIZE (loongarch_x_normal_name); i++)
 	str_hash_insert_int (x_htab, loongarch_x_normal_name[i], i, 0);
     }
-
 }
 
 const char *
-- 
2.34.1



More information about the Binutils mailing list