Previously, FCSRs were referred to as $rX, which seemed strange.
We refer to FCSRs as $fcsrX, which ensures compatibility with LLVM
IAS as well.
gas/ChangeLog:
* config/tc-loongarch.c:
(loongarch_fc_normal_name): New definition.
(loongarch_fc_numeric_name): New definition.
(loongarch_single_float_opcodes): Modify `movgr2fcsr` and
`movfcsr2gr`.
testsuite/gas/loongarch/float_op.d: Likewise.
testsuite/gas/loongarch/float_op.s: Likewise.
include/ChangeLog:
* opcode/loongarch.h:
(loongarch_fc_normal_name): New extern.
(loongarch_fc_numeric_name): New extern.
opcodes/ChangeLog:
* opcodes/loongarch-dis.c (loongarch_after_parse_args): Support
referring to FCSRs as $fcsrX.
* opcodes/loongarch-opc.c (loongarch_args_parser_can_match_arg_helper):
Likewise.
Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
static struct htab *r_htab = NULL;
static struct htab *f_htab = NULL;
+static struct htab *fc_htab = NULL;
+static struct htab *fcn_htab = NULL;
static struct htab *c_htab = NULL;
static struct htab *cr_htab = NULL;
static struct htab *v_htab = NULL;
str_hash_insert (f_htab, loongarch_f_normal_name[i], (void *) (i + 1),
0);
+ if (!fc_htab)
+ fc_htab = str_htab_create (), str_hash_insert (fc_htab, "", 0, 0);
+
+ for (i = 0; i < ARRAY_SIZE (loongarch_fc_normal_name); i++)
+ str_hash_insert (fc_htab, loongarch_fc_normal_name[i], (void *) (i + 1),
+ 0);
+
+ if (!fcn_htab)
+ fcn_htab = str_htab_create (), str_hash_insert (fcn_htab, "", 0, 0);
+
+ for (i = 0; i < ARRAY_SIZE (loongarch_fc_numeric_name); i++)
+ str_hash_insert (fcn_htab, loongarch_fc_numeric_name[i], (void *) (i + 1),
+ 0);
+
if (!c_htab)
c_htab = str_htab_create (), str_hash_insert (c_htab, "", 0, 0);
ret = imm - 1;
break;
case 'f':
- imm = (intptr_t) str_hash_find (f_htab, arg);
+ switch (esc_ch2)
+ {
+ case 'c':
+ imm = (intptr_t) str_hash_find (fc_htab, arg);
+ if (0 >= imm)
+ {
+ imm = (intptr_t) str_hash_find (fcn_htab, arg);
+ }
+ break;
+ default:
+ imm = (intptr_t) str_hash_find (f_htab, arg);
+ }
ip->match_now = 0 < imm;
ret = imm - 1;
break;
[ ]+9c:[ ]+0114b424 [ ]+movfr2gr.s[ ]+[ ]+\$a0, \$fa1
[ ]+a0:[ ]+0114b824 [ ]+movfr2gr.d[ ]+[ ]+\$a0, \$fa1
[ ]+a4:[ ]+0114bc24 [ ]+movfrh2gr.s [ ]+\$a0, \$fa1
-[ ]+a8:[ ]+0114c0a4 [ ]+movgr2fcsr[ ]+[ ]+\$a0, \$a1
-[ ]+ac:[ ]+0114c8a4 [ ]+movfcsr2gr[ ]+[ ]+\$a0, \$a1
+[ ]+a8:[ ]+0114c0a0 [ ]+movgr2fcsr[ ]+[ ]+\$fcsr0, \$a1
+[ ]+ac:[ ]+0114c804 [ ]+movfcsr2gr[ ]+[ ]+\$a0, \$fcsr0
[ ]+b0:[ ]+0114d020 [ ]+movfr2cf[ ]+[ ]+\$fcc0, \$fa1
[ ]+b4:[ ]+0114d4a0 [ ]+movcf2fr[ ]+[ ]+\$fa0, \$fcc5
[ ]+b8:[ ]+0114d8a0 [ ]+movgr2cf[ ]+[ ]+\$fcc0, \$a1
movfr2gr.s $r4,$f1
movfr2gr.d $r4,$f1
movfrh2gr.s $r4,$f1
-movgr2fcsr $r4,$r5
-movfcsr2gr $r4,$r5
+movgr2fcsr $fcsr0,$r5
+movfcsr2gr $r4,$fcsr0
movfr2cf $fcc0,$f1
movcf2fr $f0,$fcc5
movgr2cf $fcc0,$r5
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_fc_normal_name[4];
+ extern const char *const loongarch_fc_numeric_name[4];
extern const char *const loongarch_c_normal_name[8];
extern const char *const loongarch_cr_normal_name[4];
extern const char *const loongarch_v_normal_name[32];
static const char *const *loongarch_r_disname = NULL;
static const char *const *loongarch_f_disname = NULL;
+static const char *const *loongarch_fc_disname = NULL;
static const char *const *loongarch_c_disname = NULL;
static const char *const *loongarch_cr_disname = NULL;
static const char *const *loongarch_v_disname = NULL;
loongarch_r_disname = loongarch_r_lp64_name;
loongarch_f_disname = loongarch_f_lp64_name;
+ loongarch_fc_disname = loongarch_fc_normal_name;
loongarch_c_disname = loongarch_c_normal_name;
loongarch_cr_disname = loongarch_cr_normal_name;
loongarch_v_disname = loongarch_v_normal_name;
info->fprintf_func (info->stream, "%s", loongarch_r_disname[u_imm]);
break;
case 'f':
- info->fprintf_func (info->stream, "%s", loongarch_f_disname[u_imm]);
+ switch (esc2)
+ {
+ case 'c':
+ info->fprintf_func (info->stream, "%s", loongarch_fc_disname[u_imm]);
+ break;
+ default:
+ info->fprintf_func (info->stream, "%s", loongarch_f_disname[u_imm]);
+ }
break;
case 'c':
switch (esc2)
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
};
+const char *const loongarch_fc_normal_name[4] =
+{
+ "$fcsr0", "$fcsr1", "$fcsr2", "$fcsr3",
+};
+
+const char *const loongarch_fc_numeric_name[4] =
+{
+ "$r0", "$r1", "$r2", "$r3",
+};
+
const char *const loongarch_c_normal_name[8] =
{
"$fcc0", "$fcc1", "$fcc2", "$fcc3", "$fcc4", "$fcc5", "$fcc6", "$fcc7",
{ 0x0114ac00, 0xfffffc00, "movgr2frh.w", "f0:5,r5:5", 0, 0, 0, 0 },
{ 0x0114b400, 0xfffffc00, "movfr2gr.s", "r0:5,f5:5", 0, 0, 0, 0 },
{ 0x0114bc00, 0xfffffc00, "movfrh2gr.s", "r0:5,f5:5", 0, 0, 0, 0 },
- { 0x0114c000, 0xfffffc00, "movgr2fcsr", "r0:5,r5:5", 0, 0, 0, 0 },
- { 0x0114c800, 0xfffffc00, "movfcsr2gr", "r0:5,r5:5", 0, 0, 0, 0 },
+ { 0x0114c000, 0xfffffc1c, "movgr2fcsr", "fc0:2,r5:5", 0, 0, 0, 0 },
+ { 0x0114c800, 0xffffff80, "movfcsr2gr", "r0:5,fc5:2", 0, 0, 0, 0 },
{ 0x0114d000, 0xfffffc18, "movfr2cf", "c0:3,f5:5", 0, 0, 0, 0 },
{ 0x0114d400, 0xffffff00, "movcf2fr", "f0:5,c5:3", 0, 0, 0, 0 },
{ 0x0114d800, 0xfffffc18, "movgr2cf", "c0:3,r5:5", 0, 0, 0, 0 },