On Mon, 2013-06-10 at 23:13 +0100, Maciej W. Rozycki wrote:
> On Mon, 10 Jun 2013, Steve Ellcey wrote:
>
> > We found a bug in the micromips implementation where the branch delay slot
> > was not getting filled for micromips. You can reproduce this with a program
> > that just has an empty main function. Andrew Bennett created this fix for
> > it and we would like to check it in. I am submitting it for Andrew since he
> > doesn't have write access.
>
> Your fix aside shouldn't empty main expand simply to:
>
> jrc $ra
>
> ? There's no delay slot there.
Sorry, it should have been 'main(void) {return 0; }. Then you get (with
the patch):
j $31
move $2,$0
instead of:
move $2,$0
j $31
> > diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
> > index 2fdc79d..f18ab50 100644
> > --- a/gcc/config/mips/mips.md
> > +++ b/gcc/config/mips/mips.md
> > @@ -704,7 +704,9 @@
> >
> > ;; Is it a single instruction?
> > (define_attr "single_insn" "no,yes"
> > - (symbol_ref "(get_attr_length (insn) == (TARGET_MIPS16 ? 2 : 4)
> > + (symbol_ref "(((TARGET_MIPS16 || TARGET_MICROMIPS)
> > + && get_attr_length (insn) == 2)
> > + || (!TARGET_MIPS16 && get_attr_length (insn) == 4)
> > ? SINGLE_INSN_YES : SINGLE_INSN_NO)"))
>
> Is it safe to assume an RTL insn whose length is 4 has only a single
> machine instruction in the microMIPS mode? What's the difference to the
> MIPS16 instruction set here?
>
> Maciej
I think so, I don't know of any microMIPS RTL instructions whose length
is 4 that would not be a single instruction. Maybe I should add
Catherine in to the discussion to see if she knows differently.
Steve Ellcey
[email protected]