summaryrefslogtreecommitdiff
path: root/vp8/common/ppc/copy_altivec.asm
blob: a4ce9158342aeb4ecb1dd12b2c5d9ad4ee79dc31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;
;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
;
;  Use of this source code is governed by a BSD-style license
;  that can be found in the LICENSE file in the root of the source
;  tree. An additional intellectual property rights grant can be found
;  in the file PATENTS.  All contributing project authors may
;  be found in the AUTHORS file in the root of the source tree.
;


    .globl copy_mem16x16_ppc

;# r3 unsigned char *src
;# r4 int src_stride
;# r5 unsigned char *dst
;# r6 int dst_stride

;# Make the assumption that input will not be aligned,
;#  but the output will be.  So two reads and a perm
;#  for the input, but only one store for the output.
copy_mem16x16_ppc:
    mfspr   r11, 256            ;# get old VRSAVE
    oris    r12, r11, 0xe000
    mtspr   256, r12            ;# set VRSAVE

    li      r10, 16
    mtctr   r10

cp_16x16_loop:
    lvsl    v0,  0, r3          ;# permutate value for alignment

    lvx     v1,   0, r3
    lvx     v2, r10, r3

    vperm   v1, v1, v2, v0

    stvx    v1,  0, r5

    add     r3, r3, r4          ;# increment source pointer
    add     r5, r5, r6          ;# increment destination pointer

    bdnz    cp_16x16_loop

    mtspr   256, r11            ;# reset old VRSAVE

    blr