/* * 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)