1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/* $Id: blockops.S,v 1.6 1997/05/18 04:16:49 davem Exp $
* arch/sparc64/lib/blockops.S: UltraSparc block zero optimized routines.
*
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
* Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
#include <asm/asi.h>
/* Zero out 256 bytes of memory at (buf + offset). */
#define BLAST_BLOCK(buf, offset) \
stda %f48, [buf + offset + 0x00] %asi; \
stda %f48, [buf + offset + 0x40] %asi; \
stda %f48, [buf + offset + 0x80] %asi; \
stda %f48, [buf + offset + 0xc0] %asi;
/* Copy 256 bytes of memory at (src + offset) to
* (dst + offset).
*/
#define MIRROR_BLOCK(dst, src, offset, sync) \
ldda [src + offset + 0x000] %asi, %f0; \
ldda [src + offset + 0x040] %asi, %f16; \
ldda [src + offset + 0x080] %asi, %f32; \
ldda [src + offset + 0x0c0] %asi, %f48; \
membar sync; \
stda %f0, [dst + offset + 0x000] %asi; \
stda %f16, [dst + offset + 0x040] %asi; \
stda %f32, [dst + offset + 0x080] %asi; \
stda %f48, [dst + offset + 0x0c0] %asi;
.text
.align 4
#if 0
.globl bzero_1page
bzero_1page:
/* %o0 = buf */
mov %o0, %o1
wr %g0, ASI_BLK_P, %asi
mov 0x08, %g2
membar #Sync|#StoreLoad
fzero %f48
fzero %f50
fzero %f52
fzero %f54
fzero %f56
fzero %f58
fzero %f60
fzero %f62
1:
BLAST_BLOCK(%o0, 0x000)
BLAST_BLOCK(%o0, 0x100)
BLAST_BLOCK(%o0, 0x200)
BLAST_BLOCK(%o0, 0x300)
subcc %g2, 1, %g2
bne,pt %icc, 1b
add %o0, 0x400, %o0
membar #Sync|#LoadStore|#StoreStore
retl
mov %o1, %o0
#endif
.globl __bfill64
__bfill64:
#if 1
/* %o0 = buf, %o1 = 64-bit pattern */
#define FILL_BLOCK(buf, offset) \
stx %o1, [buf + offset + 0x38]; \
stx %o1, [buf + offset + 0x30]; \
stx %o1, [buf + offset + 0x28]; \
stx %o1, [buf + offset + 0x20]; \
stx %o1, [buf + offset + 0x18]; \
stx %o1, [buf + offset + 0x10]; \
stx %o1, [buf + offset + 0x08]; \
stx %o1, [buf + offset + 0x00];
mov 0x20, %g2
1:
FILL_BLOCK(%o0, 0x00)
FILL_BLOCK(%o0, 0x40)
FILL_BLOCK(%o0, 0x80)
FILL_BLOCK(%o0, 0xc0)
subcc %g2, 1, %g2
bne,pt %icc, 1b
add %o0, 0x100, %o0
retl
nop
#undef FILL_BLOCK
#else
/* %o0 = buf */
stx %o1, [%sp + 0x7ff + 128]
wr %g0, ASI_BLK_P, %asi
mov 0x08, %g2
ldd [%sp + 0x7ff + 128], %f48
membar #Sync|#StoreLoad
fmovd %f48, %f50
fmovd %f48, %f52
fmovd %f48, %f54
fmovd %f48, %f56
fmovd %f48, %f58
fmovd %f48, %f60
fmovd %f48, %f62
1:
BLAST_BLOCK(%o0, 0x000)
BLAST_BLOCK(%o0, 0x100)
BLAST_BLOCK(%o0, 0x200)
BLAST_BLOCK(%o0, 0x300)
subcc %g2, 1, %g2
bne,pt %icc, 1b
add %o0, 0x400, %o0
retl
membar #Sync|#LoadStore|#StoreStore
#endif
#if 0
.globl __copy_1page
__copy_1page:
/* %o0 = dst, %o1 = src */
or %g0, 0x08, %g1
wr %g0, ASI_BLK_P, %asi
membar #Sync|#StoreLoad
1:
MIRROR_BLOCK(%o0, %o1, 0x000, #Sync)
MIRROR_BLOCK(%o0, %o1, 0x100, #Sync)
MIRROR_BLOCK(%o0, %o1, 0x200, #Sync)
MIRROR_BLOCK(%o0, %o1, 0x300, #Sync)
subcc %g1, 1, %g1
add %o0, 0x400, %o0
bne,pt %icc, 1b
add %o1, 0x400, %o1
retl
membar #Sync|#LoadStore|#StoreStore
#endif
|