diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2022-12-20 10:19:23 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2022-12-20 10:19:23 +0100 |
commit | 2af7dd95671197f43fb8c2c6d30461c143d63b03 (patch) | |
tree | c980661368f0a8b4a2390433d0dd095e49a61586 /winsup/cygwin/x86_64/swab.S | |
parent | 43743ed754727a0ab5bbe9b15068d3256791f011 (diff) | |
download | newlib-2af7dd95671197f43fb8c2c6d30461c143d63b03.zip newlib-2af7dd95671197f43fb8c2c6d30461c143d63b03.tar.gz newlib-2af7dd95671197f43fb8c2c6d30461c143d63b03.tar.bz2 |
Cygwin: x86_64: import swab.S from NetBSD
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/x86_64/swab.S')
-rw-r--r-- | winsup/cygwin/x86_64/swab.S | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/winsup/cygwin/x86_64/swab.S b/winsup/cygwin/x86_64/swab.S new file mode 100644 index 0000000..ae73d11 --- /dev/null +++ b/winsup/cygwin/x86_64/swab.S @@ -0,0 +1,47 @@ +/* + * Written by J.T. Conklin <jtc@NetBSD.org>. + * Public domain. + */ + +#include <machine/asm.h> + +#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) |