> -----Original Message-----
> From: Richard Sandiford [mailto:[email protected]]
> Sent: Thursday, October 10, 2013 1:21 PM
> To: Moore, Catherine
> Cc: [email protected]
> Subject: Re: [PATCH] Workaround errata for the PMC-Sierra RM7000 cpu.
>
> "Moore, Catherine" <[email protected]> writes:
> >> -----Original Message-----
> >> From: Richard Sandiford [mailto:[email protected]]
> >> Subject: Re: [PATCH] Workaround errata for the PMC-Sierra RM7000 cpu.
> >>
> >> "Moore, Catherine" <[email protected]> writes:
> >> > Hi Richard,
> >> >
> >> > This patch implements a workaround for errors on the PMC-Sierra
> >> > RM7000 cpu while executing the dmult or dmultu instruction. The
> >> > workaround is to insert three nops after the dmult/dmultu.
> >>
> >> Do you have any more details? E.g. does "dmult $4,$5;addiu $6,$7,1"
> >> cause problems? The VR41xx series had errata like these, but it was
> >> always between the multiplication and other references to HI/LO.
> >
> > I've attached documentation describing the errata. The problem occurs
> > with dmult/dmultu followed by a load.
>
> Thanks.
>
> >> Normally we've handled this by getting the assembler to insert the
> >> nops and compiling in .set reorder mode. That copes with inline asms too.
> >> I'm not opposed to doing it differently if there's a specific reason
> >> though.
> >
> > No specific reason. Let me know if we need to change the
> implementation.
>
> The assembler's probably best, all other things being equal.
>
> Ideally opcodes/mips*.c would have a flag to mark load instructions, but all
> we have at the moment are flags to mark load delays, which means that LD
> and some other load instructions don't have them. So I can think of three
> options:
>
> (1) Turn INSN_LOAD_MEMORY_DELAY into INSN_LOAD_GPR and
> INSN_COPRO_MEMORY_DELAY into INSN_LOAD_COPRO. Add the flags to
> all
> loads in the opcode table that don't currently have one.
>
> This would be the best approach, but I can understand why it might
> seem like too much effort.
>
I've decided to go with this approach and will post the patches to the binutils
mailing list. I'll follow up here with the recognition of the mfix-pmc option
by the driver program.
> (2) Stick with inserting three nops regardless. This could be done by
> making insns_between return 3 for insn1 being DMULT(U), regardless
> of insn2.
>
> (3) A slightly hacky approach would be to do (2), but check for memory
> instructions using:
>
> (insn2 == NULL || strchr (insn2->insn_mo->args, '('))
>
> That would conservatively match prefetches and stores too, but would
> at least avoid the nops in some cases. It's probably not worth the
> risk or hackiness though.
>
> Thanks,
> Richard