diff options
author | David S. Miller <davem@davemloft.net> | 2012-03-01 20:43:38 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-03-01 20:43:38 -0800 |
commit | dfdb8ff2998cfcaf3c8978f522c061fe8a68fe68 (patch) | |
tree | 80f8b00fe1952d69f9229d34eebc91bea9143f30 | |
parent | ead89f9695d358ec2e67cafbda13f44e5aaf5b53 (diff) | |
download | glibc-dfdb8ff2998cfcaf3c8978f522c061fe8a68fe68.tar.gz glibc-dfdb8ff2998cfcaf3c8978f522c061fe8a68fe68.tar.xz glibc-dfdb8ff2998cfcaf3c8978f522c061fe8a68fe68.zip |
Optimized sparc assembler for signbit{,f,l} and some variants of isnan.
* sysdeps/sparc/sparc32/fpu/s_signbit.S: New file. * sysdeps/sparc/sparc32/fpu/s_signbitf.S: New file. * sysdeps/sparc/sparc32/fpu/s_signbitl.S: New file. * sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S: New file. * sysdeps/sparc/sparc64/fpu/s_isnan.S: New file. * sysdeps/sparc/sparc64/fpu/s_isnanf.S: New file. * sysdeps/sparc/sparc64/fpu/s_signbit.S: New file. * sysdeps/sparc/sparc64/fpu/s_signbitf.S: New file. * sysdeps/sparc/sparc64/fpu/s_signbitl.S: New file.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_signbit.S | 32 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_signbitf.S | 1 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_signbitl.S | 32 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S | 32 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/s_isnan.S | 33 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/s_isnanf.S | 32 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/s_signbit.S | 34 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/s_signbitf.S | 27 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/fpu/s_signbitl.S | 1 |
10 files changed, 234 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 12c739011f..31412c38bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2012-03-01 David S. Miller <davem@davemloft.net> + * sysdeps/sparc/sparc32/fpu/s_signbit.S: New file. + * sysdeps/sparc/sparc32/fpu/s_signbitf.S: New file. + * sysdeps/sparc/sparc32/fpu/s_signbitl.S: New file. + * sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S: New file. + * sysdeps/sparc/sparc64/fpu/s_isnan.S: New file. + * sysdeps/sparc/sparc64/fpu/s_isnanf.S: New file. + * sysdeps/sparc/sparc64/fpu/s_signbit.S: New file. + * sysdeps/sparc/sparc64/fpu/s_signbitf.S: New file. + * sysdeps/sparc/sparc64/fpu/s_signbitl.S: New file. + * sysdeps/sparc/fpu/libm-test-ulps: Update. * sysdeps/sparc/sparc32/fpu/libm-test-ulps: Move... diff --git a/sysdeps/sparc/sparc32/fpu/s_signbit.S b/sysdeps/sparc/sparc32/fpu/s_signbit.S new file mode 100644 index 0000000000..3756bf431a --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/s_signbit.S @@ -0,0 +1,32 @@ +/* signbit(). sparc32 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__signbit) + retl + srl %o0, 31, %o0 +END (__signbit) +weak_alias (__signbit, signbit) + +/* On 32-bit the double version will also always work for + single-precision since in both cases the word with the + sign bit in it is passed always in register %o0. */ +strong_alias (__signbit, __signbitf) +hidden_def (__signbitf) +weak_alias (__signbitf, signbitf) diff --git a/sysdeps/sparc/sparc32/fpu/s_signbitf.S b/sysdeps/sparc/sparc32/fpu/s_signbitf.S new file mode 100644 index 0000000000..91886af6d5 --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/s_signbitf.S @@ -0,0 +1 @@ +/* signbitf is implemented in s_signbit.S */ \ No newline at end of file diff --git a/sysdeps/sparc/sparc32/fpu/s_signbitl.S b/sysdeps/sparc/sparc32/fpu/s_signbitl.S new file mode 100644 index 0000000000..2feaee0361 --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/s_signbitl.S @@ -0,0 +1,32 @@ +/* signbitl(). sparc32 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (___signbitl) + ld [%o0], %o1 + retl + srl %o1, 31, %o0 +END (___signbitl) + +#ifdef IS_IN_libm +long_double_symbol (libm, ___signbitl, __signbitl); +#else +long_double_symbol (libc, ___signbitl, __signbitl); +#endif diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S b/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S new file mode 100644 index 0000000000..3122528a06 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/s_isnan.S @@ -0,0 +1,32 @@ +/* isnan(). sparc32 v9 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__isnan) + sethi %hi(0x7ff00000), %g1 + sllx %o0, 33, %o0 + sllx %g1, 32, %g1 + srlx %o0, 1, %o0 + or %o0, %o1, %o0 + sub %g1, %o0, %o0 + retl + srlx %o0, 63, %o0 +END (__isnan) +hidden_def (__isnan) +weak_alias (__isnan, isnan) diff --git a/sysdeps/sparc/sparc64/fpu/s_isnan.S b/sysdeps/sparc/sparc64/fpu/s_isnan.S new file mode 100644 index 0000000000..00041caa54 --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/s_isnan.S @@ -0,0 +1,33 @@ +/* isnan(). sparc64 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__isnan) + std %f0, [%sp + STACK_BIAS + 128] + sethi %hi(0x7ff00000), %g1 + ldx [%sp + STACK_BIAS + 128], %o0 + sllx %g1, 32, %g1 + sllx %o0, 1, %o0 + srlx %o0, 1, %o0 + sub %g1, %o0, %o0 + retl + srlx %o0, 63, %o0 +END (__isnan) +hidden_def (__isnan) +weak_alias (__isnan, isnan) diff --git a/sysdeps/sparc/sparc64/fpu/s_isnanf.S b/sysdeps/sparc/sparc64/fpu/s_isnanf.S new file mode 100644 index 0000000000..f82c8194c5 --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/s_isnanf.S @@ -0,0 +1,32 @@ +/* isnanf(). sparc64 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__isnanf) + st %f1, [%sp + STACK_BIAS + 128] + sethi %hi(0x7f800000), %g1 + lduw [%sp + STACK_BIAS + 128], %o0 + sll %o0, 1, %o0 + srl %o0, 1, %o0 + sub %g1, %o0, %o0 + retl + srl %o0, 31, %o0 +END (__isnanf) +hidden_def (__isnanf) +weak_alias (__isnanf, isnanf) diff --git a/sysdeps/sparc/sparc64/fpu/s_signbit.S b/sysdeps/sparc/sparc64/fpu/s_signbit.S new file mode 100644 index 0000000000..3c1ea000f1 --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/s_signbit.S @@ -0,0 +1,34 @@ +/* signbit(). sparc64 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__signbit) + st %f0, [%sp + STACK_BIAS + 128] + ld [%sp + STACK_BIAS + 128], %o0 + retl + srl %o0, 31, %o0 +END (__signbit) +weak_alias (__signbit, signbit) + +/* On 64-bit the double version will also always work for + long-double-precision since in both cases the word with the + sign bit in it is passed always in register %f0. */ +strong_alias (__signbit, __signbitl) +hidden_def (__signbitl) +weak_alias (__signbitl, signbitl) diff --git a/sysdeps/sparc/sparc64/fpu/s_signbitf.S b/sysdeps/sparc/sparc64/fpu/s_signbitf.S new file mode 100644 index 0000000000..d2a7aa5bdd --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/s_signbitf.S @@ -0,0 +1,27 @@ +/* signbitf(). sparc64 version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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 (__signbitf) + st %f1, [%sp + STACK_BIAS + 128] + ld [%sp + STACK_BIAS + 128], %o0 + retl + srl %o0, 31, %o0 +END (__signbitf) +weak_alias (__signbitf, signbitf) diff --git a/sysdeps/sparc/sparc64/fpu/s_signbitl.S b/sysdeps/sparc/sparc64/fpu/s_signbitl.S new file mode 100644 index 0000000000..f5e5fb9253 --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/s_signbitl.S @@ -0,0 +1 @@ +/* signbitl is implemented in s_signbit.S */ |