https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65649
Bug ID: 65649
Summary: gcc generates overlarge constants for
microblaze-linux-gnu
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: dhowells at redhat dot com
Whilst compiling libgcc for microblaze-linux-gnu, gcc produces overlarge
constants that don't fit into a 32-bits (microblaze is a 32-bit arch), eg:
addik r23,r0,0xb746a0003f800000
the assembler complains about these:
_powisf2.s:71: Fatal error: operand must be a constant or a label
if it is hosted on a 32-bit arch (eg. i386) but not if it's hosted on a 64-bit
arch (eg. x86_64). This is logged here:
https://sourceware.org/bugzilla/show_bug.cgi?id=18189
However, gcc shouldn't be producing these at all.
Reducing the preprocessed C to the bare function gives:
float __powisf2 (float x, int m)
{
unsigned int n = m < 0 ? -m : m;
float y = n % 2 ? x : 1;
while (n >>= 1)
{
x = x * x;
if (n % 2)
y = y * x;
}
return m < 0 ? 1/y : y;
}
Reducing it still further to:
float __powisf2 (float x, int m)
{
unsigned int n = m < 0 ? -m : m;
float y = n % 2 ? x : 1;
return y;
}
gives the error _only_ if -g is supplied. Looking at the assembly output of
this, the dodgy instruction is now:
addik r3,r0,0xb745e0003f800000
with -g and:
addik r3,r0,0x3f800000
without.
The compilation line is:
/root/cross-gcc/gcc-5.0.0-20150319/microblaze-linux-gnu/gcc/xgcc
-B/root/cross-gcc/gcc-5.0.0-20150319/microblaze-linux-gnu/gcc/
-B/usr/microblaze-linux-gnu/bin/ -B/usr/microblaze-linux-gnu/lib/ -O2 -fPIC
-fbuilding-libgcc -fno-exceptions -fno-stack-protector -fvisibility=hidden -o
_powisf2.o -c _powisf2.i --save-temps -g