81a6739533
Change-Id: I7605b6678014a5426ceb45c27b54885e0c4e06ed
98 lines
3.1 KiB
C
98 lines
3.1 KiB
C
/*
|
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "vpx_config.h"
|
|
#include "vp8_rtcd.h"
|
|
#include "vpx/vpx_integer.h"
|
|
|
|
#if HAVE_DSPR2
|
|
inline void prefetch_load_int(unsigned char *src) {
|
|
__asm__ __volatile__("pref 0, 0(%[src]) \n\t" : : [src] "r"(src));
|
|
}
|
|
|
|
__inline void vp8_copy_mem16x16_dspr2(unsigned char *RESTRICT src,
|
|
int src_stride,
|
|
unsigned char *RESTRICT dst,
|
|
int dst_stride) {
|
|
int r;
|
|
unsigned int a0, a1, a2, a3;
|
|
|
|
for (r = 16; r--;) {
|
|
/* load src data in cache memory */
|
|
prefetch_load_int(src + src_stride);
|
|
|
|
/* use unaligned memory load and store */
|
|
__asm__ __volatile__(
|
|
"ulw %[a0], 0(%[src]) \n\t"
|
|
"ulw %[a1], 4(%[src]) \n\t"
|
|
"ulw %[a2], 8(%[src]) \n\t"
|
|
"ulw %[a3], 12(%[src]) \n\t"
|
|
"sw %[a0], 0(%[dst]) \n\t"
|
|
"sw %[a1], 4(%[dst]) \n\t"
|
|
"sw %[a2], 8(%[dst]) \n\t"
|
|
"sw %[a3], 12(%[dst]) \n\t"
|
|
: [a0] "=&r"(a0), [a1] "=&r"(a1), [a2] "=&r"(a2), [a3] "=&r"(a3)
|
|
: [src] "r"(src), [dst] "r"(dst));
|
|
|
|
src += src_stride;
|
|
dst += dst_stride;
|
|
}
|
|
}
|
|
|
|
__inline void vp8_copy_mem8x8_dspr2(unsigned char *RESTRICT src, int src_stride,
|
|
unsigned char *RESTRICT dst,
|
|
int dst_stride) {
|
|
int r;
|
|
unsigned int a0, a1;
|
|
|
|
/* load src data in cache memory */
|
|
prefetch_load_int(src + src_stride);
|
|
|
|
for (r = 8; r--;) {
|
|
/* use unaligned memory load and store */
|
|
__asm__ __volatile__(
|
|
"ulw %[a0], 0(%[src]) \n\t"
|
|
"ulw %[a1], 4(%[src]) \n\t"
|
|
"sw %[a0], 0(%[dst]) \n\t"
|
|
"sw %[a1], 4(%[dst]) \n\t"
|
|
: [a0] "=&r"(a0), [a1] "=&r"(a1)
|
|
: [src] "r"(src), [dst] "r"(dst));
|
|
|
|
src += src_stride;
|
|
dst += dst_stride;
|
|
}
|
|
}
|
|
|
|
__inline void vp8_copy_mem8x4_dspr2(unsigned char *RESTRICT src, int src_stride,
|
|
unsigned char *RESTRICT dst,
|
|
int dst_stride) {
|
|
int r;
|
|
unsigned int a0, a1;
|
|
|
|
/* load src data in cache memory */
|
|
prefetch_load_int(src + src_stride);
|
|
|
|
for (r = 4; r--;) {
|
|
/* use unaligned memory load and store */
|
|
__asm__ __volatile__(
|
|
"ulw %[a0], 0(%[src]) \n\t"
|
|
"ulw %[a1], 4(%[src]) \n\t"
|
|
"sw %[a0], 0(%[dst]) \n\t"
|
|
"sw %[a1], 4(%[dst]) \n\t"
|
|
: [a0] "=&r"(a0), [a1] "=&r"(a1)
|
|
: [src] "r"(src), [dst] "r"(dst));
|
|
|
|
src += src_stride;
|
|
dst += dst_stride;
|
|
}
|
|
}
|
|
|
|
#endif
|