+Thu Sep 2 10:43:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
+
+ * config/tc-mips.c (macro): If $0 is destination of divide, just
+ generate the simple machine instruction, for compatibility with
+ the MIPS assembler.
+
Wed Sep 1 15:56:42 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
* write.c (write_relocs) [RELOC_EXPANSION_POSSIBLE]: Declare
((prev_insn.insn_opcode >> OP_SH_RD)
& OP_MASK_RD),
0))
+ /* If the branch writes a register that the previous
+ instruction sets, we can not swap (we know that
+ branches write only to RD or to $31). */
+ || ((prev_insn.insn_mo->pinfo & INSN_WRITE_GPR_T)
+ && (((ip->insn_mo->pinfo & INSN_WRITE_GPR_D)
+ && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
+ == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
+ || ((ip->insn_mo->pinfo & INSN_WRITE_GPR_31)
+ && (((prev_insn.insn_opcode >> OP_SH_RT)
+ & OP_MASK_RT)
+ == 31))))
+ || ((prev_insn.insn_mo->pinfo & INSN_WRITE_GPR_D)
+ && (((ip->insn_mo->pinfo & INSN_WRITE_GPR_D)
+ && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
+ == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
+ || ((ip->insn_mo->pinfo & INSN_WRITE_GPR_31)
+ && (((prev_insn.insn_opcode >> OP_SH_RD)
+ & OP_MASK_RD)
+ == 31))))
/* If the branch writes a register that the previous
instruction reads, we can not swap (we know that
branches only write to RD or to $31). */
macro_build (&icnt, NULL, "break", "c", 7);
return;
}
+ if (dreg == 0)
+ {
+ /* The MIPS assembler treats a destination of $0 as a
+ request for just the machine instruction. */
+ macro_build (&icnt, NULL,
+ dbl ? "ddiv" : "div",
+ "s,t", sreg, treg);
+ return;
+ }
mips_emit_delays ();
++mips_noreorder;
assert (S_GET_SEGMENT (insn_label) == now_seg);
insn_label->sy_frag = frag_now;
S_SET_VALUE (insn_label, frag_now_fix ());
+ insn_label = NULL;
}
}
int append_zero;
{
mips_emit_delays ();
+ insn_label = NULL;
stringer (append_zero);
}
mips_emit_delays ();
if (log_size > 0 && auto_align)
mips_align (log_size, 0);
+ insn_label = NULL;
cons (1 << log_size);
}
else
mips_align (2, 0);
+ insn_label = NULL;
+
float_cons (type);
}
int param;
{
mips_emit_delays ();
+ insn_label = NULL;
s_space (param);
}