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