1
2
3
4
5
6
7
8
9
10
11
12
13 .text
14 .p2align 4
15
16
17
18
19
20
21
22
23
24 .globl memcpy,__memcpy_end
25 .type memcpy,@function
26memcpy:
27 or.p gr8,gr9,gr4
28 orcc gr10,gr0,gr0,icc3
29 or.p gr10,gr4,gr4
30 beqlr icc3,
31
32
33 andicc.p gr4,
34 setlos
35 andicc.p gr4,
36 beq icc0,
37 andicc.p gr4,
38 beq icc1,
39 andicc.p gr4,
40 beq icc0,
41 setlos.p
42 beq icc1,
43
44
45 sub.p gr8,gr11,gr3
46 sub gr9,gr11,gr9
470: ldubu.p @(gr9,gr11),gr4
48 subicc gr10,
49 stbu.p gr4,@(gr3,gr11)
50 bne icc0,
51 bralr
52
53
54memcpy_2:
55 setlos
56 sub.p gr8,gr11,gr3
57 sub gr9,gr11,gr9
580: lduhu.p @(gr9,gr11),gr4
59 subicc gr10,
60 sthu.p gr4,@(gr3,gr11)
61 bne icc0,
62 bralr
63
64
65memcpy_4:
66 setlos
67 sub.p gr8,gr11,gr3
68 sub gr9,gr11,gr9
690: ldu.p @(gr9,gr11),gr4
70 subicc gr10,
71 stu.p gr4,@(gr3,gr11)
72 bne icc0,
73 bralr
74
75
76memcpy_8:
77 sub.p gr8,gr11,gr3
78 sub gr9,gr11,gr9
790: lddu.p @(gr9,gr11),gr4
80 subicc gr10,
81 stdu.p gr4,@(gr3,gr11)
82 bne icc0,
83 bralr
84
85
86memcpy_16:
87 sub.p gr8,gr11,gr3
88 sub gr9,gr11,gr9
890: lddu @(gr9,gr11),gr4
90 lddu.p @(gr9,gr11),gr6
91 subicc gr10,
92 stdu gr4,@(gr3,gr11)
93 stdu.p gr6,@(gr3,gr11)
94 bne icc0,
95 bralr
96__memcpy_end:
97
98 .size memcpy, __memcpy_end-memcpy
99
100
101
102
103
104
105
106
107
108 .globl __memcpy_user, __memcpy_user_error_lr, __memcpy_user_error_handler
109 .type __memcpy_user,@function
110__memcpy_user:
111 movsg lr,gr7
112 subi.p sp,
113 add gr8,gr10,gr6 ; calculate expected end address
114 stdi gr6,@(sp,
115
116
117 call memcpy
118__memcpy_user_error_lr:
119 ldi.p @(sp,
120 setlos
121 jmpl.p @(gr7,gr0)
122 addi sp,
123
124
125
126
127__memcpy_user_error_handler:
128 lddi.p @(sp,
129 add gr11,gr3,gr7
130 sub.p gr4,gr7,gr8
131
132 addi sp,
133 jmpl @(gr5,gr0)
134
135 .size __memcpy_user, .-__memcpy_user
136