Advertisement
Guest User

Untitled

a guest
Jul 4th, 2017
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 39.56 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 433adb378e46005187df9867e1e0e0c41df8dbc3 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 sse2, sse4
  730.  
  731. ---
  732. common/quant.c         |    6 ++
  733.  common/x86/const-a.asm |    1 +
  734.  common/x86/quant-a.asm |  157 ++++++++++++++++++++++++++++++++++++++----------
  735.  common/x86/quant.h     |    9 ++-
  736.  tools/checkasm.c       |    6 +-
  737.  5 files changed, 141 insertions(+), 38 deletions(-)
  738.  
  739. diff --git a/common/quant.c b/common/quant.c
  740. index 816e60a..b8a707d 100644
  741. --- a/common/quant.c
  742. +++ b/common/quant.c
  743. @@ -322,6 +322,9 @@ void x264_quant_init( x264_t *h, int cpu, x264_quant_function_t *pf )
  744.          pf->quant_8x8 = x264_quant_8x8_sse2;
  745.          pf->quant_2x2_dc = x264_quant_2x2_dc_sse2;
  746.          pf->quant_4x4_dc = x264_quant_4x4_dc_sse2;
  747. +        pf->dequant_4x4 = x264_dequant_4x4_sse2;
  748. +        pf->dequant_8x8 = x264_dequant_8x8_sse2;
  749. +        pf->dequant_4x4_dc = x264_dequant_4x4dc_sse2;
  750.          pf->denoise_dct = x264_denoise_dct_sse2;
  751.          pf->decimate_score15 = x264_decimate_score15_sse2;
  752.          pf->decimate_score16 = x264_decimate_score16_sse2;
  753. @@ -367,6 +370,9 @@ void x264_quant_init( x264_t *h, int cpu, x264_quant_function_t *pf )
  754.          pf->quant_4x4_dc = x264_quant_4x4_dc_sse4;
  755.          pf->quant_4x4 = x264_quant_4x4_sse4;
  756.          pf->quant_8x8 = x264_quant_8x8_sse4;
  757. +        pf->dequant_4x4 = x264_dequant_4x4_sse4;
  758. +        pf->dequant_8x8 = x264_dequant_8x8_sse4;
  759. +        pf->dequant_4x4_dc = x264_dequant_4x4dc_sse4;
  760.      }
  761.  #endif // HAVE_MMX
  762.  #else // !HIGH_BIT_DEPTH
  763. diff --git a/common/x86/const-a.asm b/common/x86/const-a.asm
  764. index d6e621e..8e92f52 100644
  765. --- a/common/x86/const-a.asm
  766. +++ b/common/x86/const-a.asm
  767. @@ -52,6 +52,7 @@ const pw_pixel_max,times 8 dw ((1 << BIT_DEPTH)-1)
  768.  const pd_1,        times 4 dd 1
  769.  const pd_32,       times 4 dd 32
  770.  const pd_128,      times 4 dd 128
  771. +const pd_ffff,     times 4 dd 0xffff
  772.  const pw_00ff,     times 8 dw 0x00ff
  773.  const pw_ff00,     times 8 dw 0xff00
  774.  
  775. diff --git a/common/x86/quant-a.asm b/common/x86/quant-a.asm
  776. index 5d7a15e..fc52ace 100644
  777. --- a/common/x86/quant-a.asm
  778. +++ b/common/x86/quant-a.asm
  779. @@ -75,6 +75,7 @@ cextern pb_1
  780.  cextern pw_1
  781.  cextern pd_1
  782.  cextern pb_01
  783. +cextern pd_ffff
  784.  
  785.  %macro QUANT_DC_START_MMX 0
  786.      movd       m6, r1m     ; mf
  787. @@ -469,26 +470,52 @@ QUANT_AC quant_8x8_sse4, 8
  788.  ; dequant
  789.  ;=============================================================================
  790.  
  791. -%macro DEQUANT16_L 3
  792. +%macro DEQUANT16_L 5
  793.  ;;; %1      dct[y][x]
  794.  ;;; %2,%3   dequant_mf[i_mf][y][x]
  795.  ;;; m2      i_qbits
  796. -
  797.      mova     m0, %2
  798. +%ifdef HIGH_BIT_DEPTH
  799. +%ifidn %5,sse4
  800. +    pmulld   m0, %1
  801. +%else
  802. +    mova     m4, %1
  803. +    mova     m3, m4
  804. +    pand     m4, [pd_ffff]
  805. +    pslldq   m4, 2
  806. +    por      m3, m4
  807. +    pmaddwd  m0, m3
  808. +%endif
  809. +%else
  810.      packssdw m0, %3
  811.      pmullw   m0, %1
  812. -    psllw    m0, m2
  813. +%endif
  814. +    psll%4   m0, m2
  815.      mova     %1, m0
  816.  %endmacro
  817.  
  818. -%macro DEQUANT32_R 3
  819. +%macro DEQUANT32_R 5
  820.  ;;; %1      dct[y][x]
  821.  ;;; %2,%3   dequant_mf[i_mf][y][x]
  822.  ;;; m2      -i_qbits
  823.  ;;; m3      f
  824.  ;;; m4      0
  825. -
  826.      mova      m0, %1
  827. +%ifdef HIGH_BIT_DEPTH
  828. +%ifidn %5,sse4
  829. +    pmulld    m0, %2
  830. +    paddd     m0, m3
  831. +    psrad     m0, m2
  832. +%else
  833. +    mova      m4, m0
  834. +    pand      m0, [pd_ffff]
  835. +    pslldq    m0, 2
  836. +    por       m0, m4
  837. +    pmaddwd   m0, %2
  838. +    paddd     m0, m3
  839. +    psrad     m0, m2
  840. +%endif
  841. +%else
  842.      mova      m1, m0
  843.      punpcklwd m0, m4
  844.      punpckhwd m1, m4
  845. @@ -499,21 +526,22 @@ QUANT_AC quant_8x8_sse4, 8
  846.      psrad     m0, m2
  847.      psrad     m1, m2
  848.      packssdw  m0, m1
  849. +%endif
  850.      mova      %1, m0
  851.  %endmacro
  852.  
  853. -%macro DEQUANT_LOOP 3
  854. +%macro DEQUANT_LOOP 5
  855.  %if 8*(%2-2*%3)
  856.      mov t0d, 8*(%2-2*%3)
  857.  %%loop:
  858. -    %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
  859. -    %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
  860. +    %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3], %4, %5
  861. +    %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3], %4, %5
  862.      sub t0d, 16*%3
  863.      jge %%loop
  864.      REP_RET
  865.  %else
  866. -    %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
  867. -    %1 [r0     ], [r1      ], [r1+ 8*%3]
  868. +    %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3], %4, %5
  869. +    %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3], %4, %5
  870.      RET
  871.  %endif
  872.  %endmacro
  873. @@ -562,16 +590,16 @@ QUANT_AC quant_8x8_sse4, 8
  874.  %endmacro
  875.  
  876.  ;-----------------------------------------------------------------------------
  877. -; void dequant_4x4( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  878. +; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
  879.  ;-----------------------------------------------------------------------------
  880. -%macro DEQUANT 4
  881. -cglobal dequant_%2x%2_%1, 0,3
  882. +%macro DEQUANT 5
  883. +cglobal dequant_%2x%2_%1, 0,3,6*(mmsize/16)
  884.  .skip_prologue:
  885.      DEQUANT_START %3+2, %3
  886.  
  887.  .lshift:
  888.      movd m2, t0d
  889. -    DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
  890. +    DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4, %5, %1
  891.  
  892.  .rshift32:
  893.      neg   t0d
  894. @@ -580,7 +608,7 @@ cglobal dequant_%2x%2_%1, 0,3
  895.      pxor  m4, m4
  896.      pslld m3, m2
  897.      psrld m3, 1
  898. -    DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
  899. +    DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4, %5, %1
  900.  
  901.  cglobal dequant_%2x%2_flat16_%1, 0,3
  902.      movifnidn t2d, r2m
  903. @@ -623,23 +651,60 @@ cglobal dequant_%2x%2_flat16_%1, 0,3
  904.      RET
  905.  %endmacro ; DEQUANT
  906.  
  907. +%ifdef HIGH_BIT_DEPTH
  908. +INIT_XMM
  909. +DEQUANT sse2, 4, 4, 1, d
  910. +DEQUANT sse4, 4, 4, 1, d
  911. +DEQUANT sse2, 8, 6, 1, d
  912. +DEQUANT sse4, 8, 6, 1, d
  913. +%else
  914.  %ifndef ARCH_X86_64
  915.  INIT_MMX
  916. -DEQUANT mmx, 4, 4, 1
  917. -DEQUANT mmx, 8, 6, 1
  918. +DEQUANT mmx, 4, 4, 1, w
  919. +DEQUANT mmx, 8, 6, 1, w
  920.  %endif
  921.  INIT_XMM
  922. -DEQUANT sse2, 4, 4, 2
  923. -DEQUANT sse2, 8, 6, 2
  924. +DEQUANT sse2, 4, 4, 2, w
  925. +DEQUANT sse2, 8, 6, 2, w
  926. +%endif
  927.  
  928. -%macro DEQUANT_DC 1
  929. -cglobal dequant_4x4dc_%1, 0,3
  930. +%macro DEQUANT_DC 2
  931. +cglobal dequant_4x4dc_%1, 0,3,6*(mmsize/16)
  932.      DEQUANT_START 6, 6
  933.  
  934.  .lshift:
  935. -    movd   m3, [r1]
  936. -    movd   m2, t0d
  937. -    pslld  m3, m2
  938. +    movd     m3, [r1]
  939. +    movd     m2, t0d
  940. +    pslld    m3, m2
  941. +%ifdef HIGH_BIT_DEPTH
  942. +    pshufd   m3, m3, 0
  943. +    mova     m5, [pd_ffff]
  944. +%assign x 0
  945. +%rep SIZEOF_PIXEL*16/mmsize
  946. +    mova     m0, [r0+mmsize*0+x]
  947. +    mova     m1, [r0+mmsize*1+x]
  948. +%ifidn %1,sse4
  949. +    pmull%2  m0, m3
  950. +    pmull%2  m1, m3
  951. +%else
  952. +    mova     m2, m0
  953. +    pand     m2, m5
  954. +    pslldq   m2, 2
  955. +    por      m0, m2
  956. +    pmaddwd  m0, m3
  957. +
  958. +    mova     m4, m1
  959. +    pand     m4, m5
  960. +    pslldq   m4, 2
  961. +    por      m1, m4
  962. +    pmaddwd  m1, m3
  963. +%endif
  964. +    mova     [r0+mmsize*0+x], m0
  965. +    mova     [r0+mmsize*1+x], m1
  966. +%assign x x+mmsize*2
  967. +%endrep
  968. +
  969. +%else
  970.  %if mmsize==16
  971.      pshuflw  m3, m3, 0
  972.      punpcklqdq m3, m3
  973. @@ -647,33 +712,54 @@ cglobal dequant_4x4dc_%1, 0,3
  974.      pshufw   m3, m3, 0
  975.  %endif
  976.  %assign x 0
  977. -%rep 16/mmsize
  978. +%rep SIZEOF_PIXEL*16/mmsize
  979.      mova     m0, [r0+mmsize*0+x]
  980.      mova     m1, [r0+mmsize*1+x]
  981. -    pmullw   m0, m3
  982. -    pmullw   m1, m3
  983. +    pmull%2  m0, m3
  984. +    pmull%2  m1, m3
  985.      mova     [r0+mmsize*0+x], m0
  986.      mova     [r0+mmsize*1+x], m1
  987.  %assign x x+mmsize*2
  988.  %endrep
  989. +%endif ; HIGH_BIT_DEPTH
  990.      RET
  991.  
  992.  .rshift32:
  993.      neg   t0d
  994.      movd  m3, t0d
  995. -    mova  m4, [pw_1]
  996. +    mova  m4, [p%2_1]
  997.      mova  m5, m4
  998.      pslld m4, m3
  999.      psrld m4, 1
  1000.      movd  m2, [r1]
  1001. +%assign x 0
  1002. +%ifdef HIGH_BIT_DEPTH
  1003. +    pshufd m2, m2, 0
  1004. +%rep SIZEOF_PIXEL*32/mmsize
  1005. +    mova      m0, [r0+x]
  1006. +%ifidn %1,sse4
  1007. +    pmulld    m0, m2
  1008. +%else
  1009. +    mova      m1, m0
  1010. +    pand      m1, [pd_ffff]
  1011. +    pslldq    m1, 2
  1012. +    por       m0, m1
  1013. +    pmaddwd   m0, m2
  1014. +%endif
  1015. +    paddd     m0, m4
  1016. +    psrad     m0, m3
  1017. +    mova      [r0+x], m0
  1018. +%assign x x+mmsize
  1019. +%endrep
  1020. +
  1021. +%else
  1022.  %if mmsize==8
  1023.      punpcklwd m2, m2
  1024.  %else
  1025.      pshuflw m2, m2, 0
  1026.  %endif
  1027.      punpcklwd m2, m4
  1028. -%assign x 0
  1029. -%rep 32/mmsize
  1030. +%rep SIZEOF_PIXEL*32/mmsize
  1031.      mova      m0, [r0+x]
  1032.      mova      m1, m0
  1033.      punpcklwd m0, m5
  1034. @@ -686,13 +772,20 @@ cglobal dequant_4x4dc_%1, 0,3
  1035.      mova      [r0+x], m0
  1036.  %assign x x+mmsize
  1037.  %endrep
  1038. +%endif
  1039.      RET
  1040.  %endmacro
  1041.  
  1042. +%ifdef HIGH_BIT_DEPTH
  1043. +INIT_XMM
  1044. +DEQUANT_DC sse2  , d
  1045. +DEQUANT_DC sse4  , d
  1046. +%else
  1047.  INIT_MMX
  1048. -DEQUANT_DC mmxext
  1049. +DEQUANT_DC mmxext, w
  1050.  INIT_XMM
  1051. -DEQUANT_DC sse2
  1052. +DEQUANT_DC sse2  , w
  1053. +%endif
  1054.  
  1055.  %ifdef HIGH_BIT_DEPTH
  1056.  ;-----------------------------------------------------------------------------
  1057. diff --git a/common/x86/quant.h b/common/x86/quant.h
  1058. index a28099c..56e9847 100644
  1059. --- a/common/x86/quant.h
  1060. +++ b/common/x86/quant.h
  1061. @@ -47,9 +47,9 @@ int x264_quant_8x8_sse4( dctcoef dct[64], udctcoef mf[64], udctcoef bias[64] );
  1062.  void x264_dequant_4x4_mmx( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1063.  void x264_dequant_4x4dc_mmxext( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1064.  void x264_dequant_8x8_mmx( int16_t dct[64], int dequant_mf[6][64], int i_qp );
  1065. -void x264_dequant_4x4_sse2( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1066. -void x264_dequant_4x4dc_sse2( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1067. -void x264_dequant_8x8_sse2( int16_t dct[64], int dequant_mf[6][64], int i_qp );
  1068. +void x264_dequant_4x4_sse2( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  1069. +void x264_dequant_4x4dc_sse2( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  1070. +void x264_dequant_8x8_sse2( dctcoef dct[64], int dequant_mf[6][64], int i_qp );
  1071.  void x264_dequant_4x4_flat16_mmx( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1072.  void x264_dequant_8x8_flat16_mmx( int16_t dct[64], int dequant_mf[6][64], int i_qp );
  1073.  void x264_dequant_4x4_flat16_sse2( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  1074. @@ -57,6 +57,9 @@ void x264_dequant_8x8_flat16_sse2( int16_t dct[64], int dequant_mf[6][64], int i
  1075.  void x264_denoise_dct_mmx( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  1076.  void x264_denoise_dct_sse2( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  1077.  void x264_denoise_dct_ssse3( dctcoef *dct, uint32_t *sum, udctcoef *offset, int size );
  1078. +void x264_dequant_4x4_sse4( int32_t dct[16], int dequant_mf[6][16], int i_qp );
  1079. +void x264_dequant_4x4dc_sse4( int32_t dct[16], int dequant_mf[6][16], int i_qp );
  1080. +void x264_dequant_8x8_sse4( int32_t dct[64], int dequant_mf[6][64], int i_qp );
  1081.  int x264_decimate_score15_mmxext( dctcoef *dct );
  1082.  int x264_decimate_score15_sse2  ( dctcoef *dct );
  1083.  int x264_decimate_score15_ssse3 ( dctcoef *dct );
  1084. diff --git a/tools/checkasm.c b/tools/checkasm.c
  1085. index 020bcab..4a05d2b 100644
  1086. --- a/tools/checkasm.c
  1087. +++ b/tools/checkasm.c
  1088. @@ -677,8 +677,8 @@ static int check_dct( int cpu_ref, int cpu_new )
  1089.          for( int i = 0; i < 16 && ok; i++ )\
  1090.          {\
  1091.              for( int j = 0; j < 16; j++ )\
  1092. -                dct1[0][j] = !i ? (j^j>>1^j>>2^j>>3)&1 ? 4080 : -4080 /* max dc */\
  1093. -                           : i<8 ? (*p++)&1 ? 4080 : -4080 /* max elements */\
  1094. +                dct1[0][j] = !i ? (j^j>>1^j>>2^j>>3)&1 ? PIXEL_MAX*16 : -PIXEL_MAX*16 /* max dc */\
  1095. +                           : i<8 ? (*p++)&1 ? PIXEL_MAX*16 : -PIXEL_MAX*16 /* max elements */\
  1096.                             : ((*p++)&0x1fff)-0x1000; /* general case */\
  1097.              memcpy( dct2, dct1, 16 * sizeof(dctcoef) );\
  1098.              call_c1( dct_c.name, dct1[0] );\
  1099. @@ -1533,7 +1533,7 @@ static int check_quant( int cpu_ref, int cpu_new )
  1100.              for( int qp = QP_MAX; qp > 0; qp-- ) \
  1101.              { \
  1102.                  for( int i = 0; i < 16; i++ ) \
  1103. -                    dct1[i] = rand(); \
  1104. +                    dct1[i] = rand()%(PIXEL_MAX*16*2+1) - PIXEL_MAX*16; \
  1105.                  call_c1( qf_c.qname, dct1, h->quant##w##_mf[block][qp][0]>>1, h->quant##w##_bias[block][qp][0]>>1 ); \
  1106.                  memcpy( dct2, dct1, w*w*sizeof(dctcoef) ); \
  1107.                  call_c1( qf_c.dqname, dct1, h->dequant##w##_mf[block], qp ); \
  1108. --
  1109. 1.7.2.3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement