From 2098bacc79e49403992cd7c618a0df5f3eaf2afa Mon Sep 17 00:00:00 2001 From: Chao-ying Fu Date: Fri, 18 Oct 2013 21:14:24 +0000 Subject: 2013-10-18 Chao-ying Fu * 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 | 6 ++++++ gas/config/tc-mips.c | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'gas') 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 + + * 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 * 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); -- cgit v1.2.1