Blame view

kernel/linux-imx6_3.14.28/arch/sparc/lib/GENmemcpy.S 1.91 KB
6b13f685e   김민수   BSP 최초 추가
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
  /* GENmemcpy.S: Generic sparc64 memcpy.
   *
   * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
   */
  
  #ifdef __KERNEL__
  #define GLOBAL_SPARE	%g7
  #else
  #define GLOBAL_SPARE	%g5
  #endif
  
  #ifndef EX_LD
  #define EX_LD(x)	x
  #endif
  
  #ifndef EX_ST
  #define EX_ST(x)	x
  #endif
  
  #ifndef EX_RETVAL
  #define EX_RETVAL(x)	x
  #endif
  
  #ifndef LOAD
  #define LOAD(type,addr,dest)	type [addr], dest
  #endif
  
  #ifndef STORE
  #define STORE(type,src,addr)	type src, [addr]
  #endif
  
  #ifndef FUNC_NAME
  #define FUNC_NAME	GENmemcpy
  #endif
  
  #ifndef PREAMBLE
  #define PREAMBLE
  #endif
  
  #ifndef XCC
  #define XCC xcc
  #endif
  
  	.register	%g2,#scratch
  	.register	%g3,#scratch
  
  	.text
  	.align		64
  
  	.globl	FUNC_NAME
  	.type	FUNC_NAME,#function
  FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */
  	srlx		%o2, 31, %g2
  	cmp		%g2, 0
  	tne		%XCC, 5
  	PREAMBLE
  	mov		%o0, GLOBAL_SPARE
  
  	cmp		%o2, 0
  	be,pn		%XCC, 85f
  	 or		%o0, %o1, %o3
  	cmp		%o2, 16
  	blu,a,pn	%XCC, 80f
  	 or		%o3, %o2, %o3
  
  	xor		%o0, %o1, %o4
  	andcc		%o4, 0x7, %g0
  	bne,a,pn	%XCC, 90f
  	 sub		%o0, %o1, %o3
  
  	and		%o0, 0x7, %o4
  	sub		%o4, 0x8, %o4
  	sub		%g0, %o4, %o4
  	sub		%o2, %o4, %o2
  1:	subcc		%o4, 1, %o4
  	EX_LD(LOAD(ldub, %o1, %g1))
  	EX_ST(STORE(stb, %g1, %o0))
  	add		%o1, 1, %o1
  	bne,pt		%XCC, 1b
  	add		%o0, 1, %o0
  
  	andn		%o2, 0x7, %g1
  	sub		%o2, %g1, %o2
  1:	subcc		%g1, 0x8, %g1
  	EX_LD(LOAD(ldx, %o1, %g2))
  	EX_ST(STORE(stx, %g2, %o0))
  	add		%o1, 0x8, %o1
  	bne,pt		%XCC, 1b
  	 add		%o0, 0x8, %o0
  
  	brz,pt		%o2, 85f
  	 sub		%o0, %o1, %o3
  	ba,a,pt		%XCC, 90f
  
  	.align		64
  80: /* 0 < len <= 16 */
  	andcc		%o3, 0x3, %g0
  	bne,pn		%XCC, 90f
  	 sub		%o0, %o1, %o3
  
  1:
  	subcc		%o2, 4, %o2
  	EX_LD(LOAD(lduw, %o1, %g1))
  	EX_ST(STORE(stw, %g1, %o1 + %o3))
  	bgu,pt		%XCC, 1b
  	 add		%o1, 4, %o1
  
  85:	retl
  	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
  
  	.align		32
  90:
  	subcc		%o2, 1, %o2
  	EX_LD(LOAD(ldub, %o1, %g1))
  	EX_ST(STORE(stb, %g1, %o1 + %o3))
  	bgu,pt		%XCC, 90b
  	 add		%o1, 1, %o1
  	retl
  	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
  
  	.size		FUNC_NAME, .-FUNC_NAME