Advertisement
Guest User

Untitled

a guest
Jul 30th, 2017
608
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Clone C 17.38 KB | None | 0 0
  1. From 94747e7686f32edf11707473e66f588f628cd779 Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Tue, 23 Nov 2010 20:29:37 -0500
  4. Subject: [PATCH] SSE version of high-bit-depth add4x4_idct_sse2
  5.  ~6.3x faster than C.
  6.  Our first Google Code-In patch!
  7.  
  8. ---
  9.  common/dct.c           |    4 +
  10.  common/x86/const-a.asm |    1 +
  11.  common/x86/dct-32.asm  |   36 ++++++------
  12.  common/x86/dct-64.asm  |   38 ++++++------
  13.  common/x86/dct-a.asm   |   47 +++++++++++++--
  14.  common/x86/dct.h       |    1 +
  15.  common/x86/pixel-a.asm |   16 +++---
  16.  common/x86/x86util.asm |  147 +++++++++++++++++++++++++-----------------------
  17.  8 files changed, 167 insertions(+), 123 deletions(-)
  18.  
  19. diff --git a/common/dct.c b/common/dct.c
  20. index 975afef..1b3d87b 100644
  21. --- a/common/dct.c
  22. +++ b/common/dct.c
  23. @@ -429,6 +429,10 @@ void x264_dct_init( int cpu, x264_dct_function_t *dctf )
  24.          dctf->sub8x8_dct    = x264_sub8x8_dct_mmx;
  25.          dctf->sub16x16_dct  = x264_sub16x16_dct_mmx;
  26.      }
  27. +    if( cpu&X264_CPU_SSE2 )
  28. +    {
  29. +        dctf->add4x4_idct   = x264_add4x4_idct_sse2;
  30. +    }
  31.  #endif // HAVE_MMX
  32.  #else // !HIGH_BIT_DEPTH
  33.  #if HAVE_MMX
  34. diff --git a/common/x86/const-a.asm b/common/x86/const-a.asm
  35. index 32579e3..d6e621e 100644
  36. --- a/common/x86/const-a.asm
  37. +++ b/common/x86/const-a.asm
  38. @@ -50,6 +50,7 @@ const pw_3fff,     times 8 dw 0x3fff
  39.  const pw_pixel_max,times 8 dw ((1 << BIT_DEPTH)-1)
  40.  
  41. const pd_1,        times 4 dd 1
  42. +const pd_32,       times 4 dd 32
  43. const pd_128,      times 4 dd 128
  44. const pw_00ff,     times 8 dw 0x00ff
  45. const pw_ff00,     times 8 dw 0xff00
  46. diff --git a/common/x86/dct-32.asm b/common/x86/dct-32.asm
  47. index 24e6efc..21e70c1 100644
  48. --- a/common/x86/dct-32.asm
  49. +++ b/common/x86/dct-32.asm
  50. @@ -38,13 +38,13 @@ cextern hsub_mul
  51. ; in: m0..m7
  52. ; out: 0,4,6 in mem, rest in regs
  53. %macro DCT8_1D 9
  54. -    SUMSUB_BA  m%8, m%1      ; %8 = s07, %1 = d07
  55. -    SUMSUB_BA  m%7, m%2      ; %7 = s16, %2 = d16
  56. -    SUMSUB_BA  m%6, m%3      ; %6 = s25, %3 = d25
  57. -    SUMSUB_BA  m%5, m%4      ; %5 = s34, %4 = d34
  58. -    SUMSUB_BA  m%5, m%8      ; %5 = a0,  %8 = a2
  59. -    SUMSUB_BA  m%6, m%7      ; %6 = a1,  %7 = a3
  60. -    SUMSUB_BA  m%6, m%5      ; %6 = dst0, %5 = dst4
  61. +    SUMSUB_BA  w, m%8, m%1      ; %8 = s07, %1 = d07
  62. +    SUMSUB_BA  w, m%7, m%2      ; %7 = s16, %2 = d16
  63. +    SUMSUB_BA  w, m%6, m%3      ; %6 = s25, %3 = d25
  64. +    SUMSUB_BA  w, m%5, m%4      ; %5 = s34, %4 = d34
  65. +    SUMSUB_BA  w, m%5, m%8      ; %5 = a0,  %8 = a2
  66. +    SUMSUB_BA  w, m%6, m%7      ; %6 = a1,  %7 = a3
  67. +    SUMSUB_BA  w, m%6, m%5      ; %6 = dst0, %5 = dst4
  68.     mova    [%9+0x00], m%6
  69.     mova    [%9+0x40], m%5
  70.     mova    m%6, m%7         ; a3
  71. @@ -127,13 +127,13 @@ cextern hsub_mul
  72.     psubw     m%2, m%1
  73.     mova      m%1, [%9+0x00]
  74.     mova      m%6, [%9+0x40]
  75. -    SUMSUB_BA m%6, m%1
  76. -    SUMSUB_BA m%7, m%6
  77. -    SUMSUB_BA m%3, m%1
  78. -    SUMSUB_BA m%5, m%7
  79. -    SUMSUB_BA m%2, m%3
  80. -    SUMSUB_BA m%8, m%1
  81. -    SUMSUB_BA m%4, m%6
  82. +    SUMSUB_BA w, m%6, m%1
  83. +    SUMSUB_BA w, m%7, m%6
  84. +    SUMSUB_BA w, m%3, m%1
  85. +    SUMSUB_BA w, m%5, m%7
  86. +    SUMSUB_BA w, m%2, m%3
  87. +    SUMSUB_BA w, m%8, m%1
  88. +    SUMSUB_BA w, m%4, m%6
  89.     SWAP %1, %5, %6
  90.     SWAP %3, %8, %7
  91. %endmacro
  92. @@ -434,18 +434,18 @@ global add8x8_idct_sse2.skip_prologue
  93.     SBUTTERFLY qdq, 4, 5, 0
  94.     SBUTTERFLY qdq, 6, 7, 0
  95.     UNSPILL r1,0
  96. -    IDCT4_1D 0,1,2,3,r1
  97. +    IDCT4_1D w,0,1,2,3,r1
  98.     SPILL r1, 4
  99.     TRANSPOSE2x4x4W 0,1,2,3,4
  100.     UNSPILL r1, 4
  101. -    IDCT4_1D 4,5,6,7,r1
  102. +    IDCT4_1D w,4,5,6,7,r1
  103.     SPILL r1, 0
  104.     TRANSPOSE2x4x4W 4,5,6,7,0
  105.     UNSPILL r1, 0
  106.     paddw m0, [pw_32]
  107. -    IDCT4_1D 0,1,2,3,r1
  108. +    IDCT4_1D w,0,1,2,3,r1
  109.     paddw m4, [pw_32]
  110. -    IDCT4_1D 4,5,6,7,r1
  111. +    IDCT4_1D w,4,5,6,7,r1
  112.     SPILL r1, 6,7
  113.     pxor m7, m7
  114.     DIFFx2 m0, m1, m6, m7, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]; m5
  115. diff --git a/common/x86/dct-64.asm b/common/x86/dct-64.asm
  116. index 5e43b9c..70edcbd 100644
  117. --- a/common/x86/dct-64.asm
  118. +++ b/common/x86/dct-64.asm
  119. @@ -36,13 +36,13 @@ cextern hsub_mul
  120. INIT_XMM
  121.  
  122. %macro DCT8_1D 10
  123. -    SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
  124. -    SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
  125. -    SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
  126. -    SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
  127. +    SUMSUB_BA  w, m%5, m%4 ; %5=s34, %4=d34
  128. +    SUMSUB_BA  w, m%6, m%3 ; %6=s25, %3=d25
  129. +    SUMSUB_BA  w, m%7, m%2 ; %7=s16, %2=d16
  130. +    SUMSUB_BA  w, m%8, m%1 ; %8=s07, %1=d07
  131.  
  132. -    SUMSUB_BA  m%6, m%7, m%10 ; %6=a1, %7=a3
  133. -    SUMSUB_BA  m%5, m%8, m%10 ; %5=a0, %8=a2
  134. +    SUMSUB_BA  w, m%6, m%7, m%10 ; %6=a1, %7=a3
  135. +    SUMSUB_BA  w, m%5, m%8, m%10 ; %5=a0, %8=a2
  136.  
  137.     movdqa  m%9, m%1
  138.     psraw   m%9, 1
  139. @@ -56,7 +56,7 @@ INIT_XMM
  140.     paddw   m%10, m%2
  141.     psubw   m%10, m%3 ; %10=a7
  142.  
  143. -    SUMSUB_BA  m%4, m%1
  144. +    SUMSUB_BA  w, m%4, m%1
  145.     psubw   m%1, m%3
  146.     psubw   m%4, m%2
  147.     psraw   m%3, 1
  148. @@ -70,7 +70,7 @@ INIT_XMM
  149.     psraw   m%9, 2
  150.     psubw   m%9, m%10 ; %9=b7
  151.  
  152. -    SUMSUB_BA  m%6, m%5, m%10 ; %6=b0, %5=b4
  153. +    SUMSUB_BA  w, m%6, m%5, m%10 ; %6=b0, %5=b4
  154.  
  155.     movdqa  m%3, m%7
  156.     psraw   m%3, 1
  157. @@ -88,7 +88,7 @@ INIT_XMM
  158. %endmacro
  159.  
  160. %macro IDCT8_1D 10
  161. -    SUMSUB_BA  m%5, m%1, m%9 ; %5=a0, %1=a2
  162. +    SUMSUB_BA  w, m%5, m%1, m%9 ; %5=a0, %1=a2
  163.  
  164.     movdqa  m%9, m%2
  165.     psraw   m%9, 1
  166. @@ -123,8 +123,8 @@ INIT_XMM
  167.     psraw   m%6, 2
  168.     psubw   m%9, m%6 ; %9=b7
  169.  
  170. -    SUMSUB_BA m%7, m%5, m%6 ; %7=b0, %5=b6
  171. -    SUMSUB_BA m%3, m%1, m%6; %3=b2, %1=b4
  172. +    SUMSUB_BA w, m%7, m%5, m%6 ; %7=b0, %5=b6
  173. +    SUMSUB_BA w, m%3, m%1, m%6; %3=b2, %1=b4
  174.  
  175.     movdqa  m%8, m%10
  176.     psraw   m%8, 2
  177. @@ -132,10 +132,10 @@ INIT_XMM
  178.     psraw   m%2, 2
  179.     psubw   m%2, m%10 ; %2=b5
  180.  
  181. -    SUMSUB_BA m%9, m%7, m%6 ; %9=c0, %7=c7
  182. -    SUMSUB_BA m%2, m%3, m%6 ; %2=c1, %3=c6
  183. -    SUMSUB_BA m%8, m%1, m%6 ; %8=c2, %1=c5
  184. -    SUMSUB_BA m%4, m%5, m%6 ; %4=c3, %5=c4
  185. +    SUMSUB_BA w, m%9, m%7, m%6 ; %9=c0, %7=c7
  186. +    SUMSUB_BA w, m%2, m%3, m%6 ; %2=c1, %3=c6
  187. +    SUMSUB_BA w, m%8, m%1, m%6 ; %8=c2, %1=c5
  188. +    SUMSUB_BA w, m%4, m%5, m%6 ; %4=c3, %5=c4
  189.  
  190.     SWAP %1, %9, %6
  191.     SWAP %3, %8, %7
  192. @@ -263,14 +263,14 @@ global add8x8_idct_sse2.skip_prologue
  193.     mova   m7, [r1+112]
  194.     SBUTTERFLY qdq, 4, 5, 8
  195.     SBUTTERFLY qdq, 6, 7, 8
  196. -    IDCT4_1D 0,1,2,3,8,10
  197. +    IDCT4_1D w,0,1,2,3,8,10
  198.     TRANSPOSE2x4x4W 0,1,2,3,8
  199. -    IDCT4_1D 4,5,6,7,8,10
  200. +    IDCT4_1D w,4,5,6,7,8,10
  201.     TRANSPOSE2x4x4W 4,5,6,7,8
  202.     paddw m0, [pw_32]
  203. -    IDCT4_1D 0,1,2,3,8,10
  204. +    IDCT4_1D w,0,1,2,3,8,10
  205.     paddw m4, [pw_32]
  206. -    IDCT4_1D 4,5,6,7,8,10
  207. +    IDCT4_1D w,4,5,6,7,8,10
  208.     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
  209.     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
  210.     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
  211. diff --git a/common/x86/dct-a.asm b/common/x86/dct-a.asm
  212. index 67fa34a..0e4b514 100644
  213. --- a/common/x86/dct-a.asm
  214. +++ b/common/x86/dct-a.asm
  215. @@ -52,13 +52,15 @@ SECTION .text
  216. cextern pw_32_0
  217. cextern pw_32
  218. cextern pw_8000
  219. +cextern pw_pixel_max
  220. cextern hsub_mul
  221. cextern pb_1
  222. cextern pw_1
  223. +cextern pd_32
  224.  
  225. %macro WALSH4_1D 5
  226. -    SUMSUB_BADC m%4, m%3, m%2, m%1, m%5
  227. -    SUMSUB_BADC m%4, m%2, m%3, m%1, m%5
  228. +    SUMSUB_BADC w, m%4, m%3, m%2, m%1, m%5
  229. +    SUMSUB_BADC w, m%4, m%2, m%3, m%1, m%5
  230.     SWAP %1, %4, %3
  231. %endmacro
  232.  
  233. @@ -86,7 +88,7 @@ cglobal dct4x4dc_mmx, 1,1
  234.     movq   m7, [pw_8000] ; convert to unsigned and back, so that pavgw works
  235.     WALSH4_1D  0,1,2,3,4
  236.     TRANSPOSE4x4W 0,1,2,3,4
  237. -    SUMSUB_BADC m1, m0, m3, m2, m4
  238. +    SUMSUB_BADC w, m1, m0, m3, m2, m4
  239.     SWAP 0, 1
  240.     SWAP 2, 3
  241.     SUMSUB_17BIT 0,2,4,7
  242. @@ -175,10 +177,10 @@ cglobal add4x4_idct_mmx, 2,2
  243.     movq  m3, [r1+24]
  244.     movq  m2, [r1+16]
  245.     movq  m0, [r1+ 0]
  246. -    IDCT4_1D 0,1,2,3,4,5
  247. +    IDCT4_1D w,0,1,2,3,4,5
  248.     TRANSPOSE4x4W 0,1,2,3,4
  249.     paddw m0, [pw_32]
  250. -    IDCT4_1D 0,1,2,3,4,5
  251. +    IDCT4_1D w,0,1,2,3,4,5
  252.     STORE_DIFF  m0, m4, m7, [r0+0*FDEC_STRIDE]
  253.     STORE_DIFF  m1, m4, m7, [r0+1*FDEC_STRIDE]
  254.     STORE_DIFF  m2, m4, m7, [r0+2*FDEC_STRIDE]
  255. @@ -198,7 +200,7 @@ cglobal add4x4_idct_sse4, 2,2,6
  256.     psubw     m0, m3            ; row1>>1-row3/row0-2
  257.      paddw     m2, m1            ; row3>>1+row1/row0+2
  258.      SBUTTERFLY2 wd, 0, 2, 1
  259. -    SUMSUB_BA m2, m0, m1
  260. +    SUMSUB_BA w, m2, m0, m1
  261.      pshuflw   m1, m2, 10110001b
  262.      pshufhw   m2, m2, 10110001b
  263.      punpckldq m1, m0
  264. @@ -215,7 +217,7 @@ cglobal add4x4_idct_sse4, 2,2,6
  265.      psubw     m0, m3            ; row1>>1-row3/row0-2
  266.      paddw     m2, m1            ; row3>>1+row1/row0+2
  267.      SBUTTERFLY2 qdq, 0, 2, 1
  268. -    SUMSUB_BA m2, m0, m1
  269. +    SUMSUB_BA w, m2, m0, m1
  270.  
  271.      movd      m4, [r0+FDEC_STRIDE*0]
  272.      movd      m1, [r0+FDEC_STRIDE*1]
  273. @@ -236,6 +238,37 @@ cglobal add4x4_idct_sse4, 2,2,6
  274.      movd     [r0+FDEC_STRIDE*2], m0
  275.      pextrd   [r0+FDEC_STRIDE*3], m0, 1
  276.      RET
  277. +
  278. +%else
  279. +
  280. +%macro STORE_DIFFx2 6
  281. +    psrad     %1, 6
  282. +    psrad     %2, 6
  283. +    packssdw  %1, %2
  284. +    movq      %3, %5
  285. +    movhps    %3, %6
  286. +    paddsw    %1, %3
  287. +    pxor      %4, %4
  288. +    CLIPW     %1, %4, [pw_pixel_max]
  289. +    movq      %5, %1
  290. +    movhps    %6, %1
  291. +%endmacro
  292. +
  293. +INIT_XMM
  294. +cglobal add4x4_idct_sse2, 2,2,7
  295. +    pxor  m6, m6
  296. +.skip_prologue:
  297. +    mova  m1, [r1+16]
  298. +    mova  m3, [r1+48]
  299. +    mova  m2, [r1+32]
  300. +    mova  m0, [r1+ 0]
  301. +    IDCT4_1D d,0,1,2,3,4,5
  302. +    TRANSPOSE4x4D 0,1,2,3,4
  303. +    paddd m0, [pd_32]
  304. +    IDCT4_1D d,0,1,2,3,4,5
  305. +    STORE_DIFFx2 m0, m1, m4, m6, [r0+0*FDEC_STRIDE], [r0+2*FDEC_STRIDE]
  306. +    STORE_DIFFx2 m2, m3, m4, m6, [r0+4*FDEC_STRIDE], [r0+6*FDEC_STRIDE]
  307. +    RET
  308.  %endif ; !HIGH_BIT_DEPTH
  309.  
  310.  INIT_MMX
  311. diff --git a/common/x86/dct.h b/common/x86/dct.h
  312. index 58b9d17..e55d256 100644
  313. --- a/common/x86/dct.h
  314. +++ b/common/x86/dct.h
  315. @@ -40,6 +40,7 @@ void x264_sub8x8_dct_dc_mmxext( int16_t dct    [ 4], uint8_t *pix1, uint8_t *pix
  316.  void x264_sub8x8_dct_dc_sse2  ( int16_t dct    [ 4], uint8_t *pix1, uint8_t *pix2 );
  317.  
  318.  void x264_add4x4_idct_mmx       ( uint8_t *p_dst, int16_t dct    [16] );
  319. +void x264_add4x4_idct_sse2      ( uint16_t *p_dst, int32_t dct    [16] );
  320.  void x264_add4x4_idct_sse4      ( uint8_t *p_dst, int16_t dct    [16] );
  321.  void x264_add8x8_idct_mmx       ( uint8_t *p_dst, int16_t dct[ 4][16] );
  322.  void x264_add8x8_idct_dc_mmx    ( uint8_t *p_dst, int16_t dct    [ 4] );
  323. diff --git a/common/x86/pixel-a.asm b/common/x86/pixel-a.asm
  324. index acb3612..6cd79e1 100644
  325. --- a/common/x86/pixel-a.asm
  326. +++ b/common/x86/pixel-a.asm
  327. @@ -881,7 +881,7 @@ cglobal pixel_var2_8x8_ssse3, 5,6,8
  328.      DEINTB %1, %2, %3, %4, %5
  329.      psubw m%1, m%3
  330.      psubw m%2, m%4
  331. -    SUMSUB_BA m%1, m%2, m%3
  332. +    SUMSUB_BA w, m%1, m%2, m%3
  333.  %endmacro
  334.  
  335.  %macro LOAD_SUMSUB_16x4P 10-13 r0, r2, none
  336. @@ -1278,10 +1278,10 @@ cglobal pixel_sa8d_8x8_internal_%1
  337.  %else ; non-sse2
  338.      HADAMARD4_V m0, m1, m2, m8, m6
  339.      HADAMARD4_V m4, m5, m3, m9, m6
  340. -    SUMSUB_BADC m0, m4, m1, m5, m6
  341. +    SUMSUB_BADC w, m0, m4, m1, m5, m6
  342.      HADAMARD 2, sumsub, 0, 4, 6, 11
  343.      HADAMARD 2, sumsub, 1, 5, 6, 11
  344. -    SUMSUB_BADC m2, m3, m8, m9, m6
  345. +    SUMSUB_BADC w, m2, m3, m8, m9, m6
  346.      HADAMARD 2, sumsub, 2, 3, 6, 11
  347.      HADAMARD 2, sumsub, 8, 9, 6, 11
  348.      HADAMARD 1, amax, 0, 4, 6, 11
  349. @@ -1379,7 +1379,7 @@ cglobal pixel_sa8d_8x8_internal_%1
  350.      mova spill0, m6
  351.      mova spill1, m7
  352.      HADAMARD4_V m0, m1, m2, m3, m7
  353. -    SUMSUB_BADC m0, m4, m1, m5, m7
  354. +    SUMSUB_BADC w, m0, m4, m1, m5, m7
  355.      HADAMARD 2, sumsub, 0, 4, 7, 6
  356.      HADAMARD 2, sumsub, 1, 5, 7, 6
  357.      HADAMARD 1, amax, 0, 4, 7, 6
  358. @@ -1387,7 +1387,7 @@ cglobal pixel_sa8d_8x8_internal_%1
  359.      mova m6, spill0
  360.      mova m7, spill1
  361.      paddw m0, m1
  362. -    SUMSUB_BADC m2, m6, m3, m7, m4
  363. +    SUMSUB_BADC w, m2, m6, m3, m7, m4
  364.      HADAMARD 2, sumsub, 2, 6, 4, 5
  365.      HADAMARD 2, sumsub, 3, 7, 4, 5
  366.      HADAMARD 1, amax, 2, 6, 4, 5
  367. @@ -1994,7 +1994,7 @@ cglobal hadamard_ac_2x2max_mmxext
  368.      mova      m2, [r3+0x40]
  369.      mova      m3, [r3+0x60]
  370.      sub       r3, 8
  371. -    SUMSUB_BADC m0, m1, m2, m3, m4
  372. +    SUMSUB_BADC w, m0, m1, m2, m3, m4
  373.      ABS4 m0, m2, m1, m3, m4, m5
  374.      HADAMARD 0, max, 0, 2, 4, 5
  375.      HADAMARD 0, max, 1, 3, 4, 5
  376. @@ -2059,7 +2059,7 @@ cglobal hadamard_ac_8x8_mmxext
  377.      mova      m1, [r3+0x20]
  378.      mova      m2, [r3+0x40]
  379.      mova      m3, [r3+0x60]
  380. -    SUMSUB_BADC m0, m1, m2, m3, m4
  381. +    SUMSUB_BADC w, m0, m1, m2, m3, m4
  382.      HADAMARD 0, sumsub, 0, 2, 4, 5
  383.      ABS4 m1, m3, m0, m2, m4, m5
  384.      HADAMARD 0, max, 1, 3, 4, 5
  385. @@ -2266,7 +2266,7 @@ cglobal hadamard_ac_8x8_%1
  386.      ABS_MOV   m2, m4
  387.      ABS_MOV   m3, m5
  388.      paddw     m1, m2
  389. -    SUMSUB_BA m0, m4; m2
  390. +    SUMSUB_BA w, m0, m4; m2
  391.  %if vertical
  392.      pand      m1, [mask_ac4]
  393.  %else
  394. diff --git a/common/x86/x86util.asm b/common/x86/x86util.asm
  395. index 9acaa3d..d16a237 100644
  396. --- a/common/x86/x86util.asm
  397. +++ b/common/x86/x86util.asm
  398. @@ -241,44 +241,44 @@
  399.      psrlw  m%4, 8   ; src .. y7 .. y5
  400.  %endmacro
  401.  
  402. -%macro SUMSUB_BA 2-3
  403. -%if %0==2
  404. -    paddw   %1, %2
  405. -    paddw   %2, %2
  406. -    psubw   %2, %1
  407. +%macro SUMSUB_BA 3-4
  408. +%if %0==3
  409. +    padd%1  %2, %3
  410. +    padd%1  %3, %3
  411. +    psub%1  %3, %2
  412.  %else
  413. -    mova    %3, %1
  414. -    paddw   %1, %2
  415. -    psubw   %2, %3
  416. +    mova    %4, %2
  417. +    padd%1  %2, %3
  418. +    psub%1  %3, %4
  419.  %endif
  420.  %endmacro
  421.  
  422. -%macro SUMSUB_BADC 4-5
  423. -%if %0==5
  424. -    SUMSUB_BA %1, %2, %5
  425. -    SUMSUB_BA %3, %4, %5
  426. +%macro SUMSUB_BADC 5-6
  427. +%if %0==6
  428. +    SUMSUB_BA %1, %2, %3, %6
  429. +    SUMSUB_BA %1, %4, %5, %6
  430.  %else
  431. -    paddw   %1, %2
  432. -    paddw   %3, %4
  433. -    paddw   %2, %2
  434. -    paddw   %4, %4
  435. -    psubw   %2, %1
  436. -    psubw   %4, %3
  437. +    padd%1  %2, %3
  438. +    padd%1  %4, %5
  439. +    padd%1  %3, %3
  440. +    padd%1  %5, %5
  441. +    psub%1  %3, %2
  442. +    psub%1  %5, %4
  443.  %endif
  444.  %endmacro
  445.  
  446.  %macro HADAMARD4_V 4+
  447. -    SUMSUB_BADC %1, %2, %3, %4
  448. -    SUMSUB_BADC %1, %3, %2, %4
  449. +    SUMSUB_BADC w, %1, %2, %3, %4
  450. +    SUMSUB_BADC w, %1, %3, %2, %4
  451.  %endmacro
  452.  
  453.  %macro HADAMARD8_V 8+
  454. -    SUMSUB_BADC %1, %2, %3, %4
  455. -    SUMSUB_BADC %5, %6, %7, %8
  456. -    SUMSUB_BADC %1, %3, %2, %4
  457. -    SUMSUB_BADC %5, %7, %6, %8
  458. -    SUMSUB_BADC %1, %5, %2, %6
  459. -    SUMSUB_BADC %3, %7, %4, %8
  460. +    SUMSUB_BADC w, %1, %2, %3, %4
  461. +    SUMSUB_BADC w, %5, %6, %7, %8
  462. +    SUMSUB_BADC w, %1, %3, %2, %4
  463. +    SUMSUB_BADC w, %5, %7, %6, %8
  464. +    SUMSUB_BADC w, %1, %5, %2, %6
  465. +    SUMSUB_BADC w, %3, %7, %4, %8
  466.  %endmacro
  467.  
  468.  %macro TRANS_SSE2 5-6
  469. @@ -363,7 +363,7 @@
  470.      %endif
  471.  %endif
  472.  %ifidn %2, sumsub
  473. -    SUMSUB_BA m%3, m%4, m%5
  474. +    SUMSUB_BA w, m%3, m%4, m%5
  475.  %else
  476.      %ifidn %2, amax
  477.          %if %0==6
  478. @@ -426,67 +426,72 @@
  479.  %endif
  480.  %endmacro
  481.  
  482. -%macro SUMSUB2_AB 3
  483. -    mova    %3, %1
  484. -    paddw   %1, %1
  485. -    paddw   %1, %2
  486. -    psubw   %3, %2
  487. -    psubw   %3, %2
  488. +%macro SUMSUB2_AB 4
  489. +    mova    %4, %2
  490. +    padd%1  %2, %2
  491. +    padd%1  %2, %3
  492. +    psub%1  %4, %3
  493. +    psub%1  %4, %3
  494.  %endmacro
  495.  
  496. -%macro SUMSUB2_BA 3
  497. -    mova    m%3, m%1
  498. -    paddw   m%1, m%2
  499. -    paddw   m%1, m%2
  500. -    psubw   m%2, m%3
  501. -    psubw   m%2, m%3
  502. +%macro SUMSUB2_BA 4
  503. +    mova    m%4, m%2
  504. +    padd%1  m%2, m%3
  505. +    padd%1  m%2, m%3
  506. +    psub%1  m%3, m%4
  507. +    psub%1  m%3, m%4
  508.  %endmacro
  509.  
  510. -%macro SUMSUBD2_AB 4
  511. -    mova    %4, %1
  512. -    mova    %3, %2
  513. -    psraw   %2, 1  ; %2: %2>>1
  514. -    psraw   %1, 1  ; %1: %1>>1
  515. -    paddw   %2, %4 ; %2: %2>>1+%1
  516. -    psubw   %1, %3 ; %1: %1>>1-%2
  517. +%macro SUMSUBD2_AB 5
  518. +    mova    %5, %2
  519. +    mova    %4, %3
  520. +    psra%1  %3, 1  ; %3: %2>>1
  521. +    psra%1  %2, 1  ; %2: %1>>1
  522. +    padd%1  %3, %5 ; %3: %2>>1+%1
  523. +    psub%1  %2, %4 ; %2: %1>>1-%2
  524.  %endmacro
  525.  
  526.  %macro DCT4_1D 5
  527.  %ifnum %5
  528. -    SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
  529. -    SUMSUB_BA   m%3, m%4, m%5
  530. -    SUMSUB2_AB  m%1, m%2, m%5
  531. +    SUMSUB_BADC w, m%4, m%1, m%3, m%2; m%5
  532. +    SUMSUB_BA   w, m%3, m%4, m%5
  533. +    SUMSUB2_AB  w, m%1, m%2, m%5
  534.      SWAP %1, %3, %4, %5, %2
  535.  %else
  536. -    SUMSUB_BADC m%4, m%1, m%3, m%2
  537. -    SUMSUB_BA   m%3, m%4
  538. +    SUMSUB_BADC w, m%4, m%1, m%3, m%2
  539. +    SUMSUB_BA   w, m%3, m%4
  540.      mova       [%5], m%2
  541. -    SUMSUB2_AB m%1, [%5], m%2
  542. +    SUMSUB2_AB w, m%1, [%5], m%2
  543.      SWAP %1, %3, %4, %2
  544.  %endif
  545.  %endmacro
  546.  
  547. -%macro IDCT4_1D 5-6
  548. -%ifnum %5
  549. -    SUMSUBD2_AB m%2, m%4, m%6, m%5
  550. -    ; %2: %2>>1-%4 %4: %2+%4>>1
  551. -    SUMSUB_BA   m%3, m%1, m%6
  552. -    ; %3: %1+%3 %1: %1-%3
  553. -    SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
  554. -    ; %4: %1+%3 + (%2+%4>>1)
  555. -    ; %3: %1+%3 - (%2+%4>>1)
  556. -    ; %2: %1-%3 + (%2>>1-%4)
  557. -    ; %1: %1-%3 - (%2>>1-%4)
  558. +%macro IDCT4_1D 6-7
  559. +%ifnum %6
  560. +    SUMSUBD2_AB %1, m%3, m%5, m%7, m%6
  561. +    ; %3: %3>>2-%5 %5: %3+%5>>2
  562. +    SUMSUB_BA   %1, m%4, m%2, m%7
  563. +    ; %4: %2+%4 %2: %2-%4
  564. +    SUMSUB_BADC %1, m%5, m%4, m%3, m%2, m%7
  565. +    ; %5: %2+%4 + (%3+%5>>1)
  566. +    ; %4: %2+%4 - (%3+%5>>1)
  567. +    ; %3: %2-%4 + (%3>>1-%5)
  568. +    ; %2: %2-%4 - (%3>>1-%5)
  569.  %else
  570. -    SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
  571. -    SUMSUB_BA   m%3, m%1
  572. -    SUMSUB_BADC m%4, m%3, m%2, m%1
  573. +%ifidn %1,w
  574. +    SUMSUBD2_AB %1, m%3, m%5, [%6], [%6+16]
  575. +%endif
  576. +%ifidn %1,d
  577. +    SUMSUBD2_AB %1, m%3, m%5, [%6], [%6+32]
  578. +%endif
  579. +    SUMSUB_BA   %1, m%4, m%2
  580. +    SUMSUB_BADC %1, m%5, m%4, m%3, m%2
  581.  %endif
  582. -    SWAP %1, %4, %3
  583. -    ; %1: %1+%3 + (%2+%4>>1) row0
  584. -    ; %2: %1-%3 + (%2>>1-%4) row1
  585. -    ; %3: %1-%3 - (%2>>1-%4) row2
  586. -    ; %4: %1+%3 - (%2+%4>>1) row3
  587. +    SWAP %2, %5, %4
  588. +    ; %2: %2+%4 + (%3+%5>>1) row0
  589. +    ; %3: %2-%4 + (%3>>1-%5) row2
  590. +    ; %4: %2-%4 - (%3>>1-%5) row3
  591. +    ; %5: %2+%4 - (%3+%5>>1) row4
  592.  %endmacro
  593.  
  594.  
  595. --
  596. 1.7.3.2.146.gca209
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement