diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/kernel-features.h | 2 | ||||
-rw-r--r-- | sysdeps/x86_64/memchr.S | 8 | ||||
-rw-r--r-- | sysdeps/x86_64/strchrnul.S | 63 |
3 files changed, 68 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index a640765b5c..5f1ffdb9c5 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -532,7 +532,7 @@ /* Support for preadv and pwritev was added in 2.6.30. */ #if __LINUX_KERNEL_VERSION >= 0x02061e \ - && (defined __i386__ || defined __x86_64__) + && (defined __i386__ || defined __x86_64__ || defined __powerpc__) # define __ASSUME_PREADV 1 # define __ASSUME_PWRITEV 1 #endif diff --git a/sysdeps/x86_64/memchr.S b/sysdeps/x86_64/memchr.S index 15484cb9f3..644362d565 100644 --- a/sysdeps/x86_64/memchr.S +++ b/sysdeps/x86_64/memchr.S @@ -37,12 +37,12 @@ ENTRY (memchr) shl %cl, %esi pmovmskb %xmm0, %ecx andl %esi, %ecx - movl $0, %esi + movl $16, %esi jnz 1f cmpq %rsi, %rdx jle 3f -2: movdqa 16(%rdi,%rsi), %xmm0 +2: movdqa (%rdi,%rsi), %xmm0 leaq 16(%rsi), %rsi pcmpeqb %xmm1, %xmm0 pmovmskb %xmm0, %ecx @@ -54,10 +54,10 @@ ENTRY (memchr) 3: xorl %eax, %eax ret -1: leaq (%rdi,%rsi), %rax +1: leaq -16(%rdi,%rsi), %rax bsfl %ecx, %ecx addq %rcx, %rax - addq %rcx, %rsi + leaq -16(%rsi,%rcx), %rsi cmpq %rsi, %rdx jle 3b ret diff --git a/sysdeps/x86_64/strchrnul.S b/sysdeps/x86_64/strchrnul.S new file mode 100644 index 0000000000..576027a38d --- /dev/null +++ b/sysdeps/x86_64/strchrnul.S @@ -0,0 +1,63 @@ +/* strchrnul (str, ch) -- Return pointer to first occurrence of CH in STR + or terminating NUL byte. + For AMD x86-64. + Copyright (C) 2009 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + + + .text +ENTRY (__strchrnul) + movd %esi, %xmm1 + movq %rdi, %rcx + punpcklbw %xmm1, %xmm1 + andq $~15, %rdi + pxor %xmm2, %xmm2 + punpcklbw %xmm1, %xmm1 + orl $0xffffffff, %esi + movdqa (%rdi), %xmm0 + pshufd $0, %xmm1, %xmm1 + subq %rdi, %rcx + movdqa %xmm0, %xmm3 + leaq 16(%rdi), %rdi + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm3 + shl %cl, %esi + pmovmskb %xmm0, %edx + pmovmskb %xmm3, %ecx + orl %edx, %ecx + andl %esi, %ecx + jnz 1f + +2: movdqa (%rdi), %xmm0 + leaq 16(%rdi), %rdi + movdqa %xmm0, %xmm3 + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm3 + pmovmskb %xmm0, %edx + pmovmskb %xmm3, %ecx + orl %edx, %ecx + jz 2b + +1: bsfl %ecx, %edx + leaq -16(%rdi,%rdx), %rax + ret +END (__strchrnul) + +weak_alias (__strchrnul, strchrnul) |