12fe8fb19SBen Gras/* 22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>. 32fe8fb19SBen Gras * Public domain. 42fe8fb19SBen Gras */ 52fe8fb19SBen Gras 62fe8fb19SBen Gras#include <machine/asm.h> 72fe8fb19SBen Gras 82fe8fb19SBen Gras#if defined(LIBC_SCCS) 9*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: swab.S,v 1.14 2014/05/23 02:34:19 uebayasi Exp $") 102fe8fb19SBen Gras#endif 112fe8fb19SBen Gras 122fe8fb19SBen Gras/* 132fe8fb19SBen Gras * On the i486, this code is negligibly faster than the code generated 142fe8fb19SBen Gras * by gcc at about half the size. If my i386 databook is correct, it 152fe8fb19SBen Gras * should be considerably faster than the gcc code on a i386. 162fe8fb19SBen Gras */ 172fe8fb19SBen Gras 182fe8fb19SBen GrasENTRY(swab) 192fe8fb19SBen Gras pushl %esi 202fe8fb19SBen Gras pushl %edi 212fe8fb19SBen Gras movl 12(%esp),%esi 222fe8fb19SBen Gras movl 16(%esp),%edi 232fe8fb19SBen Gras movl 20(%esp),%ecx 242fe8fb19SBen Gras 252fe8fb19SBen Gras shrl $1,%ecx 262fe8fb19SBen Gras testl $7,%ecx # copy first group of 1 to 7 words 272fe8fb19SBen Gras jz L2 # while swapping alternate bytes. 282fe8fb19SBen Gras _ALIGN_TEXT,0x90 292fe8fb19SBen GrasL1: lodsw 302fe8fb19SBen Gras rorw $8,%ax 312fe8fb19SBen Gras stosw 322fe8fb19SBen Gras decl %ecx 332fe8fb19SBen Gras testl $7,%ecx 342fe8fb19SBen Gras jnz L1 352fe8fb19SBen Gras 362fe8fb19SBen GrasL2: shrl $3,%ecx # copy remainder 8 words at a time 372fe8fb19SBen Gras jz L4 # while swapping alternate bytes. 382fe8fb19SBen Gras _ALIGN_TEXT,0x90 392fe8fb19SBen GrasL3: lodsw 402fe8fb19SBen Gras rorw $8,%ax 412fe8fb19SBen Gras stosw 422fe8fb19SBen Gras lodsw 432fe8fb19SBen Gras rorw $8,%ax 442fe8fb19SBen Gras stosw 452fe8fb19SBen Gras lodsw 462fe8fb19SBen Gras rorw $8,%ax 472fe8fb19SBen Gras stosw 482fe8fb19SBen Gras lodsw 492fe8fb19SBen Gras rorw $8,%ax 502fe8fb19SBen Gras stosw 512fe8fb19SBen Gras lodsw 522fe8fb19SBen Gras rorw $8,%ax 532fe8fb19SBen Gras stosw 542fe8fb19SBen Gras lodsw 552fe8fb19SBen Gras rorw $8,%ax 562fe8fb19SBen Gras stosw 572fe8fb19SBen Gras lodsw 582fe8fb19SBen Gras rorw $8,%ax 592fe8fb19SBen Gras stosw 602fe8fb19SBen Gras lodsw 612fe8fb19SBen Gras rorw $8,%ax 622fe8fb19SBen Gras stosw 632fe8fb19SBen Gras decl %ecx 642fe8fb19SBen Gras jnz L3 652fe8fb19SBen Gras 662fe8fb19SBen GrasL4: popl %edi 672fe8fb19SBen Gras popl %esi 682fe8fb19SBen Gras ret 69*0a6a1f1dSLionel SambucEND(swab) 70