1ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/*
2ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
4ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Use of this source code is governed by a BSD-style license
5ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  that can be found in the LICENSE file in the root of the source
6ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  tree. An additional intellectual property rights grant can be found
7ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  in the file PATENTS.  All contributing project authors may
8ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
10ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
11ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
12ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <stdlib.h>
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h"
14ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vp8/common/onyxc_int.h"
15ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_DSPR2
17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgtypedef unsigned char uc;
18ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
19ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* prefetch data for load */
20ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orginline void prefetch_load_lf(unsigned char *src)
21ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
22ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "pref   0,  0(%[src])   \n\t"
24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
25ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [src] "r" (src)
26ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
27ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
28ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
29ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
30ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* prefetch data for store */
31ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orginline void prefetch_store_lf(unsigned char *dst)
32ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
33ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
34ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "pref   1,  0(%[dst])   \n\t"
35ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
36ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [dst] "r" (dst)
37ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
38ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
39ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
40ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* processing 4 pixels at the same time
41ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * compute hev and mask in the same function
42ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
43ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic __inline void vp8_filter_mask_vec_mips
44ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
45ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t limit,
46ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t flimit,
47ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t p1,
48ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t p0,
49ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t p3,
50ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t p2,
51ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t q0,
52ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t q1,
53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t q2,
54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t q3,
55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t thresh,
56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *hev,
57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *mask
58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
60ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t c, r, r3, r_k;
61ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t s1, s2, s3;
62ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t ones = 0xFFFFFFFF;
63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev1;
64ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
65ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(p3 - p2) > limit) */
67ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[p3],     %[p2]        \n\t"
68ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[p2],     %[p3]        \n\t"
69ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
70ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
71ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   $0,        %[c]         \n\t"
72ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
73ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(p2 - p1) > limit) */
74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[p2],     %[p1]        \n\t"
75ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[p1],     %[p2]        \n\t"
76ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
77ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
78ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   %[r],      %[c]         \n\t"
79ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
80ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(p1 - p0) > limit)
81ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * hev  |= (abs(p1 - p0) > thresh)
82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
83ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[p1],     %[p0]        \n\t"
84ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[p0],     %[p1]        \n\t"
85ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
86ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[thresh], %[r_k]       \n\t"
87ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r3],  $0,        %[c]         \n\t"
88ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
89ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   %[r],      %[c]         \n\t"
90ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
91ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(q1 - q0) > limit)
92ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * hev  |= (abs(q1 - q0) > thresh)
93ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
94ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[q1],     %[q0]        \n\t"
95ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[q0],     %[q1]        \n\t"
96ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
97ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[thresh], %[r_k]       \n\t"
98ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r3],  %[r3],     %[c]         \n\t"
99ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   %[r],      %[c]         \n\t"
101ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(q2 - q1) > limit) */
103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[q2],     %[q1]        \n\t"
104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[q1],     %[q2]        \n\t"
105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   %[r],      %[c]         \n\t"
108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "sll            %[r3],    %[r3],    24          \n\t"
109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* mask |= (abs(q3 - q2) > limit) */
111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[q3],     %[q2]        \n\t"
112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[q2],     %[q3]        \n\t"
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r_k], %[r_k],    %[c]         \n\t"
114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],   %[limit],  %[r_k]       \n\t"
115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],   %[r],      %[c]         \n\t"
116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [c] "=&r" (c), [r_k] "=&r" (r_k),
118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [r] "=&r" (r), [r3] "=&r" (r3)
119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [limit] "r" (limit), [p3] "r" (p3), [p2] "r" (p2),
120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p1] "r" (p1), [p0] "r" (p0), [q1] "r" (q1), [q0] "r" (q0),
121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [q2] "r" (q2), [q3] "r" (q3), [thresh] "r" (thresh)
122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* abs(p0 - q0) */
126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],   %[p0],     %[q0]        \n\t"
127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k], %[q0],     %[p0]        \n\t"
128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "wrdsp          %[r3]                           \n\t"
129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[s1],  %[r_k],    %[c]         \n\t"
130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
131ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* abs(p1 - q1) */
132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[c],    %[p1],    %[q1]        \n\t"
133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addu_s.qb      %[s3],   %[s1],    %[s1]        \n\t"
134ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "pick.qb        %[hev1], %[ones],  $0           \n\t"
135ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subu_s.qb      %[r_k],  %[q1],    %[p1]        \n\t"
136ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[s2],   %[r_k],   %[c]         \n\t"
137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* abs(p0 - q0) * 2 + abs(p1 - q1) / 2  > flimit * 2 + limit */
139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.qb        %[s2],   %[s2],     1           \n\t"
140ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addu_s.qb      %[s1],   %[s2],     %[s3]       \n\t"
141ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "cmpgu.lt.qb    %[c],    %[flimit], %[s1]       \n\t"
142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or             %[r],    %[r],      %[c]        \n\t"
143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "sll            %[r],    %[r],      24          \n\t"
144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "wrdsp          %[r]                            \n\t"
146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "pick.qb        %[s2],  $0,         %[ones]     \n\t"
147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [c] "=&r" (c), [r_k] "=&r" (r_k), [s1] "=&r" (s1), [hev1] "=&r" (hev1),
149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [s2] "=&r" (s2), [r] "+r" (r), [s3] "=&r" (s3)
150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [p0] "r" (p0), [q0] "r" (q0), [p1] "r" (p1), [r3] "r" (r3),
151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [q1] "r" (q1), [ones] "r" (ones), [flimit] "r" (flimit)
152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *hev = hev1;
155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *mask = s2;
156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* inputs & outputs are quad-byte vectors */
160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic __inline void vp8_filter_mips
161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask,
163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev,
164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *ps1,
165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *ps0,
166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *qs0,
167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *qs1
168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vp8_filter_l, vp8_filter_r;
171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t Filter1_l, Filter1_r, Filter2_l, Filter2_r;
172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t subr_r, subr_l;
173ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t t1, t2, HWM, t3;
174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev_l, hev_r, mask_l, mask_r, invhev_l, invhev_r;
175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vps1, vps0, vqs0, vqs1;
177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vps1_l, vps1_r, vps0_l, vps0_r, vqs0_l, vqs0_r, vqs1_l, vqs1_r;
178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t N128;
179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    N128 = 0x80808080;
181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    t1  = 0x03000300;
182ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    t2  = 0x04000400;
183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    t3  = 0x01000100;
184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    HWM = 0xFF00FF00;
185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
186ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0 = (*ps0) ^ N128;
187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1 = (*ps1) ^ N128;
188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0 = (*qs0) ^ N128;
189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1 = (*qs1) ^ N128;
190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use halfword pairs instead quad-bytes because of accuracy */
192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_l = vps0 & HWM;
193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_r = vps0 << 8;
194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_r = vps0_r & HWM;
195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_l = vps1 & HWM;
197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_r = vps1 << 8;
198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_r = vps1_r & HWM;
199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_l = vqs0 & HWM;
201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_r = vqs0 << 8;
202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_r = vqs0_r & HWM;
203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_l = vqs1 & HWM;
205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_r = vqs1 << 8;
206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_r = vqs1_r & HWM;
207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask_l = mask & HWM;
209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask_r = mask << 8;
210ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask_r = mask_r & HWM;
211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev_l = hev & HWM;
213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev_r = hev << 8;
214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev_r = hev_r & HWM;
215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter = vp8_signed_char_clamp(ps1 - qs1); */
218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vp8_filter_l], %[vps1_l],       %[vqs1_l]       \n\t"
219ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vp8_filter_r], %[vps1_r],       %[vqs1_r]       \n\t"
220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* qs0 - ps0 */
222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[subr_l],       %[vqs0_l],       %[vps0_l]       \n\t"
223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[subr_r],       %[vqs0_r],       %[vps0_r]       \n\t"
224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter &= hev; */
226ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_l], %[vp8_filter_l], %[hev_l]        \n\t"
227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_r], %[vp8_filter_r], %[hev_r]        \n\t"
228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * (qs0 - ps0)); */
230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "xor          %[invhev_l],     %[hev_l],        %[HWM]          \n\t"
233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "xor          %[invhev_r],     %[hev_r],        %[HWM]          \n\t"
236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter &= mask; */
240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_l], %[vp8_filter_l], %[mask_l]       \n\t"
241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_r], %[vp8_filter_r], %[mask_r]       \n\t"
242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vp8_filter_l] "=&r" (vp8_filter_l), [vp8_filter_r] "=&r" (vp8_filter_r),
244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [subr_l] "=&r" (subr_l), [subr_r] "=&r" (subr_r),
245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [invhev_l] "=&r" (invhev_l), [invhev_r] "=&r" (invhev_r)
246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vps0_l] "r" (vps0_l), [vps0_r] "r" (vps0_r), [vps1_l] "r" (vps1_l),
248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps1_r] "r" (vps1_r), [vqs0_l] "r" (vqs0_l), [vqs0_r] "r" (vqs0_r),
249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs1_l] "r" (vqs1_l), [vqs1_r] "r" (vqs1_r),
250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [mask_l] "r" (mask_l), [mask_r] "r" (mask_r),
251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [hev_l] "r" (hev_l), [hev_r] "r" (hev_r),
252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [HWM] "r" (HWM)
253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
254ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* save bottom 3 bits so that we round one side +4 and the other +3 */
256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Filter2 = vp8_signed_char_clamp(vp8_filter + 3) >>= 3; */
258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter1_l],    %[vp8_filter_l], %[t2]           \n\t"
259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter1_r],    %[vp8_filter_r], %[t2]           \n\t"
260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Filter1 = vp8_signed_char_clamp(vp8_filter + 4) >>= 3; */
262ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter2_l],    %[vp8_filter_l], %[t1]           \n\t"
263ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter2_r],    %[vp8_filter_r], %[t1]           \n\t"
264ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter1_r],    %[Filter1_r],    3               \n\t"
265ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter1_l],    %[Filter1_l],    3               \n\t"
266ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_l],    %[Filter2_l],    3               \n\t"
268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_r],    %[Filter2_r],    3               \n\t"
269ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_l],    %[Filter1_l],    %[HWM]          \n\t"
271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_r],    %[Filter1_r],    %[HWM]          \n\t"
272ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vps0 = vp8_signed_char_clamp(ps0 + Filter2); */
274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_l],       %[vps0_l],       %[Filter2_l]    \n\t"
275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_r],       %[vps0_r],       %[Filter2_r]    \n\t"
276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vqs0 = vp8_signed_char_clamp(qs0 - Filter1); */
278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_l],       %[vqs0_l],       %[Filter1_l]    \n\t"
279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_r],       %[vqs0_r],       %[Filter1_r]    \n\t"
280ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
281ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [Filter1_l] "=&r" (Filter1_l), [Filter1_r] "=&r" (Filter1_r),
282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [Filter2_l] "=&r" (Filter2_l), [Filter2_r] "=&r" (Filter2_r),
283ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps0_l] "+r" (vps0_l), [vps0_r] "+r" (vps0_r),
284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs0_l] "+r" (vqs0_l), [vqs0_r] "+r" (vqs0_r)
285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [t1] "r" (t1), [t2] "r" (t2),
287ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vp8_filter_l] "r" (vp8_filter_l), [vp8_filter_r] "r" (vp8_filter_r),
288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [HWM] "r" (HWM)
289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
292ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* (vp8_filter += 1) >>= 1 */
293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addqh.ph    %[Filter1_l],    %[Filter1_l],     %[t3]           \n\t"
294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addqh.ph    %[Filter1_r],    %[Filter1_r],     %[t3]           \n\t"
295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter &= ~hev; */
297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_l],    %[Filter1_l],    %[invhev_l]     \n\t"
298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_r],    %[Filter1_r],    %[invhev_r]     \n\t"
299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vps1 = vp8_signed_char_clamp(ps1 + vp8_filter); */
301ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps1_l],       %[vps1_l],       %[Filter1_l]    \n\t"
302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps1_r],       %[vps1_r],       %[Filter1_r]    \n\t"
303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vqs1 = vp8_signed_char_clamp(qs1 - vp8_filter); */
305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs1_l],       %[vqs1_l],       %[Filter1_l]    \n\t"
306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs1_r],       %[vqs1_r],       %[Filter1_r]    \n\t"
307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
308ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [Filter1_l] "+r" (Filter1_l), [Filter1_r] "+r" (Filter1_r),
309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps1_l] "+r" (vps1_l), [vps1_r] "+r" (vps1_r),
310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs1_l] "+r" (vqs1_l), [vqs1_r] "+r" (vqs1_r)
311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
312ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [t3] "r" (t3), [invhev_l] "r" (invhev_l), [invhev_r] "r" (invhev_r)
313ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
315ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Create quad-bytes from halfword pairs */
316ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_l = vqs0_l & HWM;
317ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_l = vqs1_l & HWM;
318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_l = vps0_l & HWM;
319ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_l = vps1_l & HWM;
320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vqs0_r],       %[vqs0_r],       8               \n\t"
323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vps0_r],       %[vps0_r],       8               \n\t"
324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vqs1_r],       %[vqs1_r],       8               \n\t"
325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vps1_r],       %[vps1_r],       8               \n\t"
326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vps1_r] "+r" (vps1_r), [vqs1_r] "+r" (vqs1_r),
328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps0_r] "+r" (vps0_r), [vqs0_r] "+r" (vqs0_r)
329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0 = vqs0_l | vqs0_r;
333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1 = vqs1_l | vqs1_r;
334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0 = vps0_l | vps0_r;
335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1 = vps1_l | vps1_r;
336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *ps0 = vps0 ^ N128;
338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *ps1 = vps1 ^ N128;
339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *qs0 = vqs0 ^ N128;
340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *qs1 = vqs1 ^ N128;
341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_horizontal_edge_mips
344ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask;
354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev;
355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *sm1, *s0, *s1, *s2, *s3, *s4, *s5, *s6;
357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
363ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
365ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* prefetch data for store */
366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    prefetch_store_lf(s);
367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
369ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
370ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
372ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 = s - (p << 2);
373ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0 = s - p - p - p;
374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1 = s - p - p ;
375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2 = s - p;
376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3 = s;
377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4 = s + p;
378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5 = s + p + p;
379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6 = s + p + p + p;
380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
384ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
387ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
392ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
394ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
395ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
397ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
398ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
405ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
406ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
407ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
410ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 += 4;
418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  += 4;
419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  += 4;
420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  += 4;
421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  += 4;
422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  += 4;
423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  += 4;
424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  += 4;
425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
447ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
457ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
461ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 += 4;
463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  += 4;
464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  += 4;
465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  += 4;
466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  += 4;
467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  += 4;
468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  += 4;
469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  += 4;
470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
497ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
501ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
503ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 += 4;
508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  += 4;
509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  += 4;
510ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  += 4;
511ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  += 4;
512ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  += 4;
513ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  += 4;
514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  += 4;
515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
527ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
529ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
530ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
531ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
535ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
537ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
546ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
548ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
550ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
552ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
553ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_uvhorizontal_edge_mips
554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
558ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
560ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
561ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask;
564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev;
565ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *sm1, *s0, *s1, *s2, *s3, *s4, *s5, *s6;
567ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
568ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
569ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
570ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
571ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
572ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
573ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
575ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
576ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
577ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
578ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
579ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 = s - (p << 2);
580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  = s - p - p - p;
581ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  = s - p - p ;
582ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  = s - p;
583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  = s;
584ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  = s + p;
585ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  = s + p + p;
586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  = s + p + p + p;
587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
590ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
596ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
608ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
609ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
610ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
611ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
612ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
613ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
614ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
615ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
616ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
617ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
618ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
619ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
620ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
621ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
622ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
623ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
624ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 += 4;
625ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  += 4;
626ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  += 4;
627ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  += 4;
628ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  += 4;
629ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  += 4;
630ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  += 4;
631ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  += 4;
632ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
635ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
637ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
639ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
641ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
645ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
647ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
648ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
650ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
651ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
652ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
653ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
654ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
655ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
656ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
657ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
658ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
659ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
660ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
661ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood */
662ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
663ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
665ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
667ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
668ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
669ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
670ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_vertical_edge_mips
671ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
672ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
673ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
674ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    const unsigned int flimit,
675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    const unsigned int limit,
676ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    const unsigned int thresh,
677ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int i;
681ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
682ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
683ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s1, *s2, *s3, *s4;
684ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t prim1, prim2, sec3, sec4, prim3, prim4;
685ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
686ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
687ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
688ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    i = 0;
689ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = 0;
690ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0 = 0;
691ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
692ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
693ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
694ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
695ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5 = 0;
696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6 = 0;
697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
698ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
699ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
700ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
701ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
702ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* apply filter on 4 pixesl at the same time */
703ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    do
704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
705ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* prefetch data for store */
707ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        prefetch_store_lf(s + p);
708ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
709ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s1 = s;
710ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s2 = s + p;
711ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s3 = s2 + p;
712ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s4 = s3 + p;
713ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s  = s4 + p;
714ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
715ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* load quad-byte vectors
716ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * memory is 4 byte aligned
717ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
718ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p2  = *((uint32_t *)(s1 - 4));
719ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s1));
720ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p1  = *((uint32_t *)(s2 - 4));
721ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s2));
722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s3 - 4));
723ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p4  = *((uint32_t *)(s3));
724ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(s4 - 4));
725ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p3  = *((uint32_t *)(s4));
726ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
727ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose pm1, p0, p1, p2 */
728ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
729ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
730ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
731ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
732ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
733ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
734ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
735ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
737ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
738ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
741ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p1],      %[sec3],    16          \n\t"
742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[pm1],     %[sec4],    16          \n\t"
743ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
744ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
745ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
746ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
747ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
749ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
750ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose p3, p4, p5, p6 */
752ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
753ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
754ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
755ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
756ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
757ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
758ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
759ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
760ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
761ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
762ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
763ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
764ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
765ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p5],      %[sec3],    16          \n\t"
766ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p3],      %[sec4],    16          \n\t"
767ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
768ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
769ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
770ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
771ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
772ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
773ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
774ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
775ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if (p1 - p4 == 0) and (p2 - p3 == 0)
776ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * mask will be zero and filtering is not needed
777ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
778ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
779ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
780ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
781ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
782ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                     thresh, &hev, &mask);
783ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
784ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* if mask == 0 do filtering is not needed */
785ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (mask)
786ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
787ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* filtering */
788ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
790ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* unpack processed 4x4 neighborhood
791ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * don't use transpose on output data
792ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * because memory isn't aligned
793ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
794ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
795ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s4])    \n\t"
796ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s4])    \n\t"
797ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s4])    \n\t"
798ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s4])    \n\t"
799ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
800ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
803ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
804ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
805ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
806ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
807ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
808ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
809ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
810ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
811ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
812ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
813ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
814ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s3])    \n\t"
815ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s3])    \n\t"
816ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s3])    \n\t"
817ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s3])    \n\t"
818ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p1] "+r" (p1)
819ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3), [p2] "r" (p2)
820ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
821ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
822ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
823ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
824ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
825ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
826ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
827ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
828ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
829ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
830ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
831ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
832ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s2])    \n\t"
833ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s2])    \n\t"
834ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s2])    \n\t"
835ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s2])    \n\t"
836ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
837ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
838ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
839ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
840ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
841ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
842ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
843ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
844ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
845ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
846ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
847ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
848ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
849ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
850ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
851ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s1])    \n\t"
852ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s1])    \n\t"
853ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s1])    \n\t"
854ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s1])    \n\t"
855ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
856ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
857ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
858ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
859ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
860ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
861ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
862ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s1 = s;
863ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s2 = s + p;
864ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s3 = s2 + p;
865ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s4 = s3 + p;
866ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s  = s4 + p;
867ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
868ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* load quad-byte vectors
869ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * memory is 4 byte aligned
870ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
871ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p2  = *((uint32_t *)(s1 - 4));
872ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s1));
873ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p1  = *((uint32_t *)(s2 - 4));
874ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s2));
875ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s3 - 4));
876ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p4  = *((uint32_t *)(s3));
877ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(s4 - 4));
878ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p3  = *((uint32_t *)(s4));
879ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
880ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose pm1, p0, p1, p2 */
881ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
882ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
883ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
884ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
885ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
886ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
887ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
888ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
889ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
890ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
891ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
892ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
893ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
894ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p1],      %[sec3],    16          \n\t"
895ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[pm1],     %[sec4],    16          \n\t"
896ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
897ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
898ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
899ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
900ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
901ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
902ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
903ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
904ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose p3, p4, p5, p6 */
905ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
906ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
907ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
908ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
909ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
910ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
911ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
912ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
913ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
914ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
915ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
916ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
917ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
918ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p5],      %[sec3],    16          \n\t"
919ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p3],      %[sec4],    16          \n\t"
920ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
923ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
924ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
925ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
926ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
927ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
928ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if (p1 - p4 == 0) and (p2 - p3 == 0)
929ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * mask will be zero and filtering is not needed
930ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
931ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
932ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
933ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
934ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
935ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                     thresh, &hev, &mask);
936ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
937ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* if mask == 0 do filtering is not needed */
938ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (mask)
939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
940ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* filtering */
941ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
942ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
943ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* unpack processed 4x4 neighborhood
944ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * don't use transpose on output data
945ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * because memory isn't aligned
946ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
947ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
948ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s4])    \n\t"
949ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s4])    \n\t"
950ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s4])    \n\t"
951ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s4])    \n\t"
952ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
953ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
954ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
955ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
956ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
957ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
958ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
959ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
960ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
961ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
962ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
963ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
964ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
965ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
966ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
967ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s3])    \n\t"
968ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s3])    \n\t"
969ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s3])    \n\t"
970ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s3])    \n\t"
971ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p1] "+r" (p1)
972ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3), [p2] "r" (p2)
973ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
974ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
975ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
976ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
977ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
978ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
979ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
980ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
981ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
982ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
983ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
984ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
985ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s2])    \n\t"
986ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s2])    \n\t"
987ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s2])    \n\t"
988ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s2])    \n\t"
989ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
990ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
991ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
992ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
993ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
994ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
995ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8     \n\t"
996ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8     \n\t"
997ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8     \n\t"
998ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8     \n\t"
999ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1000ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
1001ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
1002ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1003ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
1004ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s1])    \n\t"
1005ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s1])    \n\t"
1006ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s1])    \n\t"
1007ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s1])    \n\t"
1008ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
1009ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
1010ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1)
1011ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
1012ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
1013ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1014ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1015ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        i += 8;
1016ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1017ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1018ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    while (i < count);
1019ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
1020ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1021ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_uvvertical_edge_mips
1022ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
1023ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
1024ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
1025ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
1026ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
1027ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
1028ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
1029ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
1030ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
1031ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
1032ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
1033ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s1, *s2, *s3, *s4;
1034ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t prim1, prim2, sec3, sec4, prim3, prim4;
1035ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1036ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
1037ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
1038ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1039ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1040ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* apply filter on 4 pixesl at the same time */
1041ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1042ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1 = s;
1043ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2 = s + p;
1044ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3 = s2 + p;
1045ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4 = s3 + p;
1046ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1047ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
1048ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    * memory is 4 byte aligned
1049ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    */
1050ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2  = *((uint32_t *)(s1 - 4));
1051ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6  = *((uint32_t *)(s1));
1052ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1  = *((uint32_t *)(s2 - 4));
1053ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5  = *((uint32_t *)(s2));
1054ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0  = *((uint32_t *)(s3 - 4));
1055ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4  = *((uint32_t *)(s3));
1056ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = *((uint32_t *)(s4 - 4));
1057ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3  = *((uint32_t *)(s4));
1058ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1059ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose pm1, p0, p1, p2 */
1060ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1061ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
1062ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
1063ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
1064ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
1065ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1066ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
1067ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
1068ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1069ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1070ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1071ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
1072ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
1073ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p1],      %[sec3],    16          \n\t"
1074ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[pm1],     %[sec4],    16          \n\t"
1075ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1076ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1077ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1078ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
1079ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
1080ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
1081ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1082ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1083ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose p3, p4, p5, p6 */
1084ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1085ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
1086ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
1087ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
1088ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
1089ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1090ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
1091ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
1092ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1093ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1094ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1095ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
1096ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
1097ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p5],      %[sec3],    16          \n\t"
1098ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p3],      %[sec4],    16          \n\t"
1099ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1101ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
1103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
1104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
1105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    * mask will be zero and filtering is not needed
1109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    */
1110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
1115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
1117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
1118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
1120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
1121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood
1123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * don't use transpose on output data
1124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * because memory isn't aligned
1125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s4])    \n\t"
1128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s4])    \n\t"
1129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s4])    \n\t"
1130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s4])    \n\t"
1131ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
1133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1)
1134ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1135ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1136ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1140ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1141ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s3])    \n\t"
1147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s3])    \n\t"
1148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s3])    \n\t"
1149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s3])    \n\t"
1150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p1] "+r" (p1)
1151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3), [p2] "r" (p2)
1152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s2])    \n\t"
1165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s2])    \n\t"
1166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s2])    \n\t"
1167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s2])    \n\t"
1168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
1170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1)
1171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1173ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1182ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s1])    \n\t"
1184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s1])    \n\t"
1185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s1])    \n\t"
1186ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s1])    \n\t"
1187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1), [p2] "r" (p2), [p1] "r" (p1)
1189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1 = s4 + p;
1194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2 = s1 + p;
1195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3 = s2 + p;
1196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4 = s3 + p;
1197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
1199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
1200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2  = *((uint32_t *)(s1 - 4));
1202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6  = *((uint32_t *)(s1));
1203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1  = *((uint32_t *)(s2 - 4));
1204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5  = *((uint32_t *)(s2));
1205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0  = *((uint32_t *)(s3 - 4));
1206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4  = *((uint32_t *)(s3));
1207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = *((uint32_t *)(s4 - 4));
1208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3  = *((uint32_t *)(s4));
1209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1210ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose pm1, p0, p1, p2 */
1211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
1213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
1214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
1215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
1216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
1218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
1219ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
1223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
1224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p1],      %[sec3],    16          \n\t"
1225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[pm1],     %[sec4],    16          \n\t"
1226ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
1230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
1231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
1232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose p3, p4, p5, p6 */
1235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
1237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
1238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
1239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
1240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
1242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
1243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
1247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
1248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p5],      %[sec3],    16          \n\t"
1249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p3],      %[sec4],    16          \n\t"
1250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
1254ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
1255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
1256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
1260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1262ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1263ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1264ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1265ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
1266ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
1268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
1269ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
1271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mips(mask, hev, &p1, &p2, &p3, &p4);
1272ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood
1274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * don't use transpose on output data
1275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * because memory isn't aligned
1276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s4])    \n\t"
1279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s4])    \n\t"
1280ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s4])    \n\t"
1281ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s4])    \n\t"
1282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1283ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
1284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1)
1285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1287ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1292ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s3])    \n\t"
1298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s3])    \n\t"
1299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s3])    \n\t"
1300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s3])    \n\t"
1301ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p1] "+r" (p1)
1302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3), [p2] "r" (p2)
1303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1308ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1312ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1313ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1315ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s2])    \n\t"
1316ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s2])    \n\t"
1317ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s2])    \n\t"
1318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s2])    \n\t"
1319ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
1321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1)
1322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8     \n\t"
1326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8     \n\t"
1327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8     \n\t"
1328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8     \n\t"
1329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "+r" (p4), [p3] "+r" (p3), [p2] "+r" (p2), [p1] "+r" (p1)
1330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
1334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s1])    \n\t"
1335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s1])    \n\t"
1336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s1])    \n\t"
1337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s1])    \n\t"
1338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
1339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
1340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1)
1341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
1342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1344ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
1345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* inputs & outputs are quad-byte vectors */
1347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic __inline void vp8_mbfilter_mips
1348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
1349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask,
1350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t hev,
1351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *ps2,
1352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *ps1,
1353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *ps0,
1354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *qs0,
1355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *qs1,
1356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t *qs2
1357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
1358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
1359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vps2, vps1, vps0, vqs0, vqs1, vqs2;
1360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vps2_l, vps1_l, vps0_l, vqs0_l, vqs1_l, vqs2_l;
1361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int32_t vps2_r, vps1_r, vps0_r, vqs0_r, vqs1_r, vqs2_r;
1362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t HWM, vp8_filter_l, vp8_filter_r, mask_l, mask_r, hev_l, hev_r, subr_r, subr_l;
1363ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t Filter2_l, Filter2_r, t1, t2, Filter1_l, Filter1_r, invhev_l, invhev_r;
1364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t N128, R63;
1365ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t u1_l, u1_r, u2_l, u2_r, u3_l, u3_r;
1366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    R63  = 0x003F003F;
1368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    HWM  = 0xFF00FF00;
1369ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    N128 = 0x80808080;
1370ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    t1   = 0x03000300;
1371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    t2   = 0x04000400;
1372ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1373ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0 = (*ps0) ^ N128;
1374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1 = (*ps1) ^ N128;
1375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps2 = (*ps2) ^ N128;
1376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0 = (*qs0) ^ N128;
1377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1 = (*qs1) ^ N128;
1378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs2 = (*qs2) ^ N128;
1379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use halfword pairs instead quad-bytes because of accuracy */
1381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_l = vps0 & HWM;
1382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_r = vps0 << 8;
1383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps0_r = vps0_r & HWM;
1384ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_l = vqs0 & HWM;
1386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_r = vqs0 << 8;
1387ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs0_r = vqs0_r & HWM;
1388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_l = vps1 & HWM;
1390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_r = vps1 << 8;
1391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps1_r = vps1_r & HWM;
1392ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_l = vqs1 & HWM;
1394ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_r = vqs1 << 8;
1395ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs1_r = vqs1_r & HWM;
1396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1397ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs2_l = vqs2 & HWM;
1398ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs2_r = vqs2 << 8;
1399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vqs2_r = vqs2_r & HWM;
1400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* qs0 - ps0 */
1403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[subr_l],       %[vqs0_l],       %[vps0_l]       \n\t"
1404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[subr_r],       %[vqs0_r],       %[vps0_r]       \n\t"
1405ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1406ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter = vp8_signed_char_clamp(ps1 - qs1); */
1407ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vp8_filter_l], %[vps1_l],       %[vqs1_l]       \n\t"
1408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vp8_filter_r], %[vps1_r],       %[vqs1_r]       \n\t"
1409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1410ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vp8_filter_l] "=&r" (vp8_filter_l), [vp8_filter_r] "=r" (vp8_filter_r),
1411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [subr_l] "=&r" (subr_l), [subr_r] "=&r" (subr_r)
1412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vps0_l] "r" (vps0_l), [vps0_r] "r" (vps0_r), [vps1_l] "r" (vps1_l),
1413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps1_r] "r" (vps1_r), [vqs0_l] "r" (vqs0_l), [vqs0_r] "r" (vqs0_r),
1414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs1_l] "r" (vqs1_l), [vqs1_r] "r" (vqs1_r)
1415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps2_l = vps2 & HWM;
1418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps2_r = vps2 << 8;
1419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vps2_r = vps2_r & HWM;
1420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* add outer taps if we have high edge variance */
1422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * (qs0 - ps0)); */
1424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
1425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
1426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[mask_l],       %[HWM],          %[mask]         \n\t"
1427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "sll          %[mask_r],       %[mask],         8               \n\t"
1428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[mask_r],       %[HWM],          %[mask_r]       \n\t"
1429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
1430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
1431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[hev_l],        %[HWM],          %[hev]          \n\t"
1432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "sll          %[hev_r],        %[hev],          8               \n\t"
1433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[hev_r],        %[HWM],          %[hev_r]        \n\t"
1434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_l], %[vp8_filter_l], %[subr_l]       \n\t"
1435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vp8_filter_r], %[vp8_filter_r], %[subr_r]       \n\t"
1436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter &= mask; */
1438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_l], %[vp8_filter_l], %[mask_l]       \n\t"
1439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vp8_filter_r], %[vp8_filter_r], %[mask_r]       \n\t"
1440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Filter2 = vp8_filter & hev; */
1442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter2_l],    %[vp8_filter_l], %[hev_l]        \n\t"
1443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter2_r],    %[vp8_filter_r], %[hev_r]        \n\t"
1444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vp8_filter_l] "+r" (vp8_filter_l), [vp8_filter_r] "+r" (vp8_filter_r),
1446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [hev_l] "=&r" (hev_l), [hev_r] "=&r" (hev_r),
1447ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [mask_l] "=&r" (mask_l), [mask_r] "=&r" (mask_r),
1448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [Filter2_l] "=&r" (Filter2_l), [Filter2_r] "=&r" (Filter2_r)
1449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [subr_l] "r" (subr_l), [subr_r] "r" (subr_r),
1450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [HWM] "r" (HWM), [hev]  "r" (hev), [mask] "r" (mask)
1451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* save bottom 3 bits so that we round one side +4 and the other +3 */
1454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Filter1 = vp8_signed_char_clamp(Filter2 + 4) >>= 3; */
1456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter1_l],    %[Filter2_l],    %[t2]           \n\t"
1457ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "xor          %[invhev_l],     %[hev_l],        %[HWM]          \n\t"
1458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter1_r],    %[Filter2_r],    %[t2]           \n\t"
1459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Filter2 = vp8_signed_char_clamp(Filter2 + 3) >>= 3; */
1461ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter2_l],    %[Filter2_l],    %[t1]           \n\t"
1462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[Filter2_r],    %[Filter2_r],    %[t1]           \n\t"
1463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter1_l],    %[Filter1_l],    3               \n\t"
1465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter1_r],    %[Filter1_r],    3               \n\t"
1466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_l],    %[Filter2_l],    3               \n\t"
1468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_r],    %[Filter2_r],    3               \n\t"
1469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_l],    %[Filter1_l],    %[HWM]          \n\t"
1470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter1_r],    %[Filter1_r],    %[HWM]          \n\t"
1471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "xor          %[invhev_r],     %[hev_r],        %[HWM]          \n\t"
1472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* qs0 = vp8_signed_char_clamp(qs0 - Filter1); */
1474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_l],       %[vqs0_l],       %[Filter1_l]    \n\t"
1475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_r],       %[vqs0_r],       %[Filter1_r]    \n\t"
1476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* ps0 = vp8_signed_char_clamp(ps0 + Filter2); */
1478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_l],       %[vps0_l],       %[Filter2_l]    \n\t"
1479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_r],       %[vps0_r],       %[Filter2_r]    \n\t"
1480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [invhev_l] "=&r" (invhev_l), [invhev_r] "=&r" (invhev_r),
1482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [Filter1_l] "=&r" (Filter1_l), [Filter1_r] "=&r" (Filter1_r),
1483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [Filter2_l] "+r" (Filter2_l), [Filter2_r] "+r" (Filter2_r),
1484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps0_l] "+r" (vps0_l), [vps0_r] "+r" (vps0_r),
1485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs0_l] "+r" (vqs0_l), [vqs0_r] "+r" (vqs0_r)
1486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [t1] "r" (t1), [t2] "r" (t2), [HWM] "r" (HWM),
1487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [hev_l] "r" (hev_l), [hev_r] "r" (hev_r)
1488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* only apply wider filter if not high edge variance */
1491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_filter &= ~hev; */
1493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter2_l],    %[vp8_filter_l], %[invhev_l]     \n\t"
1494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[Filter2_r],    %[vp8_filter_r], %[invhev_r]     \n\t"
1495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_l],    %[Filter2_l],    8               \n\t"
1497ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[Filter2_r],    %[Filter2_r],    8               \n\t"
1498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [Filter2_l] "=&r" (Filter2_l), [Filter2_r] "=&r" (Filter2_r)
1500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vp8_filter_l] "r" (vp8_filter_l), [vp8_filter_r] "r" (vp8_filter_r),
1501ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [invhev_l] "r" (invhev_l), [invhev_r] "r" (invhev_r)
1502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1503ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* roughly 3/7th difference across boundary */
1505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u3_l],         %[Filter2_l],    3               \n\t"
1507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u3_r],         %[Filter2_r],    3               \n\t"
1508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u3_l],         %[u3_l],         %[Filter2_l]    \n\t"
1510ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u3_r],         %[u3_r],         %[Filter2_r]    \n\t"
1511ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1512ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u2_l],         %[u3_l],         1               \n\t"
1513ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u2_r],         %[u3_r],         1               \n\t"
1514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u1_l],         %[u3_l],         %[u2_l]         \n\t"
1516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u1_r],         %[u3_r],         %[u2_r]         \n\t"
1517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u2_l],         %[u2_l],         %[R63]          \n\t"
1519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u2_r],         %[u2_r],         %[R63]          \n\t"
1520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u3_l],         %[u3_l],         %[R63]          \n\t"
1522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u3_r],         %[u3_r],         %[R63]          \n\t"
1523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vp8_signed_char_clamp((63 + Filter2 * 27) >> 7)
1525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * vp8_signed_char_clamp((63 + Filter2 * 18) >> 7)
1526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1527ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u1_l],         %[u1_l],         %[R63]          \n\t"
1528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq.ph      %[u1_r],         %[u1_r],         %[R63]          \n\t"
1529ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u1_l],         %[u1_l],         7               \n\t"
1530ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u1_r],         %[u1_r],         7               \n\t"
1531ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u2_l],         %[u2_l],         7               \n\t"
1532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u2_r],         %[u2_r],         7               \n\t"
1533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u1_l],         %[u1_l],         8               \n\t"
1534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u1_r],         %[u1_r],         8               \n\t"
1535ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u2_l],         %[u2_l],         8               \n\t"
1536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u2_r],         %[u2_r],         8               \n\t"
1537ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vqs0 = vp8_signed_char_clamp(qs0 - u); */
1539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_l],       %[vqs0_l],       %[u1_l]         \n\t"
1540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs0_r],       %[vqs0_r],       %[u1_r]         \n\t"
1541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vps0 = vp8_signed_char_clamp(ps0 + u); */
1543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_l],       %[vps0_l],       %[u1_l]         \n\t"
1544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps0_r],       %[vps0_r],       %[u1_r]         \n\t"
1545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1546ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [u1_l] "=&r" (u1_l), [u1_r] "=&r" (u1_r), [u2_l] "=&r" (u2_l),
1547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [u2_r] "=&r" (u2_r), [u3_l] "=&r" (u3_l), [u3_r] "=&r" (u3_r),
1548ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps0_l] "+r" (vps0_l), [vps0_r] "+r" (vps0_r),
1549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs0_l] "+r" (vqs0_l), [vqs0_r] "+r" (vqs0_r)
1550ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [R63]  "r" (R63),
1551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [Filter2_l] "r" (Filter2_l), [Filter2_r] "r" (Filter2_r)
1552ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1553ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vqs1 = vp8_signed_char_clamp(qs1 - u); */
1556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs1_l],       %[vqs1_l],       %[u2_l]         \n\t"
1557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps1_l],       %[vps1_l],       %[u2_l]         \n\t"
1558ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vps1 = vp8_signed_char_clamp(ps1 + u); */
1560ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps1_r],       %[vps1_r],       %[u2_r]         \n\t"
1561ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs1_r],       %[vqs1_r],       %[u2_r]         \n\t"
1562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vps1_l] "+r" (vps1_l), [vps1_r] "+r" (vps1_r),
1564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs1_l] "+r" (vqs1_l), [vqs1_r] "+r" (vqs1_r)
1565ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [u2_l] "r" (u2_l), [u2_r] "r" (u2_r)
1566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1567ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1568ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* roughly 1/7th difference across boundary */
1569ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1570ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* u = vp8_signed_char_clamp((63 + Filter2 * 9) >> 7); */
1571ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u3_l],         %[u3_l],         7               \n\t"
1572ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shra.ph      %[u3_r],         %[u3_r],         7               \n\t"
1573ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u3_l],         %[u3_l],         8               \n\t"
1574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shll.ph      %[u3_r],         %[u3_r],         8               \n\t"
1575ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1576ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vqs2 = vp8_signed_char_clamp(qs2 - u); */
1577ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs2_l],       %[vqs2_l],       %[u3_l]         \n\t"
1578ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "subq_s.ph    %[vqs2_r],       %[vqs2_r],       %[u3_r]         \n\t"
1579ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* vps2 = vp8_signed_char_clamp(ps2 + u); */
1581ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps2_l],       %[vps2_l],       %[u3_l]         \n\t"
1582ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "addq_s.ph    %[vps2_r],       %[vps2_r],       %[u3_r]         \n\t"
1583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1584ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [u3_l] "+r" (u3_l), [u3_r] "+r" (u3_r), [vps2_l] "+r" (vps2_l),
1585ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vps2_r] "+r" (vps2_r), [vqs2_l] "+r" (vqs2_l), [vqs2_r] "+r" (vqs2_r)
1586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
1587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Create quad-bytes from halfword pairs */
1590ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
1591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vqs0_l],       %[vqs0_l],       %[HWM]          \n\t"
1592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vqs0_r],       %[vqs0_r],       8               \n\t"
1593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vps0_l],       %[vps0_l],       %[HWM]          \n\t"
1595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vps0_r],       %[vps0_r],       8               \n\t"
1596ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vqs1_l],       %[vqs1_l],       %[HWM]          \n\t"
1598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vqs1_r],       %[vqs1_r],       8               \n\t"
1599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vps1_l],       %[vps1_l],       %[HWM]          \n\t"
1601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vps1_r],       %[vps1_r],       8               \n\t"
1602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vqs2_l],       %[vqs2_l],       %[HWM]          \n\t"
1604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vqs2_r],       %[vqs2_r],       8               \n\t"
1605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "and          %[vps2_l],       %[vps2_l],       %[HWM]          \n\t"
1607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "shrl.ph      %[vps2_r],       %[vps2_r],       8               \n\t"
1608ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1609ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vqs0_r],       %[vqs0_l],       %[vqs0_r]       \n\t"
1610ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vps0_r],       %[vps0_l],       %[vps0_r]       \n\t"
1611ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vqs1_r],       %[vqs1_l],       %[vqs1_r]       \n\t"
1612ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vps1_r],       %[vps1_l],       %[vps1_r]       \n\t"
1613ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vqs2_r],       %[vqs2_l],       %[vqs2_r]       \n\t"
1614ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "or           %[vps2_r],       %[vps2_l],       %[vps2_r]       \n\t"
1615ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1616ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [vps1_l] "+r" (vps1_l), [vps1_r] "+r" (vps1_r), [vqs1_l] "+r" (vqs1_l),
1617ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs1_r] "+r" (vqs1_r), [vps0_l] "+r" (vps0_l), [vps0_r] "+r" (vps0_r),
1618ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs0_l] "+r" (vqs0_l), [vqs0_r] "+r" (vqs0_r), [vqs2_l] "+r" (vqs2_l),
1619ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [vqs2_r] "+r" (vqs2_r), [vps2_r] "+r" (vps2_r), [vps2_l] "+r" (vps2_l)
1620ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [HWM] "r" (HWM)
1621ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
1622ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1623ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *ps0 = vps0_r ^ N128;
1624ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *ps1 = vps1_r ^ N128;
1625ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *ps2 = vps2_r ^ N128;
1626ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *qs0 = vqs0_r ^ N128;
1627ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *qs1 = vqs1_r ^ N128;
1628ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    *qs2 = vqs2_r ^ N128;
1629ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
1630ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1631ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_mbloop_filter_horizontal_edge_mips
1632ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
1633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
1634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
1635ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
1636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
1637ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
1638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
1639ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
1640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
1641ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int i;
1642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
1643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
1644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *sm1, *s0, *s1, *s2, *s3, *s4, *s5, *s6;
1645ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
1647ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
1648ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    i = 0;
1649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
1650ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
1651ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
1652ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
1653ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1654ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
1655ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
1656ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1657ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1658ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 = s - (p << 2);
1659ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  = s - p - p - p;
1660ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  = s - p - p;
1661ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  = s - p;
1662ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  = s;
1663ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  = s + p;
1664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  = s + p + p;
1665ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  = s + p + p + p;
1666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1667ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* prefetch data for load */
1668ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    prefetch_load_lf(s + p);
1669ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1670ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* apply filter on 4 pixesl at the same time */
1671ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    do
1672ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1673ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* load quad-byte vectors
1674ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * memory is 4 byte aligned
1675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1676ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p1 = *((uint32_t *)(s1));
1677ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p2 = *((uint32_t *)(s2));
1678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p3 = *((uint32_t *)(s3));
1679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p4 = *((uint32_t *)(s4));
1680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1681ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1682ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * mask will be zero and filtering is not needed
1683ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1684ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1685ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1686ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1687ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            pm1 = *((uint32_t *)(sm1));
1688ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p0  = *((uint32_t *)(s0));
1689ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p5  = *((uint32_t *)(s5));
1690ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p6  = *((uint32_t *)(s6));
1691ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1692ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1693ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                     thresh, &hev, &mask);
1694ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1695ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* if mask == 0 do filtering is not needed */
1696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (mask)
1697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
1698ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* filtering */
1699ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
1700ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1701ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* unpack processed 4x4 neighborhood
1702ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * memory is 4 byte aligned
1703ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
1704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s0) = p0;
1705ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s1) = p1;
1706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s2) = p2;
1707ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s3) = p3;
1708ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s4) = p4;
1709ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s5) = p5;
1710ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
1711ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1712ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1713ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        sm1 += 4;
1714ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s0  += 4;
1715ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s1  += 4;
1716ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s2  += 4;
1717ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s3  += 4;
1718ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s4  += 4;
1719ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s5  += 4;
1720ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s6  += 4;
1721ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* load quad-byte vectors
1723ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * memory is 4 byte aligned
1724ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1725ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p1 = *((uint32_t *)(s1));
1726ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p2 = *((uint32_t *)(s2));
1727ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p3 = *((uint32_t *)(s3));
1728ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p4 = *((uint32_t *)(s4));
1729ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1730ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1731ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * mask will be zero and filtering is not needed
1732ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1733ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1734ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1735ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            pm1 = *((uint32_t *)(sm1));
1737ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p0  = *((uint32_t *)(s0));
1738ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p5  = *((uint32_t *)(s5));
1739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            p6  = *((uint32_t *)(s6));
1740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1741ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                     thresh, &hev, &mask);
1743ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1744ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* if mask == 0 do filtering is not needed */
1745ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (mask)
1746ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
1747ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* filtering */
1748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
1749ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1750ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* unpack processed 4x4 neighborhood
1751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * memory is 4 byte aligned
1752ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
1753ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s0) = p0;
1754ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s1) = p1;
1755ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s2) = p2;
1756ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s3) = p3;
1757ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s4) = p4;
1758ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                *((uint32_t *)s5) = p5;
1759ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
1760ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1761ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1762ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        sm1 += 4;
1763ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s0  += 4;
1764ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s1  += 4;
1765ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s2  += 4;
1766ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s3  += 4;
1767ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s4  += 4;
1768ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s5  += 4;
1769ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s6  += 4;
1770ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1771ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        i += 8;
1772ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1773ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1774ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    while (i < count);
1775ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
1776ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1777ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_mbloop_filter_uvhorizontal_edge_mips
1778ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
1779ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
1780ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
1781ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
1782ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
1783ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
1784ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
1785ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
1786ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
1787ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
1788ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
1789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *sm1, *s0, *s1, *s2, *s3, *s4, *s5, *s6;
1790ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1791ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
1792ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
1793ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
1794ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
1795ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
1796ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
1797ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1798ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
1799ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
1800ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 = s - (p << 2);
1803ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  = s - p - p - p;
1804ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  = s - p - p;
1805ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  = s - p;
1806ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  = s;
1807ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  = s + p;
1808ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  = s + p + p;
1809ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  = s + p + p + p;
1810ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1811ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
1812ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
1813ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1814ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
1815ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
1816ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
1817ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
1818ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1819ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1820ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
1821ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1822ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1823ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1824ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1825ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
1826ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
1827ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
1828ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
1829ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1830ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
1831ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1832ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
1833ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1834ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
1835ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1836ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
1837ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
1838ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1839ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood
1840ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * memory is 4 byte aligned
1841ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1842ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s0) = p0;
1843ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
1844ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
1845ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
1846ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
1847ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s5) = p5;
1848ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1849ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1850ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1851ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    sm1 += 4;
1852ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s0  += 4;
1853ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1  += 4;
1854ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2  += 4;
1855ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3  += 4;
1856ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4  += 4;
1857ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s5  += 4;
1858ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s6  += 4;
1859ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1860ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
1861ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
1862ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1863ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = *((uint32_t *)(s1));
1864ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = *((uint32_t *)(s2));
1865ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = *((uint32_t *)(s3));
1866ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = *((uint32_t *)(s4));
1867ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1868ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
1869ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
1870ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1871ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
1872ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1873ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1874ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(sm1));
1875ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s0));
1876ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s5));
1877ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s6));
1878ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1879ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
1880ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
1881ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1882ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
1883ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
1884ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
1885ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
1886ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
1887ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1888ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* unpack processed 4x4 neighborhood
1889ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * memory is 4 byte aligned
1890ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1891ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s0) = p0;
1892ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s1) = p1;
1893ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s2) = p2;
1894ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s3) = p3;
1895ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s4) = p4;
1896ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *((uint32_t *)s5) = p5;
1897ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
1898ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
1899ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
1900ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1901ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1902ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_mbloop_filter_vertical_edge_mips
1903ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
1904ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
1905ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
1906ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
1907ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
1908ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
1909ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
1910ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
1911ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
1912ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1913ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int i;
1914ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
1915ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
1916ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s1, *s2, *s3, *s4;
1917ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t prim1, prim2, sec3, sec4, prim3, prim4;
1918ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1919ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
1920ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
1921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    i = 0;
1922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = 0;
1923ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0 = 0;
1924ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
1925ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
1926ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
1927ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
1928ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5 = 0;
1929ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6 = 0;
1930ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1931ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
1932ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
1933ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1934ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1935ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* apply filter on 4 pixesl at the same time */
1936ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    do
1937ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
1938ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s1 = s;
1939ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s2 = s + p;
1940ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s3 = s2 + p;
1941ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s4 = s3 + p;
1942ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        s  = s4 + p;
1943ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1944ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* load quad-byte vectors
1945ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * memory is 4 byte aligned
1946ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1947ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p2  = *((uint32_t *)(s1 - 4));
1948ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p6  = *((uint32_t *)(s1));
1949ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p1  = *((uint32_t *)(s2 - 4));
1950ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p5  = *((uint32_t *)(s2));
1951ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p0  = *((uint32_t *)(s3 - 4));
1952ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p4  = *((uint32_t *)(s3));
1953ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        pm1 = *((uint32_t *)(s4 - 4));
1954ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        p3  = *((uint32_t *)(s4));
1955ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1956ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose pm1, p0, p1, p2 */
1957ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
1958ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
1959ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
1960ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
1961ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
1962ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1963ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
1964ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
1965ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1966ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1967ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1968ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
1969ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
1970ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p1],      %[sec3],    16          \n\t"
1971ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[pm1],     %[sec4],    16          \n\t"
1972ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1973ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1974ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1975ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
1976ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
1977ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
1978ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
1979ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1980ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* transpose p3, p4, p5, p6 */
1981ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        __asm__ __volatile__ (
1982ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
1983ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
1984ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
1985ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
1986ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1987ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
1988ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
1989ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
1990ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
1991ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1992ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
1993ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
1994ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p5],      %[sec3],    16          \n\t"
1995ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            "append         %[p3],      %[sec4],    16          \n\t"
1996ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
1997ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
1998ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
1999ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2000ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
2001ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            :
2002ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        );
2003ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2004ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if (p1 - p4 == 0) and (p2 - p3 == 0)
2005ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * mask will be zero and filtering is not needed
2006ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
2007ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
2008ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
2009ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2010ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
2011ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                     thresh, &hev, &mask);
2012ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2013ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* if mask == 0 do filtering is not needed */
2014ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (mask)
2015ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            {
2016ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* filtering */
2017ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
2018ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2019ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* don't use transpose on output data
2020ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * because memory isn't aligned
2021ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
2022ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2023ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p5],  2(%[s4])        \n\t"
2024ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s4])        \n\t"
2025ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s4])        \n\t"
2026ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s4])        \n\t"
2027ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s4])        \n\t"
2028ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p0], -3(%[s4])        \n\t"
2029ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2030ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
2031ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2032ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2033ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2034ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2035ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p5], %[p5], 8         \n\t"
2036ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8         \n\t"
2037ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8         \n\t"
2038ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8         \n\t"
2039ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8         \n\t"
2040ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p0], %[p0], 8         \n\t"
2041ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2042ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2043ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2044ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2045ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2046ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2047ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p5],  2(%[s3])        \n\t"
2048ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s3])        \n\t"
2049ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s3])        \n\t"
2050ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s3])        \n\t"
2051ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s3])        \n\t"
2052ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p0], -3(%[s3])        \n\t"
2053ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2054ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3),
2055ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2056ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2057ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2058ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2059ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p5], %[p5], 8         \n\t"
2060ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8         \n\t"
2061ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8         \n\t"
2062ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8         \n\t"
2063ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8         \n\t"
2064ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p0], %[p0], 8         \n\t"
2065ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2066ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2067ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2068ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2069ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2070ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2071ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p5],  2(%[s2])        \n\t"
2072ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s2])        \n\t"
2073ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s2])        \n\t"
2074ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s2])        \n\t"
2075ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s2])        \n\t"
2076ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p0], -3(%[s2])        \n\t"
2077ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2078ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
2079ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2080ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2081ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2082ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2083ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p5], %[p5], 8         \n\t"
2084ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p4], %[p4], 8         \n\t"
2085ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p3], %[p3], 8         \n\t"
2086ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p2], %[p2], 8         \n\t"
2087ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p1], %[p1], 8         \n\t"
2088ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "srl        %[p0], %[p0], 8         \n\t"
2089ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2090ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2091ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2092ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2093ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2094ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                __asm__ __volatile__ (
2095ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p5],  2(%[s1])        \n\t"
2096ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p4],  1(%[s1])        \n\t"
2097ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p3],  0(%[s1])        \n\t"
2098ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p2], -1(%[s1])        \n\t"
2099ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p1], -2(%[s1])        \n\t"
2100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    "sb         %[p0], -3(%[s1])        \n\t"
2101ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    :
2102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
2103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                      [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                );
2105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            }
2106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
2107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        i += 4;
2109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    while (i < count);
2112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_mbloop_filter_uvvertical_edge_mips
2115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org(
2116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s,
2117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int p,
2118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int flimit,
2119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int limit,
2120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh,
2121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int count
2122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org)
2123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
2124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t mask, hev;
2125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t pm1, p0, p1, p2, p3, p4, p5, p6;
2126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char *s1, *s2, *s3, *s4;
2127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint32_t prim1, prim2, sec3, sec4, prim3, prim4;
2128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    mask = 0;
2130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    hev = 0;
2131ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = 0;
2132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0 = 0;
2133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1 = 0;
2134ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2 = 0;
2135ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3 = 0;
2136ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4 = 0;
2137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5 = 0;
2138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6 = 0;
2139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2140ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* loop filter designed to work using chars so that we can make maximum use
2141ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * of 8 bit simd instructions.
2142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* apply filter on 4 pixesl at the same time */
2145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1 = s;
2147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2 = s + p;
2148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3 = s2 + p;
2149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4 = s3 + p;
2150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* prefetch data for load */
2152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    prefetch_load_lf(s + 2 * p);
2153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
2155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * memory is 4 byte aligned
2156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2  = *((uint32_t *)(s1 - 4));
2158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6  = *((uint32_t *)(s1));
2159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1  = *((uint32_t *)(s2 - 4));
2160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5  = *((uint32_t *)(s2));
2161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0  = *((uint32_t *)(s3 - 4));
2162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4  = *((uint32_t *)(s3));
2163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = *((uint32_t *)(s4 - 4));
2164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3  = *((uint32_t *)(s4));
2165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose pm1, p0, p1, p2 */
2167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
2169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
2170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
2171ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
2172ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2173ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
2174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
2175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
2176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
2177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
2179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
2180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p1],      %[sec3],    16          \n\t"
2181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[pm1],     %[sec4],    16          \n\t"
2182ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
2184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
2185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
2186ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
2187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
2188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose p3, p4, p5, p6 */
2191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
2193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
2194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
2195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
2196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
2198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
2199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
2200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
2201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
2203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
2204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p5],      %[sec3],    16          \n\t"
2205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p3],      %[sec4],    16          \n\t"
2206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
2208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
2209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2210ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
2211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
2212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
2215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
2216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
2218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
2219ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6,
2221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                 thresh, &hev, &mask);
2222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
2224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
2225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
2226ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
2227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
2228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* don't use transpose on output data
2230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * because memory isn't aligned
2231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
2232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s4])        \n\t"
2234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s4])        \n\t"
2235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s4])        \n\t"
2236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s4])        \n\t"
2237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s4])        \n\t"
2238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s4])        \n\t"
2239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
2241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2254ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s3])        \n\t"
2258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s3])        \n\t"
2259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s3])        \n\t"
2260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s3])        \n\t"
2261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s3])        \n\t"
2262ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s3])        \n\t"
2263ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2264ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3),
2265ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2266ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2269ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2272ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2280ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2281ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s2])        \n\t"
2282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s2])        \n\t"
2283ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s2])        \n\t"
2284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s2])        \n\t"
2285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s2])        \n\t"
2286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s2])        \n\t"
2287ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
2289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2292ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2301ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s1])        \n\t"
2306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s1])        \n\t"
2307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s1])        \n\t"
2308ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s1])        \n\t"
2309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s1])        \n\t"
2310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s1])        \n\t"
2311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2312ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
2313ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2315ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
2316ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2317ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s1 = s4 + p;
2319ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s2 = s1 + p;
2320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s3 = s2 + p;
2321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    s4 = s3 + p;
2322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* load quad-byte vectors
2324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    * memory is 4 byte aligned
2325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    */
2326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p2  = *((uint32_t *)(s1 - 4));
2327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p6  = *((uint32_t *)(s1));
2328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p1  = *((uint32_t *)(s2 - 4));
2329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p5  = *((uint32_t *)(s2));
2330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p0  = *((uint32_t *)(s3 - 4));
2331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p4  = *((uint32_t *)(s3));
2332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    pm1 = *((uint32_t *)(s4 - 4));
2333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    p3  = *((uint32_t *)(s4));
2334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose pm1, p0, p1, p2 */
2336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p2],      %[p1]       \n\t"
2338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p2],      %[p1]       \n\t"
2339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p0],      %[pm1]      \n\t"
2340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p0],      %[pm1]      \n\t"
2341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p1],      %[prim1],   %[prim2]    \n\t"
2343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[pm1],     %[prim1],   %[prim2]    \n\t"
2344ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
2345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
2346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p2],      %[p1],      %[sec3]     \n\t"
2348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p0],      %[pm1],     %[sec4]     \n\t"
2349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p1],      %[sec3],    16          \n\t"
2350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[pm1],     %[sec4],    16          \n\t"
2351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
2353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
2354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0), [pm1] "+r" (pm1),
2355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
2356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
2357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* transpose p3, p4, p5, p6 */
2360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim1],   %[p6],      %[p5]       \n\t"
2362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim2],   %[p6],      %[p5]       \n\t"
2363ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[prim3],   %[p4],      %[p3]       \n\t"
2364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[prim4],   %[p4],      %[p3]       \n\t"
2365ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[p5],      %[prim1],   %[prim2]    \n\t"
2367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[p3],      %[prim1],   %[prim2]    \n\t"
2368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.qb.ph   %[sec3],    %[prim3],   %[prim4]    \n\t"
2369ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precr.qb.ph    %[sec4],    %[prim3],   %[prim4]    \n\t"
2370ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p6],      %[p5],      %[sec3]     \n\t"
2372ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "precrq.ph.w    %[p4],      %[p3],      %[sec4]     \n\t"
2373ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p5],      %[sec3],    16          \n\t"
2374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "append         %[p3],      %[sec4],    16          \n\t"
2375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [prim1] "=&r" (prim1), [prim2] "=&r" (prim2),
2377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [prim3] "=&r" (prim3), [prim4] "=&r" (prim4),
2378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [p6] "+r" (p6), [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          [sec3] "=&r" (sec3), [sec4] "=&r" (sec4)
2380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        :
2381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* if (p1 - p4 == 0) and (p2 - p3 == 0)
2384ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mask will be zero and filtering is not needed
2385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
2386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (!(((p1 - p4) == 0) && ((p2 - p3) == 0)))
2387ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
2388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_filter_mask_vec_mips(limit, flimit, p1, p2, pm1, p0, p3, p4, p5, p6, thresh, &hev, &mask);
2390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if mask == 0 do filtering is not needed */
2392ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (mask)
2393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        {
2394ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* filtering */
2395ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            vp8_mbfilter_mips(mask, hev, &p0, &p1, &p2, &p3, &p4, &p5);
2396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2397ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* don't use transpose on output data
2398ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * because memory isn't aligned
2399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
2400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s4])        \n\t"
2402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s4])        \n\t"
2403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s4])        \n\t"
2404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s4])        \n\t"
2405ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s4])        \n\t"
2406ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s4])        \n\t"
2407ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s4] "r" (s4),
2409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2410ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s3])        \n\t"
2426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s3])        \n\t"
2427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s3])        \n\t"
2428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s3])        \n\t"
2429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s3])        \n\t"
2430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s3])        \n\t"
2431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s3] "r" (s3),
2433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2447ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s2])        \n\t"
2450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s2])        \n\t"
2451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s2])        \n\t"
2452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s2])        \n\t"
2453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s2])        \n\t"
2454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s2])        \n\t"
2455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s2] "r" (s2),
2457ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2461ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p5], %[p5], 8         \n\t"
2462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p4], %[p4], 8         \n\t"
2463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p3], %[p3], 8         \n\t"
2464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p2], %[p2], 8         \n\t"
2465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p1], %[p1], 8         \n\t"
2466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "srl        %[p0], %[p0], 8         \n\t"
2467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "+r" (p5), [p4] "+r" (p4), [p3] "+r" (p3),
2468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "+r" (p2), [p1] "+r" (p1), [p0] "+r" (p0)
2469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            __asm__ __volatile__ (
2473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p5],  2(%[s1])        \n\t"
2474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p4],  1(%[s1])        \n\t"
2475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p3],  0(%[s1])        \n\t"
2476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p2], -1(%[s1])        \n\t"
2477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p1], -2(%[s1])        \n\t"
2478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                "sb         %[p0], -3(%[s1])        \n\t"
2479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                :
2480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                : [p5] "r" (p5), [p4] "r" (p4), [p3] "r" (p3), [s1] "r" (s1),
2481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  [p2] "r" (p2), [p1] "r" (p1), [p0] "r" (p0)
2482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            );
2483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        }
2484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Horizontal MB filtering */
2488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_mbh_dspr2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
2489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                               int y_stride, int uv_stride, loop_filter_info *lfi)
2490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
2491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh_vec, flimit_vec, limit_vec;
2492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char thresh, flimit, limit, flimit_temp;
2493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use direct value instead pointers */
2495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    limit = *(lfi->lim);
2496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit_temp = *(lfi->mblim);
2497ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    thresh = *(lfi->hev_thr);
2498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit = flimit_temp;
2499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2500ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* create quad-byte */
2501ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[thresh_vec], %[thresh]    \n\t"
2503ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[flimit_vec], %[flimit]    \n\t"
2504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[limit_vec],  %[limit]     \n\t"
2505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh_vec] "=&r" (thresh_vec), [flimit_vec] "=&r" (flimit_vec), [limit_vec] "=r" (limit_vec)
2506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh] "r" (thresh), [flimit] "r" (flimit), [limit] "r" (limit)
2507ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_mbloop_filter_horizontal_edge_mips(y_ptr, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2510ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2511ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (u_ptr)
2512ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
2513ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_mbloop_filter_uvhorizontal_edge_mips(u_ptr, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (v_ptr)
2517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    {
2518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_mbloop_filter_uvhorizontal_edge_mips(v_ptr, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
2520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Vertical MB Filtering */
2524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_mbv_dspr2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
2525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                               int y_stride, int uv_stride, loop_filter_info *lfi)
2526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
2527ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh_vec, flimit_vec, limit_vec;
2528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char thresh, flimit, limit, flimit_temp;
2529ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2530ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use direct value instead pointers */
2531ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    limit = *(lfi->lim);
2532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit_temp = *(lfi->mblim);
2533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    thresh = *(lfi->hev_thr);
2534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit = flimit_temp;
2535ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* create quad-byte */
2537ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[thresh_vec], %[thresh]    \n\t"
2539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[flimit_vec], %[flimit]    \n\t"
2540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[limit_vec],  %[limit]     \n\t"
2541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh_vec] "=&r" (thresh_vec), [flimit_vec] "=&r" (flimit_vec), [limit_vec] "=r" (limit_vec)
2542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh] "r" (thresh), [flimit] "r" (flimit), [limit] "r" (limit)
2543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_mbloop_filter_vertical_edge_mips(y_ptr, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2546ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (u_ptr)
2548ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_mbloop_filter_uvvertical_edge_mips(u_ptr, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2550ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (v_ptr)
2551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_mbloop_filter_uvvertical_edge_mips(v_ptr, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2552ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2553ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Horizontal B Filtering */
2556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_bh_dspr2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
2557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
2558ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
2559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh_vec, flimit_vec, limit_vec;
2560ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char thresh, flimit, limit, flimit_temp;
2561ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use direct value instead pointers */
2563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    limit = *(lfi->lim);
2564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit_temp = *(lfi->blim);
2565ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    thresh = *(lfi->hev_thr);
2566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit = flimit_temp;
2567ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2568ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* create quad-byte */
2569ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2570ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[thresh_vec], %[thresh]    \n\t"
2571ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[flimit_vec], %[flimit]    \n\t"
2572ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[limit_vec],  %[limit]     \n\t"
2573ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh_vec] "=&r" (thresh_vec), [flimit_vec] "=&r" (flimit_vec), [limit_vec] "=r" (limit_vec)
2574ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh] "r" (thresh), [flimit] "r" (flimit), [limit] "r" (limit)
2575ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2576ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2577ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_horizontal_edge_mips(y_ptr + 4 * y_stride, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2578ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_horizontal_edge_mips(y_ptr + 8 * y_stride, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2579ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_horizontal_edge_mips(y_ptr + 12 * y_stride, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2581ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (u_ptr)
2582ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_loop_filter_uvhorizontal_edge_mips(u_ptr + 4 * uv_stride, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2584ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (v_ptr)
2585ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_loop_filter_uvhorizontal_edge_mips(v_ptr + 4 * uv_stride, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Vertical B Filtering */
2590ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_bv_dspr2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
2591ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
2592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{
2593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned int thresh_vec, flimit_vec, limit_vec;
2594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    unsigned char thresh, flimit, limit, flimit_temp;
2595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2596ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* use direct value instead pointers */
2597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    limit = *(lfi->lim);
2598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit_temp = *(lfi->blim);
2599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    thresh = *(lfi->hev_thr);
2600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    flimit = flimit_temp;
2601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* create quad-byte */
2603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    __asm__ __volatile__ (
2604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[thresh_vec], %[thresh]    \n\t"
2605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[flimit_vec], %[flimit]    \n\t"
2606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        "replv.qb       %[limit_vec],  %[limit]     \n\t"
2607ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh_vec] "=&r" (thresh_vec), [flimit_vec] "=&r" (flimit_vec), [limit_vec] "=r" (limit_vec)
2608ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        : [thresh] "r" (thresh), [flimit] "r" (flimit), [limit] "r" (limit)
2609ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    );
2610ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2611ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_vertical_edge_mips(y_ptr + 4, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2612ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_vertical_edge_mips(y_ptr + 8, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2613ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_loop_filter_vertical_edge_mips(y_ptr + 12, y_stride, flimit_vec, limit_vec, thresh_vec, 16);
2614ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2615ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (u_ptr)
2616ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_loop_filter_uvvertical_edge_mips(u_ptr + 4, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2617ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2618ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (v_ptr)
2619ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        vp8_loop_filter_uvvertical_edge_mips(v_ptr + 4, uv_stride, flimit_vec, limit_vec, thresh_vec, 0);
2620ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
2621ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
2622ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif
2623