Hi All,

Below is the patterns defined  for the  mov and add  instruction
.
[(set (match_operand:HI 0 "general_mov_operand" "=r,rRA")
        (match_operand:HI 1 "general_mov_operand" "rRAi,ri"))]
  ""
         {

        }
)

(define_insn "addhi3"
  [(set (match_operand:HI 0 "register_operand" "=Ar")
        (plus:HI (match_operand:HI 1 "register_operand" "%0")
                 (match_operand:HI 2 "general_mov_operand" "Ar")))]
  ""
  "add\t%0, (%2)"
)

The problem we stuck with is that the compiler emit unoptimal code for
the below testcase with -O0 option

int a,b;

int func()
{
   return a=b;
}

.s file

 ld      BC, (a)
 ld      WA, (b)
 add     WA, BC
 ld      (a), WA
 ret

the compiler try to load a and b to the register BC and WA
respectively in the expand_assignment and add them , then store back
the result to a.

But  if you see the addhi3 definition ,it states that i'm allowed to
emit instruction like

add WA,(a)

where second operand can be register indirect addressing .

I can write peephole pattern to optimize  the emitted code like

.s file

 ld      WA, (b)
 add     WA, (a)
 ld      (a), WA
 ret


the reason for the unoptimal  code is that  the code is expanded to
load  the memory contents  to the registers  and then update the add
operands accordingly. I don't want this to happen .

I will be glad ,if somebody from the group  share their experience or
through some insights  how i can achieve this .

Thanks
~Umesh

Reply via email to