On 04/28/2010 03:47 AM, Amker.Cheng wrote:

You can get the RTL for these patterns when expanding stores like

   a = (b < c);

In this case, GCC tries to avoid a conditional branch and (I suppose you are
on GCC<4.5) instead of cmp<mode>  and b<cond>  you go through cmp<mode>  and
s<cond>.  cmp<mode>  does nothing but stashing away its operands, while
s<cond>  expands RTL for both the comparison and the above insn.

Thanks, and yes, I'm using GCC 4.4,
But gcc didn't work in this way for me, I tried piece of code like:

extern float a, b;
extern int c;
int main(void)
{
   c = (a < b);
   return 0;
}

after tracing cc1, found gcc would also do it with set/compare/jump/set code at
the end of function do_store_flag, i.e., unsing cmp<mode>  and b<code>  
sequence.

Indeed, looking at GCC 4.5 there's no cstore expander for floating-point variables. Maybe you can make a patch! :-)

Paolo

Reply via email to