lib/genalloc: fix the overflow when size is too big
[linux-2.6-microblaze.git] / arch / powerpc / lib / copyuser_power7.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *
4  * Copyright (C) IBM Corporation, 2011
5  *
6  * Author: Anton Blanchard <anton@au.ibm.com>
7  */
8 #include <asm/ppc_asm.h>
9
10 #ifndef SELFTEST_CASE
11 /* 0 == don't use VMX, 1 == use VMX */
12 #define SELFTEST_CASE   0
13 #endif
14
15 #ifdef __BIG_ENDIAN__
16 #define LVS(VRT,RA,RB)          lvsl    VRT,RA,RB
17 #define VPERM(VRT,VRA,VRB,VRC)  vperm   VRT,VRA,VRB,VRC
18 #else
19 #define LVS(VRT,RA,RB)          lvsr    VRT,RA,RB
20 #define VPERM(VRT,VRA,VRB,VRC)  vperm   VRT,VRB,VRA,VRC
21 #endif
22
23         .macro err1
24 100:
25         EX_TABLE(100b,.Ldo_err1)
26         .endm
27
28         .macro err2
29 200:
30         EX_TABLE(200b,.Ldo_err2)
31         .endm
32
33 #ifdef CONFIG_ALTIVEC
34         .macro err3
35 300:
36         EX_TABLE(300b,.Ldo_err3)
37         .endm
38
39         .macro err4
40 400:
41         EX_TABLE(400b,.Ldo_err4)
42         .endm
43
44
45 .Ldo_err4:
46         ld      r16,STK_REG(R16)(r1)
47         ld      r15,STK_REG(R15)(r1)
48         ld      r14,STK_REG(R14)(r1)
49 .Ldo_err3:
50         bl      exit_vmx_usercopy
51         ld      r0,STACKFRAMESIZE+16(r1)
52         mtlr    r0
53         b       .Lexit
54 #endif /* CONFIG_ALTIVEC */
55
56 .Ldo_err2:
57         ld      r22,STK_REG(R22)(r1)
58         ld      r21,STK_REG(R21)(r1)
59         ld      r20,STK_REG(R20)(r1)
60         ld      r19,STK_REG(R19)(r1)
61         ld      r18,STK_REG(R18)(r1)
62         ld      r17,STK_REG(R17)(r1)
63         ld      r16,STK_REG(R16)(r1)
64         ld      r15,STK_REG(R15)(r1)
65         ld      r14,STK_REG(R14)(r1)
66 .Lexit:
67         addi    r1,r1,STACKFRAMESIZE
68 .Ldo_err1:
69         ld      r3,-STACKFRAMESIZE+STK_REG(R31)(r1)
70         ld      r4,-STACKFRAMESIZE+STK_REG(R30)(r1)
71         ld      r5,-STACKFRAMESIZE+STK_REG(R29)(r1)
72         b       __copy_tofrom_user_base
73
74
75 _GLOBAL(__copy_tofrom_user_power7)
76         cmpldi  r5,16
77         cmpldi  cr1,r5,3328
78
79         std     r3,-STACKFRAMESIZE+STK_REG(R31)(r1)
80         std     r4,-STACKFRAMESIZE+STK_REG(R30)(r1)
81         std     r5,-STACKFRAMESIZE+STK_REG(R29)(r1)
82
83         blt     .Lshort_copy
84
85 #ifdef CONFIG_ALTIVEC
86 test_feature = SELFTEST_CASE
87 BEGIN_FTR_SECTION
88         bgt     cr1,.Lvmx_copy
89 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
90 #endif
91
92 .Lnonvmx_copy:
93         /* Get the source 8B aligned */
94         neg     r6,r4
95         mtocrf  0x01,r6
96         clrldi  r6,r6,(64-3)
97
98         bf      cr7*4+3,1f
99 err1;   lbz     r0,0(r4)
100         addi    r4,r4,1
101 err1;   stb     r0,0(r3)
102         addi    r3,r3,1
103
104 1:      bf      cr7*4+2,2f
105 err1;   lhz     r0,0(r4)
106         addi    r4,r4,2
107 err1;   sth     r0,0(r3)
108         addi    r3,r3,2
109
110 2:      bf      cr7*4+1,3f
111 err1;   lwz     r0,0(r4)
112         addi    r4,r4,4
113 err1;   stw     r0,0(r3)
114         addi    r3,r3,4
115
116 3:      sub     r5,r5,r6
117         cmpldi  r5,128
118         blt     5f
119
120         mflr    r0
121         stdu    r1,-STACKFRAMESIZE(r1)
122         std     r14,STK_REG(R14)(r1)
123         std     r15,STK_REG(R15)(r1)
124         std     r16,STK_REG(R16)(r1)
125         std     r17,STK_REG(R17)(r1)
126         std     r18,STK_REG(R18)(r1)
127         std     r19,STK_REG(R19)(r1)
128         std     r20,STK_REG(R20)(r1)
129         std     r21,STK_REG(R21)(r1)
130         std     r22,STK_REG(R22)(r1)
131         std     r0,STACKFRAMESIZE+16(r1)
132
133         srdi    r6,r5,7
134         mtctr   r6
135
136         /* Now do cacheline (128B) sized loads and stores. */
137         .align  5
138 4:
139 err2;   ld      r0,0(r4)
140 err2;   ld      r6,8(r4)
141 err2;   ld      r7,16(r4)
142 err2;   ld      r8,24(r4)
143 err2;   ld      r9,32(r4)
144 err2;   ld      r10,40(r4)
145 err2;   ld      r11,48(r4)
146 err2;   ld      r12,56(r4)
147 err2;   ld      r14,64(r4)
148 err2;   ld      r15,72(r4)
149 err2;   ld      r16,80(r4)
150 err2;   ld      r17,88(r4)
151 err2;   ld      r18,96(r4)
152 err2;   ld      r19,104(r4)
153 err2;   ld      r20,112(r4)
154 err2;   ld      r21,120(r4)
155         addi    r4,r4,128
156 err2;   std     r0,0(r3)
157 err2;   std     r6,8(r3)
158 err2;   std     r7,16(r3)
159 err2;   std     r8,24(r3)
160 err2;   std     r9,32(r3)
161 err2;   std     r10,40(r3)
162 err2;   std     r11,48(r3)
163 err2;   std     r12,56(r3)
164 err2;   std     r14,64(r3)
165 err2;   std     r15,72(r3)
166 err2;   std     r16,80(r3)
167 err2;   std     r17,88(r3)
168 err2;   std     r18,96(r3)
169 err2;   std     r19,104(r3)
170 err2;   std     r20,112(r3)
171 err2;   std     r21,120(r3)
172         addi    r3,r3,128
173         bdnz    4b
174
175         clrldi  r5,r5,(64-7)
176
177         ld      r14,STK_REG(R14)(r1)
178         ld      r15,STK_REG(R15)(r1)
179         ld      r16,STK_REG(R16)(r1)
180         ld      r17,STK_REG(R17)(r1)
181         ld      r18,STK_REG(R18)(r1)
182         ld      r19,STK_REG(R19)(r1)
183         ld      r20,STK_REG(R20)(r1)
184         ld      r21,STK_REG(R21)(r1)
185         ld      r22,STK_REG(R22)(r1)
186         addi    r1,r1,STACKFRAMESIZE
187
188         /* Up to 127B to go */
189 5:      srdi    r6,r5,4
190         mtocrf  0x01,r6
191
192 6:      bf      cr7*4+1,7f
193 err1;   ld      r0,0(r4)
194 err1;   ld      r6,8(r4)
195 err1;   ld      r7,16(r4)
196 err1;   ld      r8,24(r4)
197 err1;   ld      r9,32(r4)
198 err1;   ld      r10,40(r4)
199 err1;   ld      r11,48(r4)
200 err1;   ld      r12,56(r4)
201         addi    r4,r4,64
202 err1;   std     r0,0(r3)
203 err1;   std     r6,8(r3)
204 err1;   std     r7,16(r3)
205 err1;   std     r8,24(r3)
206 err1;   std     r9,32(r3)
207 err1;   std     r10,40(r3)
208 err1;   std     r11,48(r3)
209 err1;   std     r12,56(r3)
210         addi    r3,r3,64
211
212         /* Up to 63B to go */
213 7:      bf      cr7*4+2,8f
214 err1;   ld      r0,0(r4)
215 err1;   ld      r6,8(r4)
216 err1;   ld      r7,16(r4)
217 err1;   ld      r8,24(r4)
218         addi    r4,r4,32
219 err1;   std     r0,0(r3)
220 err1;   std     r6,8(r3)
221 err1;   std     r7,16(r3)
222 err1;   std     r8,24(r3)
223         addi    r3,r3,32
224
225         /* Up to 31B to go */
226 8:      bf      cr7*4+3,9f
227 err1;   ld      r0,0(r4)
228 err1;   ld      r6,8(r4)
229         addi    r4,r4,16
230 err1;   std     r0,0(r3)
231 err1;   std     r6,8(r3)
232         addi    r3,r3,16
233
234 9:      clrldi  r5,r5,(64-4)
235
236         /* Up to 15B to go */
237 .Lshort_copy:
238         mtocrf  0x01,r5
239         bf      cr7*4+0,12f
240 err1;   lwz     r0,0(r4)        /* Less chance of a reject with word ops */
241 err1;   lwz     r6,4(r4)
242         addi    r4,r4,8
243 err1;   stw     r0,0(r3)
244 err1;   stw     r6,4(r3)
245         addi    r3,r3,8
246
247 12:     bf      cr7*4+1,13f
248 err1;   lwz     r0,0(r4)
249         addi    r4,r4,4
250 err1;   stw     r0,0(r3)
251         addi    r3,r3,4
252
253 13:     bf      cr7*4+2,14f
254 err1;   lhz     r0,0(r4)
255         addi    r4,r4,2
256 err1;   sth     r0,0(r3)
257         addi    r3,r3,2
258
259 14:     bf      cr7*4+3,15f
260 err1;   lbz     r0,0(r4)
261 err1;   stb     r0,0(r3)
262
263 15:     li      r3,0
264         blr
265
266 .Lunwind_stack_nonvmx_copy:
267         addi    r1,r1,STACKFRAMESIZE
268         b       .Lnonvmx_copy
269
270 .Lvmx_copy:
271 #ifdef CONFIG_ALTIVEC
272         mflr    r0
273         std     r0,16(r1)
274         stdu    r1,-STACKFRAMESIZE(r1)
275         bl      enter_vmx_usercopy
276         cmpwi   cr1,r3,0
277         ld      r0,STACKFRAMESIZE+16(r1)
278         ld      r3,STK_REG(R31)(r1)
279         ld      r4,STK_REG(R30)(r1)
280         ld      r5,STK_REG(R29)(r1)
281         mtlr    r0
282
283         /*
284          * We prefetch both the source and destination using enhanced touch
285          * instructions. We use a stream ID of 0 for the load side and
286          * 1 for the store side.
287          */
288         clrrdi  r6,r4,7
289         clrrdi  r9,r3,7
290         ori     r9,r9,1         /* stream=1 */
291
292         srdi    r7,r5,7         /* length in cachelines, capped at 0x3FF */
293         cmpldi  r7,0x3FF
294         ble     1f
295         li      r7,0x3FF
296 1:      lis     r0,0x0E00       /* depth=7 */
297         sldi    r7,r7,7
298         or      r7,r7,r0
299         ori     r10,r7,1        /* stream=1 */
300
301         lis     r8,0x8000       /* GO=1 */
302         clrldi  r8,r8,32
303
304         /* setup read stream 0 */
305         dcbt    0,r6,0b01000   /* addr from */
306         dcbt    0,r7,0b01010   /* length and depth from */
307         /* setup write stream 1 */
308         dcbtst  0,r9,0b01000   /* addr to */
309         dcbtst  0,r10,0b01010  /* length and depth to */
310         eieio
311         dcbt    0,r8,0b01010    /* all streams GO */
312
313         beq     cr1,.Lunwind_stack_nonvmx_copy
314
315         /*
316          * If source and destination are not relatively aligned we use a
317          * slower permute loop.
318          */
319         xor     r6,r4,r3
320         rldicl. r6,r6,0,(64-4)
321         bne     .Lvmx_unaligned_copy
322
323         /* Get the destination 16B aligned */
324         neg     r6,r3
325         mtocrf  0x01,r6
326         clrldi  r6,r6,(64-4)
327
328         bf      cr7*4+3,1f
329 err3;   lbz     r0,0(r4)
330         addi    r4,r4,1
331 err3;   stb     r0,0(r3)
332         addi    r3,r3,1
333
334 1:      bf      cr7*4+2,2f
335 err3;   lhz     r0,0(r4)
336         addi    r4,r4,2
337 err3;   sth     r0,0(r3)
338         addi    r3,r3,2
339
340 2:      bf      cr7*4+1,3f
341 err3;   lwz     r0,0(r4)
342         addi    r4,r4,4
343 err3;   stw     r0,0(r3)
344         addi    r3,r3,4
345
346 3:      bf      cr7*4+0,4f
347 err3;   ld      r0,0(r4)
348         addi    r4,r4,8
349 err3;   std     r0,0(r3)
350         addi    r3,r3,8
351
352 4:      sub     r5,r5,r6
353
354         /* Get the desination 128B aligned */
355         neg     r6,r3
356         srdi    r7,r6,4
357         mtocrf  0x01,r7
358         clrldi  r6,r6,(64-7)
359
360         li      r9,16
361         li      r10,32
362         li      r11,48
363
364         bf      cr7*4+3,5f
365 err3;   lvx     v1,0,r4
366         addi    r4,r4,16
367 err3;   stvx    v1,0,r3
368         addi    r3,r3,16
369
370 5:      bf      cr7*4+2,6f
371 err3;   lvx     v1,0,r4
372 err3;   lvx     v0,r4,r9
373         addi    r4,r4,32
374 err3;   stvx    v1,0,r3
375 err3;   stvx    v0,r3,r9
376         addi    r3,r3,32
377
378 6:      bf      cr7*4+1,7f
379 err3;   lvx     v3,0,r4
380 err3;   lvx     v2,r4,r9
381 err3;   lvx     v1,r4,r10
382 err3;   lvx     v0,r4,r11
383         addi    r4,r4,64
384 err3;   stvx    v3,0,r3
385 err3;   stvx    v2,r3,r9
386 err3;   stvx    v1,r3,r10
387 err3;   stvx    v0,r3,r11
388         addi    r3,r3,64
389
390 7:      sub     r5,r5,r6
391         srdi    r6,r5,7
392
393         std     r14,STK_REG(R14)(r1)
394         std     r15,STK_REG(R15)(r1)
395         std     r16,STK_REG(R16)(r1)
396
397         li      r12,64
398         li      r14,80
399         li      r15,96
400         li      r16,112
401
402         mtctr   r6
403
404         /*
405          * Now do cacheline sized loads and stores. By this stage the
406          * cacheline stores are also cacheline aligned.
407          */
408         .align  5
409 8:
410 err4;   lvx     v7,0,r4
411 err4;   lvx     v6,r4,r9
412 err4;   lvx     v5,r4,r10
413 err4;   lvx     v4,r4,r11
414 err4;   lvx     v3,r4,r12
415 err4;   lvx     v2,r4,r14
416 err4;   lvx     v1,r4,r15
417 err4;   lvx     v0,r4,r16
418         addi    r4,r4,128
419 err4;   stvx    v7,0,r3
420 err4;   stvx    v6,r3,r9
421 err4;   stvx    v5,r3,r10
422 err4;   stvx    v4,r3,r11
423 err4;   stvx    v3,r3,r12
424 err4;   stvx    v2,r3,r14
425 err4;   stvx    v1,r3,r15
426 err4;   stvx    v0,r3,r16
427         addi    r3,r3,128
428         bdnz    8b
429
430         ld      r14,STK_REG(R14)(r1)
431         ld      r15,STK_REG(R15)(r1)
432         ld      r16,STK_REG(R16)(r1)
433
434         /* Up to 127B to go */
435         clrldi  r5,r5,(64-7)
436         srdi    r6,r5,4
437         mtocrf  0x01,r6
438
439         bf      cr7*4+1,9f
440 err3;   lvx     v3,0,r4
441 err3;   lvx     v2,r4,r9
442 err3;   lvx     v1,r4,r10
443 err3;   lvx     v0,r4,r11
444         addi    r4,r4,64
445 err3;   stvx    v3,0,r3
446 err3;   stvx    v2,r3,r9
447 err3;   stvx    v1,r3,r10
448 err3;   stvx    v0,r3,r11
449         addi    r3,r3,64
450
451 9:      bf      cr7*4+2,10f
452 err3;   lvx     v1,0,r4
453 err3;   lvx     v0,r4,r9
454         addi    r4,r4,32
455 err3;   stvx    v1,0,r3
456 err3;   stvx    v0,r3,r9
457         addi    r3,r3,32
458
459 10:     bf      cr7*4+3,11f
460 err3;   lvx     v1,0,r4
461         addi    r4,r4,16
462 err3;   stvx    v1,0,r3
463         addi    r3,r3,16
464
465         /* Up to 15B to go */
466 11:     clrldi  r5,r5,(64-4)
467         mtocrf  0x01,r5
468         bf      cr7*4+0,12f
469 err3;   ld      r0,0(r4)
470         addi    r4,r4,8
471 err3;   std     r0,0(r3)
472         addi    r3,r3,8
473
474 12:     bf      cr7*4+1,13f
475 err3;   lwz     r0,0(r4)
476         addi    r4,r4,4
477 err3;   stw     r0,0(r3)
478         addi    r3,r3,4
479
480 13:     bf      cr7*4+2,14f
481 err3;   lhz     r0,0(r4)
482         addi    r4,r4,2
483 err3;   sth     r0,0(r3)
484         addi    r3,r3,2
485
486 14:     bf      cr7*4+3,15f
487 err3;   lbz     r0,0(r4)
488 err3;   stb     r0,0(r3)
489
490 15:     addi    r1,r1,STACKFRAMESIZE
491         b       exit_vmx_usercopy       /* tail call optimise */
492
493 .Lvmx_unaligned_copy:
494         /* Get the destination 16B aligned */
495         neg     r6,r3
496         mtocrf  0x01,r6
497         clrldi  r6,r6,(64-4)
498
499         bf      cr7*4+3,1f
500 err3;   lbz     r0,0(r4)
501         addi    r4,r4,1
502 err3;   stb     r0,0(r3)
503         addi    r3,r3,1
504
505 1:      bf      cr7*4+2,2f
506 err3;   lhz     r0,0(r4)
507         addi    r4,r4,2
508 err3;   sth     r0,0(r3)
509         addi    r3,r3,2
510
511 2:      bf      cr7*4+1,3f
512 err3;   lwz     r0,0(r4)
513         addi    r4,r4,4
514 err3;   stw     r0,0(r3)
515         addi    r3,r3,4
516
517 3:      bf      cr7*4+0,4f
518 err3;   lwz     r0,0(r4)        /* Less chance of a reject with word ops */
519 err3;   lwz     r7,4(r4)
520         addi    r4,r4,8
521 err3;   stw     r0,0(r3)
522 err3;   stw     r7,4(r3)
523         addi    r3,r3,8
524
525 4:      sub     r5,r5,r6
526
527         /* Get the desination 128B aligned */
528         neg     r6,r3
529         srdi    r7,r6,4
530         mtocrf  0x01,r7
531         clrldi  r6,r6,(64-7)
532
533         li      r9,16
534         li      r10,32
535         li      r11,48
536
537         LVS(v16,0,r4)           /* Setup permute control vector */
538 err3;   lvx     v0,0,r4
539         addi    r4,r4,16
540
541         bf      cr7*4+3,5f
542 err3;   lvx     v1,0,r4
543         VPERM(v8,v0,v1,v16)
544         addi    r4,r4,16
545 err3;   stvx    v8,0,r3
546         addi    r3,r3,16
547         vor     v0,v1,v1
548
549 5:      bf      cr7*4+2,6f
550 err3;   lvx     v1,0,r4
551         VPERM(v8,v0,v1,v16)
552 err3;   lvx     v0,r4,r9
553         VPERM(v9,v1,v0,v16)
554         addi    r4,r4,32
555 err3;   stvx    v8,0,r3
556 err3;   stvx    v9,r3,r9
557         addi    r3,r3,32
558
559 6:      bf      cr7*4+1,7f
560 err3;   lvx     v3,0,r4
561         VPERM(v8,v0,v3,v16)
562 err3;   lvx     v2,r4,r9
563         VPERM(v9,v3,v2,v16)
564 err3;   lvx     v1,r4,r10
565         VPERM(v10,v2,v1,v16)
566 err3;   lvx     v0,r4,r11
567         VPERM(v11,v1,v0,v16)
568         addi    r4,r4,64
569 err3;   stvx    v8,0,r3
570 err3;   stvx    v9,r3,r9
571 err3;   stvx    v10,r3,r10
572 err3;   stvx    v11,r3,r11
573         addi    r3,r3,64
574
575 7:      sub     r5,r5,r6
576         srdi    r6,r5,7
577
578         std     r14,STK_REG(R14)(r1)
579         std     r15,STK_REG(R15)(r1)
580         std     r16,STK_REG(R16)(r1)
581
582         li      r12,64
583         li      r14,80
584         li      r15,96
585         li      r16,112
586
587         mtctr   r6
588
589         /*
590          * Now do cacheline sized loads and stores. By this stage the
591          * cacheline stores are also cacheline aligned.
592          */
593         .align  5
594 8:
595 err4;   lvx     v7,0,r4
596         VPERM(v8,v0,v7,v16)
597 err4;   lvx     v6,r4,r9
598         VPERM(v9,v7,v6,v16)
599 err4;   lvx     v5,r4,r10
600         VPERM(v10,v6,v5,v16)
601 err4;   lvx     v4,r4,r11
602         VPERM(v11,v5,v4,v16)
603 err4;   lvx     v3,r4,r12
604         VPERM(v12,v4,v3,v16)
605 err4;   lvx     v2,r4,r14
606         VPERM(v13,v3,v2,v16)
607 err4;   lvx     v1,r4,r15
608         VPERM(v14,v2,v1,v16)
609 err4;   lvx     v0,r4,r16
610         VPERM(v15,v1,v0,v16)
611         addi    r4,r4,128
612 err4;   stvx    v8,0,r3
613 err4;   stvx    v9,r3,r9
614 err4;   stvx    v10,r3,r10
615 err4;   stvx    v11,r3,r11
616 err4;   stvx    v12,r3,r12
617 err4;   stvx    v13,r3,r14
618 err4;   stvx    v14,r3,r15
619 err4;   stvx    v15,r3,r16
620         addi    r3,r3,128
621         bdnz    8b
622
623         ld      r14,STK_REG(R14)(r1)
624         ld      r15,STK_REG(R15)(r1)
625         ld      r16,STK_REG(R16)(r1)
626
627         /* Up to 127B to go */
628         clrldi  r5,r5,(64-7)
629         srdi    r6,r5,4
630         mtocrf  0x01,r6
631
632         bf      cr7*4+1,9f
633 err3;   lvx     v3,0,r4
634         VPERM(v8,v0,v3,v16)
635 err3;   lvx     v2,r4,r9
636         VPERM(v9,v3,v2,v16)
637 err3;   lvx     v1,r4,r10
638         VPERM(v10,v2,v1,v16)
639 err3;   lvx     v0,r4,r11
640         VPERM(v11,v1,v0,v16)
641         addi    r4,r4,64
642 err3;   stvx    v8,0,r3
643 err3;   stvx    v9,r3,r9
644 err3;   stvx    v10,r3,r10
645 err3;   stvx    v11,r3,r11
646         addi    r3,r3,64
647
648 9:      bf      cr7*4+2,10f
649 err3;   lvx     v1,0,r4
650         VPERM(v8,v0,v1,v16)
651 err3;   lvx     v0,r4,r9
652         VPERM(v9,v1,v0,v16)
653         addi    r4,r4,32
654 err3;   stvx    v8,0,r3
655 err3;   stvx    v9,r3,r9
656         addi    r3,r3,32
657
658 10:     bf      cr7*4+3,11f
659 err3;   lvx     v1,0,r4
660         VPERM(v8,v0,v1,v16)
661         addi    r4,r4,16
662 err3;   stvx    v8,0,r3
663         addi    r3,r3,16
664
665         /* Up to 15B to go */
666 11:     clrldi  r5,r5,(64-4)
667         addi    r4,r4,-16       /* Unwind the +16 load offset */
668         mtocrf  0x01,r5
669         bf      cr7*4+0,12f
670 err3;   lwz     r0,0(r4)        /* Less chance of a reject with word ops */
671 err3;   lwz     r6,4(r4)
672         addi    r4,r4,8
673 err3;   stw     r0,0(r3)
674 err3;   stw     r6,4(r3)
675         addi    r3,r3,8
676
677 12:     bf      cr7*4+1,13f
678 err3;   lwz     r0,0(r4)
679         addi    r4,r4,4
680 err3;   stw     r0,0(r3)
681         addi    r3,r3,4
682
683 13:     bf      cr7*4+2,14f
684 err3;   lhz     r0,0(r4)
685         addi    r4,r4,2
686 err3;   sth     r0,0(r3)
687         addi    r3,r3,2
688
689 14:     bf      cr7*4+3,15f
690 err3;   lbz     r0,0(r4)
691 err3;   stb     r0,0(r3)
692
693 15:     addi    r1,r1,STACKFRAMESIZE
694         b       exit_vmx_usercopy       /* tail call optimise */
695 #endif /* CONFIG_ALTIVEC */