On Tue, Dec 10, 2013 at 4:03 PM, Umesh Kalappa <umesh.kalap...@gmail.com> wrote: > 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 .
Use -On with n > 0. Richard. > Thanks > ~Umesh