Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %ifdef ARCH_X86_64
  2. cglobal mbtree_propagate_cost_avx, 7,7,13
  3.     shl         r6d, 1
  4.     lea          r0, [r0+r6*2]
  5.     add          r1, r6
  6.     add          r2, r6
  7.     add          r3, r6
  8.     add          r4, r6
  9.     neg          r6
  10.     vpxor      xmm4, xmm4
  11.     vmovss     xmm6, [r5]
  12.     vshufps    ymm6, ymm6, ymm6, 0
  13.     vmulps     ymm6, ymm6, [pf_inv256]
  14.     vmovdqa    xmm5, [pw_3fff]
  15. .loop:
  16.     vmovq      xmm2, [r2+r6] ; intra
  17.     vmovq      xmm0, [r4+r6] ; invq
  18.     vpunpcklwd xmm2, xmm4
  19.     vpunpcklwd xmm0, xmm4
  20.     vpmaddwd   xmm0, xmm2
  21.     vmovdqa   xmm12, xmm2
  22.  
  23.     vmovq      xmm8, [r2+r6+8]
  24.     vmovq      xmm7, [r4+r6+8]
  25.     vpunpcklwd xmm8, xmm4
  26.     vpunpcklwd xmm7, xmm4
  27.     vpmaddwd   xmm7, xmm8
  28.     vinsertf128 ymm2, ymm2, xmm8, 1
  29.     vinsertf128 ymm0, ymm0, xmm7, 1
  30.     vcvtdq2ps   ymm9, ymm2
  31.  
  32.     vmovq       xmm3, [r3+r6] ; inter
  33.     vmovq       xmm1, [r1+r6] ; prop
  34.     vpand       xmm3, xmm5
  35.     vpunpcklwd  xmm1, xmm4
  36.     vpunpcklwd  xmm3, xmm4
  37.  
  38.     vmovq       xmm11, [r3+r6+8]
  39.     vmovq       xmm10, [r1+r6+8]
  40.     vpand       xmm11, xmm5
  41.     vpunpcklwd  xmm10, xmm4
  42.     vpunpcklwd  xmm11, xmm4
  43.  
  44.     vpsubd     xmm12, xmm3    ; intra - inter
  45.     vpsubd      xmm8, xmm11   ; intra - inter
  46.     vinsertf128 ymm3, ymm3, xmm11, 1
  47.     vinsertf128 ymm1, ymm1, xmm10, 1
  48.     vinsertf128 ymm2, ymm12, xmm8, 1
  49.  
  50.  
  51.     vcvtdq2ps  ymm0, ymm0
  52.     vmulps     ymm0, ymm0, ymm6    ; intra*invq*fps_factor>>8
  53.     vcvtdq2ps  ymm1, ymm1    ; prop
  54.     vaddps     ymm0, ymm0, ymm1    ; prop + (intra*invq*fps_factor>>8)
  55.     vcvtdq2ps  ymm2, ymm2    ; intra - inter
  56.     vrcpps     ymm3, ymm9    ; 1 / intra 1st approximation
  57.     vmulps     ymm1, ymm9, ymm3    ; intra * (1/intra 1st approx)
  58.     vmulps     ymm1, ymm1, ymm3    ; intra * (1/intra 1st approx)^2
  59.     vmulps     ymm0, ymm0, ymm2    ; (prop + (intra*invq*fps_factor>>8)) * (intra - inter)
  60.     vaddps     ymm3, ymm3, ymm3    ; 2 * (1/intra 1st approx)
  61.     vsubps     ymm3, ymm3, ymm1    ; 2nd approximation for 1/intra
  62.     vmulps     ymm0, ymm0, ymm3    ; / intra
  63.     vcvtps2dq  ymm0, ymm0
  64.     vmovdqu [r0+r6*2], ymm0
  65.     add          r6, 16
  66.     jl .loop
  67.     vzeroupper
  68.     RET
  69. %endif ; x64
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement