sparc: remove fdim sparc specific implementations

The fdim and fdimf functions on sparc do not fully follow the standard
and do not set errno to ERANGE when the result overflows. Since glibc
2.24 this causes the two following tests to fail:

  Failure: fdim (max_value, -max_value): errno set to 0, expected 34 (ERANGE)
  Failure: fdim_upward (max_value, -max_value): errno set to 0, expected 34 (ERANGE)

It happens that using GCC with the generic C code generates very similar
code to the sparc specific implementations. Therefore this patches
remove them. Note it might still worth adding a vis3 specific version of
fdim on sparc32/sparcv9, this is done in a following patch to ease
backporting.

Changelog:
	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
	[$(subdir) = math && $(have-as-vis3) = yes] (libm-sysdep_routines):
	Remove s_fdimf-vis3, s_fdim-vis3.
	* sysdeps/sparc/sparc32/fpu/s_fdim.S: Delete file.
	* sysdeps/sparc/sparc32/fpu/s_fdimf.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-vis3.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-vis3.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/s_fdim.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/fpu/s_fdimf.S: Likewise.
	* sysdeps/sparc/sparc64/fpu/s_fdim.S: Likewise.
	* sysdeps/sparc/sparc64/fpu/s_fdimf.S: Likewise.
This commit is contained in:
Aurelien Jarno 2016-08-05 22:35:01 +02:00
parent 9c8addbc1c
commit 8a9f4eb958
12 changed files with 18 additions and 314 deletions

View File

@ -1,3 +1,19 @@
2016-08-05 Aurelien Jarno <aurelien@aurel32.net>
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
[$(subdir) = math && $(have-as-vis3) = yes] (libm-sysdep_routines):
Remove s_fdimf-vis3, s_fdim-vis3.
* sysdeps/sparc/sparc32/fpu/s_fdim.S: Delete file.
* sysdeps/sparc/sparc32/fpu/s_fdimf.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-vis3.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-vis3.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_fdim.S: Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/s_fdimf.S: Likewise.
* sysdeps/sparc/sparc64/fpu/s_fdim.S: Likewise.
* sysdeps/sparc/sparc64/fpu/s_fdimf.S: Likewise.
2016-08-05 Aurelien Jarno <aurelien@aurel32.net>
* sysdeps/sparc/sparc32/sparcv9/Makefile (sysdep-CFLAGS): Add -mvis.

View File

@ -1,42 +0,0 @@
/* Compute positive difference, sparc 32-bit.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
ENTRY(__fdim)
std %o0, [%sp + 72]
std %o2, [%sp + 80]
ldd [%sp + 72], %f0
ldd [%sp + 80], %f2
fcmpd %f0, %f2
st %g0, [%sp + 72]
fbug 1f
st %g0, [%sp + 76]
ldd [%sp + 72], %f0
fnegs %f0, %f2
fmovs %f1, %f3
1: retl
fsubd %f0, %f2, %f0
END(__fdim)
weak_alias (__fdim, fdim)
#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
compat_symbol (libm, __fdim, fdiml, GLIBC_2_1);
#endif

View File

@ -1,35 +0,0 @@
/* Compute positive difference, sparc 32-bit.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__fdimf)
st %o0, [%sp + 72]
st %o1, [%sp + 76]
ld [%sp + 72], %f0
ld [%sp + 76], %f1
fcmps %f0, %f1
fbug 1f
st %g0, [%sp + 72]
ld [%sp + 72], %f0
fnegs %f0, %f1
1: retl
fsubs %f0, %f1, %f0
END(__fdimf)
weak_alias (__fdimf, fdimf)

View File

@ -4,8 +4,8 @@ libm-sysdep_routines += m_copysignf-vis3 m_copysign-vis3 s_fabs-vis3 \
s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
s_rintf-vis3 s_rint-vis3 w_sqrt-vis3 w_sqrtf-vis3 \
s_fminf-vis3 s_fmin-vis3 s_fmaxf-vis3 s_fmax-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fdimf-vis3 s_fdim-vis3 \
s_nearbyint-vis3 s_nearbyintf-vis3
s_fmaf-vis3 s_fma-vis3 s_nearbyint-vis3 \
s_nearbyintf-vis3
sysdep_routines += s_copysignf-vis3 s_copysign-vis3
endif
endif

View File

@ -1,34 +0,0 @@
/* Compute positive difference, sparc 32-bit+v9+vis3.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__fdim_vis3)
movwtos %o0, %f0
movwtos %o1, %f1
movwtos %o2, %f2
movwtos %o3, %f3
fcmpd %f0, %f2
fbug 1f
nop
fzero %f0
fnegd %f0, %f2
1: retl
fsubd %f0, %f2, %f0
END(__fdim_vis3)

View File

@ -1,19 +0,0 @@
#include <sparc-ifunc.h>
#include <math_ldbl_opt.h>
SPARC_ASM_VIS3_IFUNC(fdim)
weak_alias (__fdim, fdim)
#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
compat_symbol (libm, __fdim, fdiml, GLIBC_2_1);
#endif
# undef weak_alias
# define weak_alias(a, b)
# undef compat_symbol
# define compat_symbol(a, b, c, d)
#define __fdim __fdim_generic
#include "../s_fdim.S"

View File

@ -1,32 +0,0 @@
/* Compute positive difference, sparc 32-bit+v9+vis3.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__fdimf_vis3)
movwtos %o0, %f0
movwtos %o1, %f1
fcmps %f0, %f1
fbug 1f
nop
fzeros %f0
fnegs %f0, %f1
1: retl
fsubs %f0, %f1, %f0
END(__fdimf_vis3)

View File

@ -1,12 +0,0 @@
#include <sparc-ifunc.h>
SPARC_ASM_VIS3_IFUNC(fdimf)
weak_alias (__fdimf, fdimf)
# undef weak_alias
# define weak_alias(a, b)
#define __fdimf __fdimf_generic
#include "../s_fdimf.S"

View File

@ -1,40 +0,0 @@
/* Compute positive difference, sparc 32-bit+v9.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
ENTRY(__fdim)
std %o0, [%sp + 72]
std %o2, [%sp + 80]
ldd [%sp + 72], %f0
ldd [%sp + 80], %f2
fcmpd %f0, %f2
fbug 1f
nop
fzero %f0
fnegd %f0, %f2
1: retl
fsubd %f0, %f2, %f0
END(__fdim)
weak_alias (__fdim, fdim)
#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
compat_symbol (libm, __fdim, fdiml, GLIBC_2_1);
#endif

View File

@ -1,35 +0,0 @@
/* Compute positive difference, sparc 32-bit+v9.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__fdimf)
st %o0, [%sp + 72]
st %o1, [%sp + 76]
ld [%sp + 72], %f0
ld [%sp + 76], %f1
fcmps %f0, %f1
fbug 1f
nop
fzeros %f0
fnegs %f0, %f1
1: retl
fsubs %f0, %f1, %f0
END(__fdimf)
weak_alias (__fdimf, fdimf)

View File

@ -1,32 +0,0 @@
/* Compute positive difference, sparc 64-bit.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <math_ldbl_opt.h>
ENTRY(__fdim)
fcmpd %f0, %f2
fbug 1f
nop
fzero %f0
fnegd %f0, %f2
1: retl
fsubd %f0, %f2, %f0
END(__fdim)
weak_alias (__fdim, fdim)

View File

@ -1,31 +0,0 @@
/* Compute positive difference, sparc 64-bit.
Copyright (C) 2013-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__fdimf)
fcmps %f1, %f3
fbug 1f
nop
fzeros %f1
fnegs %f1, %f3
1: retl
fsubs %f1, %f3, %f0
END(__fdimf)
weak_alias (__fdimf, fdimf)