a9c7597adc
Change-Id: Ib8f8a66c9fd31e508cdc9caa662192f38433aa3d
122 lines
3.2 KiB
C
122 lines
3.2 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
|