15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Use of this source code is governed by a BSD-style license
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  that can be found in the LICENSE file in the root of the source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  tree. An additional intellectual property rights grant can be found
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  in the file PATENTS.  All contributing project authors may
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  be found in the AUTHORS file in the root of the source tree.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "vpx_config.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "vp8_rtcd.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "vpx_ports/x86.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vp8/encoder/block.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid vp8_short_fdct4x4_mmx(short *input, short *output, int pitch);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vp8_short_fdct8x4_mmx(short *input, short *output, int pitch)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vp8_short_fdct4x4_mmx(input,   output,    pitch);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vp8_short_fdct4x4_mmx(input + 4, output + 16, pitch);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int vp8_fast_quantize_b_impl_mmx(short *coeff_ptr, short *zbin_ptr,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 short *qcoeff_ptr, short *dequant_ptr,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const short *scan_mask, short *round_ptr,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 short *quant_ptr, short *dqcoeff_ptr);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vp8_fast_quantize_b_mmx(BLOCK *b, BLOCKD *d)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const short *scan_mask   = vp8_default_zig_zag_mask;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *coeff_ptr   = b->coeff;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *zbin_ptr    = b->zbin;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *round_ptr   = b->round;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *quant_ptr   = b->quant_fast;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *qcoeff_ptr  = d->qcoeff;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *dqcoeff_ptr = d->dqcoeff;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *dequant_ptr = d->dequant;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *d->eob = (char)vp8_fast_quantize_b_impl_mmx(
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                 coeff_ptr,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 zbin_ptr,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 qcoeff_ptr,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 dequant_ptr,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 scan_mask,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 round_ptr,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 quant_ptr,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 dqcoeff_ptr
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 );
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int vp8_mbblock_error_mmx_impl(short *coeff_ptr, short *dcoef_ptr, int dc);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int vp8_mbblock_error_mmx(MACROBLOCK *mb, int dc)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *coeff_ptr =  mb->block[0].coeff;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *dcoef_ptr =  mb->e_mbd.block[0].dqcoeff;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return vp8_mbblock_error_mmx_impl(coeff_ptr, dcoef_ptr, dc);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int vp8_mbuverror_mmx_impl(short *s_ptr, short *d_ptr);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int vp8_mbuverror_mmx(MACROBLOCK *mb)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    short *s_ptr = &mb->coeff[256];
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    short *d_ptr = &mb->e_mbd.dqcoeff[256];
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return vp8_mbuverror_mmx_impl(s_ptr, d_ptr);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vp8_subtract_b_mmx_impl(unsigned char *z,  int src_stride,
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             short *diff, unsigned char *predictor,
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             int pitch);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vp8_subtract_b_mmx(BLOCK *be, BLOCKD *bd, int pitch)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *z = *(be->base_src) + be->src;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int  src_stride = be->src_stride;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    short *diff = &be->src_diff[0];
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *predictor = &bd->predictor[0];
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vp8_subtract_b_mmx_impl(z, src_stride, diff, predictor, pitch);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)