TARGET_SECONDARY_RELOAD usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

The avr backend uses r0 as a temporary register for a couple of
complex instruction, and i would like to remove that usage.
As a start i wanted to remove it from the code to update the stack,
this code need a temporary register to save the flags before disabling
the interrupts so i tried to use secondary reload to get a temporary
register.

i defined the following in avr.c:
[Code]
static reg_class_t
avr_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
         enum machine_mode mode,
         secondary_reload_info *sri)
{
 if (in_p)
 {
  if (rclass == STACK_REG && register_operand (x, HImode))
  {
   if (!TARGET_NO_INTERRUPTS && !AVR_HAVE_8BIT_SP)
   {
    sri->icode = CODE_FOR_movhi_sp_r;
   }
  }
 }
 return NO_REGS;
}

#undef TARGET_SECONDARY_RELOAD
#define TARGET_SECONDARY_RELOAD avr_secondary_reload
[\Code]

and in avr.md:

[Code]
(define_insn "movhi_sp_r"
  [(set (match_operand:HI 0 "stack_register_operand" "=q")
        (match_operand:HI 1 "register_operand"  "r"))
   (clobber (match_operand:QI 2 "register_operand" "=&r"))]
  "(stack_register_operand(operands[0], HImode) && register_operand
(operands[1], HImode))"
  "in   %2, __SREG__
   cli
   out __SP_H__, %B1
   out,__SREG__, %2
   out,__SP_L__, %A1"
  [(set_attr "length" "5")
   (set_attr "cc" "none")])
[\Code]


but for some reason when i use my changed compiler to compile code
that update the stack pointer i get the following error:

../testgcc.c:24:1: error: invalid insn:
(insn/f 27 26 28 (set (reg/f:HI 28 r28)
        (reg/f:HI 32 __SP_L__)) ../testgcc.c:4 7 {*movhi_r_sp}
     (expr_list:REG_UNUSED (reg:QI 29 r29)
        (nil)))

which to me say's that the compiler didnt use my new pattern.

can anyone explain to me what's wrong with what i did?


Thank in advance,
Ilya.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux