xref: /minix3/lib/libc/arch/i386/string/swab.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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