diff options
author | David S. Miller <davem@davemloft.net> | 2016-10-25 00:20:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-10-25 00:20:35 -0400 |
commit | ee841d0aff649164080e445e84885015958d8ff4 (patch) | |
tree | 015261d201e3b2893d19d0b6c9a2d0a80d86cc76 | |
parent | e93704e4464fdc191f73fce35129c18de2ebf95d (diff) |
sparc64: Convert U3copy_{from,to}_user to accurate exception reporting.
Report the exact number of bytes which have not been successfully
copied when an exception occurs, using the running remaining length.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/lib/U3copy_from_user.S | 8 | ||||
-rw-r--r-- | arch/sparc/lib/U3copy_to_user.S | 8 | ||||
-rw-r--r-- | arch/sparc/lib/U3memcpy.S | 227 |
3 files changed, 162 insertions, 81 deletions
diff --git a/arch/sparc/lib/U3copy_from_user.S b/arch/sparc/lib/U3copy_from_user.S index 1046e2b083fe..db73010a1af8 100644 --- a/arch/sparc/lib/U3copy_from_user.S +++ b/arch/sparc/lib/U3copy_from_user.S | |||
@@ -3,19 +3,19 @@ | |||
3 | * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com) | 3 | * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com) |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #define EX_LD(x) \ | 6 | #define EX_LD(x,y) \ |
7 | 98: x; \ | 7 | 98: x; \ |
8 | .section __ex_table,"a";\ | 8 | .section __ex_table,"a";\ |
9 | .align 4; \ | 9 | .align 4; \ |
10 | .word 98b, __retl_mone; \ | 10 | .word 98b, y; \ |
11 | .text; \ | 11 | .text; \ |
12 | .align 4; | 12 | .align 4; |
13 | 13 | ||
14 | #define EX_LD_FP(x) \ | 14 | #define EX_LD_FP(x,y) \ |
15 | 98: x; \ | 15 | 98: x; \ |
16 | .section __ex_table,"a";\ | 16 | .section __ex_table,"a";\ |
17 | .align 4; \ | 17 | .align 4; \ |
18 | .word 98b, __retl_mone_fp;\ | 18 | .word 98b, y##_fp; \ |
19 | .text; \ | 19 | .text; \ |
20 | .align 4; | 20 | .align 4; |
21 | 21 | ||
diff --git a/arch/sparc/lib/U3copy_to_user.S b/arch/sparc/lib/U3copy_to_user.S index 032b0c5419b0..c4ee858e352a 100644 --- a/arch/sparc/lib/U3copy_to_user.S +++ b/arch/sparc/lib/U3copy_to_user.S | |||
@@ -3,19 +3,19 @@ | |||
3 | * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com) | 3 | * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com) |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #define EX_ST(x) \ | 6 | #define EX_ST(x,y) \ |
7 | 98: x; \ | 7 | 98: x; \ |
8 | .section __ex_table,"a";\ | 8 | .section __ex_table,"a";\ |
9 | .align 4; \ | 9 | .align 4; \ |
10 | .word 98b, __retl_mone; \ | 10 | .word 98b, y; \ |
11 | .text; \ | 11 | .text; \ |
12 | .align 4; | 12 | .align 4; |
13 | 13 | ||
14 | #define EX_ST_FP(x) \ | 14 | #define EX_ST_FP(x,y) \ |
15 | 98: x; \ | 15 | 98: x; \ |
16 | .section __ex_table,"a";\ | 16 | .section __ex_table,"a";\ |
17 | .align 4; \ | 17 | .align 4; \ |
18 | .word 98b, __retl_mone_fp;\ | 18 | .word 98b, y##_fp; \ |
19 | .text; \ | 19 | .text; \ |
20 | .align 4; | 20 | .align 4; |
21 | 21 | ||
diff --git a/arch/sparc/lib/U3memcpy.S b/arch/sparc/lib/U3memcpy.S index 491ee69e4995..54f98706b03b 100644 --- a/arch/sparc/lib/U3memcpy.S +++ b/arch/sparc/lib/U3memcpy.S | |||
@@ -4,6 +4,7 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
7 | #include <linux/linkage.h> | ||
7 | #include <asm/visasm.h> | 8 | #include <asm/visasm.h> |
8 | #include <asm/asi.h> | 9 | #include <asm/asi.h> |
9 | #define GLOBAL_SPARE %g7 | 10 | #define GLOBAL_SPARE %g7 |
@@ -22,21 +23,17 @@ | |||
22 | #endif | 23 | #endif |
23 | 24 | ||
24 | #ifndef EX_LD | 25 | #ifndef EX_LD |
25 | #define EX_LD(x) x | 26 | #define EX_LD(x,y) x |
26 | #endif | 27 | #endif |
27 | #ifndef EX_LD_FP | 28 | #ifndef EX_LD_FP |
28 | #define EX_LD_FP(x) x | 29 | #define EX_LD_FP(x,y) x |
29 | #endif | 30 | #endif |
30 | 31 | ||
31 | #ifndef EX_ST | 32 | #ifndef EX_ST |
32 | #define EX_ST(x) x | 33 | #define EX_ST(x,y) x |
33 | #endif | 34 | #endif |
34 | #ifndef EX_ST_FP | 35 | #ifndef EX_ST_FP |
35 | #define EX_ST_FP(x) x | 36 | #define EX_ST_FP(x,y) x |
36 | #endif | ||
37 | |||
38 | #ifndef EX_RETVAL | ||
39 | #define EX_RETVAL(x) x | ||
40 | #endif | 37 | #endif |
41 | 38 | ||
42 | #ifndef LOAD | 39 | #ifndef LOAD |
@@ -77,6 +74,87 @@ | |||
77 | */ | 74 | */ |
78 | 75 | ||
79 | .text | 76 | .text |
77 | #ifndef EX_RETVAL | ||
78 | #define EX_RETVAL(x) x | ||
79 | __restore_fp: | ||
80 | VISExitHalf | ||
81 | retl | ||
82 | nop | ||
83 | ENTRY(U3_retl_o2_plus_g2_plus_g1_plus_1_fp) | ||
84 | add %g1, 1, %g1 | ||
85 | add %g2, %g1, %g2 | ||
86 | ba,pt %xcc, __restore_fp | ||
87 | add %o2, %g2, %o0 | ||
88 | ENDPROC(U3_retl_o2_plus_g2_plus_g1_plus_1_fp) | ||
89 | ENTRY(U3_retl_o2_plus_g2_fp) | ||
90 | ba,pt %xcc, __restore_fp | ||
91 | add %o2, %g2, %o0 | ||
92 | ENDPROC(U3_retl_o2_plus_g2_fp) | ||
93 | ENTRY(U3_retl_o2_plus_g2_plus_8_fp) | ||
94 | add %g2, 8, %g2 | ||
95 | ba,pt %xcc, __restore_fp | ||
96 | add %o2, %g2, %o0 | ||
97 | ENDPROC(U3_retl_o2_plus_g2_plus_8_fp) | ||
98 | ENTRY(U3_retl_o2) | ||
99 | retl | ||
100 | mov %o2, %o0 | ||
101 | ENDPROC(U3_retl_o2) | ||
102 | ENTRY(U3_retl_o2_plus_1) | ||
103 | retl | ||
104 | add %o2, 1, %o0 | ||
105 | ENDPROC(U3_retl_o2_plus_1) | ||
106 | ENTRY(U3_retl_o2_plus_4) | ||
107 | retl | ||
108 | add %o2, 4, %o0 | ||
109 | ENDPROC(U3_retl_o2_plus_4) | ||
110 | ENTRY(U3_retl_o2_plus_8) | ||
111 | retl | ||
112 | add %o2, 8, %o0 | ||
113 | ENDPROC(U3_retl_o2_plus_8) | ||
114 | ENTRY(U3_retl_o2_plus_g1_plus_1) | ||
115 | add %g1, 1, %g1 | ||
116 | retl | ||
117 | add %o2, %g1, %o0 | ||
118 | ENDPROC(U3_retl_o2_plus_g1_plus_1) | ||
119 | ENTRY(U3_retl_o2_fp) | ||
120 | ba,pt %xcc, __restore_fp | ||
121 | mov %o2, %o0 | ||
122 | ENDPROC(U3_retl_o2_fp) | ||
123 | ENTRY(U3_retl_o2_plus_o3_sll_6_plus_0x80_fp) | ||
124 | sll %o3, 6, %o3 | ||
125 | add %o3, 0x80, %o3 | ||
126 | ba,pt %xcc, __restore_fp | ||
127 | add %o2, %o3, %o0 | ||
128 | ENDPROC(U3_retl_o2_plus_o3_sll_6_plus_0x80_fp) | ||
129 | ENTRY(U3_retl_o2_plus_o3_sll_6_plus_0x40_fp) | ||
130 | sll %o3, 6, %o3 | ||
131 | add %o3, 0x40, %o3 | ||
132 | ba,pt %xcc, __restore_fp | ||
133 | add %o2, %o3, %o0 | ||
134 | ENDPROC(U3_retl_o2_plus_o3_sll_6_plus_0x40_fp) | ||
135 | ENTRY(U3_retl_o2_plus_GS_plus_0x10) | ||
136 | add GLOBAL_SPARE, 0x10, GLOBAL_SPARE | ||
137 | retl | ||
138 | add %o2, GLOBAL_SPARE, %o0 | ||
139 | ENDPROC(U3_retl_o2_plus_GS_plus_0x10) | ||
140 | ENTRY(U3_retl_o2_plus_GS_plus_0x08) | ||
141 | add GLOBAL_SPARE, 0x08, GLOBAL_SPARE | ||
142 | retl | ||
143 | add %o2, GLOBAL_SPARE, %o0 | ||
144 | ENDPROC(U3_retl_o2_plus_GS_plus_0x08) | ||
145 | ENTRY(U3_retl_o2_and_7_plus_GS) | ||
146 | and %o2, 7, %o2 | ||
147 | retl | ||
148 | add %o2, GLOBAL_SPARE, %o2 | ||
149 | ENDPROC(U3_retl_o2_and_7_plus_GS) | ||
150 | ENTRY(U3_retl_o2_and_7_plus_GS_plus_8) | ||
151 | add GLOBAL_SPARE, 8, GLOBAL_SPARE | ||
152 | and %o2, 7, %o2 | ||
153 | retl | ||
154 | add %o2, GLOBAL_SPARE, %o2 | ||
155 | ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8) | ||
156 | #endif | ||
157 | |||
80 | .align 64 | 158 | .align 64 |
81 | 159 | ||
82 | /* The cheetah's flexible spine, oversized liver, enlarged heart, | 160 | /* The cheetah's flexible spine, oversized liver, enlarged heart, |
@@ -126,8 +204,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
126 | and %g2, 0x38, %g2 | 204 | and %g2, 0x38, %g2 |
127 | 205 | ||
128 | 1: subcc %g1, 0x1, %g1 | 206 | 1: subcc %g1, 0x1, %g1 |
129 | EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3)) | 207 | EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3), U3_retl_o2_plus_g2_plus_g1_plus_1) |
130 | EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE)) | 208 | EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE), U3_retl_o2_plus_g2_plus_g1_plus_1) |
131 | bgu,pt %XCC, 1b | 209 | bgu,pt %XCC, 1b |
132 | add %o1, 0x1, %o1 | 210 | add %o1, 0x1, %o1 |
133 | 211 | ||
@@ -138,20 +216,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
138 | be,pt %icc, 3f | 216 | be,pt %icc, 3f |
139 | alignaddr %o1, %g0, %o1 | 217 | alignaddr %o1, %g0, %o1 |
140 | 218 | ||
141 | EX_LD_FP(LOAD(ldd, %o1, %f4)) | 219 | EX_LD_FP(LOAD(ldd, %o1, %f4), U3_retl_o2_plus_g2) |
142 | 1: EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6)) | 220 | 1: EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6), U3_retl_o2_plus_g2) |
143 | add %o1, 0x8, %o1 | 221 | add %o1, 0x8, %o1 |
144 | subcc %g2, 0x8, %g2 | 222 | subcc %g2, 0x8, %g2 |
145 | faligndata %f4, %f6, %f0 | 223 | faligndata %f4, %f6, %f0 |
146 | EX_ST_FP(STORE(std, %f0, %o0)) | 224 | EX_ST_FP(STORE(std, %f0, %o0), U3_retl_o2_plus_g2_plus_8) |
147 | be,pn %icc, 3f | 225 | be,pn %icc, 3f |
148 | add %o0, 0x8, %o0 | 226 | add %o0, 0x8, %o0 |
149 | 227 | ||
150 | EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4)) | 228 | EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4), U3_retl_o2_plus_g2) |
151 | add %o1, 0x8, %o1 | 229 | add %o1, 0x8, %o1 |
152 | subcc %g2, 0x8, %g2 | 230 | subcc %g2, 0x8, %g2 |
153 | faligndata %f6, %f4, %f2 | 231 | faligndata %f6, %f4, %f2 |
154 | EX_ST_FP(STORE(std, %f2, %o0)) | 232 | EX_ST_FP(STORE(std, %f2, %o0), U3_retl_o2_plus_g2_plus_8) |
155 | bne,pt %icc, 1b | 233 | bne,pt %icc, 1b |
156 | add %o0, 0x8, %o0 | 234 | add %o0, 0x8, %o0 |
157 | 235 | ||
@@ -161,25 +239,25 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
161 | LOAD(prefetch, %o1 + 0x080, #one_read) | 239 | LOAD(prefetch, %o1 + 0x080, #one_read) |
162 | LOAD(prefetch, %o1 + 0x0c0, #one_read) | 240 | LOAD(prefetch, %o1 + 0x0c0, #one_read) |
163 | LOAD(prefetch, %o1 + 0x100, #one_read) | 241 | LOAD(prefetch, %o1 + 0x100, #one_read) |
164 | EX_LD_FP(LOAD(ldd, %o1 + 0x000, %f0)) | 242 | EX_LD_FP(LOAD(ldd, %o1 + 0x000, %f0), U3_retl_o2) |
165 | LOAD(prefetch, %o1 + 0x140, #one_read) | 243 | LOAD(prefetch, %o1 + 0x140, #one_read) |
166 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2)) | 244 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2) |
167 | LOAD(prefetch, %o1 + 0x180, #one_read) | 245 | LOAD(prefetch, %o1 + 0x180, #one_read) |
168 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4)) | 246 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2) |
169 | LOAD(prefetch, %o1 + 0x1c0, #one_read) | 247 | LOAD(prefetch, %o1 + 0x1c0, #one_read) |
170 | faligndata %f0, %f2, %f16 | 248 | faligndata %f0, %f2, %f16 |
171 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6)) | 249 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2) |
172 | faligndata %f2, %f4, %f18 | 250 | faligndata %f2, %f4, %f18 |
173 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8)) | 251 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2) |
174 | faligndata %f4, %f6, %f20 | 252 | faligndata %f4, %f6, %f20 |
175 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10)) | 253 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2) |
176 | faligndata %f6, %f8, %f22 | 254 | faligndata %f6, %f8, %f22 |
177 | 255 | ||
178 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12)) | 256 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2) |
179 | faligndata %f8, %f10, %f24 | 257 | faligndata %f8, %f10, %f24 |
180 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14)) | 258 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2) |
181 | faligndata %f10, %f12, %f26 | 259 | faligndata %f10, %f12, %f26 |
182 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0)) | 260 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2) |
183 | 261 | ||
184 | subcc GLOBAL_SPARE, 0x80, GLOBAL_SPARE | 262 | subcc GLOBAL_SPARE, 0x80, GLOBAL_SPARE |
185 | add %o1, 0x40, %o1 | 263 | add %o1, 0x40, %o1 |
@@ -190,26 +268,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
190 | 268 | ||
191 | .align 64 | 269 | .align 64 |
192 | 1: | 270 | 1: |
193 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2)) | 271 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
194 | faligndata %f12, %f14, %f28 | 272 | faligndata %f12, %f14, %f28 |
195 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4)) | 273 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
196 | faligndata %f14, %f0, %f30 | 274 | faligndata %f14, %f0, %f30 |
197 | EX_ST_FP(STORE_BLK(%f16, %o0)) | 275 | EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
198 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6)) | 276 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
199 | faligndata %f0, %f2, %f16 | 277 | faligndata %f0, %f2, %f16 |
200 | add %o0, 0x40, %o0 | 278 | add %o0, 0x40, %o0 |
201 | 279 | ||
202 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8)) | 280 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
203 | faligndata %f2, %f4, %f18 | 281 | faligndata %f2, %f4, %f18 |
204 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10)) | 282 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
205 | faligndata %f4, %f6, %f20 | 283 | faligndata %f4, %f6, %f20 |
206 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12)) | 284 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
207 | subcc %o3, 0x01, %o3 | 285 | subcc %o3, 0x01, %o3 |
208 | faligndata %f6, %f8, %f22 | 286 | faligndata %f6, %f8, %f22 |
209 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14)) | 287 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
210 | 288 | ||
211 | faligndata %f8, %f10, %f24 | 289 | faligndata %f8, %f10, %f24 |
212 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0)) | 290 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
213 | LOAD(prefetch, %o1 + 0x1c0, #one_read) | 291 | LOAD(prefetch, %o1 + 0x1c0, #one_read) |
214 | faligndata %f10, %f12, %f26 | 292 | faligndata %f10, %f12, %f26 |
215 | bg,pt %XCC, 1b | 293 | bg,pt %XCC, 1b |
@@ -217,29 +295,29 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
217 | 295 | ||
218 | /* Finally we copy the last full 64-byte block. */ | 296 | /* Finally we copy the last full 64-byte block. */ |
219 | 2: | 297 | 2: |
220 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2)) | 298 | EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
221 | faligndata %f12, %f14, %f28 | 299 | faligndata %f12, %f14, %f28 |
222 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4)) | 300 | EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
223 | faligndata %f14, %f0, %f30 | 301 | faligndata %f14, %f0, %f30 |
224 | EX_ST_FP(STORE_BLK(%f16, %o0)) | 302 | EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x80) |
225 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6)) | 303 | EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
226 | faligndata %f0, %f2, %f16 | 304 | faligndata %f0, %f2, %f16 |
227 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8)) | 305 | EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
228 | faligndata %f2, %f4, %f18 | 306 | faligndata %f2, %f4, %f18 |
229 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10)) | 307 | EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
230 | faligndata %f4, %f6, %f20 | 308 | faligndata %f4, %f6, %f20 |
231 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12)) | 309 | EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
232 | faligndata %f6, %f8, %f22 | 310 | faligndata %f6, %f8, %f22 |
233 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14)) | 311 | EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
234 | faligndata %f8, %f10, %f24 | 312 | faligndata %f8, %f10, %f24 |
235 | cmp %g1, 0 | 313 | cmp %g1, 0 |
236 | be,pt %XCC, 1f | 314 | be,pt %XCC, 1f |
237 | add %o0, 0x40, %o0 | 315 | add %o0, 0x40, %o0 |
238 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0)) | 316 | EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
239 | 1: faligndata %f10, %f12, %f26 | 317 | 1: faligndata %f10, %f12, %f26 |
240 | faligndata %f12, %f14, %f28 | 318 | faligndata %f12, %f14, %f28 |
241 | faligndata %f14, %f0, %f30 | 319 | faligndata %f14, %f0, %f30 |
242 | EX_ST_FP(STORE_BLK(%f16, %o0)) | 320 | EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x40) |
243 | add %o0, 0x40, %o0 | 321 | add %o0, 0x40, %o0 |
244 | add %o1, 0x40, %o1 | 322 | add %o1, 0x40, %o1 |
245 | membar #Sync | 323 | membar #Sync |
@@ -259,20 +337,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
259 | 337 | ||
260 | sub %o2, %g2, %o2 | 338 | sub %o2, %g2, %o2 |
261 | be,a,pt %XCC, 1f | 339 | be,a,pt %XCC, 1f |
262 | EX_LD_FP(LOAD(ldd, %o1 + 0x00, %f0)) | 340 | EX_LD_FP(LOAD(ldd, %o1 + 0x00, %f0), U3_retl_o2_plus_g2) |
263 | 341 | ||
264 | 1: EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f2)) | 342 | 1: EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f2), U3_retl_o2_plus_g2) |
265 | add %o1, 0x8, %o1 | 343 | add %o1, 0x8, %o1 |
266 | subcc %g2, 0x8, %g2 | 344 | subcc %g2, 0x8, %g2 |
267 | faligndata %f0, %f2, %f8 | 345 | faligndata %f0, %f2, %f8 |
268 | EX_ST_FP(STORE(std, %f8, %o0)) | 346 | EX_ST_FP(STORE(std, %f8, %o0), U3_retl_o2_plus_g2_plus_8) |
269 | be,pn %XCC, 2f | 347 | be,pn %XCC, 2f |
270 | add %o0, 0x8, %o0 | 348 | add %o0, 0x8, %o0 |
271 | EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f0)) | 349 | EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f0), U3_retl_o2_plus_g2) |
272 | add %o1, 0x8, %o1 | 350 | add %o1, 0x8, %o1 |
273 | subcc %g2, 0x8, %g2 | 351 | subcc %g2, 0x8, %g2 |
274 | faligndata %f2, %f0, %f8 | 352 | faligndata %f2, %f0, %f8 |
275 | EX_ST_FP(STORE(std, %f8, %o0)) | 353 | EX_ST_FP(STORE(std, %f8, %o0), U3_retl_o2_plus_g2_plus_8) |
276 | bne,pn %XCC, 1b | 354 | bne,pn %XCC, 1b |
277 | add %o0, 0x8, %o0 | 355 | add %o0, 0x8, %o0 |
278 | 356 | ||
@@ -292,30 +370,33 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
292 | andcc %o2, 0x8, %g0 | 370 | andcc %o2, 0x8, %g0 |
293 | be,pt %icc, 1f | 371 | be,pt %icc, 1f |
294 | nop | 372 | nop |
295 | EX_LD(LOAD(ldx, %o1, %o5)) | 373 | EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2) |
296 | EX_ST(STORE(stx, %o5, %o1 + %o3)) | 374 | EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2) |
297 | add %o1, 0x8, %o1 | 375 | add %o1, 0x8, %o1 |
376 | sub %o2, 8, %o2 | ||
298 | 377 | ||
299 | 1: andcc %o2, 0x4, %g0 | 378 | 1: andcc %o2, 0x4, %g0 |
300 | be,pt %icc, 1f | 379 | be,pt %icc, 1f |
301 | nop | 380 | nop |
302 | EX_LD(LOAD(lduw, %o1, %o5)) | 381 | EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2) |
303 | EX_ST(STORE(stw, %o5, %o1 + %o3)) | 382 | EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2) |
304 | add %o1, 0x4, %o1 | 383 | add %o1, 0x4, %o1 |
384 | sub %o2, 4, %o2 | ||
305 | 385 | ||
306 | 1: andcc %o2, 0x2, %g0 | 386 | 1: andcc %o2, 0x2, %g0 |
307 | be,pt %icc, 1f | 387 | be,pt %icc, 1f |
308 | nop | 388 | nop |
309 | EX_LD(LOAD(lduh, %o1, %o5)) | 389 | EX_LD(LOAD(lduh, %o1, %o5), U3_retl_o2) |
310 | EX_ST(STORE(sth, %o5, %o1 + %o3)) | 390 | EX_ST(STORE(sth, %o5, %o1 + %o3), U3_retl_o2) |
311 | add %o1, 0x2, %o1 | 391 | add %o1, 0x2, %o1 |
392 | sub %o2, 2, %o2 | ||
312 | 393 | ||
313 | 1: andcc %o2, 0x1, %g0 | 394 | 1: andcc %o2, 0x1, %g0 |
314 | be,pt %icc, 85f | 395 | be,pt %icc, 85f |
315 | nop | 396 | nop |
316 | EX_LD(LOAD(ldub, %o1, %o5)) | 397 | EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2) |
317 | ba,pt %xcc, 85f | 398 | ba,pt %xcc, 85f |
318 | EX_ST(STORE(stb, %o5, %o1 + %o3)) | 399 | EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2) |
319 | 400 | ||
320 | .align 64 | 401 | .align 64 |
321 | 70: /* 16 < len <= 64 */ | 402 | 70: /* 16 < len <= 64 */ |
@@ -326,26 +407,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
326 | andn %o2, 0xf, GLOBAL_SPARE | 407 | andn %o2, 0xf, GLOBAL_SPARE |
327 | and %o2, 0xf, %o2 | 408 | and %o2, 0xf, %o2 |
328 | 1: subcc GLOBAL_SPARE, 0x10, GLOBAL_SPARE | 409 | 1: subcc GLOBAL_SPARE, 0x10, GLOBAL_SPARE |
329 | EX_LD(LOAD(ldx, %o1 + 0x00, %o5)) | 410 | EX_LD(LOAD(ldx, %o1 + 0x00, %o5), U3_retl_o2_plus_GS_plus_0x10) |
330 | EX_LD(LOAD(ldx, %o1 + 0x08, %g1)) | 411 | EX_LD(LOAD(ldx, %o1 + 0x08, %g1), U3_retl_o2_plus_GS_plus_0x10) |
331 | EX_ST(STORE(stx, %o5, %o1 + %o3)) | 412 | EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_GS_plus_0x10) |
332 | add %o1, 0x8, %o1 | 413 | add %o1, 0x8, %o1 |
333 | EX_ST(STORE(stx, %g1, %o1 + %o3)) | 414 | EX_ST(STORE(stx, %g1, %o1 + %o3), U3_retl_o2_plus_GS_plus_0x08) |
334 | bgu,pt %XCC, 1b | 415 | bgu,pt %XCC, 1b |
335 | add %o1, 0x8, %o1 | 416 | add %o1, 0x8, %o1 |
336 | 73: andcc %o2, 0x8, %g0 | 417 | 73: andcc %o2, 0x8, %g0 |
337 | be,pt %XCC, 1f | 418 | be,pt %XCC, 1f |
338 | nop | 419 | nop |
339 | sub %o2, 0x8, %o2 | 420 | sub %o2, 0x8, %o2 |
340 | EX_LD(LOAD(ldx, %o1, %o5)) | 421 | EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2_plus_8) |
341 | EX_ST(STORE(stx, %o5, %o1 + %o3)) | 422 | EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_8) |
342 | add %o1, 0x8, %o1 | 423 | add %o1, 0x8, %o1 |
343 | 1: andcc %o2, 0x4, %g0 | 424 | 1: andcc %o2, 0x4, %g0 |
344 | be,pt %XCC, 1f | 425 | be,pt %XCC, 1f |
345 | nop | 426 | nop |
346 | sub %o2, 0x4, %o2 | 427 | sub %o2, 0x4, %o2 |
347 | EX_LD(LOAD(lduw, %o1, %o5)) | 428 | EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2_plus_4) |
348 | EX_ST(STORE(stw, %o5, %o1 + %o3)) | 429 | EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2_plus_4) |
349 | add %o1, 0x4, %o1 | 430 | add %o1, 0x4, %o1 |
350 | 1: cmp %o2, 0 | 431 | 1: cmp %o2, 0 |
351 | be,pt %XCC, 85f | 432 | be,pt %XCC, 85f |
@@ -361,8 +442,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
361 | sub %o2, %g1, %o2 | 442 | sub %o2, %g1, %o2 |
362 | 443 | ||
363 | 1: subcc %g1, 1, %g1 | 444 | 1: subcc %g1, 1, %g1 |
364 | EX_LD(LOAD(ldub, %o1, %o5)) | 445 | EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2_plus_g1_plus_1) |
365 | EX_ST(STORE(stb, %o5, %o1 + %o3)) | 446 | EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2_plus_g1_plus_1) |
366 | bgu,pt %icc, 1b | 447 | bgu,pt %icc, 1b |
367 | add %o1, 1, %o1 | 448 | add %o1, 1, %o1 |
368 | 449 | ||
@@ -378,16 +459,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
378 | 459 | ||
379 | 8: mov 64, %o3 | 460 | 8: mov 64, %o3 |
380 | andn %o1, 0x7, %o1 | 461 | andn %o1, 0x7, %o1 |
381 | EX_LD(LOAD(ldx, %o1, %g2)) | 462 | EX_LD(LOAD(ldx, %o1, %g2), U3_retl_o2) |
382 | sub %o3, %g1, %o3 | 463 | sub %o3, %g1, %o3 |
383 | andn %o2, 0x7, GLOBAL_SPARE | 464 | andn %o2, 0x7, GLOBAL_SPARE |
384 | sllx %g2, %g1, %g2 | 465 | sllx %g2, %g1, %g2 |
385 | 1: EX_LD(LOAD(ldx, %o1 + 0x8, %g3)) | 466 | 1: EX_LD(LOAD(ldx, %o1 + 0x8, %g3), U3_retl_o2_and_7_plus_GS) |
386 | subcc GLOBAL_SPARE, 0x8, GLOBAL_SPARE | 467 | subcc GLOBAL_SPARE, 0x8, GLOBAL_SPARE |
387 | add %o1, 0x8, %o1 | 468 | add %o1, 0x8, %o1 |
388 | srlx %g3, %o3, %o5 | 469 | srlx %g3, %o3, %o5 |
389 | or %o5, %g2, %o5 | 470 | or %o5, %g2, %o5 |
390 | EX_ST(STORE(stx, %o5, %o0)) | 471 | EX_ST(STORE(stx, %o5, %o0), U3_retl_o2_and_7_plus_GS_plus_8) |
391 | add %o0, 0x8, %o0 | 472 | add %o0, 0x8, %o0 |
392 | bgu,pt %icc, 1b | 473 | bgu,pt %icc, 1b |
393 | sllx %g3, %g1, %g2 | 474 | sllx %g3, %g1, %g2 |
@@ -407,8 +488,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
407 | 488 | ||
408 | 1: | 489 | 1: |
409 | subcc %o2, 4, %o2 | 490 | subcc %o2, 4, %o2 |
410 | EX_LD(LOAD(lduw, %o1, %g1)) | 491 | EX_LD(LOAD(lduw, %o1, %g1), U3_retl_o2_plus_4) |
411 | EX_ST(STORE(stw, %g1, %o1 + %o3)) | 492 | EX_ST(STORE(stw, %g1, %o1 + %o3), U3_retl_o2_plus_4) |
412 | bgu,pt %XCC, 1b | 493 | bgu,pt %XCC, 1b |
413 | add %o1, 4, %o1 | 494 | add %o1, 4, %o1 |
414 | 495 | ||
@@ -418,8 +499,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
418 | .align 32 | 499 | .align 32 |
419 | 90: | 500 | 90: |
420 | subcc %o2, 1, %o2 | 501 | subcc %o2, 1, %o2 |
421 | EX_LD(LOAD(ldub, %o1, %g1)) | 502 | EX_LD(LOAD(ldub, %o1, %g1), U3_retl_o2_plus_1) |
422 | EX_ST(STORE(stb, %g1, %o1 + %o3)) | 503 | EX_ST(STORE(stb, %g1, %o1 + %o3), U3_retl_o2_plus_1) |
423 | bgu,pt %XCC, 90b | 504 | bgu,pt %XCC, 90b |
424 | add %o1, 1, %o1 | 505 | add %o1, 1, %o1 |
425 | retl | 506 | retl |