summaryrefslogtreecommitdiffstats
path: root/arch/sparc64/lib/blockops.S
blob: d0f023d1b6cbf5786c4b6f429cb781337b46776b (plain)
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