Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 34.61 KB | None | 0 0
  1. From 6e9f6f7c55bd4fe95adc69b1ec7a7ff335f46fe7 Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Tue, 7 Dec 2010 15:19:46 -0500
  4. Subject: [PATCH 1/3] fixes
  5.  
  6. ---
  7. common/x86/predict-a.asm |   48 ++++++++++++++++++++++++++++++++++++++++++---
  8.  common/x86/predict-c.c   |   10 ++++----
  9.  2 files changed, 49 insertions(+), 9 deletions(-)
  10.  
  11. diff --git a/common/x86/predict-a.asm b/common/x86/predict-a.asm
  12. index c908c3a..7af6024 100644
  13. --- a/common/x86/predict-a.asm
  14. +++ b/common/x86/predict-a.asm
  15. @@ -168,7 +168,7 @@ cextern pb_reverse
  16.  ;-----------------------------------------------------------------------------
  17.  %macro PREDICT_4x4_DDL 4
  18.  cglobal predict_4x4_ddl_%1, 1,1
  19. -    mova    m1, [r0-FDEC_STRIDEB]
  20. +    movu    m1, [r0-FDEC_STRIDEB]
  21.      mova    m2, m1
  22.      mova    m3, m1
  23.      mova    m4, m1
  24. @@ -224,8 +224,21 @@ PREDICT_4x4_DDL mmxext, q , 8, b
  25.  ;-----------------------------------------------------------------------------
  26.  %macro PREDICT_4x4 7
  27.  cglobal predict_4x4_ddr_%1, 1,1
  28. -    mova      m1, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  29. -    mova      m2, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  30. +    movu      m1, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  31. +    movu      m2, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  32. +%ifdef HIGH_BIT_DEPTH
  33. +    movu      m4, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  34. +    punpckh%2 m2, m4
  35. +    movh      m3, [r0-1*FDEC_STRIDEB]
  36. +    punpckh%3 m1, m2
  37. +    PALIGNR   m3, m1, 5*SIZEOF_PIXEL, m1
  38. +    mova      m1, m3
  39. +    movu      m4, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  40. +    PALIGNR   m3, m4, 7*SIZEOF_PIXEL, m4
  41. +    mova      m2, m3
  42. +    movu      m4, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  43. +    PALIGNR   m3, m4, 7*SIZEOF_PIXEL, m4
  44. +%else
  45.      punpckh%2 m2, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  46.      movh      m3, [r0-1*FDEC_STRIDEB]
  47.      punpckh%3 m1, m2
  48. @@ -234,6 +247,7 @@ cglobal predict_4x4_ddr_%1, 1,1
  49.      PALIGNR   m3, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m4
  50.      mova      m2, m3
  51.      PALIGNR   m3, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m4
  52. +%endif
  53.      PRED8x8_LOWPASS %5, m0, m3, m1, m2, m4
  54.  %assign Y 3
  55.      movh      [r0+Y*FDEC_STRIDEB], m0
  56. @@ -247,6 +261,19 @@ cglobal predict_4x4_ddr_%1, 1,1
  57.  cglobal predict_4x4_vr_%1, 1,1,6*(mmsize/16)
  58.      movh    m0, [r0-1*FDEC_STRIDEB]                                       ; ........t3t2t1t0
  59.      mova    m5, m0
  60. +%ifdef HIGH_BIT_DEPTH
  61. +    movu    m1, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  62. +    PALIGNR m0, m1, 7*SIZEOF_PIXEL, m1                                    ; ......t3t2t1t0lt
  63. +    pavg%5  m5, m0
  64. +    movu    m1, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  65. +    PALIGNR m0, m1, 7*SIZEOF_PIXEL, m1                                    ; ....t3t2t1t0ltl0
  66. +    mova    m1, m0
  67. +    movu    m2, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  68. +    PALIGNR m0, m2, 7*SIZEOF_PIXEL, m2                                    ; ..t3t2t1t0ltl0l1
  69. +    mova    m2, m0
  70. +    movu    m3, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  71. +    PALIGNR m0, m3, 7*SIZEOF_PIXEL, m3                                    ; t3t2t1t0ltl0l1l2
  72. +%else
  73.      PALIGNR m0, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m1    ; ......t3t2t1t0lt
  74.      pavg%5  m5, m0
  75.      PALIGNR m0, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m1    ; ....t3t2t1t0ltl0
  76. @@ -254,6 +281,7 @@ cglobal predict_4x4_vr_%1, 1,1,6*(mmsize/16)
  77.      PALIGNR m0, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m2    ; ..t3t2t1t0ltl0l1
  78.      mova    m2, m0
  79.      PALIGNR m0, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m3    ; t3t2t1t0ltl0l1l2
  80. +%endif
  81.      PRED8x8_LOWPASS %5, m3, m1, m0, m2, m4
  82.      mova    m1, m3
  83.      psrl%4  m3, %7*2
  84. @@ -269,12 +297,24 @@ cglobal predict_4x4_vr_%1, 1,1,6*(mmsize/16)
  85.  
  86.  cglobal predict_4x4_hd_%1, 1,1,6*(mmsize/16)
  87.      movh      m0, [r0-1*FDEC_STRIDEB-4*SIZEOF_PIXEL] ; lt ..
  88. +%ifdef HIGH_BIT_DEPTH
  89. +    movu      m1, [r0-1*FDEC_STRIDEB]
  90. +    punpckl%6 m0, m1                                 ; t3 t2 t1 t0 lt .. .. ..
  91. +    psll%4    m0, %7                                 ; t2 t1 t0 lt .. .. .. ..
  92. +    movu      m1, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l3
  93. +    movu      m2, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  94. +    punpckh%2 m1, m2                                 ; l2 l3
  95. +    movu      m2, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l1
  96. +    movu      m3, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL]
  97. +    punpckh%2 m2, m3                                 ; l0 l1
  98. +%else
  99.      punpckl%6 m0, [r0-1*FDEC_STRIDEB]                ; t3 t2 t1 t0 lt .. .. ..
  100.      psll%4    m0, %7                                 ; t2 t1 t0 lt .. .. .. ..
  101.      mova      m1, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l3
  102.      punpckh%2 m1, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l2 l3
  103.      mova      m2, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l1
  104.      punpckh%2 m2, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l0 l1
  105. +%endif
  106.      punpckh%3 m1, m2                                 ; l0 l1 l2 l3
  107.      punpckh%6 m1, m0                                 ; t2 t1 t0 lt l0 l1 l2 l3
  108.      mova      m0, m1
  109. @@ -378,7 +418,7 @@ cglobal predict_4x4_hu_mmxext, 1,1
  110.  ;-----------------------------------------------------------------------------
  111.  %macro PREDICT_4x4_V1 4
  112.  cglobal predict_4x4_vl_%1, 1,1,6*(mmsize/16)
  113. -    mova        m1, [r0-FDEC_STRIDEB]
  114. +    movu        m1, [r0-FDEC_STRIDEB]
  115.      mova        m3, m1
  116.      mova        m2, m1
  117.      psrl%2      m3, %3
  118. diff --git a/common/x86/predict-c.c b/common/x86/predict-c.c
  119. index 994e05f..829a191 100644
  120. --- a/common/x86/predict-c.c
  121. +++ b/common/x86/predict-c.c
  122. @@ -505,14 +505,14 @@ void x264_predict_4x4_init_mmx( int cpu, x264_predict_t pf[12] )
  123.  #if HIGH_BIT_DEPTH
  124.      if( !(cpu&X264_CPU_SSE2) )
  125.          return;
  126. -//  pf[I_PRED_4x4_DDL] = x264_predict_4x4_ddl_sse2;
  127. +    pf[I_PRED_4x4_DDL] = x264_predict_4x4_ddl_sse2;
  128.      pf[I_PRED_4x4_HU]  = x264_predict_4x4_hu_sse2;
  129. -//  pf[I_PRED_4x4_VL]  = x264_predict_4x4_vl_sse2;
  130. +    pf[I_PRED_4x4_VL]  = x264_predict_4x4_vl_sse2;
  131.      if( !(cpu&X264_CPU_SSSE3) )
  132.          return;
  133. -//  pf[I_PRED_4x4_DDR] = x264_predict_4x4_ddr_ssse3;
  134. -//  pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_ssse3;
  135. -//  pf[I_PRED_4x4_HD]  = x264_predict_4x4_hd_ssse3;
  136. +    pf[I_PRED_4x4_DDR] = x264_predict_4x4_ddr_ssse3;
  137. +    pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_ssse3;
  138. +    pf[I_PRED_4x4_HD]  = x264_predict_4x4_hd_ssse3;
  139.  #else
  140.      pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_mmxext;
  141.      pf[I_PRED_4x4_DDR] = x264_predict_4x4_ddr_mmxext;
  142. --
  143. 1.7.2.3
  144.  
  145.  
  146. From 590562302162f9f150b36a2ab813e190d70abd2a Mon Sep 17 00:00:00 2001
  147. From: Daniel Kang <daniel.d.kang@gmail.com>
  148. Date: Tue, 7 Dec 2010 22:48:15 -0500
  149. Subject: [PATCH 2/3] zigzag_scan_4x4_frame, zigzag_scan_4x4_field, zigzag_scan_8x8_frame, zigzag_scan_8x8_field
  150.  
  151. ---
  152. common/dct.c         |   23 +++-
  153.  common/x86/dct-a.asm |  440 ++++++++++++++++++++++++++++----------------------
  154.  common/x86/dct.h     |    5 +-
  155.  3 files changed, 268 insertions(+), 200 deletions(-)
  156.  
  157. diff --git a/common/dct.c b/common/dct.c
  158. index 788452b..25c53d9 100644
  159. --- a/common/dct.c
  160. +++ b/common/dct.c
  161. @@ -732,7 +732,16 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  162.          pf->sub_8x8    = zigzag_sub_8x8_field;
  163.          pf->sub_4x4    = zigzag_sub_4x4_field;
  164.          pf->sub_4x4ac  = zigzag_sub_4x4ac_field;
  165. -#if !HIGH_BIT_DEPTH
  166. +#if HIGH_BIT_DEPTH
  167. +        if( cpu&X264_CPU_SSE2 )
  168. +        {
  169. +            pf->scan_4x4 = x264_zigzag_scan_4x4_field_sse2;
  170. +        }
  171. +        if( cpu&X264_CPU_SSE4 )
  172. +        {
  173. +            pf->scan_8x8 = x264_zigzag_scan_8x8_field_sse4;
  174. +        }
  175. +#else
  176.  #if HAVE_MMX
  177.          if( cpu&X264_CPU_MMXEXT )
  178.          {
  179. @@ -750,7 +759,7 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  180.          if( cpu&X264_CPU_ALTIVEC )
  181.              pf->scan_4x4   = x264_zigzag_scan_4x4_field_altivec;
  182.  #endif
  183. -#endif // !HIGH_BIT_DEPTH
  184. +#endif // HIGH_BIT_DEPTH
  185.      }
  186.      else
  187.      {
  188. @@ -759,7 +768,13 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  189.          pf->sub_8x8    = zigzag_sub_8x8_frame;
  190.          pf->sub_4x4    = zigzag_sub_4x4_frame;
  191.          pf->sub_4x4ac  = zigzag_sub_4x4ac_frame;
  192. -#if !HIGH_BIT_DEPTH
  193. +#if HIGH_BIT_DEPTH
  194. +        if( cpu&X264_CPU_SSE2 )
  195. +        {
  196. +            pf->scan_4x4 = x264_zigzag_scan_4x4_frame_sse2;
  197. +            pf->scan_8x8 = x264_zigzag_scan_8x8_frame_sse2;
  198. +        }
  199. +#else
  200.  #if HAVE_MMX
  201.          if( cpu&X264_CPU_MMX )
  202.              pf->scan_4x4 = x264_zigzag_scan_4x4_frame_mmx;
  203. @@ -785,7 +800,7 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  204.          if( cpu&X264_CPU_NEON )
  205.              pf->scan_4x4 = x264_zigzag_scan_4x4_frame_neon;
  206.  #endif
  207. -#endif // !HIGH_BIT_DEPTH
  208. +#endif // HIGH_BIT_DEPTH
  209.      }
  210.  
  211.      pf->interleave_8x8_cavlc = zigzag_interleave_8x8_cavlc;
  212. diff --git a/common/x86/dct-a.asm b/common/x86/dct-a.asm
  213. index 50f806a..8500e03 100644
  214. --- a/common/x86/dct-a.asm
  215. +++ b/common/x86/dct-a.asm
  216. @@ -891,136 +891,158 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8
  217.      RET
  218.  %endmacro
  219.  
  220. +%ifndef HIGH_BIT_DEPTH
  221.  INIT_XMM
  222.  %define PALIGNR PALIGNR_MMX
  223.  SCAN_8x8 sse2
  224.  %define PALIGNR PALIGNR_SSSE3
  225.  SCAN_8x8 ssse3
  226. +%endif
  227.  
  228.  ;-----------------------------------------------------------------------------
  229. -; void zigzag_scan_8x8_frame( int16_t level[64], int16_t dct[8][8] )
  230. +; void zigzag_scan_8x8_frame( dctcoef level[64], dctcoef dct[8][8] )
  231.  ;-----------------------------------------------------------------------------
  232. -cglobal zigzag_scan_8x8_frame_mmxext, 2,2
  233. -    movq       mm0, [r1]
  234. -    movq       mm1, [r1+2*8]
  235. -    movq       mm2, [r1+2*14]
  236. -    movq       mm3, [r1+2*21]
  237. -    movq       mm4, [r1+2*28]
  238. -    movq       mm5, mm0
  239. -    movq       mm6, mm1
  240. -    psrlq      mm0, 16
  241. -    punpckldq  mm1, mm1
  242. -    punpcklwd  mm5, mm6
  243. -    punpckhwd  mm1, mm3
  244. -    punpckhwd  mm6, mm0
  245. -    punpckldq  mm5, mm0
  246. -    movq       mm7, [r1+2*52]
  247. -    movq       mm0, [r1+2*60]
  248. -    punpckhwd  mm1, mm2
  249. -    punpcklwd  mm2, mm4
  250. -    punpckhwd  mm4, mm3
  251. -    punpckldq  mm3, mm3
  252. -    punpckhwd  mm3, mm2
  253. -    movq      [r0], mm5
  254. -    movq  [r0+2*4], mm1
  255. -    movq  [r0+2*8], mm6
  256. -    punpcklwd  mm6, mm0
  257. -    punpcklwd  mm6, mm7
  258. -    movq       mm1, [r1+2*32]
  259. -    movq       mm5, [r1+2*39]
  260. -    movq       mm2, [r1+2*46]
  261. -    movq [r0+2*35], mm3
  262. -    movq [r0+2*47], mm4
  263. -    punpckhwd  mm7, mm0
  264. -    psllq      mm0, 16
  265. -    movq       mm3, mm5
  266. -    punpcklwd  mm5, mm1
  267. -    punpckhwd  mm1, mm2
  268. -    punpckhdq  mm3, mm3
  269. -    movq [r0+2*52], mm6
  270. -    movq [r0+2*13], mm5
  271. -    movq       mm4, [r1+2*11]
  272. -    movq       mm6, [r1+2*25]
  273. -    punpcklwd  mm5, mm7
  274. -    punpcklwd  mm1, mm3
  275. -    punpckhdq  mm0, mm7
  276. -    movq       mm3, [r1+2*4]
  277. -    movq       mm7, [r1+2*18]
  278. -    punpcklwd  mm2, mm5
  279. -    movq [r0+2*25], mm1
  280. -    movq       mm1, mm4
  281. -    movq       mm5, mm6
  282. -    punpcklwd  mm4, mm3
  283. -    punpcklwd  mm6, mm7
  284. -    punpckhwd  mm1, mm3
  285. -    punpckhwd  mm5, mm7
  286. -    movq       mm3, mm6
  287. -    movq       mm7, mm5
  288. -    punpckldq  mm6, mm4
  289. -    punpckldq  mm5, mm1
  290. -    punpckhdq  mm3, mm4
  291. -    punpckhdq  mm7, mm1
  292. -    movq       mm4, [r1+2*35]
  293. -    movq       mm1, [r1+2*49]
  294. -    pshufw     mm6, mm6, 0x1b
  295. -    pshufw     mm5, mm5, 0x1b
  296. -    movq [r0+2*60], mm0
  297. -    movq [r0+2*56], mm2
  298. -    movq       mm0, [r1+2*42]
  299. -    movq       mm2, [r1+2*56]
  300. -    movq [r0+2*17], mm3
  301. -    movq [r0+2*32], mm7
  302. -    movq [r0+2*10], mm6
  303. -    movq [r0+2*21], mm5
  304. -    movq       mm3, mm0
  305. -    movq       mm7, mm2
  306. -    punpcklwd  mm0, mm4
  307. -    punpcklwd  mm2, mm1
  308. -    punpckhwd  mm3, mm4
  309. -    punpckhwd  mm7, mm1
  310. -    movq       mm4, mm2
  311. -    movq       mm1, mm7
  312. -    punpckhdq  mm2, mm0
  313. -    punpckhdq  mm7, mm3
  314. -    punpckldq  mm4, mm0
  315. -    punpckldq  mm1, mm3
  316. -    pshufw     mm2, mm2, 0x1b
  317. -    pshufw     mm7, mm7, 0x1b
  318. -    movq [r0+2*28], mm4
  319. -    movq [r0+2*43], mm1
  320. -    movq [r0+2*39], mm2
  321. -    movq [r0+2*50], mm7
  322. +%macro SCAN_8x8_FRAME 6
  323. +cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  324. +    mova        m0, [r1]
  325. +    mova        m1, [r1+SIZEOF_PIXEL*2* 8]
  326. +    movu        m2, [r1+SIZEOF_PIXEL*2*14]
  327. +    movu        m3, [r1+SIZEOF_PIXEL*2*21]
  328. +    mova        m4, [r1+SIZEOF_PIXEL*2*28]
  329. +    mova        m5, m0
  330. +    mova        m6, m1
  331. +    psrl%3      m0, %2
  332. +    punpckl%4   m1, m1
  333. +    punpckl%5   m5, m6
  334. +    punpckh%5   m1, m3
  335. +    punpckh%5   m6, m0
  336. +    punpckl%4   m5, m0
  337. +    mova        m7, [r1+SIZEOF_PIXEL*2*52]
  338. +    mova        m0, [r1+SIZEOF_PIXEL*2*60]
  339. +    punpckh%5   m1, m2
  340. +    punpckl%5   m2, m4
  341. +    punpckh%5   m4, m3
  342. +    punpckl%4   m3, m3
  343. +    punpckh%5   m3, m2
  344. +    mova      [r0], m5
  345. +    mova  [r0+SIZEOF_PIXEL*2*4], m1
  346. +    mova  [r0+SIZEOF_PIXEL*2*8], m6
  347. +    punpckl%5   m6, m0
  348. +    punpckl%5   m6, m7
  349. +    mova        m1, [r1+SIZEOF_PIXEL*2*32]
  350. +    movu        m5, [r1+SIZEOF_PIXEL*2*39]
  351. +    movu        m2, [r1+SIZEOF_PIXEL*2*46]
  352. +    movu [r0+SIZEOF_PIXEL*2*35], m3
  353. +    movu [r0+SIZEOF_PIXEL*2*47], m4
  354. +    punpckh%5   m7, m0
  355. +    psll%3      m0, %2
  356. +    mova        m3, m5
  357. +    punpckl%5   m5, m1
  358. +    punpckh%5   m1, m2
  359. +    punpckh%4   m3, m3
  360. +    mova [r0+SIZEOF_PIXEL*2*52], m6
  361. +    movu [r0+SIZEOF_PIXEL*2*13], m5
  362. +    movu        m4, [r1+SIZEOF_PIXEL*2*11]
  363. +    movu        m6, [r1+SIZEOF_PIXEL*2*25]
  364. +    punpckl%5   m5, m7
  365. +    punpckl%5   m1, m3
  366. +    punpckh%4   m0, m7
  367. +    mova        m3, [r1+SIZEOF_PIXEL*2* 4]
  368. +    movu        m7, [r1+SIZEOF_PIXEL*2*18]
  369. +    punpckl%5   m2, m5
  370. +    movu [r0+SIZEOF_PIXEL*2*25], m1
  371. +    mova        m1, m4
  372. +    mova        m5, m6
  373. +    punpckl%5   m4, m3
  374. +    punpckl%5   m6, m7
  375. +    punpckh%5   m1, m3
  376. +    punpckh%5   m5, m7
  377. +    mova        m3, m6
  378. +    mova        m7, m5
  379. +    punpckl%4   m6, m4
  380. +    punpckl%4   m5, m1
  381. +    punpckh%4   m3, m4
  382. +    punpckh%4   m7, m1
  383. +    movu        m4, [r1+SIZEOF_PIXEL*2*35]
  384. +    movu        m1, [r1+SIZEOF_PIXEL*2*49]
  385. +    pshuf%6     m6, m6, 0x1b
  386. +    pshuf%6     m5, m5, 0x1b
  387. +    mova [r0+SIZEOF_PIXEL*2*60], m0
  388. +    mova [r0+SIZEOF_PIXEL*2*56], m2
  389. +    movu        m0, [r1+SIZEOF_PIXEL*2*42]
  390. +    mova        m2, [r1+SIZEOF_PIXEL*2*56]
  391. +    movu [r0+SIZEOF_PIXEL*2*17], m3
  392. +    mova [r0+SIZEOF_PIXEL*2*32], m7
  393. +    movu [r0+SIZEOF_PIXEL*2*10], m6
  394. +    movu [r0+SIZEOF_PIXEL*2*21], m5
  395. +    mova        m3, m0
  396. +    mova        m7, m2
  397. +    punpckl%5   m0, m4
  398. +    punpckl%5   m2, m1
  399. +    punpckh%5   m3, m4
  400. +    punpckh%5   m7, m1
  401. +    mova        m4, m2
  402. +    mova        m1, m7
  403. +    punpckh%4   m2, m0
  404. +    punpckh%4   m7, m3
  405. +    punpckl%4   m4, m0
  406. +    punpckl%4   m1, m3
  407. +    pshuf%6     m2, m2, 0x1b
  408. +    pshuf%6     m7, m7, 0x1b
  409. +    mova [r0+SIZEOF_PIXEL*2*28], m4
  410. +    movu [r0+SIZEOF_PIXEL*2*43], m1
  411. +    movu [r0+SIZEOF_PIXEL*2*39], m2
  412. +    movu [r0+SIZEOF_PIXEL*2*50], m7
  413.      RET
  414. +%endmacro
  415. +
  416. +%ifdef HIGH_BIT_DEPTH
  417. +INIT_XMM
  418. +SCAN_8x8_FRAME sse2  , 4 , dq, qdq, dq, d
  419. +%else
  420. +INIT_MMX
  421. +SCAN_8x8_FRAME mmxext, 16, q , dq , wd, w
  422. +%endif
  423.  
  424.  ;-----------------------------------------------------------------------------
  425. -; void zigzag_scan_4x4_frame( int16_t level[16], int16_t dct[4][4] )
  426. +; void zigzag_scan_4x4_frame( dctcoef level[16], dctcoef dct[4][4] )
  427.  ;-----------------------------------------------------------------------------
  428. -cglobal zigzag_scan_4x4_frame_mmx, 2,2
  429. -    movq       mm0, [r1]
  430. -    movq       mm1, [r1+8]
  431. -    movq       mm2, [r1+16]
  432. -    movq       mm3, [r1+24]
  433. -    movq       mm4, mm0
  434. -    movq       mm5, mm1
  435. -    movq       mm6, mm2
  436. -    movq       mm7, mm3
  437. -    psllq      mm3, 16
  438. -    psrlq      mm0, 16
  439. -    punpckldq  mm2, mm2
  440. -    punpckhdq  mm1, mm1
  441. -    punpcklwd  mm4, mm5
  442. -    punpcklwd  mm5, mm3
  443. -    punpckldq  mm4, mm0
  444. -    punpckhwd  mm5, mm2
  445. -    punpckhwd  mm0, mm6
  446. -    punpckhwd  mm6, mm7
  447. -    punpcklwd  mm1, mm0
  448. -    punpckhdq  mm3, mm6
  449. -    movq      [r0], mm4
  450. -    movq    [r0+8], mm5
  451. -    movq   [r0+16], mm1
  452. -    movq   [r0+24], mm3
  453. +%macro SCAN_4x4 5
  454. +cglobal zigzag_scan_4x4_frame_%1, 2,2,8*(mmsize)/16
  455. +    mova       m0, [r1]
  456. +    mova       m1, [r1+SIZEOF_PIXEL* 8]
  457. +    mova       m2, [r1+SIZEOF_PIXEL*16]
  458. +    mova       m3, [r1+SIZEOF_PIXEL*24]
  459. +    mova       m4, m0
  460. +    mova       m5, m1
  461. +    mova       m6, m2
  462. +    mova       m7, m3
  463. +    psll%3     m3, %2
  464. +    psrl%3     m0, %2
  465. +    punpckl%4  m2, m2
  466. +    punpckh%4  m1, m1
  467. +    punpckl%5  m4, m5
  468. +    punpckl%5  m5, m3
  469. +    punpckl%4  m4, m0
  470. +    punpckh%5  m5, m2
  471. +    punpckh%5  m0, m6
  472. +    punpckh%5  m6, m7
  473. +    punpckl%5  m1, m0
  474. +    punpckh%4  m3, m6
  475. +    mova     [r0], m4
  476. +    mova  [r0+SIZEOF_PIXEL* 8], m5
  477. +    mova  [r0+SIZEOF_PIXEL*16], m1
  478. +    mova  [r0+SIZEOF_PIXEL*24], m3
  479.      RET
  480. +%endmacro
  481. +
  482. +%ifdef HIGH_BIT_DEPTH
  483. +INIT_XMM
  484. +SCAN_4x4 sse2, 4 , dq, qdq, dq
  485. +%else
  486. +INIT_MMX
  487. +SCAN_4x4 mmx , 16, q , dq , wd
  488. +%endif
  489.  
  490.  ;-----------------------------------------------------------------------------
  491.  ; void zigzag_scan_4x4_frame( int16_t level[16], int16_t dct[4][4] )
  492. @@ -1039,6 +1061,25 @@ cglobal zigzag_scan_4x4_frame_ssse3, 2,2
  493.      movdqa [r0+16], xmm1
  494.      RET
  495.  
  496. +%ifdef HIGH_BIT_DEPTH
  497. +INIT_XMM
  498. +;-----------------------------------------------------------------------------
  499. +; void zigzag_scan_4x4_field( int32_t level[16], int32_t dct[4][4] )
  500. +;-----------------------------------------------------------------------------
  501. +cglobal zigzag_scan_4x4_field_sse2, 2,3
  502. +    movu       m4, [r1+8]
  503. +    pshufd     m0, m4, 0xd2
  504. +    mova       m1, [r1+32]
  505. +    mova       m2, [r1+48]
  506. +    movu   [r0+8], m0
  507. +    mova  [r0+32], m1
  508. +    mova  [r0+48], m2
  509. +    movq      mm0, [r1]
  510. +    movq     [r0], mm0
  511. +    movq      mm0, [r1+24]
  512. +    movq  [r0+24], mm0
  513. +    RET
  514. +%else
  515.  ;-----------------------------------------------------------------------------
  516.  ; void zigzag_scan_4x4_field( int16_t level[16], int16_t dct[4][4] )
  517.  ;-----------------------------------------------------------------------------
  518. @@ -1055,11 +1096,11 @@ cglobal zigzag_scan_4x4_field_mmxext, 2,3
  519.      mov        r2d, [r1+12]
  520.      mov    [r0+12], r2d
  521.      RET
  522. +%endif ; HIGH_BIT_DEPTH
  523.  
  524.  ;-----------------------------------------------------------------------------
  525.  ; void zigzag_scan_8x8_field( int16_t level[64], int16_t dct[8][8] )
  526.  ;-----------------------------------------------------------------------------
  527. -
  528.  ; Output order:
  529.  ;  0  1  2  8  9  3  4 10
  530.  ; 16 11  5  6  7 12 17 24
  531. @@ -1069,84 +1110,93 @@ cglobal zigzag_scan_4x4_field_mmxext, 2,3
  532.  ; 36 37 38 39 43 49 50 44
  533.  ; 45 46 47 51 56 57 52 53
  534.  ; 54 55 58 59 60 61 62 63
  535. -
  536. -cglobal zigzag_scan_8x8_field_mmxext, 2,3
  537. -    movq       mm0, [r1+2*0]        ; 03 02 01 00
  538. -    movq       mm1, [r1+2*4]        ; 07 06 05 04
  539. -    movq       mm2, [r1+2*8]        ; 11 10 09 08
  540. -    pshufw     mm3, mm0, 011111111b ; 03 03 03 03
  541. -    movd        r2, mm2             ; 09 08
  542. -    pshufw     mm2, mm2, 000111001b ; 08 11 10 09
  543. -    punpcklwd  mm3, mm1             ; 05 03 04 03
  544. -    pinsrw     mm0, r2, 3           ; 08 02 01 00
  545. -    movq       mm4, mm2
  546. -    punpcklwd  mm2, mm3             ; 04 10 03 09
  547. -    pshufw     mm2, mm2, 010110100b ; 10 04 03 09
  548. -    movq  [r0+2*0], mm0             ; 08 02 01 00
  549. -    movq  [r0+2*4], mm2             ; 10 04 03 09
  550. -    movq       mm3, [r1+2*12]       ; 15 14 13 12
  551. -    movq       mm5, [r1+2*16]       ; 19 18 17 16
  552. -    punpckldq  mm6, mm5             ; 17 16 XX XX
  553. -    psrlq      mm1, 16              ; XX 07 06 05
  554. -    punpckhwd  mm6, mm4             ; 08 17 11 16
  555. -    punpckldq  mm6, mm1             ; 06 05 11 16
  556. -    movq  [r0+2*8], mm6             ; 06 05 11 16
  557. -    psrlq      mm1, 16              ; XX XX 07 06
  558. -    punpcklwd  mm1, mm5             ; 17 07 16 06
  559. -    movq       mm0, [r1+2*20]       ; 23 22 21 20
  560. -    movq       mm2, [r1+2*24]       ; 27 26 25 24
  561. -    movq       mm6, mm3
  562. -    punpckhdq  mm1, mm1             ; 17 07 17 07
  563. -    punpcklwd  mm6, mm2             ; 25 13 24 12
  564. -    pextrw      r2, mm5, 2
  565. -    movq [r0+2*24], mm0             ; 23 22 21 20
  566. -    punpcklwd  mm1, mm6             ; 24 17 12 07
  567. -    movq [r0+2*12], mm1
  568. -    pinsrw     mm3, r2, 0           ; 15 14 13 18
  569. -    movq [r0+2*16], mm3             ; 15 14 13 18
  570. -    movq       mm7, [r1+2*28]
  571. -    movq       mm0, [r1+2*32]       ; 35 34 33 32
  572. -    psrlq      mm5, 48              ; XX XX XX 19
  573. -    pshufw     mm1, mm2, 011111001b ; 27 27 26 25
  574. -    punpcklwd  mm5, mm0             ; 33 XX 32 19
  575. -    psrlq      mm2, 48              ; XX XX XX 27
  576. -    punpcklwd  mm5, mm1             ; 26 32 25 19
  577. -    movq [r0+2*32], mm7
  578. -    movq [r0+2*20], mm5             ; 26 32 25 19
  579. -    movq       mm7, [r1+2*36]
  580. -    movq       mm1, [r1+2*40]       ; 43 42 41 40
  581. -    pshufw     mm3, mm0, 011111001b ; 35 35 34 33
  582. -    punpcklwd  mm2, mm1             ; 41 XX 40 27
  583. -    movq [r0+2*40], mm7
  584. -    punpcklwd  mm2, mm3             ; 34 40 33 27
  585. -    movq [r0+2*28], mm2
  586. -    movq       mm7, [r1+2*44]       ; 47 46 45 44
  587. -    movq       mm2, [r1+2*48]       ; 51 50 49 48
  588. -    psrlq      mm0, 48              ; XX XX XX 35
  589. -    punpcklwd  mm0, mm2             ; 49 XX 48 35
  590. -    pshufw     mm3, mm1, 011111001b ; 43 43 42 41
  591. -    punpcklwd  mm0, mm3             ; 42 48 41 35
  592. -    movq [r0+2*36], mm0
  593. -    pextrw      r2, mm2, 3          ; 51
  594. -    psrlq      mm1, 48              ; XX XX XX 43
  595. -    punpcklwd  mm1, mm7             ; 45 XX 44 43
  596. -    psrlq      mm2, 16              ; XX 51 50 49
  597. -    punpcklwd  mm1, mm2             ; 50 44 49 43
  598. -    pshufw     mm1, mm1, 010110100b ; 44 50 49 43
  599. -    movq [r0+2*44], mm1
  600. -    psrlq      mm7, 16              ; XX 47 46 45
  601. -    pinsrw     mm7, r2, 3           ; 51 47 46 45
  602. -    movq [r0+2*48], mm7
  603. -    movq       mm0, [r1+2*56]       ; 59 58 57 56
  604. -    movq       mm1, [r1+2*52]       ; 55 54 53 52
  605. -    movq       mm2, mm0
  606. -    movq       mm7, [r1+2*60]
  607. -    punpckldq  mm2, mm1             ; 53 52 57 56
  608. -    punpckhdq  mm1, mm0             ; 59 58 55 54
  609. -    movq [r0+2*52], mm2
  610. -    movq [r0+2*56], mm1
  611. -    movq [r0+2*60], mm7
  612. +%undef SCAN_8x8
  613. +%macro SCAN_8x8 6
  614. +cglobal zigzag_scan_8x8_field_%1, 2,3,8*(mmsize/16)
  615. +    mova       m0, [r1+SIZEOF_PIXEL*2*0]        ; 03 02 01 00
  616. +    mova       m1, [r1+SIZEOF_PIXEL*2*4]        ; 07 06 05 04
  617. +    mova       m2, [r1+SIZEOF_PIXEL*2*8]        ; 11 10 09 08
  618. +    pshuf%2    m3, m0, 011111111b               ; 03 03 03 03
  619. +    movd       r2, m2                           ; 09 08
  620. +    pshuf%2    m2, m2, 000111001b               ; 08 11 10 09
  621. +    punpckl%3  m3, m1                           ; 05 03 04 03
  622. +    pinsr%2    m0, r2d, 3                       ; 08 02 01 00
  623. +    mova       m4, m2
  624. +    punpckl%3  m2, m3                           ; 04 10 03 09
  625. +    pshuf%2    m2, m2, 010110100b               ; 10 04 03 09
  626. +    mova  [r0+SIZEOF_PIXEL*2*0], m0             ; 08 02 01 00
  627. +    mova  [r0+SIZEOF_PIXEL*2*4], m2             ; 10 04 03 09
  628. +    mova       m3, [r1+SIZEOF_PIXEL*2*12]       ; 15 14 13 12
  629. +    mova       m5, [r1+SIZEOF_PIXEL*2*16]       ; 19 18 17 16
  630. +    punpckl%4  m6, m5                           ; 17 16 XX XX
  631. +    psrl%5     m1, %6                           ; XX 07 06 05
  632. +    punpckh%3  m6, m4                           ; 08 17 11 16
  633. +    punpckl%4  m6, m1                           ; 06 05 11 16
  634. +    mova  [r0+SIZEOF_PIXEL*2*8], m6             ; 06 05 11 16
  635. +    psrl%5     m1, %6                           ; XX XX 07 06
  636. +    punpckl%3  m1, m5                           ; 17 07 16 06
  637. +    mova       m0, [r1+SIZEOF_PIXEL*2*20]       ; 23 22 21 20
  638. +    mova       m2, [r1+SIZEOF_PIXEL*2*24]       ; 27 26 25 24
  639. +    mova       m6, m3
  640. +    punpckh%4  m1, m1                           ; 17 07 17 07
  641. +    punpckl%3  m6, m2                           ; 25 13 24 12
  642. +    pextr%2    r2d, m5, 2
  643. +    mova [r0+SIZEOF_PIXEL*2*24], m0             ; 23 22 21 20
  644. +    punpckl%3  m1, m6                           ; 24 17 12 07
  645. +    mova [r0+SIZEOF_PIXEL*2*12], m1
  646. +    pinsr%2    m3, r2d, 0                       ; 15 14 13 18
  647. +    mova [r0+SIZEOF_PIXEL*2*16], m3             ; 15 14 13 18
  648. +    mova       m7, [r1+SIZEOF_PIXEL*2*28]
  649. +    mova       m0, [r1+SIZEOF_PIXEL*2*32]       ; 35 34 33 32
  650. +    psrl%5     m5, %6*3                         ; XX XX XX 19
  651. +    pshuf%2    m1, m2, 011111001b               ; 27 27 26 25
  652. +    punpckl%3  m5, m0                           ; 33 XX 32 19
  653. +    psrl%5     m2, %6*3                         ; XX XX XX 27
  654. +    punpckl%3  m5, m1                           ; 26 32 25 19
  655. +    mova [r0+SIZEOF_PIXEL*2*32], m7
  656. +    mova [r0+SIZEOF_PIXEL*2*20], m5             ; 26 32 25 19
  657. +    mova       m7, [r1+SIZEOF_PIXEL*2*36]
  658. +    mova       m1, [r1+SIZEOF_PIXEL*2*40]       ; 43 42 41 40
  659. +    pshuf%2    m3, m0, 011111001b               ; 35 35 34 33
  660. +    punpckl%3  m2, m1                           ; 41 XX 40 27
  661. +    mova [r0+SIZEOF_PIXEL*2*40], m7
  662. +    punpckl%3  m2, m3                           ; 34 40 33 27
  663. +    mova [r0+SIZEOF_PIXEL*2*28], m2
  664. +    mova       m7, [r1+SIZEOF_PIXEL*2*44]       ; 47 46 45 44
  665. +    mova       m2, [r1+SIZEOF_PIXEL*2*48]       ; 51 50 49 48
  666. +    psrl%5     m0, %6*3                         ; XX XX XX 35
  667. +    punpckl%3  m0, m2                           ; 49 XX 48 35
  668. +    pshuf%2    m3, m1, 011111001b               ; 43 43 42 41
  669. +    punpckl%3  m0, m3                           ; 42 48 41 35
  670. +    mova [r0+SIZEOF_PIXEL*2*36], m0
  671. +    pextr%2     r2d, m2, 3                      ; 51
  672. +    psrl%5      m1, %6*3                        ; XX XX XX 43
  673. +    punpckl%3   m1, m7                          ; 45 XX 44 43
  674. +    psrl%5      m2, %6                          ; XX 51 50 49
  675. +    punpckl%3   m1, m2                          ; 50 44 49 43
  676. +    pshuf%2     m1, m1, 010110100b              ; 44 50 49 43
  677. +    mova [r0+SIZEOF_PIXEL*2*44], m1
  678. +    psrl%5      m7, %6                          ; XX 47 46 45
  679. +    pinsr%2     m7, r2d, 3                      ; 51 47 46 45
  680. +    mova [r0+SIZEOF_PIXEL*2*48], m7
  681. +    mova        m0, [r1+SIZEOF_PIXEL*2*56]      ; 59 58 57 56
  682. +    mova        m1, [r1+SIZEOF_PIXEL*2*52]      ; 55 54 53 52
  683. +    mova        m2, m0
  684. +    mova        m7, [r1+SIZEOF_PIXEL*2*60]
  685. +    punpckl%4   m2, m1                          ; 53 52 57 56
  686. +    punpckh%4   m1, m0                          ; 59 58 55 54
  687. +    mova [r0+SIZEOF_PIXEL*2*52], m2
  688. +    mova [r0+SIZEOF_PIXEL*2*56], m1
  689. +    mova [r0+SIZEOF_PIXEL*2*60], m7
  690.      RET
  691. +%endmacro
  692. +%ifdef HIGH_BIT_DEPTH
  693. +INIT_XMM
  694. +SCAN_8x8 sse4  , d, dq, qdq, dq, 4
  695. +%else
  696. +INIT_MMX
  697. +SCAN_8x8 mmxext, w, wd, dq , q , 16
  698. +%endif
  699.  
  700.  ;-----------------------------------------------------------------------------
  701.  ; void zigzag_sub_4x4_frame( int16_t level[16], const uint8_t *src, uint8_t *dst )
  702. diff --git a/common/x86/dct.h b/common/x86/dct.h
  703. index bb8c250..54a6e44 100644
  704. --- a/common/x86/dct.h
  705. +++ b/common/x86/dct.h
  706. @@ -72,11 +72,14 @@ void x264_add8x8_idct8_sse2  ( uint8_t *dst, int16_t dct   [64] );
  707.  void x264_add16x16_idct8_sse2( uint8_t *dst, int16_t dct[4][64] );
  708.  
  709.  void x264_zigzag_scan_8x8_frame_ssse3 ( int16_t level[64], int16_t dct[64] );
  710. -void x264_zigzag_scan_8x8_frame_sse2  ( int16_t level[64], int16_t dct[64] );
  711. +void x264_zigzag_scan_8x8_frame_sse2  ( dctcoef level[64], dctcoef dct[64] );
  712.  void x264_zigzag_scan_8x8_frame_mmxext( int16_t level[64], int16_t dct[64] );
  713.  void x264_zigzag_scan_4x4_frame_ssse3 ( int16_t level[16], int16_t dct[16] );
  714. +void x264_zigzag_scan_4x4_frame_sse2  ( int32_t level[16], int32_t dct[16] );
  715.  void x264_zigzag_scan_4x4_frame_mmx   ( int16_t level[16], int16_t dct[16] );
  716. +void x264_zigzag_scan_4x4_field_sse2  ( int32_t level[16], int32_t dct[16] );
  717.  void x264_zigzag_scan_4x4_field_mmxext( int16_t level[16], int16_t dct[16] );
  718. +void x264_zigzag_scan_8x8_field_sse4  ( int32_t level[64], int32_t dct[64] );
  719.  void x264_zigzag_scan_8x8_field_mmxext( int16_t level[64], int16_t dct[64] );
  720.  int  x264_zigzag_sub_4x4_frame_ssse3  ( int16_t level[16], const uint8_t *src, uint8_t *dst );
  721.  int  x264_zigzag_sub_4x4ac_frame_ssse3( int16_t level[16], const uint8_t *src, uint8_t *dst, int16_t *dc );
  722. --
  723. 1.7.2.3
  724.  
  725.  
  726. From dc3aeb9cae6a3ba6c8e03689d09b04dda8b22ca6 Mon Sep 17 00:00:00 2001
  727. From: Daniel Kang <daniel.d.kang@gmail.com>
  728. Date: Wed, 8 Dec 2010 17:56:22 -0500
  729. Subject: [PATCH 3/3] dequant4x4, dequant8x8, dequant_4x4dc
  730.  
  731. ---
  732. common/quant.c         |    3 ++
  733.  common/x86/quant-a.asm |   94 +++++++++++++++++++++++++++++++++---------------
  734.  common/x86/quant.h     |    3 ++
  735.  3 files changed, 71 insertions(+), 29 deletions(-)
  736.  
  737. diff --git a/common/quant.c b/common/quant.c
  738. index 816e60a..39576a0 100644
  739. --- a/common/quant.c
  740. +++ b/common/quant.c
  741. @@ -367,6 +367,9 @@ void x264_quant_init( x264_t *h, int cpu, x264_quant_function_t *pf )
  742.          pf->quant_4x4_dc = x264_quant_4x4_dc_sse4;
  743.          pf->quant_4x4 = x264_quant_4x4_sse4;
  744.          pf->quant_8x8 = x264_quant_8x8_sse4;
  745. +        pf->dequant_4x4 = x264_dequant_4x4_sse4;
  746. +        pf->dequant_8x8 = x264_dequant_8x8_sse4;
  747. +        pf->dequant_4x4_dc = x264_dequant_4x4dc_sse4;
  748.      }
  749.  #endif // HAVE_MMX
  750.  #else // !HIGH_BIT_DEPTH
  751. diff --git a/common/x86/quant-a.asm b/common/x86/quant-a.asm
  752. index 5d7a15e..48501a3 100644
  753. --- a/common/x86/quant-a.asm
  754. +++ b/common/x86/quant-a.asm
  755. @@ -469,26 +469,33 @@ QUANT_AC quant_8x8_sse4, 8
  756.  ; dequant
  757.  ;=============================================================================
  758.  
  759. -%macro DEQUANT16_L 3
  760. +%macro DEQUANT16_L 4
  761.  ;;; %1      dct[y][x]
  762.  ;;; %2,%3   dequant_mf[i_mf][y][x]
  763.  ;;; m2      i_qbits
  764. -
  765.      mova     m0, %2
  766. +%ifdef HIGH_BIT_DEPTH
  767. +    pmulld   m0, %1
  768. +%else
  769.      packssdw m0, %3
  770.      pmullw   m0, %1
  771. -    psllw    m0, m2
  772. +%endif
  773. +    psll%4   m0, m2
  774.      mova     %1, m0
  775.  %endmacro
  776.  
  777. -%macro DEQUANT32_R 3
  778. +%macro DEQUANT32_R 3-4
  779.  ;;; %1      dct[y][x]
  780.  ;;; %2,%3   dequant_mf[i_mf][y][x]
  781.  ;;; m2      -i_qbits
  782.  ;;; m3      f
  783.  ;;; m4      0
  784. -
  785.      mova      m0, %1
  786. +%ifdef HIGH_BIT_DEPTH
  787. +    pmulld    m0, %2
  788. +    paddd     m0, m3
  789. +    psrad     m0, m2
  790. +%else
  791.      mova      m1, m0
  792.      punpcklwd m0, m4
  793.      punpckhwd m1, m4
  794. @@ -499,21 +506,22 @@ QUANT_AC quant_8x8_sse4, 8
  795.      psrad     m0, m2
  796.      psrad     m1, m2
  797.      packssdw  m0, m1
  798. +%endif
  799.      mova      %1, m0
  800.  %endmacro
  801.  
  802. -%macro DEQUANT_LOOP 3
  803. +%macro DEQUANT_LOOP 4
  804.  %if 8*(%2-2*%3)
  805.      mov t0d, 8*(%2-2*%3)
  806.  %%loop:
  807. -    %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
  808. -    %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
  809. +    %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3], %4
  810. +    %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3], %4
  811.      sub t0d, 16*%3
  812.      jge %%loop
  813.      REP_RET
  814.  %else
  815. -    %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
  816. -    %1 [r0     ], [r1      ], [r1+ 8*%3]
  817. +    %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3], %4
  818. +    %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3], %4
  819.      RET
  820.  %endif
  821.  %endmacro
  822. @@ -562,16 +570,16 @@ QUANT_AC quant_8x8_sse4, 8
  823.  %endmacro
  824.  
  825.  ;-----------------------------------------------------------------------------
  826. -; void dequant_4x4( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  827. +; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
  828.  ;-----------------------------------------------------------------------------
  829. -%macro DEQUANT 4
  830. -cglobal dequant_%2x%2_%1, 0,3
  831. +%macro DEQUANT 5
  832. +cglobal dequant_%2x%2_%1, 0,3,8*(mmsize/16)
  833.  .skip_prologue:
  834.      DEQUANT_START %3+2, %3
  835.  
  836.  .lshift:
  837.      movd m2, t0d
  838. -    DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
  839. +    DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4, %5
  840.  
  841.  .rshift32:
  842.      neg   t0d
  843. @@ -580,7 +588,7 @@ cglobal dequant_%2x%2_%1, 0,3
  844.      pxor  m4, m4
  845.      pslld m3, m2
  846.      psrld m3, 1
  847. -    DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
  848. +    DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4, %5
  849.  
  850.  cglobal dequant_%2x%2_flat16_%1, 0,3
  851.      movifnidn t2d, r2m
  852. @@ -623,35 +631,45 @@ cglobal dequant_%2x%2_flat16_%1, 0,3
  853.      RET
  854.  %endmacro ; DEQUANT
  855.  
  856. +%ifdef HIGH_BIT_DEPTH
  857. +INIT_XMM
  858. +DEQUANT sse4, 4, 4, 1, d
  859. +DEQUANT sse4, 8, 6, 1, d
  860. +%else
  861.  %ifndef ARCH_X86_64
  862.  INIT_MMX
  863. -DEQUANT mmx, 4, 4, 1
  864. -DEQUANT mmx, 8, 6, 1
  865. +DEQUANT mmx, 4, 4, 1, w
  866. +DEQUANT mmx, 8, 6, 1, w
  867.  %endif
  868.  INIT_XMM
  869. -DEQUANT sse2, 4, 4, 2
  870. -DEQUANT sse2, 8, 6, 2
  871. +DEQUANT sse2, 4, 4, 2, w
  872. +DEQUANT sse2, 8, 6, 2, w
  873. +%endif
  874.  
  875. -%macro DEQUANT_DC 1
  876. -cglobal dequant_4x4dc_%1, 0,3
  877. +%macro DEQUANT_DC 2
  878. +cglobal dequant_4x4dc_%1, 0,3,6*(mmsize/16)
  879.      DEQUANT_START 6, 6
  880.  
  881.  .lshift:
  882.      movd   m3, [r1]
  883.      movd   m2, t0d
  884.      pslld  m3, m2
  885. +%ifdef HIGH_BIT_DEPTH
  886. +    pshufd m3, m3, 0
  887. +%else
  888.  %if mmsize==16
  889.      pshuflw  m3, m3, 0
  890.      punpcklqdq m3, m3
  891.  %else
  892.      pshufw   m3, m3, 0
  893.  %endif
  894. +%endif ; HIGH_BIT_DEPTH
  895.  %assign x 0
  896. -%rep 16/mmsize
  897. +%rep SIZEOF_PIXEL*16/mmsize
  898.      mova     m0, [r0+mmsize*0+x]
  899.      mova     m1, [r0+mmsize*1+x]
  900. -    pmullw   m0, m3
  901. -    pmullw   m1, m3
  902. +    pmull%2  m0, m3
  903. +    pmull%2  m1, m3
  904.      mova     [r0+mmsize*0+x], m0
  905.      mova     [r0+mmsize*1+x], m1
  906.  %assign x x+mmsize*2
  907. @@ -661,19 +679,31 @@ cglobal dequant_4x4dc_%1, 0,3
  908.  .rshift32:
  909.      neg   t0d
  910.      movd  m3, t0d
  911. -    mova  m4, [pw_1]
  912. +    mova  m4, [p%2_1]
  913.      mova  m5, m4
  914.      pslld m4, m3
  915.      psrld m4, 1
  916.      movd  m2, [r1]
  917. +%assign x 0
  918. +%ifdef HIGH_BIT_DEPTH
  919. +    pshufd m2, m2, 0
  920. +%rep SIZEOF_PIXEL*32/mmsize
  921. +    mova      m0, [r0+x]
  922. +    pmulld    m0, m2
  923. +    paddd     m0, m4
  924. +    psrad     m0, m3
  925. +    mova      [r0+x], m0
  926. +%assign x x+mmsize
  927. +%endrep
  928. +
  929. +%else
  930.  %if mmsize==8
  931.      punpcklwd m2, m2
  932.  %else
  933.      pshuflw m2, m2, 0
  934.  %endif
  935.      punpcklwd m2, m4
  936. -%assign x 0
  937. -%rep 32/mmsize
  938. +%rep SIZEOF_PIXEL*32/mmsize
  939.      mova      m0, [r0+x]
  940.      mova      m1, m0
  941.      punpcklwd m0, m5
  942. @@ -686,13 +716,19 @@ cglobal dequant_4x4dc_%1, 0,3
  943.      mova      [r0+x], m0
  944.  %assign x x+mmsize
  945.  %endrep
  946. +%endif
  947.      RET
  948.  %endmacro
  949.  
  950. +%ifdef HIGH_BIT_DEPTH
  951. +INIT_XMM
  952. +DEQUANT_DC sse4  , d
  953. +%else
  954.  INIT_MMX
  955. -DEQUANT_DC mmxext
  956. +DEQUANT_DC mmxext, w
  957.  INIT_XMM
  958. -DEQUANT_DC sse2
  959. +DEQUANT_DC sse2  , w
  960. +%endif
  961.  
  962.  %ifdef HIGH_BIT_DEPTH
  963.  ;-----------------------------------------------------------------------------
  964. diff --git a/common/x86/quant.h b/common/x86/quant.h
  965. index a28099c..78817e0 100644
  966. --- a/common/x86/quant.h
  967. +++ b/common/x86/quant.h
  968. @@ -57,6 +57,9 @@ void x264_dequant_8x8_flat16_sse2( int16_t dct[64], int dequant_mf[6][64], int i
  969.  void x264_denoise_dct_mmx( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  970.  void x264_denoise_dct_sse2( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  971.  void x264_denoise_dct_ssse3( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  972. +void x264_dequant_4x4_sse4( int32_t dct[16], int dequant_mf[6][16], int i_qp );
  973. +void x264_dequant_4x4dc_sse4( int32_t dct[16], int dequant_mf[6][16], int i_qp );
  974. +void x264_dequant_8x8_sse4( int32_t dct[64], int dequant_mf[6][64], int i_qp );
  975.  int x264_decimate_score15_mmxext( dctcoef *dct );
  976.  int x264_decimate_score15_sse2  ( dctcoef *dct );
  977.  int x264_decimate_score15_ssse3 ( dctcoef *dct );
  978. --
  979. 1.7.2.3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement