diff options
author | David S. Miller <davem@davemloft.net> | 2012-03-28 22:35:26 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-03-28 22:35:26 -0700 |
commit | 88d85d4f001fac0fd7ef4e3d05ca8a7d50b0c98f (patch) | |
tree | dac097e3214f049492bbf41a575b6d846af3dd9e /sysdeps/sparc/sparc64/multiarch | |
parent | e5aa83e16d02bc8f1b1a352f83e12f3f14c4d4ac (diff) | |
download | glibc-88d85d4f001fac0fd7ef4e3d05ca8a7d50b0c98f.tar.gz glibc-88d85d4f001fac0fd7ef4e3d05ca8a7d50b0c98f.tar.xz glibc-88d85d4f001fac0fd7ef4e3d05ca8a7d50b0c98f.zip |
Optimize mempcpy on sparc.
* sysdeps/sparc/sparc32/memcpy.S: Implement mempcpy using a stub that branches into memcpy. * sysdeps/sparc/sparc64/memcpy.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memcpy.S: Add mempcpy multiarch bits. * sysdeps/sparc/sparc64/rtld-memcpy.c: Include generic mempcpy implementation too. * sysdeps/sparc/mempcpy.S: New file.
Diffstat (limited to 'sysdeps/sparc/sparc64/multiarch')
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S | 10 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S | 10 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S | 6 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/memcpy.S | 60 |
4 files changed, 82 insertions, 4 deletions
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S index 8bada0eeec..6ba1b0c6e9 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S @@ -43,13 +43,19 @@ .text +ENTRY(__mempcpy_niagara1) + ba,pt %XCC, 101f + add %o0, %o2, %g5 +END(__mempcpy_niagara1) + .align 32 ENTRY(__memcpy_niagara1) +100: /* %o0=dst, %o1=src, %o2=len */ + mov %o0, %g5 +101: # ifndef USE_BPR srl %o2, 0, %o2 # endif -100: /* %o0=dst, %o1=src, %o2=len */ - mov %o0, %g5 cmp %o2, 0 be,pn %XCC, 85f 218: or %o0, %o1, %o3 diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S index ccbb0252f3..0e9442de5f 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S @@ -145,13 +145,19 @@ .text +ENTRY(__mempcpy_niagara2) + ba,pt %XCC, 101f + add %o0, %o2, %g5 +END(__mempcpy_niagara2) + .align 32 ENTRY(__memcpy_niagara2) +100: /* %o0=dst, %o1=src, %o2=len */ + mov %o0, %g5 +101: # ifndef USE_BPR srl %o2, 0, %o2 # endif -100: /* %o0=dst, %o1=src, %o2=len */ - mov %o0, %g5 cmp %o2, 0 be,pn %XCC, 85f 218: or %o0, %o1, %o3 diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S index 7e21665d5f..0784ba9b5d 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S @@ -38,6 +38,11 @@ .text +ENTRY(__mempcpy_ultra3) + ba,pt %XCC, 101f + add %o0, %o2, %g5 +END(__mempcpy_ultra3) + /* Special/non-trivial issues of this code: * * 1) %o5 is preserved from VISEntryHalf to VISExitHalf @@ -57,6 +62,7 @@ ENTRY(__memcpy_ultra3) 100: /* %o0=dst, %o1=src, %o2=len */ mov %o0, %g5 +101: cmp %o2, 0 be,pn %XCC, out 218: or %o0, %o1, %o3 diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S index 0f3751e5e7..20c72d9bbd 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy.S @@ -72,12 +72,72 @@ ENTRY(memcpy) mov %o1, %o0 END(memcpy) +ENTRY(__mempcpy) + .type __mempcpy, @gnu_indirect_function +# ifdef SHARED + SETUP_PIC_REG_LEAF(o3, o5) +# endif + andcc %o0, HWCAP_SPARC_N2, %g0 + be 1f + andcc %o0, HWCAP_SPARC_BLKINIT, %g0 +# ifdef SHARED + sethi %gdop_hix22(__mempcpy_niagara2), %o1 + xor %o1, %gdop_lox10(__mempcpy_niagara2), %o1 +# else + set __mempcpy_niagara2, %o1 +# endif + ba 10f + nop +1: be 1f + andcc %o0, HWCAP_SPARC_ULTRA3, %g0 +# ifdef SHARED + sethi %gdop_hix22(__mempcpy_niagara1), %o1 + xor %o1, %gdop_lox10(__mempcpy_niagara1), %o1 +# else + set __mempcpy_niagara1, %o1 +# endif + ba 10f + nop +1: be 9f + nop +# ifdef SHARED + sethi %gdop_hix22(__mempcpy_ultra3), %o1 + xor %o1, %gdop_lox10(__mempcpy_ultra3), %o1 +# else + set __mempcpy_ultra3, %o1 +# endif + ba 10f + nop +9: +# ifdef SHARED + sethi %gdop_hix22(__mempcpy_ultra1), %o1 + xor %o1, %gdop_lox10(__mempcpy_ultra1), %o1 +# else + set __mempcpy_ultra1, %o1 +# endif +10: +# ifdef SHARED + add %o3, %o1, %o1 +# endif + retl + mov %o1, %o0 +END(__mempcpy) + libc_hidden_builtin_def (memcpy) +libc_hidden_def (__mempcpy) +weak_alias (__mempcpy, mempcpy) +libc_hidden_builtin_def (mempcpy) + #undef libc_hidden_builtin_def #define libc_hidden_builtin_def(name) +#undef weak_alias +#define weak_alias(x, y) +#undef libc_hidden_def +#define libc_hidden_def(name) #define memcpy __memcpy_ultra1 +#define __mempcpy __mempcpy_ultra1 #endif |