diff --git a/winsup/cygwin/Makefile.am b/winsup/cygwin/Makefile.am index f8c249f52..0200f6e2a 100644 --- a/winsup/cygwin/Makefile.am +++ b/winsup/cygwin/Makefile.am @@ -58,6 +58,7 @@ TARGET_FILES= \ x86_64/memmove.S \ x86_64/mempcpy.S \ x86_64/memset.S \ + x86_64/swab.S \ x86_64/wmemcpy.S \ x86_64/wmemmove.S \ x86_64/wmempcpy.S diff --git a/winsup/cygwin/x86_64/swab.S b/winsup/cygwin/x86_64/swab.S new file mode 100644 index 000000000..ae73d1124 --- /dev/null +++ b/winsup/cygwin/x86_64/swab.S @@ -0,0 +1,47 @@ +/* + * Written by J.T. Conklin . + * Public domain. + */ + +#include + +#if defined(LIBC_SCCS) + RCSID("$NetBSD: swab.S,v 1.4 2014/05/22 15:01:57 uebayasi Exp $") +#endif + +#define LOAD_SWAP_STORE_WORD \ + lodsw ; \ + xchgb %al,%ah ; \ + stosw + +ENTRY3(swab) + xchgq %rdi,%rsi + cld # set direction forward + + shrq $1,%rdx + testq $7,%rdx # copy first group of 1 to 7 words + jz L2 # while swapping alternate bytes. +L1: lodsw + rorw $8,%ax + stosw + decq %rdx + testq $7,%rdx + jnz L1 + +L2: shrq $3,%rdx # copy remainder 8 words at a time + jz L4 # while swapping alternate bytes. +L3: + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + LOAD_SWAP_STORE_WORD + + decq %rdx + jnz L3 +L4: + ret +END(swab)