Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.97 KB | None | 0 0
  1. static inline void RENAME(tempNoiseReducer)(uint8_t *src, int stride,
  2.                                     uint8_t *tempBlurred, uint32_t *tempBlurredPast, int *maxNoise)
  3. {
  4.     // to save a register (FIXME do this outside of the loops)
  5.     tempBlurredPast[127]= maxNoise[0];
  6.     tempBlurredPast[128]= maxNoise[1];
  7.     tempBlurredPast[129]= maxNoise[2];
  8.  
  9. #define FAST_L2_DIFF
  10. //#define L1_DIFF //u should change the thresholds too if u try that one
  11. #if HAVE_MMX2 || HAVE_AMD3DNOW
  12.     __asm__ volatile(
  13.         "lea (%2, %2, 2), %%"REG_a"             \n\t" // 3*stride
  14.         "lea (%2, %2, 4), %%"REG_d"             \n\t" // 5*stride
  15.         "lea (%%"REG_d", %2, 2), %%"REG_c"      \n\t" // 7*stride
  16. //      0       1       2       3       4       5       6       7       8       9
  17. //      %x      %x+%2   %x+2%2  %x+eax  %x+4%2  %x+edx  %x+2eax %x+ecx  %x+8%2
  18. //FIXME reorder?
  19.         "pcmpeqb %%mm7, %%mm7                   \n\t"
  20.         "movq "MANGLE(b80)", %%mm6              \n\t"
  21.         "pxor %%mm0, %%mm0                      \n\t"
  22. #define REAL_L2_DIFF_CORE(a, b)\
  23.         "movq " #a ", %%mm5                     \n\t"\
  24.         "movq " #b ", %%mm2                     \n\t"\
  25.         "pxor %%mm7, %%mm2                      \n\t"\
  26.         PAVGB(%%mm2, %%mm5)\
  27.         "paddb %%mm6, %%mm5                     \n\t"\
  28.         "movq %%mm5, %%mm2                      \n\t"\
  29.         "psllw $8, %%mm5                        \n\t"\
  30.         "pmaddwd %%mm5, %%mm5                   \n\t"\
  31.         "pmaddwd %%mm2, %%mm2                   \n\t"\
  32.         "paddd %%mm2, %%mm5                     \n\t"\
  33.         "psrld $14, %%mm5                       \n\t"\
  34.         "paddd %%mm5, %%mm0                     \n\t"
  35.  
  36.  
  37. #define L2_DIFF_CORE(a, b)  REAL_L2_DIFF_CORE(a, b)
  38.  
  39. L2_DIFF_CORE((%0)          , (%1))
  40. L2_DIFF_CORE((%0, %2)      , (%1, %2))
  41. L2_DIFF_CORE((%0, %2, 2)   , (%1, %2, 2))
  42. L2_DIFF_CORE((%0, %%REGa)  , (%1, %%REGa))
  43. L2_DIFF_CORE((%0, %2, 4)   , (%1, %2, 4))
  44. L2_DIFF_CORE((%0, %%REGd)  , (%1, %%REGd))
  45. L2_DIFF_CORE((%0, %%REGa,2), (%1, %%REGa,2))
  46. L2_DIFF_CORE((%0, %%REGc)  , (%1, %%REGc))
  47.        
  48.     "movq %%mm0, %%mm4                      \n\t"
  49.         "psrlq $32, %%mm0                       \n\t"
  50.         "paddd %%mm0, %%mm4                     \n\t"
  51.         "movd %%mm4, %%ecx                      \n\t"
  52.         "shll $2, %%ecx                         \n\t"
  53.         "mov %3, %%"REG_d"                      \n\t"
  54.         "addl -4(%%"REG_d"), %%ecx              \n\t"
  55.         "addl 4(%%"REG_d"), %%ecx               \n\t"
  56.         "addl -1024(%%"REG_d"), %%ecx           \n\t"
  57.         "addl $4, %%ecx                         \n\t"
  58.         "addl 1024(%%"REG_d"), %%ecx            \n\t"
  59.         "shrl $3, %%ecx                         \n\t"
  60.         "movl %%ecx, (%%"REG_d")                \n\t"
  61.  
  62.         "cmpl 512(%%"REG_d"), %%ecx             \n\t"
  63.         " jb 2f                                 \n\t"
  64.         "cmpl 516(%%"REG_d"), %%ecx             \n\t"
  65.         " jb 1f                                 \n\t"
  66.  
  67.         "lea (%%"REG_a", %2, 2), %%"REG_d"      \n\t" // 5*stride
  68.         "lea (%%"REG_d", %2, 2), %%"REG_c"      \n\t" // 7*stride
  69.         "movq (%0), %%mm0                       \n\t" // L0
  70.         "movq (%0, %2), %%mm1                   \n\t" // L1
  71.         "movq (%0, %2, 2), %%mm2                \n\t" // L2
  72.         "movq (%0, %%"REG_a"), %%mm3            \n\t" // L3
  73.         "movq (%0, %2, 4), %%mm4                \n\t" // L4
  74.         "movq (%0, %%"REG_d"), %%mm5            \n\t" // L5
  75.         "movq (%0, %%"REG_a", 2), %%mm6         \n\t" // L6
  76.         "movq (%0, %%"REG_c"), %%mm7            \n\t" // L7
  77.         "movq %%mm0, (%1)                       \n\t" // L0
  78.         "movq %%mm1, (%1, %2)                   \n\t" // L1
  79.         "movq %%mm2, (%1, %2, 2)                \n\t" // L2
  80.         "movq %%mm3, (%1, %%"REG_a")            \n\t" // L3
  81.         "movq %%mm4, (%1, %2, 4)                \n\t" // L4
  82.         "movq %%mm5, (%1, %%"REG_d")            \n\t" // L5
  83.         "movq %%mm6, (%1, %%"REG_a", 2)         \n\t" // L6
  84.         "movq %%mm7, (%1, %%"REG_c")            \n\t" // L7
  85.         "jmp 4f                                 \n\t"
  86.  
  87.         "1:                                     \n\t"
  88.         "lea (%%"REG_a", %2, 2), %%"REG_d"      \n\t" // 5*stride
  89.         "lea (%%"REG_d", %2, 2), %%"REG_c"      \n\t" // 7*stride
  90.         "movq (%0), %%mm0                       \n\t" // L0
  91.         PAVGB((%1), %%mm0)                            // L0
  92.         "movq (%0, %2), %%mm1                   \n\t" // L1
  93.         PAVGB((%1, %2), %%mm1)                        // L1
  94.         "movq (%0, %2, 2), %%mm2                \n\t" // L2
  95.         PAVGB((%1, %2, 2), %%mm2)                     // L2
  96.         "movq (%0, %%"REG_a"), %%mm3            \n\t" // L3
  97.         PAVGB((%1, %%REGa), %%mm3)                    // L3
  98.         "movq (%0, %2, 4), %%mm4                \n\t" // L4
  99.         PAVGB((%1, %2, 4), %%mm4)                     // L4
  100.         "movq (%0, %%"REG_d"), %%mm5            \n\t" // L5
  101.         PAVGB((%1, %%REGd), %%mm5)                    // L5
  102.         "movq (%0, %%"REG_a", 2), %%mm6         \n\t" // L6
  103.         PAVGB((%1, %%REGa, 2), %%mm6)                 // L6
  104.         "movq (%0, %%"REG_c"), %%mm7            \n\t" // L7
  105.         PAVGB((%1, %%REGc), %%mm7)                    // L7
  106.         "movq %%mm0, (%1)                       \n\t" // R0
  107.         "movq %%mm1, (%1, %2)                   \n\t" // R1
  108.         "movq %%mm2, (%1, %2, 2)                \n\t" // R2
  109.         "movq %%mm3, (%1, %%"REG_a")            \n\t" // R3
  110.         "movq %%mm4, (%1, %2, 4)                \n\t" // R4
  111.         "movq %%mm5, (%1, %%"REG_d")            \n\t" // R5
  112.         "movq %%mm6, (%1, %%"REG_a", 2)         \n\t" // R6
  113.         "movq %%mm7, (%1, %%"REG_c")            \n\t" // R7
  114.         "movq %%mm0, (%0)                       \n\t" // L0
  115.         "movq %%mm1, (%0, %2)                   \n\t" // L1
  116.         "movq %%mm2, (%0, %2, 2)                \n\t" // L2
  117.         "movq %%mm3, (%0, %%"REG_a")            \n\t" // L3
  118.         "movq %%mm4, (%0, %2, 4)                \n\t" // L4
  119.         "movq %%mm5, (%0, %%"REG_d")            \n\t" // L5
  120.         "movq %%mm6, (%0, %%"REG_a", 2)         \n\t" // L6
  121.         "movq %%mm7, (%0, %%"REG_c")            \n\t" // L7
  122.         "jmp 4f                                 \n\t"
  123.  
  124.         "2:                                     \n\t"
  125.         "cmpl 508(%%"REG_d"), %%ecx             \n\t"
  126.         " jb 3f                                 \n\t"
  127.         "lea (%%"REG_a", %2, 2), %%"REG_d"      \n\t" // 5*stride
  128.         "lea (%%"REG_d", %2, 2), %%"REG_c"      \n\t" // 7*stride
  129.         "movq (%0), %%mm0                       \n\t" // L0
  130.         "movq (%0, %2), %%mm1                   \n\t" // L1
  131.         "movq (%0, %2, 2), %%mm2                \n\t" // L2
  132.         "movq (%0, %%"REG_a"), %%mm3            \n\t" // L3
  133.         "movq (%1), %%mm4                       \n\t" // R0
  134.         "movq (%1, %2), %%mm5                   \n\t" // R1
  135.         "movq (%1, %2, 2), %%mm6                \n\t" // R2
  136.         "movq (%1, %%"REG_a"), %%mm7            \n\t" // R3
  137.         PAVGB(%%mm4, %%mm0)
  138.         PAVGB(%%mm5, %%mm1)
  139.         PAVGB(%%mm6, %%mm2)
  140.         PAVGB(%%mm7, %%mm3)
  141.         PAVGB(%%mm4, %%mm0)
  142.         PAVGB(%%mm5, %%mm1)
  143.         PAVGB(%%mm6, %%mm2)
  144.         PAVGB(%%mm7, %%mm3)
  145.         "movq %%mm0, (%1)                       \n\t" // R0
  146.         "movq %%mm1, (%1, %2)                   \n\t" // R1
  147.         "movq %%mm2, (%1, %2, 2)                \n\t" // R2
  148.         "movq %%mm3, (%1, %%"REG_a")            \n\t" // R3
  149.         "movq %%mm0, (%0)                       \n\t" // L0
  150.         "movq %%mm1, (%0, %2)                   \n\t" // L1
  151.         "movq %%mm2, (%0, %2, 2)                \n\t" // L2
  152.         "movq %%mm3, (%0, %%"REG_a")            \n\t" // L3
  153.  
  154.         "movq (%0, %2, 4), %%mm0                \n\t" // L4
  155.         "movq (%0, %%"REG_d"), %%mm1            \n\t" // L5
  156.         "movq (%0, %%"REG_a", 2), %%mm2         \n\t" // L6
  157.         "movq (%0, %%"REG_c"), %%mm3            \n\t" // L7
  158.         "movq (%1, %2, 4), %%mm4                \n\t" // R4
  159.         "movq (%1, %%"REG_d"), %%mm5            \n\t" // R5
  160.         "movq (%1, %%"REG_a", 2), %%mm6         \n\t" // R6
  161.         "movq (%1, %%"REG_c"), %%mm7            \n\t" // R7
  162.         PAVGB(%%mm4, %%mm0)
  163.         PAVGB(%%mm5, %%mm1)
  164.         PAVGB(%%mm6, %%mm2)
  165.         PAVGB(%%mm7, %%mm3)
  166.         PAVGB(%%mm4, %%mm0)
  167.         PAVGB(%%mm5, %%mm1)
  168.         PAVGB(%%mm6, %%mm2)
  169.         PAVGB(%%mm7, %%mm3)
  170.         "movq %%mm0, (%1, %2, 4)                \n\t" // R4
  171.         "movq %%mm1, (%1, %%"REG_d")            \n\t" // R5
  172.         "movq %%mm2, (%1, %%"REG_a", 2)         \n\t" // R6
  173.         "movq %%mm3, (%1, %%"REG_c")            \n\t" // R7
  174.         "movq %%mm0, (%0, %2, 4)                \n\t" // L4
  175.         "movq %%mm1, (%0, %%"REG_d")            \n\t" // L5
  176.         "movq %%mm2, (%0, %%"REG_a", 2)         \n\t" // L6
  177.         "movq %%mm3, (%0, %%"REG_c")            \n\t" // L7
  178.         "jmp 4f                                 \n\t"
  179.         "3:                                     \n\t"
  180.         "lea (%%"REG_a", %2, 2), %%"REG_d"      \n\t" // 5*stride
  181.         "lea (%%"REG_d", %2, 2), %%"REG_c"      \n\t" // 7*stride
  182.         "movq (%0), %%mm0                       \n\t" // L0
  183.         "movq (%0, %2), %%mm1                   \n\t" // L1
  184.         "movq (%0, %2, 2), %%mm2                \n\t" // L2
  185.         "movq (%0, %%"REG_a"), %%mm3            \n\t" // L3
  186.         "movq (%1), %%mm4                       \n\t" // R0
  187.         "movq (%1, %2), %%mm5                   \n\t" // R1
  188.         "movq (%1, %2, 2), %%mm6                \n\t" // R2
  189.         "movq (%1, %%"REG_a"), %%mm7            \n\t" // R3
  190.         PAVGB(%%mm4, %%mm0)
  191.         PAVGB(%%mm5, %%mm1)
  192.         PAVGB(%%mm6, %%mm2)
  193.         PAVGB(%%mm7, %%mm3)
  194.         PAVGB(%%mm4, %%mm0)
  195.         PAVGB(%%mm5, %%mm1)
  196.         PAVGB(%%mm6, %%mm2)
  197.         PAVGB(%%mm7, %%mm3)
  198.         PAVGB(%%mm4, %%mm0)
  199.         PAVGB(%%mm5, %%mm1)
  200.         PAVGB(%%mm6, %%mm2)
  201.         PAVGB(%%mm7, %%mm3)
  202.         "movq %%mm0, (%1)                       \n\t" // R0
  203.         "movq %%mm1, (%1, %2)                   \n\t" // R1
  204.         "movq %%mm2, (%1, %2, 2)                \n\t" // R2
  205.         "movq %%mm3, (%1, %%"REG_a")            \n\t" // R3
  206.         "movq %%mm0, (%0)                       \n\t" // L0
  207.         "movq %%mm1, (%0, %2)                   \n\t" // L1
  208.         "movq %%mm2, (%0, %2, 2)                \n\t" // L2
  209.         "movq %%mm3, (%0, %%"REG_a")            \n\t" // L3
  210.  
  211.         "movq (%0, %2, 4), %%mm0                \n\t" // L4
  212.         "movq (%0, %%"REG_d"), %%mm1            \n\t" // L5
  213.         "movq (%0, %%"REG_a", 2), %%mm2         \n\t" // L6
  214.         "movq (%0, %%"REG_c"), %%mm3            \n\t" // L7
  215.         "movq (%1, %2, 4), %%mm4                \n\t" // R4
  216.         "movq (%1, %%"REG_d"), %%mm5            \n\t" // R5
  217.         "movq (%1, %%"REG_a", 2), %%mm6         \n\t" // R6
  218.         "movq (%1, %%"REG_c"), %%mm7            \n\t" // R7
  219.         PAVGB(%%mm4, %%mm0)
  220.         PAVGB(%%mm5, %%mm1)
  221.         PAVGB(%%mm6, %%mm2)
  222.         PAVGB(%%mm7, %%mm3)
  223.         PAVGB(%%mm4, %%mm0)
  224.         PAVGB(%%mm5, %%mm1)
  225.         PAVGB(%%mm6, %%mm2)
  226.         PAVGB(%%mm7, %%mm3)
  227.         PAVGB(%%mm4, %%mm0)
  228.         PAVGB(%%mm5, %%mm1)
  229.         PAVGB(%%mm6, %%mm2)
  230.         PAVGB(%%mm7, %%mm3)
  231.         "movq %%mm0, (%1, %2, 4)                \n\t" // R4
  232.         "movq %%mm1, (%1, %%"REG_d")            \n\t" // R5
  233.         "movq %%mm2, (%1, %%"REG_a", 2)         \n\t" // R6
  234.         "movq %%mm3, (%1, %%"REG_c")            \n\t" // R7
  235.         "movq %%mm0, (%0, %2, 4)                \n\t" // L4
  236.         "movq %%mm1, (%0, %%"REG_d")            \n\t" // L5
  237.         "movq %%mm2, (%0, %%"REG_a", 2)         \n\t" // L6
  238.         "movq %%mm3, (%0, %%"REG_c")            \n\t" // L7
  239.  
  240.         "4:                                     \n\t"
  241.  
  242.         :: "r" (src), "r" (tempBlurred), "r"((x86_reg)stride), "m" (tempBlurredPast)
  243.         : "%"REG_a, "%"REG_d, "%"REG_c, "memory"
  244.     );
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement