2013-10-18 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
authorChao-ying Fu <fu@mips.com>
Fri, 18 Oct 2013 21:14:25 +0000 (21:14 +0000)
committerChao-ying Fu <fu@mips.com>
Fri, 18 Oct 2013 21:14:25 +0000 (21:14 +0000)
* 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.

gas/ChangeLog
gas/config/tc-mips.c

index 25c1503d8f3ffd9610739fcd7a210a98b5cbb7c5..1490eeaf943ef2880fdb4297f4faf59e08087b8d 100644 (file)
@@ -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.
index 5741d3e1243b03f6df5cb8fa9999cfccbd961aa4..08ad7bab665b38133913336ae204d0d1033c6969 100644 (file)
@@ -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);