usr/src/lib/libc/sparc/gen/memmove.s
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 6812 febeba71273d
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    24
 * Use is subject to license terms.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 6812
diff changeset
    27
	.file	"memmove.s"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/asm_linkage.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
	ANSI_PRAGMA_WEAK(memmove,function)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * memmove(s1, s2, len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * Copy s2 to s1, always copy n bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * For overlapped copies it does the right thing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
	ENTRY(memmove)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
	save	%sp, -SA(MINFRAME), %sp		! not a leaf routine any more
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
	mov	%i0, %l6	! Save pointer to destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
	cmp	%i1, %i0	! if from address is >= to use forward copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
	bgeu,a	2f		! else use backward if ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	cmp	%i2, 17		! delay slot, for small counts copy bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	sub	%i0, %i1, %i4	! get difference of two addresses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	cmp	%i2, %i4	! compare size and difference of addresses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	bgu	ovbc		! if size is bigger, have do overlapped copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	cmp	%i2, 17		! delay slot, for small counts copy bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	! normal, copy forwards
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
2:	ble	dbytecp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	andcc	%i1, 3, %i5		! is src word aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	bz	aldst
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	cmp	%i5, 2			! is src half-word aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	be	s2algn
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	cmp	%i5, 3			! src is byte aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
s1algn:	ldub	[%i1], %i3		! move 1 or 3 bytes to align it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	inc	1, %i1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	stb	%i3, [%i0]		! move a byte to align src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	inc	1, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	bne	s2algn
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	dec	%i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	b	ald			! now go align dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	andcc	%i0, 3, %i5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
s2algn:	lduh	[%i1], %i3		! know src is 2 byte alinged
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	inc	2, %i1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	srl	%i3, 8, %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	stb	%i4, [%i0]		! have to do bytes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	stb	%i3, [%i0 + 1]		! don't know dst alingment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	inc	2, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	dec	2, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
aldst:	andcc	%i0, 3, %i5		! align the destination address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
ald:	bz	w4cp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	cmp	%i5, 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	bz	w2cp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	cmp	%i5, 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
w3cp:	ld	[%i1], %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	inc	4, %i1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	srl	%i4, 24, %i5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	stb	%i5, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	bne	w1cp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	inc	%i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	dec	1, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	andn	%i2, 3, %i3		! i3 is aligned word count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	dec	4, %i3			! avoid reading beyond tail of src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
1:	sll	%i4, 8, %g1		! save residual bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	ld	[%i1+%i0], %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	deccc	4, %i3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	srl	%i4, 24, %i5		! merge with residual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	or	%i5, %g1, %g1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	st	%g1, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	bnz	1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	inc	4, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	sub	%i1, 3, %i1		! used one byte of last word read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	and	%i2, 3, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	b	7f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	inc	4, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
w1cp:	srl	%i4, 8, %i5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	sth	%i5, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	inc	2, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	dec	3, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	andn	%i2, 3, %i3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	dec	4, %i3			! avoid reading beyond tail of src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
2:	sll	%i4, 24, %g1		! save residual bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	ld	[%i1+%i0], %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	deccc	4, %i3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	srl	%i4, 8, %i5		! merge with residual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	or	%i5, %g1, %g1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	st	%g1, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	bnz	2b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	inc	4, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	sub	%i1, 1, %i1		! used three bytes of last word read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	and	%i2, 3, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	b	7f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	inc	4, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
w2cp:	ld	[%i1], %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	inc	4, %i1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	srl	%i4, 16, %i5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	sth	%i5, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	inc	2, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	dec	2, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	andn	%i2, 3, %i3		! i3 is aligned word count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	dec	4, %i3			! avoid reading beyond tail of src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
3:	sll	%i4, 16, %g1		! save residual bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	ld	[%i1+%i0], %i4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	deccc	4, %i3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	srl	%i4, 16, %i5		! merge with residual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	or	%i5, %g1, %g1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	st	%g1, [%i0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	bnz	3b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	inc	4, %i0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	sub	%i1, 2, %i1		! used two bytes of last word read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	and	%i2, 3, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	b	7f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	inc	4, %i2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
w4cp:	andn	%i2, 3, %i3		! i3 is aligned word count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
1:	ld	[%i1+%i0], %i4		! read from address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	deccc	4, %i3			! decrement count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	st	%i4, [%i0]		! write at destination address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	bg	1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	inc	4, %i0			! increment to address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	b	7f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	and	%i2, 3, %i2		! number of leftover bytes, if any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	! differenced byte copy, works with any alignment
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
dbytecp:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	b	7f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
4:	stb	%i4, [%i0]		! write to address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	inc	%i0			! inc to address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
7:	deccc	%i2			! decrement count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	bge,a	4b			! loop till done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	ldub	[%i1+%i0], %i4		! read from address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	ret
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	restore %l6, %g0, %o0		! return pointer to destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	! an overlapped copy that must be done "backwards"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
ovbc:	add	%i1, %i2, %i1		! get to end of source space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	add	%i0, %i2, %i0		! get to end of destination space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	sub	%i1, %i0, %i1		! i1 gets the difference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
5:	dec	%i0			! decrement to address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	ldub	[%i1+%i0], %i3		! read a byte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	deccc	%i2			! decrement count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	bg	5b			! loop until done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	stb	%i3, [%i0]		! write byte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	ret	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	restore %l6, %g0, %o0		! return pointer to destination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	SET_SIZE(memmove)