question about assembly code

Olivier Maury Olivier_maury@mentor.com
Tue Aug 9 15:24:00 GMT 2011


Ok thanks for the information !
But when the floating point happens gdb shows the fcmove instruction, 
the content of the variable is NAN (because of the UMR) but the 
condition must be false (at least the function has returned 0).
When the FPE is raised the floating point stack is :
=>R7: Valid   0x3fff8000000000000000 +1
   R6: Empty   0x00000000000000000000
   R5: Empty   0x00000000000000000000
   R4: Empty   0xc0778fb44823c7812000
   R3: Empty   0x3febc9539b888722a000
   R2: Empty   0x3feba10fafa06c1bb5b7
   R1: Empty   0x00000000000000000000
   R0: Empty   0x3feb8637bd05af6c6800



Any idea about what to check in my gdb ?


On 08/09/11 16:44, Ian Lance Taylor wrote:
> Olivier Maury<Olivier_maury@mentor.com>  writes:
>
>> I was wondering, is the following assembly code correct:
>>       c94:       e8 fc ff ff ff          call   c95
>> <load_param_def_given+0x1d1>
>>       c99:       84 c0                   test   %al,%al
>>       c9b:       dd 45 d0                fldl   -0x30(%ebp)
>>       c9e:       dd 45 d8                fldl   -0x28(%ebp)
>>       ca1:       da c9                   fcmove %st(1),%st
>>       ca3:       dd d9                   fstp   %st(1)
>>       ca5:       dd 5d d0                fstpl  -0x30(%ebp)
>>       ca8:       89 f8                   mov    %edi,%eax
>>
>> This code is some optimized assembly code extracted from the object
>> file using objdump. My concern here is that I have a test instruction
>> without the corresponding jump !
> The test instruction is setting the flags for the fcmove instruction.
>
>
>> That piece of assembly comes from a code that look like:
>> if (my_function(param1,&out_param))
>>      value = out_param;
>>
>> with :
>> out_param a double value that is not assigned with a default value
>> and
>> char my_function(long param1, double *out)
>> {
>>     char ret = 0;
>>      ... do some stuff ...
>>      if (some_property)
>>     {
>>         ... do some stuff ...
>>         *out = a_value_computed;
>>         ret = 1;
>>     }
>>     ....
>>     return ret;
>> }
>>
>> And taking that optimized code in a debugger it crash with a FPE from
>> time to time because even if the my_function returns 0 it seems to do
>> the assignement (value = out_param) with an unitialized out_param
>> value !
>>
>> What do you think ? Am I doing something wrong or is it a gcc bug ?
> It's pretty hard to say anything about an incomplete example.  However,
> fcmove is a conditional move, so the code will only do the move if the
> value returned is non-zero.  I don't see anything wrong in what you have
> shown us.
>
> Ian



More information about the Gcc-help mailing list