return ret;
}
+static const char *const *r_abi_names = NULL;
+static const char *const *f_abi_names = NULL;
static struct htab *r_htab = NULL;
+static struct htab *r_deprecated_htab = NULL;
static struct htab *f_htab = NULL;
+static struct htab *f_deprecated_htab = NULL;
static struct htab *fc_htab = NULL;
static struct htab *fcn_htab = NULL;
static struct htab *c_htab = NULL;
/* Init ilp32/lp64 registers names. */
if (!r_htab)
r_htab = str_htab_create (), str_hash_insert (r_htab, "", 0, 0);
+ if (!r_deprecated_htab)
+ r_deprecated_htab = str_htab_create (),
+ str_hash_insert (r_deprecated_htab, "", 0, 0);
+ r_abi_names = loongarch_r_normal_name;
for (i = 0; i < ARRAY_SIZE (loongarch_r_normal_name); i++)
str_hash_insert (r_htab, loongarch_r_normal_name[i], (void *) (i + 1), 0);
{
if (!f_htab)
f_htab = str_htab_create (), str_hash_insert (f_htab, "", 0, 0);
+ if (!f_deprecated_htab)
+ f_deprecated_htab = str_htab_create (),
+ str_hash_insert (f_deprecated_htab, "", 0, 0);
+ f_abi_names = loongarch_f_normal_name;
for (i = 0; i < ARRAY_SIZE (loongarch_f_normal_name); i++)
str_hash_insert (f_htab, loongarch_f_normal_name[i], (void *) (i + 1),
0);
/* Init lp64 registers alias. */
if (LARCH_opts.ase_lp64)
{
+ r_abi_names = loongarch_r_lp64_name;
for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name); i++)
str_hash_insert (r_htab, loongarch_r_lp64_name[i], (void *) (i + 1),
0);
- for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name1); i++)
- str_hash_insert (r_htab, loongarch_r_lp64_name1[i], (void *) (i + 1),
- 0);
+ for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name_deprecated); i++)
+ str_hash_insert (r_deprecated_htab, loongarch_r_lp64_name_deprecated[i],
+ (void *) (i + 1), 0);
}
/* Init float-lp64 registers alias */
if ((LARCH_opts.ase_sf || LARCH_opts.ase_df) && LARCH_opts.ase_lp64)
{
+ f_abi_names = loongarch_f_lp64_name;
for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name); i++)
str_hash_insert (f_htab, loongarch_f_lp64_name[i],
(void *) (i + 1), 0);
- for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name1); i++)
- str_hash_insert (f_htab, loongarch_f_lp64_name1[i],
+ for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name_deprecated); i++)
+ str_hash_insert (f_deprecated_htab, loongarch_f_lp64_name_deprecated[i],
(void *) (i + 1), 0);
}
}
imm = (intptr_t) str_hash_find (r_htab, arg);
ip->match_now = 0 < imm;
ret = imm - 1;
+ if (ip->match_now)
+ break;
+ /* Handle potential usage of deprecated register aliases. */
+ imm = (intptr_t) str_hash_find (r_deprecated_htab, arg);
+ ip->match_now = 0 < imm;
+ ret = imm - 1;
+ if (ip->match_now && !ip->macro_id)
+ as_warn (_("register alias %s is deprecated, use %s instead"),
+ arg, r_abi_names[ret]);
break;
case 'f':
switch (esc_ch2)
}
ip->match_now = 0 < imm;
ret = imm - 1;
+ if (ip->match_now && !ip->macro_id)
+ break;
+ /* Handle potential usage of deprecated register aliases. */
+ imm = (intptr_t) str_hash_find (f_deprecated_htab, arg);
+ ip->match_now = 0 < imm;
+ ret = imm - 1;
+ if (ip->match_now)
+ as_warn (_("register alias %s is deprecated, use %s instead"),
+ arg, f_abi_names[ret]);
break;
case 'c':
switch (esc_ch2)
--- /dev/null
+#name: Deprecated register aliases
+#as-new:
+#objdump: -d
+#warning_output: deprecated_reg_aliases.l
+#skip: loongarch32-*-*
+
+.*:[ ]+file format .*
+
+
+Disassembly of section .text:
+
+0000000000000000 <foo>:
+[ ]+0:[ ]+14acf125[ ]+lu12i\.w[ ]+\$a1, 354185
+[ ]+4:[ ]+038048a5[ ]+ori[ ]+\$a1, \$a1, 0x12
+[ ]+8:[ ]+16024685[ ]+lu32i\.d[ ]+\$a1, 4660
+[ ]+c:[ ]+08200420[ ]+fmadd\.d[ ]+\$fa0, \$fa1, \$fa1, \$fa0
+[ ]+10:[ ]+380c16a4[ ]+ldx\.d[ ]+\$a0, \$r21, \$a1
+[ ]+14:[ ]+4c000020[ ]+ret[ ]+
--- /dev/null
+.*Assembler messages:
+.*:2: Warning: register alias \$v1 is deprecated, use \$a1 instead
+.*:3: Warning: register alias \$fv0 is deprecated, use \$fa0 instead
+.*:3: Warning: register alias \$fv1 is deprecated, use \$fa1 instead
+.*:3: Warning: register alias \$fv1 is deprecated, use \$fa1 instead
+.*:4: Warning: register alias \$v0 is deprecated, use \$a0 instead
+.*:4: Warning: register alias \$x is deprecated, use \$r21 instead
--- /dev/null
+foo:
+ li.d $v1, 0x123456789012
+ fmadd.d $fv0, $fv1, $fv1, $fa0
+ ldx.d $v0, $x, $a1
+ ret
extern const char *const loongarch_r_normal_name[32];
extern const char *const loongarch_r_lp64_name[32];
- extern const char *const loongarch_r_lp64_name1[32];
+ extern const char *const loongarch_r_lp64_name_deprecated[32];
extern const char *const loongarch_f_normal_name[32];
extern const char *const loongarch_f_lp64_name[32];
- extern const char *const loongarch_f_lp64_name1[32];
+ extern const char *const loongarch_f_lp64_name_deprecated[32];
extern const char *const loongarch_fc_normal_name[4];
extern const char *const loongarch_fc_numeric_name[4];
extern const char *const loongarch_c_normal_name[8];
{
"$zero", "$ra", "$tp", "$sp", "$a0", "$a1", "$a2", "$a3",
"$a4", "$a5", "$a6", "$a7", "$t0", "$t1", "$t2", "$t3",
- "$t4", "$t5", "$t6", "$t7", "$t8", "$x", "$fp", "$s0",
+ "$t4", "$t5", "$t6", "$t7", "$t8", "$r21","$fp", "$s0",
"$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7", "$s8",
};
-const char *const loongarch_r_lp64_name1[32] =
+const char *const loongarch_r_lp64_name_deprecated[32] =
{
"", "", "", "", "$v0", "$v1", "", "", "", "", "", "", "", "", "", "",
- "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "$x", "", "", "", "", "", "", "", "", "", "",
};
const char *const loongarch_f_normal_name[32] =
"$fs0", "$fs1", "$fs2", "$fs3", "$fs4", "$fs5", "$fs6", "$fs7",
};
-const char *const loongarch_f_lp64_name1[32] =
+const char *const loongarch_f_lp64_name_deprecated[32] =
{
"$fv0", "$fv1", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",