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_sad16x16_ppc
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_sad16x8_ppc
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_sad8x16_ppc
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_sad8x8_ppc
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .globl vp8_sad4x4_ppc
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro load_aligned_16 V R O
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v3,  0, \R          ;# permutate value for alignment
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1,  0, \R
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, \O, \R
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   \V, v1, v2, v3
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro prologue
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mfspr   r11, 256            ;# get old VRSAVE
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    oris    r12, r11, 0xffc0
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r12            ;# set VRSAVE
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stwu    r1, -32(r1)         ;# create space on the stack
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r10, 16             ;# load offset and loop counter
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v8, 0              ;# zero out total to start
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro epilogue
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addi    r1, r1, 32          ;# recover stack
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtspr   256, r11            ;# reset old VRSAVE
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro SAD_16
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# v6 = abs (v4 - v5)
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v6, v4, v5
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v7, v5, v4
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vor     v6, v6, v7
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# v8 += abs (v4 - v5)
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsum4ubs v8, v6, v8
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro sad_16_loop loop_label
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvsl    v3,  0, r5          ;# only needs to be done once per block
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# preload a line of data before getting into the loop
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v4, 0, r3
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1,  0, r5
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, r10, r5
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r6
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r4
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v5, v1, v2, v3
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 4
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber\loop_label:
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# compute difference on first row
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v6, v4, v5
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v7, v5, v4
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# load up next set of data
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v9, 0, r3
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1,  0, r5
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, r10, r5
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# perform abs() of difference
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vor     v6, v6, v7
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r4
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# add to the running tally
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsum4ubs v8, v6, v8
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# now onto the next line
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v5, v1, v2, v3
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r6
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v4, 0, r3
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# compute difference on second row
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v6, v9, v5
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v1,  0, r5
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v7, v5, v9
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v2, r10, r5
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vor     v6, v6, v7
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r4
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsum4ubs v8, v6, v8
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vperm   v5, v1, v2, v3
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r6
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bdnz    \loop_label
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v7, 0
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsumsws v8, v8, v7
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v8, 0, r1
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r3, 12(r1)
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro sad_8_loop loop_label
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 4
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber\loop_label:
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# only one of the inputs should need to be aligned.
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    load_aligned_16 v4, r3, r10
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    load_aligned_16 v5, r5, r10
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# move onto the next line
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r4
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r6
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# only one of the inputs should need to be aligned.
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    load_aligned_16 v6, r3, r10
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    load_aligned_16 v7, r5, r10
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# move onto the next line
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r3, r3, r4
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     r5, r5, r6
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v4, v4, v6
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vmrghb  v5, v5, v7
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    SAD_16
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bdnz    \loop_label
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v7, 0
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsumsws v8, v8, v7
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v8, 0, r1
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r3, 12(r1)
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 2
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 unsigned char *src_ptr
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 int  src_stride
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *ref_ptr
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int  ref_stride
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;#
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 return value
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_sad16x16_ppc:
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    prologue
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9, 8
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sad_16_loop sad16x16_loop
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    epilogue
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 2
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 unsigned char *src_ptr
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 int  src_stride
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *ref_ptr
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int  ref_stride
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;#
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 return value
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_sad16x8_ppc:
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    prologue
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9, 4
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sad_16_loop sad16x8_loop
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    epilogue
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 2
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 unsigned char *src_ptr
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 int  src_stride
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *ref_ptr
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int  ref_stride
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;#
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 return value
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_sad8x16_ppc:
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    prologue
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9, 8
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sad_8_loop sad8x16_loop
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    epilogue
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 2
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 unsigned char *src_ptr
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 int  src_stride
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *ref_ptr
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int  ref_stride
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;#
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 return value
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_sad8x8_ppc:
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    prologue
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    li      r9, 4
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    mtctr   r9
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    sad_8_loop sad8x8_loop
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    epilogue
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.macro transfer_4x4 I P
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r0, 0(\I)
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     \I, \I, \P
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r7, 0(\I)
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     \I, \I, \P
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r8, 0(\I)
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    add     \I, \I, \P
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r9, 0(\I)
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stw     r0,  0(r1)
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stw     r7,  4(r1)
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stw     r8,  8(r1)
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stw     r9, 12(r1)
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber.endm
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    .align 2
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 unsigned char *src_ptr
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r4 int  src_stride
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r5 unsigned char *ref_ptr
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r6 int  ref_stride
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;#
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;# r3 return value
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervp8_sad4x4_ppc:
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    prologue
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    transfer_4x4 r3, r4
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v4, 0, r1
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    transfer_4x4 r5, r6
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lvx     v5, 0, r1
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vspltisw v8, 0              ;# zero out total to start
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# v6 = abs (v4 - v5)
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v6, v4, v5
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsububs v7, v5, v4
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vor     v6, v6, v7
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ;# v8 += abs (v4 - v5)
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsum4ubs v7, v6, v8
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vsumsws v7, v7, v8
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stvx    v7, 0, r1
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lwz     r3, 12(r1)
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    epilogue
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    blr
278