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