This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/70504] New: FLD, FLD, FXCH emitted instead of FLD, FLD in the needed order
- From: "b7.10110111 at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 01 Apr 2016 15:21:41 +0000
- Subject: [Bug rtl-optimization/70504] New: FLD, FLD, FXCH emitted instead of FLD, FLD in the needed order
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70504
Bug ID: 70504
Summary: FLD, FLD, FXCH emitted instead of FLD, FLD in the
needed order
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: b7.10110111 at gmail dot com
Target Milestone: ---
The following code demonstrates the bug:
long double inl_scalbn(long double mant, long double exp)
{
long double result;
asm("fscale"
: "=&t"(result)
: "%0"(mant),
"u"(exp)
);
return result;
}
With `-O3` option GCC generates the following assembly:
inl_scalbn:
fld TBYTE PTR [esp+4]
fld TBYTE PTR [esp+16]
fxch st(1)
fscale
fstp st(1)
ret
What's even stranger, I thought it was somehow related to order of function
arguments, but if I switch `mant` and `exp`, the code just switches `fld`
instructions instead of removing `fxch`.
It's clear that in both cases the code could have just loaded the parameters in
the correct order in the first place.