When I compile this function: double f(long double i) {return (i);} with gcc flags -S -O3, I get the assembly below. There are two redundant FPU instructions there. double value is already in FPU after fldt. No need to store it and load it back since difference between double and long double is only in memory representation, and in FPU registers they are the same. ---- asm output (relevant part) ---- f: pushl %ebp movl %esp, %ebp subl $8, %esp <---- redundant related stack adjustment fldt 8(%ebp) fstpl -8(%ebp) <---- redundant STORE fldl -8(%ebp) <---- redundant LOAD leave ret
Forgot to mention: 32-bit mode on i586 CPU.
(In reply to comment #0) > There are two redundant FPU instructions there. double value is already in FPU > after fldt. No need to store it and load it back since difference between > double and long double is only in memory representation, and in FPU registers > they are the same. No, they are not. These instructions implement FP truncation from long-double to double. Try to compile your code with -ffast-math.