16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
11ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vpx_config.h"
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/encoder/vp9_variance.h"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_pragmas.h"
146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vpx_ports/mem.h"
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgextern unsigned int vp9_get8x8var_mmx
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org(
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *SSE,
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int *Sum
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org);
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgextern unsigned int vp9_get4x4var_mmx
266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org(
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *SSE,
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int *Sum
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org);
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_variance4x4_mmx(
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int var;
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int avg;
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  vp9_get4x4var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &var, &avg);
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return (var - (((unsigned int)avg * avg) >> 4));
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_variance8x8_mmx(
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int var;
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int avg;
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  vp9_get8x8var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &var, &avg);
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return (var - (((unsigned int)avg * avg) >> 6));
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_mse16x16_mmx(
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int sse0, sse1, sse2, sse3, var;
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int sum0, sum1, sum2, sum3;
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
74ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &sse0,
75ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sum0);
76ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8, source_stride, ref_ptr + 8, recon_stride,
77ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sse1, &sum1);
78ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8 * source_stride, source_stride,
79ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    ref_ptr + 8 * recon_stride, recon_stride, &sse2, &sum2);
80ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8 * source_stride + 8, source_stride,
81ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    ref_ptr + 8 * recon_stride + 8, recon_stride, &sse3, &sum3);
826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  var = sse0 + sse1 + sse2 + sse3;
846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return var;
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_variance16x16_mmx(
906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int sse0, sse1, sse2, sse3, var;
966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int sum0, sum1, sum2, sum3, avg;
976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
98ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &sse0,
99ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sum0);
100ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8, source_stride, ref_ptr + 8, recon_stride,
101ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sse1, &sum1);
102ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8 * source_stride, source_stride,
103ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    ref_ptr + 8 * recon_stride, recon_stride, &sse2, &sum2);
104ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8 * source_stride + 8, source_stride,
105ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    ref_ptr + 8 * recon_stride + 8, recon_stride, &sse3, &sum3);
1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  var = sse0 + sse1 + sse2 + sse3;
1086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  avg = sum0 + sum1 + sum2 + sum3;
1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return (var - (((unsigned int)avg * avg) >> 8));
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_variance16x8_mmx(
1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int sse0, sse1, var;
1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int sum0, sum1, avg;
1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
122ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &sse0,
123ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sum0);
124ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8, source_stride, ref_ptr + 8, recon_stride,
125ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sse1, &sum1);
1266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  var = sse0 + sse1;
1286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  avg = sum0 + sum1;
1296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
1306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return (var - (((unsigned int)avg * avg) >> 7));
1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgunsigned int vp9_variance8x16_mmx(
1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *src_ptr,
1366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  source_stride,
1376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const unsigned char *ref_ptr,
1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int  recon_stride,
1396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int *sse) {
1406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int sse0, sse1, var;
1416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int sum0, sum1, avg;
1426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
143ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr, source_stride, ref_ptr, recon_stride, &sse0,
144ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    &sum0);
145ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_get8x8var_mmx(src_ptr + 8 * source_stride, source_stride,
146ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    ref_ptr + 8 * recon_stride, recon_stride, &sse1, &sum1);
1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  var = sse0 + sse1;
1496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  avg = sum0 + sum1;
1506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  *sse = var;
1516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return (var - (((unsigned int)avg * avg) >> 7));
1536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
154