XOP 8-bit fDCT
authorJason Garrett-Glaser <jason@x264.com>
Thu, 22 Dec 2011 22:03:15 +0000 (14:03 -0800)
committerJason Garrett-Glaser <jason@x264.com>
Sun, 15 Jan 2012 21:04:36 +0000 (13:04 -0800)
Use integer MAC for one of the SUMSUB passes.  About a dozen cycles faster for 16x16.

common/dct.c
common/x86/const-a.asm
common/x86/dct-32.asm
common/x86/dct-64.asm
common/x86/dct-a.asm
common/x86/dct.h
common/x86/x86util.asm

index 6836bc2..c071ae4 100644 (file)
@@ -597,6 +597,12 @@ void x264_dct_init( int cpu, x264_dct_function_t *dctf )
         dctf->sub8x8_dct8      = x264_sub8x8_dct8_avx;
         dctf->sub16x16_dct8    = x264_sub16x16_dct8_avx;
     }
+
+    if( cpu&X264_CPU_XOP )
+    {
+        dctf->sub8x8_dct       = x264_sub8x8_dct_xop;
+        dctf->sub16x16_dct     = x264_sub16x16_dct_xop;
+    }
 #endif //HAVE_MMX
 
 #if HAVE_ALTIVEC
index 8ce98c6..a7cfbe8 100644 (file)
@@ -38,6 +38,7 @@ const pb_shuf8x8c, db 0,0,0,0,2,2,2,2,4,4,4,4,6,6,6,6
 
 const pw_1,        times 8 dw 1
 const pw_2,        times 8 dw 2
+const pw_m2,       times 8 dw -2
 const pw_4,        times 8 dw 4
 const pw_8,        times 8 dw 8
 const pw_16,       times 8 dw 16
index f439508..b0aedc8 100644 (file)
 
 SECTION .text
 
-%ifndef HIGH_BIT_DEPTH
+cextern pw_2
+cextern pw_m2
 cextern pw_32
 cextern hsub_mul
 
+%ifndef HIGH_BIT_DEPTH
+
 ; in: m0..m7
 ; out: 0,4,6 in mem, rest in regs
 %macro DCT8_1D 9
@@ -402,6 +405,8 @@ INIT_XMM ssse3
 DCT_SUB8
 INIT_XMM avx
 DCT_SUB8
+INIT_XMM xop
+DCT_SUB8
 
 ;-----------------------------------------------------------------------------
 ; void add8x8_idct( uint8_t *pix, int16_t dct[4][4][4] )
index e144250..dab0054 100644 (file)
 
 SECTION .text
 
-%ifndef HIGH_BIT_DEPTH
+cextern pw_2
+cextern pw_m2
 cextern pw_32
 cextern hsub_mul
 
+%ifndef HIGH_BIT_DEPTH
+
 %macro DCT8_1D 10
     SUMSUB_BA w, %5, %4 ; %5=s34, %4=d34
     SUMSUB_BA w, %6, %3 ; %6=s25, %3=d25
@@ -198,6 +201,8 @@ INIT_XMM ssse3
 DCT_SUB8
 INIT_XMM avx
 DCT_SUB8
+INIT_XMM xop
+DCT_SUB8
 
 ;-----------------------------------------------------------------------------
 ; void add8x8_idct8( uint8_t *p_dst, int16_t dct[8][8] )
index 1324b48..57432f7 100644 (file)
@@ -452,9 +452,11 @@ INIT_XMM
 cextern sub8x8_dct_sse2.skip_prologue
 cextern sub8x8_dct_ssse3.skip_prologue
 cextern sub8x8_dct_avx.skip_prologue
+cextern sub8x8_dct_xop.skip_prologue
 SUB_NxN_DCT  sub16x16_dct_sse2,  sub8x8_dct_sse2,  128, 8, 0, 0
 SUB_NxN_DCT  sub16x16_dct_ssse3, sub8x8_dct_ssse3, 128, 8, 0, 0
 SUB_NxN_DCT  sub16x16_dct_avx,   sub8x8_dct_avx,   128, 8, 0, 0
+SUB_NxN_DCT  sub16x16_dct_xop,   sub8x8_dct_xop,   128, 8, 0, 0
 
 cextern add8x8_idct_sse2.skip_prologue
 cextern add8x8_idct_avx.skip_prologue
index 3a615df..ad0e9a5 100644 (file)
@@ -38,6 +38,8 @@ void x264_sub8x8_dct_ssse3  ( int16_t dct[ 4][16], uint8_t *pix1, uint8_t *pix2
 void x264_sub16x16_dct_ssse3( int16_t dct[16][16], uint8_t *pix1, uint8_t *pix2 );
 void x264_sub8x8_dct_avx    ( int16_t dct[ 4][16], uint8_t *pix1, uint8_t *pix2 );
 void x264_sub16x16_dct_avx  ( int16_t dct[16][16], uint8_t *pix1, uint8_t *pix2 );
+void x264_sub8x8_dct_xop    ( int16_t dct[ 4][16], uint8_t *pix1, uint8_t *pix2 );
+void x264_sub16x16_dct_xop  ( int16_t dct[16][16], uint8_t *pix1, uint8_t *pix2 );
 void x264_sub8x8_dct_dc_mmx2( int16_t dct    [ 4], uint8_t *pix1, uint8_t *pix2 );
 void x264_sub8x8_dct_dc_sse2( dctcoef dct    [ 4], pixel   *pix1, pixel   *pix2 );
 void x264_sub8x16_dct_dc_sse2 ( dctcoef dct  [ 4], pixel   *pix1, pixel   *pix2 );
index b71ed79..097ec9c 100644 (file)
 %endmacro
 
 %macro SUMSUB2_AB 4
-%ifnum %3
+%if cpuflag(xop)
+    pmacs%1%1 m%4, m%3, [p%1_m2], m%2
+    pmacs%1%1 m%2, m%2, [p%1_2], m%3
+%elifnum %3
     psub%1  m%4, m%2, m%3
     psub%1  m%4, m%3
     padd%1  m%2, m%2
 %endif
 %endmacro
 
-%macro SUMSUB2_BA 4
-%if avx_enabled
-    padd%1  m%4, m%2, m%3
-    padd%1  m%4, m%3
-    psub%1  m%3, m%2
-    psub%1  m%3, m%2
-    SWAP     %2,  %4
-%else
-    mova    m%4, m%2
-    padd%1  m%2, m%3
-    padd%1  m%2, m%3
-    psub%1  m%3, m%4
-    psub%1  m%3, m%4
-%endif
-%endmacro
-
 %macro SUMSUBD2_AB 5
 %ifnum %4
     psra%1  m%5, m%2, 1  ; %3: %3>>1