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