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 vp8_sad16x16_ppc
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .globl vp8_sad16x8_ppc
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .globl vp8_sad8x16_ppc
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .globl vp8_sad8x8_ppc
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .globl vp8_sad4x4_ppc
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro load_aligned_16 V R O
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvsl    v3,  0, \R          ;# permutate value for alignment
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v1,  0, \R
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v2, \O, \R
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vperm   \V, v1, v2, v3
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro prologue
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mfspr   r11, 256            ;# get old VRSAVE
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    oris    r12, r11, 0xffc0
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtspr   256, r12            ;# set VRSAVE
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stwu    r1, -32(r1)         ;# create space on the stack
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r10, 16             ;# load offset and loop counter
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vspltisw v8, 0              ;# zero out total to start
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro epilogue
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addi    r1, r1, 32          ;# recover stack
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtspr   256, r11            ;# reset old VRSAVE
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro SAD_16
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# v6 = abs (v4 - v5)
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v6, v4, v5
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v7, v5, v4
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vor     v6, v6, v7
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# v8 += abs (v4 - v5)
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsum4ubs v8, v6, v8
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro sad_16_loop loop_label
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvsl    v3,  0, r5          ;# only needs to be done once per block
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# preload a line of data before getting into the loop
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v4, 0, r3
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v1,  0, r5
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v2, r10, r5
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vperm   v5, v1, v2, v3
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 4
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan\loop_label:
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# compute difference on first row
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v6, v4, v5
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v7, v5, v4
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# load up next set of data
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v9, 0, r3
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v1,  0, r5
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v2, r10, r5
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# perform abs() of difference
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vor     v6, v6, v7
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# add to the running tally
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsum4ubs v8, v6, v8
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# now onto the next line
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vperm   v5, v1, v2, v3
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v4, 0, r3
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# compute difference on second row
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v6, v9, v5
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v1,  0, r5
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v7, v5, v9
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v2, r10, r5
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vor     v6, v6, v7
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsum4ubs v8, v6, v8
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vperm   v5, v1, v2, v3
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bdnz    \loop_label
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vspltisw v7, 0
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsumsws v8, v8, v7
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stvx    v8, 0, r1
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r3, 12(r1)
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro sad_8_loop loop_label
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 4
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan\loop_label:
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# only one of the inputs should need to be aligned.
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    load_aligned_16 v4, r3, r10
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    load_aligned_16 v5, r5, r10
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# move onto the next line
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# only one of the inputs should need to be aligned.
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    load_aligned_16 v6, r3, r10
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    load_aligned_16 v7, r5, r10
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# move onto the next line
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r3, r3, r4
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r5, r5, r6
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmrghb  v4, v4, v6
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vmrghb  v5, v5, v7
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SAD_16
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bdnz    \loop_label
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vspltisw v7, 0
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsumsws v8, v8, v7
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stvx    v8, 0, r1
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r3, 12(r1)
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 2
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src_ptr
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int  src_stride
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *ref_ptr
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int  ref_stride
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 return value
153233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_sad16x16_ppc:
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    prologue
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r9, 8
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtctr   r9
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sad_16_loop sad16x16_loop
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    epilogue
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 2
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src_ptr
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int  src_stride
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *ref_ptr
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int  ref_stride
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 return value
173233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_sad16x8_ppc:
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    prologue
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r9, 4
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtctr   r9
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sad_16_loop sad16x8_loop
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    epilogue
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 2
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src_ptr
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int  src_stride
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *ref_ptr
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int  ref_stride
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 return value
193233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_sad8x16_ppc:
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    prologue
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r9, 8
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtctr   r9
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sad_8_loop sad8x16_loop
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    epilogue
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 2
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src_ptr
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int  src_stride
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *ref_ptr
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int  ref_stride
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 return value
213233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_sad8x8_ppc:
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    prologue
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    li      r9, 4
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mtctr   r9
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sad_8_loop sad8x8_loop
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    epilogue
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan.macro transfer_4x4 I P
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r0, 0(\I)
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     \I, \I, \P
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r7, 0(\I)
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     \I, \I, \P
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r8, 0(\I)
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     \I, \I, \P
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r9, 0(\I)
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stw     r0,  0(r1)
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stw     r7,  4(r1)
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stw     r8,  8(r1)
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stw     r9, 12(r1)
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan.endm
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    .align 2
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 unsigned char *src_ptr
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r4 int  src_stride
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r5 unsigned char *ref_ptr
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r6 int  ref_stride
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan;#
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan;# r3 return value
251233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_sad4x4_ppc:
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan    prologue
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    transfer_4x4 r3, r4
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v4, 0, r1
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    transfer_4x4 r5, r6
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lvx     v5, 0, r1
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vspltisw v8, 0              ;# zero out total to start
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# v6 = abs (v4 - v5)
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v6, v4, v5
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsububs v7, v5, v4
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vor     v6, v6, v7
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;# v8 += abs (v4 - v5)
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsum4ubs v7, v6, v8
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vsumsws v7, v7, v8
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    stvx    v7, 0, r1
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lwz     r3, 12(r1)
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    epilogue
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    blr
278