1233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .globl copy_mem16x16_ppc
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int src_stride
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *dst
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int dst_stride
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# Make the assumption that input will not be aligned,
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#  but the output will be.  So two reads and a perm
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#  for the input, but only one store for the output.
22233d2500723e5594f3e7c70896ffeeef32b9c950ywancopy_mem16x16_ppc:
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mfspr   r11, 256            ;# get old VRSAVE
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    oris    r12, r11, 0xe000
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtspr   256, r12            ;# set VRSAVE
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r10, 16
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtctr   r10
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan
30233d2500723e5594f3e7c70896ffeeef32b9c950ywancp_16x16_loop:
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvsl    v0,  0, r3          ;# permutate value for alignment
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v1,   0, r3
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v2, r10, r3
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vperm   v1, v1, v2, v0
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stvx    v1,  0, r5
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4          ;# increment source pointer
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6          ;# increment destination pointer
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bdnz    cp_16x16_loop
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtspr   256, r11            ;# reset old VRSAVE
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
48