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 "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 14ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx/vpx_integer.h" 15ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if HAVE_DSPR2 17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orginline void prefetch_load_int(unsigned char *src) 18ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 19ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org __asm__ __volatile__ ( 20ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "pref 0, 0(%[src]) \n\t" 21ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : 22ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [src] "r" (src) 23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ); 24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 25ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 26ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 27ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org__inline void vp8_copy_mem16x16_dspr2( 28ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT src, 29ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int src_stride, 30ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT dst, 31ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int dst_stride) 32ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 33ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int r; 34ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int a0, a1, a2, a3; 35ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 36ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (r = 16; r--;) 37ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 38ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* load src data in cache memory */ 39ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org prefetch_load_int(src + src_stride); 40ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 41ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* use unaligned memory load and store */ 42ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org __asm__ __volatile__ ( 43ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a0], 0(%[src]) \n\t" 44ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a1], 4(%[src]) \n\t" 45ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a2], 8(%[src]) \n\t" 46ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a3], 12(%[src]) \n\t" 47ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a0], 0(%[dst]) \n\t" 48ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a1], 4(%[dst]) \n\t" 49ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a2], 8(%[dst]) \n\t" 50ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a3], 12(%[dst]) \n\t" 51ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [a0] "=&r" (a0), [a1] "=&r" (a1), 52ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org [a2] "=&r" (a2), [a3] "=&r" (a3) 53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [src] "r" (src), [dst] "r" (dst) 54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ); 55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src += src_stride; 57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst += dst_stride; 58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 60ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 61ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 62ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org__inline void vp8_copy_mem8x8_dspr2( 63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT src, 64ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int src_stride, 65ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT dst, 66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int dst_stride) 67ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 68ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int r; 69ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int a0, a1; 70ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 71ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* load src data in cache memory */ 72ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org prefetch_load_int(src + src_stride); 73ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (r = 8; r--;) 75ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 76ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* use unaligned memory load and store */ 77ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org __asm__ __volatile__ ( 78ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a0], 0(%[src]) \n\t" 79ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a1], 4(%[src]) \n\t" 80ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a0], 0(%[dst]) \n\t" 81ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a1], 4(%[dst]) \n\t" 82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [a0] "=&r" (a0), [a1] "=&r" (a1) 83ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [src] "r" (src), [dst] "r" (dst) 84ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ); 85ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 86ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src += src_stride; 87ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst += dst_stride; 88ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 89ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 90ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 91ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 92ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org__inline void vp8_copy_mem8x4_dspr2( 93ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT src, 94ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int src_stride, 95ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *RESTRICT dst, 96ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int dst_stride) 97ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 98ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int r; 99ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int a0, a1; 100ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 101ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* load src data in cache memory */ 102ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org prefetch_load_int(src + src_stride); 103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (r = 4; r--;) 105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* use unaligned memory load and store */ 107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org __asm__ __volatile__ ( 108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a0], 0(%[src]) \n\t" 109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "ulw %[a1], 4(%[src]) \n\t" 110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a0], 0(%[dst]) \n\t" 111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "sw %[a1], 4(%[dst]) \n\t" 112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [a0] "=&r" (a0), [a1] "=&r" (a1) 113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org : [src] "r" (src), [dst] "r" (dst) 114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ); 115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src += src_stride; 117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst += dst_stride; 118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 122