[LLVMdev] Floating point compare instruction selection

Morten Ofstad morten at hue.no
Thu Mar 17 01:22:10 PST 2005

Chris Lattner wrote:
> On Wed, 16 Mar 2005, Morten Ofstad wrote:
>> The case which emits code for the special case of comparing against 
>> constant 0.0 does not return after generating it's code, so the normal 
>> compare is also generated! As far as I can tell it should return right 
>> after this:
>> BuildMI(BB, X86::SAHF, 1);
>> instead it falls through and goes on to generate the normal compare 
>> instruction... Am I right?
> Nope.  It's emitting a compare against zero with fucomi instead of ftst. 
> fucomi is a PPRO+ instruction that deposits the result of the comparison 
> into the integer condition codes. This saves having to use SAHF and some 
> bit-twiddling, so it's usually a bit faster than using ftst.  The simple 
> isel used to produce ftst for compare against zero.  If you do some 
> benchmarking and find that one is noticably faster than the other, we 
> should switch them both to use the same code sequence.

It's generating _both_ the SAHF and the fucomi -- look at the code ISelPattern generates:

17160443  call        HueVMReadCommands_LLVMReadVoxel (19BB229h)
17160448  fsub        dword ptr ds:[161D6280h]
1716044E  fabs
17160450  fst         qword ptr [esp+14h]
17160454  ftst
17160456  fstp        st(0)
17160458  fnstsw      ax
1716045A  sahf
1716045B  fldz
1716045D  fchs
1716045F  fld         qword ptr [esp+14h]
17160463  fucomip     st,st(1)
17160465  fstp        st(0)
17160467  jbe         17160498

the ISelSimple generates:

1716047F  call        eax
17160481  fsub        dword ptr ds:[16237240h]
17160487  fabs
17160489  fst         qword ptr [esp+14h]
1716048D  ftst
1716048F  fstp        st(0)
17160491  fnstsw      ax
17160493  sahf
17160494  jbe         171604C7


More information about the llvm-dev mailing list