"rws_access_reg should be handling this correctly. It uses
HARD_REGNO_NREGS to get the number of regs referred to by a reg rtl.
So it should return 64 in this case, and then it will iterate over all
64-bit PR regs when checking for a dependency."

I have found HARD_REGNO_NREGS in ia64.h

#define HARD_REGNO_NREGS(REGNO, MODE)                                   \
  ((REGNO) == PR_REG (0) && (MODE) == DImode ? 64                       \
  ....

 As you stated above, it returns 64 for DImode pr0.

"We already have support for these move instructions. See the
movdi_internal pattern. Since there are 64 1-bit PR registers, we use
a DImode reference to pr0 to represent the entire set of PR registers.
Is this the RTL that you are using? Or do you have your own
representation? If different, what RTL are you using?"

I generate this mov instruction like this:
gen_movdi(gen_rtx_REG(DImode, PR_REG(0)), X);
here X is a general register. Further, I dump the rtl list and found
the generated insn, I think it is correct:

(insn 522 551 523 2 (set (reg:DI 8 r8)
        (reg:DI 256 p0)) -1 (nil)
    (nil))
and

(insn 537 377 535 2 (set (reg:DI 256 p0)
        (reg:DI 8 r8)) -1 (nil)
    (nil))
but the scheduling really produces wrong code :-<

Besides, I am using GCC-4.1.1 and I found rws_access_reg which handles
the dependencies for these mov instructions ...

static int
rws_access_reg (rtx reg, struct reg_flags flags, int pred)
{
  int regno = REGNO (reg);
  int n = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));

  if (n == 1)
    return rws_access_regno (regno, flags, pred);
  else
    {
      int need_barrier = 0;
      while (--n >= 0)
        need_barrier |= rws_access_regno (regno + n, flags, pred);
      return need_barrier;
    }
}

Well... Is there anything I miss or forget to do ?

Thanks

Reply via email to