usr/src/lib/libc_psr/sun4v/common/memset.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
3900
0388bcf80faf 6507249 memset in sun4v 32 bit libc_psr fails when size argument is 0
mathue
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
0388bcf80faf 6507249 memset in sun4v 32 bit libc_psr fails when size argument is 0
mathue
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: 4077
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4077
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
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	"memset.s"
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4077
diff changeset
    28
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * char *memset(sp, c, n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * Set an array of n chars starting at sp to the character c.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * Return sp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * Fast assembler language version of the following C-program for memset
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * which represents the `standard' for the C-library.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 *	void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 *	memset(void *sp1, int c, size_t n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 *	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 *	    if (n != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 *		char *sp = sp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 *		do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 *		    *sp++ = (char)c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *		} while (--n != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 *	    return (sp1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 *	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * Flow :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 *	For small 6 or fewer bytes stores, bytes will be stored.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 *	For less than 32 bytes stores, align the address on 4 byte boundary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 *	Then store as many 4-byte chunks, followed by trailing bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *	For sizes greater than 32 bytes, align the address on 8 byte boundary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 *	if (count > 64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 *		store as many 8-bytes chunks to block align the address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *		store using ASI_BLK_INIT_ST_QUAD_LDD_P
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 *	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *	Store as many 8-byte chunks, followed by trialing bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 *		
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <sys/asm_linkage.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <sys/niagaraasi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <sys/asi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	ANSI_PRAGMA_WEAK(memset,function)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	.section        ".text"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	.align 32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	ENTRY(memset)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	mov	%o0, %o5		! copy sp1 before using it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	cmp	%o2, 7			! if small counts, just write bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	blu,pn	%ncc, .wrchar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	and	%o1, 0xff, %o1		! o1 is (char)c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	sll	%o1, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	or	%o1, %o3, %o1		! now o1 has 2 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	sll	%o1, 16, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	cmp	%o2, 0x20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	blu,pn	%ncc, .wdalign
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	or	%o1, %o3, %o1		! now o1 has 4 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	sllx	%o1, 32, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	or	%o1, %o3, %o1		! now o1 has 8 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
.dbalign:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	andcc	%o5, 7, %o3		! is sp1 aligned on a 8 byte bound
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	bz,pt	%ncc, .blkalign		! already double aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	sub	%o3, 8, %o3		! -(bytes till double aligned)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	add	%o2, %o3, %o2		! update o2 with new count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	! Set -(%o3) bytes till sp1 double aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
1:	stb	%o1, [%o5]		! there is at least 1 byte to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	inccc	%o3			! byte clearing loop 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	bl,pt	%ncc, 1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	inc	%o5 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	! Now sp1 is double aligned (sp1 is found in %o5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
.blkalign:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	mov	ASI_BLK_INIT_ST_QUAD_LDD_P, %asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	cmp	%o2, 0x40		! check if there are 64 bytes to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	blu,pn	%ncc, 5f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	mov	%o2, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	andcc	%o5, 63, %o3		! is sp1 block aligned?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	bz,pt	%ncc, .blkwr		! now block aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	sub	%o3, 64, %o3		! o3 is -(bytes till block aligned)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	add	%o2, %o3, %o2		! o2 is the remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	! Store -(%o3) bytes till dst is block (64 byte) aligned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	! Use double word stores.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	! Recall that dst is already double word aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	stx	%o1, [%o5]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	addcc	%o3, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	bl,pt	%ncc, 1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	add	%o5, 8, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	! Now sp1 is block aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
.blkwr:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	and	%o2, 63, %o3		! calc bytes left after blk store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	andn	%o2, 63, %o4		! calc size of blocks in bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	cmp	%o4, 0x100		! check if there are 256 bytes to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	blu,pn	%ncc, 3f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	stxa	%o1, [%o5+0x0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	stxa	%o1, [%o5+0x40]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	stxa	%o1, [%o5+0x80]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	stxa	%o1, [%o5+0xc0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	stxa	%o1, [%o5+0x8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	stxa	%o1, [%o5+0x10]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	stxa	%o1, [%o5+0x18]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	stxa	%o1, [%o5+0x20]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	stxa	%o1, [%o5+0x28]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	stxa	%o1, [%o5+0x30]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	stxa	%o1, [%o5+0x38]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	stxa	%o1, [%o5+0x48]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	stxa	%o1, [%o5+0x50]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	stxa	%o1, [%o5+0x58]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	stxa	%o1, [%o5+0x60]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	stxa	%o1, [%o5+0x68]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	stxa	%o1, [%o5+0x70]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	stxa	%o1, [%o5+0x78]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	stxa	%o1, [%o5+0x88]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	stxa	%o1, [%o5+0x90]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	stxa	%o1, [%o5+0x98]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	stxa	%o1, [%o5+0xa0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	stxa	%o1, [%o5+0xa8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	stxa	%o1, [%o5+0xb0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	stxa	%o1, [%o5+0xb8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	stxa	%o1, [%o5+0xc8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	stxa	%o1, [%o5+0xd0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	stxa	%o1, [%o5+0xd8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	stxa	%o1, [%o5+0xe0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	stxa	%o1, [%o5+0xe8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	stxa	%o1, [%o5+0xf0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	stxa	%o1, [%o5+0xf8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	sub	%o4, 0x100, %o4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	cmp	%o4, 0x100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	bgu,pt	%ncc, 2b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	add	%o5, 0x100, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	cmp	%o4, 0x40		! check if 64 bytes to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	blu	%ncc, 5f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
4:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	stxa	%o1, [%o5+0x0]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	stxa	%o1, [%o5+0x8]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	stxa	%o1, [%o5+0x10]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	stxa	%o1, [%o5+0x18]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	stxa	%o1, [%o5+0x20]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	stxa	%o1, [%o5+0x28]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	stxa	%o1, [%o5+0x30]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	stxa	%o1, [%o5+0x38]%asi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	subcc	%o4, 0x40, %o4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	bgu,pt	%ncc, 4b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	add	%o5, 0x40, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	! Set the remaining doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	membar	#Sync
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	mov	ASI_PNF, %asi		! restore %asi to default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
					! ASI_PRIMARY_NOFAULT value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	subcc	%o3, 8, %o3		! Can we store any doubles?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	blu,pn	%ncc, .wrchar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	and	%o2, 7, %o2		! calc bytes left after doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	stx	%o1, [%o5]		! store the doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	subcc	%o3, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	bgeu,pt	%ncc, 6b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	add	%o5, 8, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	ba	.wrchar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
.wdalign:			
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	andcc	%o5, 3, %o3		! is sp1 aligned on a word boundary
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	bz,pn	%ncc, .wrword
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	andn	%o2, 3, %o3		! create word sized count in %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	dec	%o2			! decrement count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	stb	%o1, [%o5]		! clear a byte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	b	.wdalign
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	inc	%o5			! next byte
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
.wrword:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	st	%o1, [%o5]		! 4-byte writing loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	subcc	%o3, 4, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	bnz,pt	%ncc, .wrword
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	inc	4, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	and	%o2, 3, %o2		! leftover count, if any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
.wrchar:
3900
0388bcf80faf 6507249 memset in sun4v 32 bit libc_psr fails when size argument is 0
mathue
parents: 0
diff changeset
   233
	! Set the remaining bytes, if any
0388bcf80faf 6507249 memset in sun4v 32 bit libc_psr fails when size argument is 0
mathue
parents: 0
diff changeset
   234
	cmp	%o2, 0
0388bcf80faf 6507249 memset in sun4v 32 bit libc_psr fails when size argument is 0
mathue
parents: 0
diff changeset
   235
	be	%ncc, .exit
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
7:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	deccc	%o2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	stb	%o1, [%o5]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	bgu,pt	%ncc, 7b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	inc	%o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
.exit:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	retl				! %o0 was preserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	nop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	SET_SIZE(memset)