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