1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h"
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/blockd.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q);
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequantize_b_mmx(BLOCKD *d, short *DQC)
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *sq = (short *) d->qcoeff;
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *dq = (short *) d->dqcoeff;
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_dequantize_b_impl_mmx(sq, dq, DQC);
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan
26233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequant_idct_add_y_block_mmx
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan            (short *q, short *dq,
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan             unsigned char *dst, int stride, char *eobs)
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 4; i++)
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[0] > 1)
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q, dq, dst, stride);
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[0] == 1)
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[0]*dq[0], dst, stride, dst, stride);
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q, 0, 2 * sizeof(q[0]));
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[1] > 1)
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q+16, dq, dst+4, stride);
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[1] == 1)
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[16]*dq[0], dst+4, stride,
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      dst+4, stride);
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q + 16, 0, 2 * sizeof(q[0]));
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[2] > 1)
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q+32, dq, dst+8, stride);
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[2] == 1)
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[32]*dq[0], dst+8, stride,
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      dst+8, stride);
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q + 32, 0, 2 * sizeof(q[0]));
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[3] > 1)
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q+48, dq, dst+12, stride);
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[3] == 1)
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[48]*dq[0], dst+12, stride,
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      dst+12, stride);
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q + 48, 0, 2 * sizeof(q[0]));
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q    += 64;
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst  += 4*stride;
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan        eobs += 4;
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan
75233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_dequant_idct_add_uv_block_mmx
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan            (short *q, short *dq,
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan             unsigned char *dstu, unsigned char *dstv, int stride, char *eobs)
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 2; i++)
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[0] > 1)
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q, dq, dstu, stride);
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[0] == 1)
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[0]*dq[0], dstu, stride, dstu, stride);
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q, 0, 2 * sizeof(q[0]));
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[1] > 1)
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q+16, dq, dstu+4, stride);
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[1] == 1)
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[16]*dq[0], dstu+4, stride,
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      dstu+4, stride);
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q + 16, 0, 2 * sizeof(q[0]));
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q    += 32;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dstu += 4*stride;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan        eobs += 2;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 2; i++)
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[0] > 1)
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q, dq, dstv, stride);
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[0] == 1)
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[0]*dq[0], dstv, stride, dstv, stride);
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q, 0, 2 * sizeof(q[0]));
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (eobs[1] > 1)
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dequant_idct_add_mmx (q+16, dq, dstv+4, stride);
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else if (eobs[1] == 1)
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vp8_dc_only_idct_add_mmx (q[16]*dq[0], dstv+4, stride,
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      dstv+4, stride);
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan            vpx_memset(q + 16, 0, 2 * sizeof(q[0]));
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q    += 32;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dstv += 4*stride;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan        eobs += 2;
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
129