http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52107
Bug #: 52107
Summary: IBM 128bit long double constant loaded inefficiently
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: [email protected]
ReportedBy: [email protected]
/* -m64 -O2 -mcmodel=small */
typedef float TFtype __attribute__ ((mode (TF)));
TFtype f2 (TFtype x)
{
return x * 0x1p-64f;
}
gives
[snip]
.LC2:
.tc ID_0_0[TC],0x000000000
.LC3:
.tc ID_0_3bf00000[TC],0x03bf00000
[snip]
.L.f2:
mflr 0
lfd 3,.LC3@toc(2)
std 0,16(1)
stdu 1,-128(1)
lfd 4,.LC2@toc(2)
stfd 3,112(1)
ld 9,112(1)
sldi 9,9,32
std 9,112(1)
lfd 3,112(1)
bl __gcc_qmul
[snip]
Horrible! How come the bit pattern is stored right-shifted, and so needs
shifting back into place? By comparison, gcc-4.4.1 generated
[snip]
.LC1:
.tc ID_3bf00000_0[TC],0x3bf0000000000000
.LC2:
.tc ID_0_0[TC],0x000000000
[snip]
.L.f2:
mflr 0
lfd 4,.LC2@toc(2)
lfd 3,.LC1@toc(2)
std 0,16(1)
stdu 1,-112(1)
bl __gcc_qmul
[snip]