@ -1909,15 +1909,10 @@ static av_noinline void emulated_edge_mc_sse(uint8_t *buf, const uint8_t *src,
# if HAVE_INLINE_ASM
typedef void emulated_edge_mc_func ( uint8_t * dst , const uint8_t * src ,
int linesize , int block_w , int block_h ,
int src_x , int src_y , int w , int h ) ;
static av_always_inline void gmc ( uint8_t * dst , uint8_t * src ,
int stride , int h , int ox , int oy ,
int dxx , int dxy , int dyx , int dyy ,
int shift , int r , int width , int height ,
emulated_edge_mc_func * emu_edge_fn )
static void gmc_mmx ( uint8_t * dst , uint8_t * src ,
int stride , int h , int ox , int oy ,
int dxx , int dxy , int dyx , int dyy ,
int shift , int r , int width , int height )
{
const int w = 8 ;
const int ix = ox > > ( 16 + shift ) ;
@ -1932,7 +1927,6 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
const uint16_t dxy4 [ 4 ] = { dxys , dxys , dxys , dxys } ;
const uint16_t dyy4 [ 4 ] = { dyys , dyys , dyys , dyys } ;
const uint64_t shift2 = 2 * shift ;
uint8_t edge_buf [ ( h + 1 ) * stride ] ;
int x , y ;
const int dxw = ( dxx - ( 1 < < ( 16 + shift ) ) ) * ( w - 1 ) ;
@ -1943,7 +1937,9 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
( ( ox ^ ( ox + dxw ) ) | ( ox ^ ( ox + dxh ) ) | ( ox ^ ( ox + dxw + dxh ) ) |
( oy ^ ( oy + dyw ) ) | ( oy ^ ( oy + dyh ) ) | ( oy ^ ( oy + dyw + dyh ) ) ) > > ( 16 + shift )
// uses more than 16 bits of subpel mv (only at huge resolution)
| | ( dxx | dxy | dyx | dyy ) & 15 ) {
| | ( dxx | dxy | dyx | dyy ) & 15 | |
( unsigned ) ix > = width - w | |
( unsigned ) iy > = height - h ) {
// FIXME could still use mmx for some of the rows
ff_gmc_c ( dst , src , stride , h , ox , oy , dxx , dxy , dyx , dyy ,
shift , r , width , height ) ;
@ -1951,11 +1947,6 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
}
src + = ix + iy * stride ;
if ( ( unsigned ) ix > = width - w | |
( unsigned ) iy > = height - h ) {
emu_edge_fn ( edge_buf , src , stride , w + 1 , h + 1 , ix , iy , width , height ) ;
src = edge_buf ;
}
__asm__ volatile (
" movd %0, %%mm6 \n \t "
@ -2034,36 +2025,6 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
}
}
# if HAVE_YASM
# if ARCH_X86_32
static void gmc_mmx ( uint8_t * dst , uint8_t * src ,
int stride , int h , int ox , int oy ,
int dxx , int dxy , int dyx , int dyy ,
int shift , int r , int width , int height )
{
gmc ( dst , src , stride , h , ox , oy , dxx , dxy , dyx , dyy , shift , r ,
width , height , & emulated_edge_mc_mmx ) ;
}
# endif
static void gmc_sse ( uint8_t * dst , uint8_t * src ,
int stride , int h , int ox , int oy ,
int dxx , int dxy , int dyx , int dyy ,
int shift , int r , int width , int height )
{
gmc ( dst , src , stride , h , ox , oy , dxx , dxy , dyx , dyy , shift , r ,
width , height , & emulated_edge_mc_sse ) ;
}
# else
static void gmc_mmx ( uint8_t * dst , uint8_t * src ,
int stride , int h , int ox , int oy ,
int dxx , int dxy , int dyx , int dyy ,
int shift , int r , int width , int height )
{
gmc ( dst , src , stride , h , ox , oy , dxx , dxy , dyx , dyy , shift , r ,
width , height , & ff_emulated_edge_mc_8 ) ;
}
# endif
# define PREFETCH(name, op) \
static void name ( void * mem , int stride , int h ) \
{ \
@ -2469,9 +2430,7 @@ static void dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx, int mm_flags)
}
}
# if ARCH_X86_32 || !HAVE_YASM
c - > gmc = gmc_mmx ;
# endif
c - > add_bytes = add_bytes_mmx ;
@ -2729,9 +2688,6 @@ static void dsputil_init_sse(DSPContext *c, AVCodecContext *avctx, int mm_flags)
if ( ! high_bit_depth )
c - > emulated_edge_mc = emulated_edge_mc_sse ;
# if HAVE_INLINE_ASM
c - > gmc = gmc_sse ;
# endif
# endif /* HAVE_YASM */
}