This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH]: R10000 Needs LL/SC Workaround in Gcc


Richard Sandiford wrote:

As Maciej said, this should really be controlled by an -mfix-r10000 command-line option, not by the _MIPS_ARCH_* macro. (In this context, _MIPS_ARCH_* is a property of the compiler that you're using to build gcc itself.)

There are two ways we could handle this:

  - Make -mfix-r10000 require -mbranch-likely.  (It mustn't _imply_
    -mbranch-likely.  It should simply check that -mbranch-likely is
    already in effect.)

- Make -mfix-r10000 insert nops when -mbranch-likely is not in effect.

Does using -mbranch-likely change the output of those specific asm commands that my original patch was altering? Or will -mfix-r10000 need to not only check the status of -mbranch-likely and set it if not set, but also need to modify the referenced beq/beqzl sets in mips.h?


If so, I assume a test for both TARGET_FIX_R10000 and TARGET_BRANCHLIKELY would be needed, and then if TARGET_BRANCHLIKELY doesn't exist, but TARGET_FIX_R10000 is, insert 28 nops before beq. Sound correct?


On setting -mbranch-likely, I found what I think is the appropriate section in mips.c around Line 13810:


  /* If neither -mbranch-likely nor -mno-branch-likely was given
     on the command line, set MASK_BRANCHLIKELY based on the target
     architecture and tuning flags.  Annulled delay slots are a
     size win, so we only consider the processor-specific tuning
     for !optimize_size.  */
  if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
    {
      if (ISA_HAS_BRANCHLIKELY
          && (optimize_size
              || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
        target_flags |= MASK_BRANCHLIKELY;
      else
        target_flags &= ~MASK_BRANCHLIKELY;
    }
  else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
    warning (0, "the %qs architecture does not support branch-likely"
             " instructions", mips_arch_info->name);

I'm kind of thinking that the -mfix-r10000 setting to include -mbranch-likely would fit here (Assuming this is what can enable/disable that option via MASK_BRANCHLIKELY), but if I'm reading it right, optimizing for size disables brach-likely instructions. Shouldn't -mfix-r10000 override that?

Would an equivalent conditional like this be close?:

      if (ISA_HAS_BRANCHLIKELY
          && ((optimize_size || TARGET_FIX_R10000)
              || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))


Also, does anyone have a copy of the R10000 Silicon Errata documentation kicking around? Thiemo brought up a point that we may need ssnop instead of nop, but I'd need to check the errata for that, and that doesn't seem to exist anywhere anymore. I found an old link to it on MIPS' site, but nothing else. I've only got Vr10000 manuals from SGI and NEC, and they don't seem to cover revision-specific errata any.


Thanks!

--
Joshua Kinard
Gentoo/MIPS
kumba@gentoo.org

"The past tempts us, the present confuses us, the future frightens us. And our lives slip away, moment by moment, lost in that vast, terrible in-between."

--Emperor Turhan, Centauri Republic


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]