190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
2f71323e297a928af368937089d3ed71239786f86Andreas Huber;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
4f71323e297a928af368937089d3ed71239786f86Andreas Huber;  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber;  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber;  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber;  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber;  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_subtract_mbuv_ppc
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_subtract_mby_ppc
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 short *diff
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 unsigned char *usrc
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *vsrc
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 unsigned char *pred
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r7 int stride
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_subtract_mbuv_ppc:
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mfspr   r11, 256            ;# get old VRSAVE
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    oris    r12, r11, 0xf000
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r12            ;# set VRSAVE
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9, 256
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r9
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r9
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r6, r6, r9
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r10, 16
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9,  4
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v0, 0
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubermbu_loop:
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v5, 0, r4           ;# permutate value for alignment
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1, 0, r4           ;# src
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, 0, r6           ;# pred
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r4, r4, r7
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r6, r6, 16
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v1, v1, v0, v5
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v3, v0, v1          ;# unpack high src  to short
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v4, v0, v2          ;# unpack high pred to short
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v5, 0, r4           ;# permutate value for alignment
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1, 0, r4           ;# src
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r4, r4, r7
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, 0, r3           ;# store out diff
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v1, v1, v0, v5
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v3, v0, v1          ;# unpack high src  to short
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrglb  v4, v0, v2          ;# unpack high pred to short
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, r10, r3         ;# store out diff
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r3, r3, 32
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bdnz    mbu_loop
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubermbv_loop:
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v5, 0, r5           ;# permutate value for alignment
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1, 0, r5           ;# src
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, 0, r6           ;# pred
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r7
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r6, r6, 16
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v1, v1, v0, v5
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v3, v0, v1          ;# unpack high src  to short
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v4, v0, v2          ;# unpack high pred to short
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v5, 0, r5           ;# permutate value for alignment
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1, 0, r5           ;# src
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r7
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, 0, r3           ;# store out diff
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v1, v1, v0, v5
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v3, v0, v1          ;# unpack high src  to short
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrglb  v4, v0, v2          ;# unpack high pred to short
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, r10, r3         ;# store out diff
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r3, r3, 32
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bdnz    mbv_loop
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r11            ;# reset old VRSAVE
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 short *diff
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 unsigned char *src
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *pred
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int stride
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_subtract_mby_ppc:
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mfspr   r11, 256            ;# get old VRSAVE
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    oris    r12, r11, 0xf800
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r12            ;# set VRSAVE
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r10, 16
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r10
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v0, 0
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubermby_loop:
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1, 0, r4           ;# src
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, 0, r5           ;# pred
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r4, r4, r6
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r5, r5, 16
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v3, v0, v1          ;# unpack high src  to short
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v4, v0, v2          ;# unpack high pred to short
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, 0, r3           ;# store out diff
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrglb  v3, v0, v1          ;# unpack low src  to short
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrglb  v4, v0, v2          ;# unpack low pred to short
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsubshs v3, v3, v4
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v3, r10, r3         ;# store out diff
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r3, r3, 32
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bdnz    mby_loop
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r11            ;# reset old VRSAVE
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
154