1/* 2 * Written by J.T. Conklin <jtc@NetBSD.org>. 3 * Public domain. 4 */ 5 6#include <machine/asm.h> 7 8#if defined(LIBC_SCCS) 9 RCSID("$NetBSD: swab.S,v 1.14 2014/05/23 02:34:19 uebayasi Exp $") 10#endif 11 12/* 13 * On the i486, this code is negligibly faster than the code generated 14 * by gcc at about half the size. If my i386 databook is correct, it 15 * should be considerably faster than the gcc code on a i386. 16 */ 17 18ENTRY(swab) 19 pushl %esi 20 pushl %edi 21 movl 12(%esp),%esi 22 movl 16(%esp),%edi 23 movl 20(%esp),%ecx 24 25 shrl $1,%ecx 26 testl $7,%ecx # copy first group of 1 to 7 words 27 jz L2 # while swapping alternate bytes. 28 _ALIGN_TEXT,0x90 29L1: lodsw 30 rorw $8,%ax 31 stosw 32 decl %ecx 33 testl $7,%ecx 34 jnz L1 35 36L2: shrl $3,%ecx # copy remainder 8 words at a time 37 jz L4 # while swapping alternate bytes. 38 _ALIGN_TEXT,0x90 39L3: lodsw 40 rorw $8,%ax 41 stosw 42 lodsw 43 rorw $8,%ax 44 stosw 45 lodsw 46 rorw $8,%ax 47 stosw 48 lodsw 49 rorw $8,%ax 50 stosw 51 lodsw 52 rorw $8,%ax 53 stosw 54 lodsw 55 rorw $8,%ax 56 stosw 57 lodsw 58 rorw $8,%ax 59 stosw 60 lodsw 61 rorw $8,%ax 62 stosw 63 decl %ecx 64 jnz L3 65 66L4: popl %edi 67 popl %esi 68 ret 69END(swab) 70