The truth you're saying....

some func. attributes will partly solve your problem.

Also, if you see some stupidity in a code, just send me sources.
I'll see waht I can do.

~d

P.S. I'll think about jump instad of call at the func. tail, but cannot 
imagine how right away.


On Friday 06 December 2002 23:16, David Brown wrote:
> Hi Dmitry,
>
> I hope this is of interest to you.  I know I have the source, and could
> fiddle things myself, but this is way beyond my knowledge.
>
> I've been playing about with bitfields, and looking at the code generated
> by gcc for various manipulations.  Normally I tend to use chars to hold
> flag registers and #defines to specify different flags, but I thought I
> might try bitfields since I now have a good debugger that can display them
> properly. There are a couple of places where I have spotted sub-optimal
> code, even with -O2 or -O3 with plenty of flags.  I doubt if there is any
> point in making an effort to optomise these particular points - after all,
> they are purely artificial test cases, which are unlikely to be the same in
> real code.  But it may be that you can generalise from them.
>
> I have a bitfield structure defined:
>
> typedef struct { unsigned char a : 1; unsigned char b : 1; } t;
> t Test(t x) {
>     x.a = x.b;
>     return x;
> }
>
> The code generated is:
>     mov.b r15, r14
>     clrc
>     rrc.b r14
>     and.b #llo(1), r14
>     bic.b #llo(1), r15
>     bis.b r15, r14
>     mov.b r14, r15
>     ret
>
> As far as I can see, the final mov should be removed, and the bis.b should
> be "bis.b r14, r15".  I think the clrc could also be eliminated.
>
> I have noticed on several occasions a tendancy to over-use r15.  For
> example, in a switch statement I have seen the switch variable calculated
> in another register (such as r14), which is then mov'ed into r15 before
> doing the compares.
>
> Finally, doing a switch on bitfields generates a lot of extra code, some of
> which should definitely have been removed by the peephole optomisers:
>
> switch(y.b) { ...                // y is in r11 here
>     mov.b r11, r13
>     clrc
>     rrcb r13
>     mov.b r13, r15            // All this could have been mov.b r11, r15;
> rrcb r15
>     and.b #llo(1), r15
>     and.b #-1, r15            // ???
>     cmp #llo(0), r15, etc.
>
>
>
> Also, is there any way to optomise tail calls (if that is the right word) ?
> I am thinking of a function that ends with a call to another function,
> where the "call #...; ret" pair is replaced with a "jmp ..." instruction.
>
>
> I always like to examine generated assembly, and look for ideas to improve
> the generated code.  I must say it has been extremly difficult to find such
> cases with msp430-gcc !
>
> mvh.
>
> David
>
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users

-- 
*********************************************************************
   ("`-''-/").___..--''"`-._     (\       Dimmy the Wild      UA1ACZ
    `6_ 6  )   `-.  (     ).`-.__.`)      Enterprise Information Sys 
    (_Y_.)'  ._   )  `._ `. ``-..-'       Nevsky prospekt,   20 / 44
  _..`--'_..-_/  /--'_.' ,'               Saint Petersburg,   Russia
 (il),-''  (li),'  ((!.-'                 +7 (812) 314-8860, 5585314
*********************************************************************




Reply via email to