Home | History | Annotate | Download | only in lib
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2008 H. Peter Anvin - All Rights Reserved
      4  *   Copyright 2010 Intel Corporation; author: H. Peter Anvin
      5  *
      6  *   Permission is hereby granted, free of charge, to any person
      7  *   obtaining a copy of this software and associated documentation
      8  *   files (the "Software"), to deal in the Software without
      9  *   restriction, including without limitation the rights to use,
     10  *   copy, modify, merge, publish, distribute, sublicense, and/or
     11  *   sell copies of the Software, and to permit persons to whom
     12  *   the Software is furnished to do so, subject to the following
     13  *   conditions:
     14  *
     15  *   The above copyright notice and this permission notice shall
     16  *   be included in all copies or substantial portions of the Software.
     17  *
     18  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     19  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     20  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     21  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     22  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     23  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     24  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     25  *   OTHER DEALINGS IN THE SOFTWARE.
     26  *
     27  * ----------------------------------------------------------------------- */
     28 
     29 /*
     30  * memmove.S
     31  *
     32  * Reasonably efficient memmove, using aligned transfers at least
     33  * for the destination operand.
     34  */
     35 
     36 	.globl	memmove
     37 	.type	memmove,@function
     38 	.text
     39 memmove:
     40 	movl	0xc(%esp),%ecx
     41 	movl	0x8(%esp),%edx
     42 	movl	0x4(%esp),%eax
     43 
     44 	jecxz	4f
     45 
     46 	pushl	%esi
     47 	pushl	%edi
     48 	pushl	%eax		/* Return value */
     49 
     50 	movl	%eax,%edi
     51 	movl	%edx,%esi
     52 
     53 	cmpl	%edi,%esi
     54 	jb	2f
     55 
     56 	/* source >= dest, forwards move */
     57 
     58 	/* Initial alignment */
     59 1:
     60 	movl	%edi,%edx
     61 	shrl	$1,%edx
     62 	jnc	11f
     63 	movsb
     64 	decl	%ecx
     65 11:
     66 	movb	%cl,%al
     67 	cmpl	$2,%ecx
     68 	jb	13f
     69 
     70 	shrl	$1,%edx
     71 	jnc	12f
     72 	movsw
     73 	subl	$2,%ecx
     74 12:
     75 	/* Bulk transfer */
     76 	movb	%cl,%al
     77 	shrl	$2,%ecx
     78 	rep; movsl
     79 
     80 	/* Final alignment */
     81 	testb	$2,%al
     82 	jz	14f
     83 	movsw
     84 13:
     85 14:
     86 	testb	$1,%al
     87 	jz	15f
     88 	movsb
     89 15:
     90 	/* Common exit stub */
     91 3:
     92 	popl	%eax		/* Return value */
     93 	popl	%edi
     94 	popl	%esi
     95 4:
     96 	ret
     97 
     98 
     99 2:
    100 	/* source < dest, backwards move if overlap */
    101 	leal	-1(%ecx,%esi),%eax
    102 	cmpl	%eax,%edi
    103 	ja	1b			/* No overlap, after all... */
    104 
    105 	std
    106 	leal	-1(%ecx,%edi),%edi
    107 	movl	%eax,%esi
    108 
    109 	/* Initial alignment */
    110 	movl	%edi,%edx
    111 	shrl	$1,%edx
    112 	jc	21f
    113 	movsb
    114 	decl	%ecx
    115 21:
    116 	decl	%esi
    117 	decl	%edi
    118 	movb	%cl,%al
    119 	cmpl	$2,%ecx
    120 	jb	23f
    121 	shrl	$1,%edx
    122 	jc	22f
    123 	movsw
    124 	subl	$2,%ecx
    125 22:
    126 	/* Bulk transfer */
    127 	subl	$2,%esi
    128 	subl	$2,%edi
    129 	movb	%cl,%al
    130 	shrl	$2,%ecx
    131 	rep; movsl
    132 
    133 	/* Final alignment */
    134 	addl	$2,%esi
    135 	addl	$2,%edi
    136 	testb	$2,%al
    137 	jz	24f
    138 	movsw
    139 23:
    140 24:
    141 	incl	%esi
    142 	incl	%edi
    143 	testb	$1,%al
    144 	jz	25f
    145 	movsb
    146 25:
    147 	cld
    148 	jmp	3b
    149 
    150 	.size	memmove, .-memmove
    151