> -----Original Message----- > From: Richard Sandiford [mailto:rdsandif...@googlemail.com] > Sent: Saturday, April 12, 2014 6:41 AM > To: Matthew Fortune > Cc: Moore, Catherine; gcc-patches@gcc.gnu.org; rguent...@suse.de; > ja...@redhat.com > Subject: Re: [PATCH] [MIPS] Fix operands for microMIPS SW16, SH16 and > SB16 > > Richard Sandiford <rdsandif...@googlemail.com> writes: > > Matthew Fortune <matthew.fort...@imgtec.com> writes: > >> Hi Catherine/Richard, > >> > >> I think there may be some impact on register move costs by > >> introducing this class. > > > > Yeah, I was worried about that too. I'm going to do some code > > comparison tests for SE and MIPS16 to see what happens. > > OK, I compared the .s testsuite output for -O, -O2, -O3, -Os, "-O -mips16 - > mabi=32" and "-Os -mips16 -mabi=32" on mips64-linux-gnu. > I also tried CSiBE with -O2 and "-Os -mips16 -mabi=32". The code was > identical in all cases so I think we should be OK. > > I went ahead and applied the adjusted version of the patch to trunk as below > (because I wanted to add a testcase too).
Thanks for doing this. > > Adding a new register class is definitely a bit invasive for this stage of > 4.9. > OTOH microMIPS is a new feature and it would be good to have it working in > 4.9.0. Since the testing suggests that the patch really doesn't affect non- > microMIPS code, I'd like it to go in 4.9 now. > Richard, Jakub, would that be OK? > Okay, understood. Will wait to hear. > > > gcc/ > 2014-04-12 Catherine Moore <c...@codesourcery.com> > > * config/mips/constraints.md: Add new register constraint "kb". > * config/mips/mips.md (*mov<mode>_internal): Use constraint > "kb". > (*movhi_internal): Likewise. > (*movqi_internal): Likewise. > * config/mips/mips.h (M16_STORE_REGS): New register class. > (REG_CLASS_NAMES): Add M16_STORE_REGS. > (REG_CLASS_CONTENTS): Likewise. > * config/mips/mips.c (mips_regno_to_class): Add > M16_STORE_REGS. > > gcc/testsuite/ > * gcc.target/mips/umips-store16-1.c: New test. > > Index: gcc/config/mips/constraints.md > ========================================================== > ========= > --- gcc/config/mips/constraints.md 2014-04-12 10:36:09.105788710 +0100 > +++ gcc/config/mips/constraints.md 2014-04-12 10:38:48.895224932 +0100 > @@ -92,6 +92,9 @@ (define_register_constraint "D" "COP3_RE ;; but the > DSP version allows any accumulator target. > (define_register_constraint "ka" "ISA_HAS_DSP_MULT ? ACC_REGS : > MD_REGS") > > +(define_register_constraint "kb" "M16_STORE_REGS" > + "@internal") > + > (define_constraint "kf" > "@internal" > (match_operand 0 "force_to_mem_operand")) > Index: gcc/config/mips/mips.md > ========================================================== > ========= > --- gcc/config/mips/mips.md 2014-04-12 10:36:09.105788710 +0100 > +++ gcc/config/mips/mips.md 2014-04-12 10:38:48.925225200 +0100 > @@ -4437,7 +4437,7 @@ (define_expand "mov<mode>" > > (define_insn "*mov<mode>_internal" > [(set (match_operand:IMOVE32 0 "nonimmediate_operand" > "=d,!u,!u,d,e,!u,!ks,d,ZS,ZT,m,*f,*f,*d,*m,*d,*z,*a,*d,*B*C*D,*B*C*D,*d, > *m") > - (match_operand:IMOVE32 1 "move_operand" > "d,J,Udb7,Yd,Yf,ZT,ZS,m,!ks,!u,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*a,*d,*m,*B*C > *D,*B*C*D"))] > + (match_operand:IMOVE32 1 "move_operand" > +"d,J,Udb7,Yd,Yf,ZT,ZS,m,!ks,!kb,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*a,*d,*m,*B > +*C*D,*B*C*D"))] > "!TARGET_MIPS16 > && (register_operand (operands[0], <MODE>mode) > || reg_or_0_operand (operands[1], <MODE>mode))" > @@ -4578,7 +4578,7 @@ (define_expand "movhi" > > (define_insn "*movhi_internal" > [(set (match_operand:HI 0 "nonimmediate_operand" > "=d,!u,d,!u,d,ZU,m,*a,*d") > - (match_operand:HI 1 "move_operand" > "d,J,I,ZU,m,!u,dJ,*d*J,*a"))] > + (match_operand:HI 1 "move_operand" > "d,J,I,ZU,m,!kb,dJ,*d*J,*a"))] > "!TARGET_MIPS16 > && (register_operand (operands[0], HImode) > || reg_or_0_operand (operands[1], HImode))" > @@ -4654,7 +4654,7 @@ (define_expand "movqi" > > (define_insn "*movqi_internal" > [(set (match_operand:QI 0 "nonimmediate_operand" > "=d,!u,d,!u,d,ZV,m,*a,*d") > - (match_operand:QI 1 "move_operand" > "d,J,I,ZW,m,!u,dJ,*d*J,*a"))] > + (match_operand:QI 1 "move_operand" > "d,J,I,ZW,m,!kb,dJ,*d*J,*a"))] > "!TARGET_MIPS16 > && (register_operand (operands[0], QImode) > || reg_or_0_operand (operands[1], QImode))" > Index: gcc/config/mips/mips.h > ========================================================== > ========= > --- gcc/config/mips/mips.h 2014-04-12 10:36:09.105788710 +0100 > +++ gcc/config/mips/mips.h 2014-04-12 10:38:48.924225191 +0100 > @@ -1870,6 +1870,7 @@ #define PIC_OFFSET_TABLE_REGNUM \ enum > reg_class { > NO_REGS, /* no registers in set */ > + M16_STORE_REGS, /* microMIPS store registers */ > M16_REGS, /* mips16 directly accessible registers */ > T_REG, /* mips16 T register ($24) */ > M16_T_REGS, /* mips16 registers plus T register */ > @@ -1907,6 +1908,7 @@ #define GENERAL_REGS GR_REGS > #define REG_CLASS_NAMES > \ > { \ > "NO_REGS", \ > + "M16_STORE_REGS", > \ > "M16_REGS", > \ > "T_REG", \ > "M16_T_REGS", > \ > @@ -1947,6 +1949,7 @@ #define REG_CLASS_NAMES > \ > #define REG_CLASS_CONTENTS > \ > { > \ > { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, > 0x00000000 }, /* NO_REGS */ \ > + { 0x000200fc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, > 0x00000000 }, /* M16_STORE_REGS */ \ > { 0x000300fc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 > }, /* M16_REGS */ \ > { 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, > 0x00000000 }, /* T_REG */ \ > { 0x010300fc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 > }, /* M16_T_REGS */ \ > Index: gcc/config/mips/mips.c > ========================================================== > ========= > --- gcc/config/mips/mips.c 2014-04-12 10:36:09.105788710 +0100 > +++ gcc/config/mips/mips.c 2014-04-12 10:38:48.923225182 +0100 > @@ -648,14 +648,15 @@ struct target_globals *mips16_globals; > > /* Index R is the smallest register class that contains register R. */ > const > enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = { > - LEA_REGS, LEA_REGS, M16_REGS, V1_REG, > - M16_REGS, M16_REGS, M16_REGS, M16_REGS, > - LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > - LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > - M16_REGS, M16_REGS, LEA_REGS, LEA_REGS, > - LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > - T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS, > - LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > + LEA_REGS, LEA_REGS, M16_STORE_REGS, V1_REG, > + M16_STORE_REGS, M16_STORE_REGS, M16_STORE_REGS, > M16_STORE_REGS, > + LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > + LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > + M16_REGS, M16_STORE_REGS, LEA_REGS, LEA_REGS, > + LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > + T_REG, PIC_FN_ADDR_REG, LEA_REGS, LEA_REGS, > + LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS, > + > FP_REGS, FP_REGS, FP_REGS, FP_REGS, > FP_REGS, FP_REGS, FP_REGS, FP_REGS, > FP_REGS, FP_REGS, FP_REGS, FP_REGS, > Index: gcc/testsuite/gcc.target/mips/umips-store16-1.c > ========================================================== > ========= > --- /dev/null 2014-04-11 11:50:02.034263237 +0100 > +++ gcc/testsuite/gcc.target/mips/umips-store16-1.c 2014-04-12 > 10:38:48.926225209 +0100 > @@ -0,0 +1,30 @@ > +/* { dg-options "(-mmicromips)" } */ > +/* { dg-do assemble } */ > + > +register unsigned int global asm ("$16"); > + > +extern void exit (int) __attribute__((noreturn)); > + > +MICROMIPS void > +test_sb (unsigned char *ptr, void (*f) (void)) { > + ptr[0] = global; > + f (); > + exit (0); > +} > + > +MICROMIPS void > +test_sh (unsigned short *ptr, void (*f) (void)) { > + ptr[0] = global; > + f (); > + exit (0); > +} > + > +MICROMIPS void > +test_sw (unsigned int *ptr, void (*f) (void)) { > + ptr[0] = global; > + f (); > + exit (0); > +}