Root/arch/sparc/lib/GENmemcpy.S

Source at commit 0de2b2b3be81048189a32f7a3d3ba0ba9ec817b6 created 11 years 11 months ago.
By Maarten ter Huurne, MIPS: JZ4740: Fixed value for round robin constant.
1/* GENmemcpy.S: Generic sparc64 memcpy.
2 *
3 * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
4 */
5
6#ifdef __KERNEL__
7#define GLOBAL_SPARE %g7
8#else
9#define GLOBAL_SPARE %g5
10#endif
11
12#ifndef EX_LD
13#define EX_LD(x) x
14#endif
15
16#ifndef EX_ST
17#define EX_ST(x) x
18#endif
19
20#ifndef EX_RETVAL
21#define EX_RETVAL(x) x
22#endif
23
24#ifndef LOAD
25#define LOAD(type,addr,dest) type [addr], dest
26#endif
27
28#ifndef STORE
29#define STORE(type,src,addr) type src, [addr]
30#endif
31
32#ifndef FUNC_NAME
33#define FUNC_NAME GENmemcpy
34#endif
35
36#ifndef PREAMBLE
37#define PREAMBLE
38#endif
39
40#ifndef XCC
41#define XCC xcc
42#endif
43
44    .register %g2,#scratch
45    .register %g3,#scratch
46
47    .text
48    .align 64
49
50    .globl FUNC_NAME
51    .type FUNC_NAME,#function
52FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
53    srlx %o2, 31, %g2
54    cmp %g2, 0
55    tne %XCC, 5
56    PREAMBLE
57    mov %o0, GLOBAL_SPARE
58
59    cmp %o2, 0
60    be,pn %XCC, 85f
61     or %o0, %o1, %o3
62    cmp %o2, 16
63    blu,a,pn %XCC, 80f
64     or %o3, %o2, %o3
65
66    xor %o0, %o1, %o4
67    andcc %o4, 0x7, %g0
68    bne,a,pn %XCC, 90f
69     sub %o0, %o1, %o3
70
71    and %o0, 0x7, %o4
72    sub %o4, 0x8, %o4
73    sub %g0, %o4, %o4
74    sub %o2, %o4, %o2
751: subcc %o4, 1, %o4
76    EX_LD(LOAD(ldub, %o1, %g1))
77    EX_ST(STORE(stb, %g1, %o0))
78    add %o1, 1, %o1
79    bne,pt %XCC, 1b
80    add %o0, 1, %o0
81
82    andn %o2, 0x7, %g1
83    sub %o2, %g1, %o2
841: subcc %g1, 0x8, %g1
85    EX_LD(LOAD(ldx, %o1, %g2))
86    EX_ST(STORE(stx, %g2, %o0))
87    add %o1, 0x8, %o1
88    bne,pt %XCC, 1b
89     add %o0, 0x8, %o0
90
91    brz,pt %o2, 85f
92     sub %o0, %o1, %o3
93    ba,a,pt %XCC, 90f
94
95    .align 64
9680: /* 0 < len <= 16 */
97    andcc %o3, 0x3, %g0
98    bne,pn %XCC, 90f
99     sub %o0, %o1, %o3
100
1011:
102    subcc %o2, 4, %o2
103    EX_LD(LOAD(lduw, %o1, %g1))
104    EX_ST(STORE(stw, %g1, %o1 + %o3))
105    bgu,pt %XCC, 1b
106     add %o1, 4, %o1
107
10885: retl
109     mov EX_RETVAL(GLOBAL_SPARE), %o0
110
111    .align 32
11290:
113    subcc %o2, 1, %o2
114    EX_LD(LOAD(ldub, %o1, %g1))
115    EX_ST(STORE(stb, %g1, %o1 + %o3))
116    bgu,pt %XCC, 90b
117     add %o1, 1, %o1
118    retl
119     mov EX_RETVAL(GLOBAL_SPARE), %o0
120
121    .size FUNC_NAME, .-FUNC_NAME
122

Archive Download this file



interactive