summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChao-ying Fu <fu@mips.com>2013-10-18 21:14:24 +0000
committerChao-ying Fu <fu@mips.com>2013-10-18 21:14:24 +0000
commit2098bacc79e49403992cd7c618a0df5f3eaf2afa (patch)
tree47455acebf32cc0a499f98a40f8b4a36431d96d0
parentea267a8c8bd1216bc1a6e274a6d255b90237de99 (diff)
downloadbinutils-redhat-2098bacc79e49403992cd7c618a0df5f3eaf2afa.tar.gz
2013-10-18 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
* config/tc-mips.c (fpr_read_mask): Test MSA registers. (fpr_write_mask): Test MSA registers. (can_swap_branch_p): Check fpr write followed by fpr read.
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-mips.c12
2 files changed, 16 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 25c1503d8f..1490eeaf94 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2013-10-18 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
+
+ * config/tc-mips.c (fpr_read_mask): Test MSA registers.
+ (fpr_write_mask): Test MSA registers.
+ (can_swap_branch_p): Check fpr write followed by fpr read.
+
2013-10-18 Nick Clifton <nickc@redhat.com>
* config/tc-tic6x.c (tic6x_parse_operand): Revert previous delta.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 5741d3e124..08ad7bab66 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -4161,7 +4161,8 @@ fpr_read_mask (const struct mips_cl_insn *ip)
unsigned long pinfo;
unsigned int mask;
- mask = insn_reg_mask (ip, (1 << OP_REG_FP) | (1 << OP_REG_VEC),
+ mask = insn_reg_mask (ip, ((1 << OP_REG_FP) | (1 << OP_REG_VEC)
+ | (1 << OP_REG_MSA)),
insn_read_mask (ip->insn_mo));
pinfo = ip->insn_mo->pinfo;
/* Conservatively treat all operands to an FP_D instruction are doubles.
@@ -4179,7 +4180,8 @@ fpr_write_mask (const struct mips_cl_insn *ip)
unsigned long pinfo;
unsigned int mask;
- mask = insn_reg_mask (ip, (1 << OP_REG_FP) | (1 << OP_REG_VEC),
+ mask = insn_reg_mask (ip, ((1 << OP_REG_FP) | (1 << OP_REG_VEC)
+ | (1 << OP_REG_MSA)),
insn_write_mask (ip->insn_mo));
pinfo = ip->insn_mo->pinfo;
/* Conservatively treat all operands to an FP_D instruction are doubles.
@@ -6070,6 +6072,7 @@ can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
{
unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
+ unsigned int fpr_read, prev_fpr_write;
/* -O2 and above is required for this optimization. */
if (mips_optimize < 2)
@@ -6144,6 +6147,11 @@ can_swap_branch_p (struct mips_cl_insn *ip, expressionS *address_expr,
if (gpr_read & prev_gpr_write)
return FALSE;
+ fpr_read = fpr_read_mask (ip);
+ prev_fpr_write = fpr_write_mask (&history[0]);
+ if (fpr_read & prev_fpr_write)
+ return FALSE;
+
/* If the branch writes a register that the previous
instruction sets, we can not swap. */
gpr_write = gpr_write_mask (ip);