mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-17 02:08:38 +00:00
ce82ff0538
When compile u-boot with the 2.18 binutils the following warning messages for each object file in post/lib_ppc/fpu/ is produced at the linking stage: post/libpost.a(acc1.o) uses hard float, u-boot uses soft-float ... This is because of the fact that, in general, the soft-float and hard-float ABIs are incompatible; the 2.18 binutils do checking of the Tag_GNU_Power_ABI_FP attribute of the files to be linked, and produce the worning like above if these are not compatible. The incompatibility of ABIs is concerned only the float values: e.g. the soft-float ABI assumes the float argument passing in the pair of rX registers, and the hard-float ABI assumes passing of the float argument in the fX register. When we don't pass the float arguments between the functions compiled with different floatness, then such an application will work correctly. This is the case for the FPU POST: u-boot (compiled with soft-float) doesn't pass to (and doesn't get from) the FPU POST functions any floats; there are no functions exported from the post/lib_ppc/fpu/ objects which would work with float parameters/returns too. So, we can reassure the linker not to worry about the difference in ABI attributes of linking files just by setting the 'soft-float' attribute for the objects in post/lib_ppc/fpu. And this patch does this. Also, to avoid passing both soft- and hard-float options in CFLAGS when compiling the files from post/lib_ppc/fpu (which is OK, but looks rather dirty) this patch removes the soft-float string from CFLAGS in post/lib_ppc/fpu/Makefile. Signed-off-by: Yuri Tikhonov <yur@emcraft.com>
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
/*
|
|
* Copyright (C) 2007
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
/*
|
|
* This file is originally a part of the GCC testsuite.
|
|
* Check that certain subnormal numbers (formerly known as denormalized
|
|
* numbers) are rounded to within 0.5 ulp. PR other/14354.
|
|
*/
|
|
|
|
#include <common.h>
|
|
|
|
#include <post.h>
|
|
|
|
#if CONFIG_POST & CONFIG_SYS_POST_FPU
|
|
|
|
GNU_FPOST_ATTR
|
|
|
|
union uf
|
|
{
|
|
unsigned int u;
|
|
float f;
|
|
};
|
|
|
|
static float
|
|
u2f (unsigned int v)
|
|
{
|
|
union uf u;
|
|
u.u = v;
|
|
return u.f;
|
|
}
|
|
|
|
static unsigned int
|
|
f2u (float v)
|
|
{
|
|
union uf u;
|
|
u.f = v;
|
|
return u.u;
|
|
}
|
|
|
|
static int ok = 1;
|
|
|
|
static void
|
|
tstmul (unsigned int ux, unsigned int uy, unsigned int ur)
|
|
{
|
|
float x = u2f (ux);
|
|
float y = u2f (uy);
|
|
|
|
if (f2u (x * y) != ur)
|
|
/* Set a variable rather than aborting here, to simplify tracing when
|
|
several computations are wrong. */
|
|
ok = 0;
|
|
}
|
|
|
|
/* We don't want to make this const and static, or else we risk inlining
|
|
causing the test to fold as constants at compile-time. */
|
|
struct
|
|
{
|
|
unsigned int p1, p2, res;
|
|
} static volatile expected[] =
|
|
{
|
|
{0xfff, 0x3f800400, 0xfff},
|
|
{0xf, 0x3fc88888, 0x17},
|
|
{0xf, 0x3f844444, 0xf}
|
|
};
|
|
|
|
int fpu_post_test_math7 (void)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < sizeof (expected) / sizeof (expected[0]); i++)
|
|
{
|
|
tstmul (expected[i].p1, expected[i].p2, expected[i].res);
|
|
tstmul (expected[i].p2, expected[i].p1, expected[i].res);
|
|
}
|
|
|
|
if (!ok) {
|
|
post_log ("Error in FPU math7 test\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_POST & CONFIG_SYS_POST_FPU */
|