usr/src/lib/libc_psr/sun4u/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
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.
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: 0
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/asm_linkage.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/sun4asi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	ANSI_PRAGMA_WEAK(memset,function)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#define	ALIGN8(X)	(((X) + 7) & ~7)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	.section        ".text"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	.align 32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	ENTRY(memset)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	cmp	%o2, 12			! if small counts, just write bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	bgeu,pn	%ncc, .wrbig
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	mov	%o0, %o5		! copy sp1 before using it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
.wrchar:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	deccc   %o2			! byte clearing loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
        inc     %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	bgeu,a,pt %ncc, .wrchar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
        stb     %o1, [%o5 + -1]         ! we've already incremented the address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
        retl
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	.empty	! next instruction is safe, %o0 still good
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
.wrbig:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
        andcc	%o5, 7, %o3		! is sp1 aligned on a 8 byte bound
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
        bz,pt	%ncc, .blkchk		! already double aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	and	%o1, 0xff, %o1		! o1 is (char)c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
        sub	%o3, 8, %o3		! -(bytes till double aligned)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
        add	%o2, %o3, %o2		! update o2 with new count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	! Set -(%o3) bytes till sp1 double aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
1:	stb	%o1, [%o5]		! there is at least 1 byte to set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	inccc	%o3			! byte clearing loop 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
        bl,pt	%ncc, 1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
        inc	%o5 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	! Now sp1 is double aligned (sp1 is found in %o5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
.blkchk:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	sll     %o1, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
        or      %o1, %o3, %o1		! now o1 has 2 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
        sll     %o1, 16, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
        or      %o1, %o3, %o1		! now o1 has 4 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	cmp     %o2, 4095		! if large count use Block ld/st
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	sllx	%o1, 32, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	or	%o1, %o3, %o1		! now o1 has 8 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
        bgu,a,pn %ncc, .blkwr		! Do block write for large count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
        andcc   %o5, 63, %o3            ! is sp1 block aligned?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	and	%o2, 24, %o3		! o3 is {0, 8, 16, 24}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
1:	subcc	%o3, 8, %o3		! double-word loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	add	%o5, 8, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	bgeu,a,pt %ncc, 1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	stx	%o1, [%o5 - 8]		! already incremented the address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	andncc	%o2, 31, %o4		! o4 has 32 byte aligned count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	bz,pn	%ncc, 3f		! First instruction of icache line
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	subcc	%o4, 32, %o4		! main loop, 32 bytes per iteration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	stx	%o1, [%o5 - 8]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	stx	%o1, [%o5]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	stx	%o1, [%o5 + 8]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	stx	%o1, [%o5 + 16]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	bnz,pt	%ncc, 2b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	add	%o5, 32, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
3:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	and	%o2, 7, %o2		! o2 has the remaining bytes (<8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	deccc   %o2                     ! byte clearing loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
        inc     %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
        bgeu,a,pt %ncc, 4b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
        stb     %o1, [%o5 - 9]		! already incremented the address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	retl
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	nop				! %o0 still preserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
.blkwr:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
        bz,pn   %ncc, .blalign		! now block aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
        sub	%o3, 64, %o3		! o3 is -(bytes till block aligned)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	add	%o2, %o3, %o2		! o2 is the remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
        ! Store -(%o3) bytes till dst is block (64 byte) aligned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
        ! Use double word stores.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	! Recall that dst is already double word aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
        stx     %o1, [%o5]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	addcc   %o3, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	bl,pt	%ncc, 1b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	add     %o5, 8, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	! sp1 is block aligned                                     
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
.blalign:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
        rd      %fprs, %g1              ! g1 = fprs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	and	%o2, 63, %o3		! calc bytes left after blk store.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	andcc	%g1, 0x4, %g1		! fprs.du = fprs.dl = 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	bz,a	%ncc, 2f		! Is fprs.fef == 0 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
        wr      %g0, 0x4, %fprs         ! fprs.fef = 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	brnz,pn	%o1, 3f			! %o1 is safe to check all 64-bits
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	andn	%o2, 63, %o4		! calc size of blocks in bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	fzero   %d0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	fzero   %d2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	fzero   %d4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	fzero   %d6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	fmuld   %d0, %d0, %d8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	fzero   %d10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	ba	4f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	fmuld   %d0, %d0, %d12
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	! allocate 8 bytes of scratch space on the stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	add	%sp, -SA(16), %sp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	stx	%o1, [%sp + STACK_BIAS + ALIGN8(MINFRAME)]  ! move %o1 to %d0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	ldd	[%sp + STACK_BIAS + ALIGN8(MINFRAME)], %d0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	fmovd	%d0, %d2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	add	%sp, SA(16), %sp	! deallocate the scratch space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	fmovd	%d0, %d4	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	fmovd	%d0, %d6	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	fmovd	%d0, %d8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	fmovd	%d0, %d10	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	fmovd	%d0, %d12	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
4:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	fmovd	%d0, %d14
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	! 1st quadrant has 64 bytes of c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	! instructions 32-byte aligned here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
        stda    %d0, [%o5]ASI_BLK_P
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
        subcc   %o4, 64, %o4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
        bgu,pt	%ncc, 4b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
        add     %o5, 64, %o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	! Set the remaining doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	subcc   %o3, 8, %o3		! Can we store any doubles?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	blu,pn  %ncc, 6f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	and	%o2, 7, %o2		! calc bytes left after doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
5:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	std     %d0, [%o5]		! store the doubles
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	subcc   %o3, 8, %o3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	bgeu,pt	%ncc, 5b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
        add     %o5, 8, %o5      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	! Set the remaining bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	brz	%o2, .exit		! safe to check all 64-bits
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	! Terminate the copy with a partial store. (bug 1200071 does not apply)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	! The data should be at d0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
        dec     %o2                     ! needed to get the mask right
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	edge8n	%g0, %o2, %o4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	stda	%d0, [%o5]%o4, ASI_PST8_P
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
7:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	deccc	%o2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	stb	%o1, [%o5]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	bgu,pt	%ncc, 7b
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	inc	%o5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
.exit:	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
        membar  #StoreLoad|#StoreStore
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
        retl				! %o0 was preserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
        wr	%g1, %g0, %fprs         ! fprs = g1  restore fprs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	SET_SIZE(memset)