question about assembly code
Ian Lance Taylor
iant@google.com
Tue Aug 9 14:45:00 GMT 2011
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