dsputil_iwmmxt_rnd.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:46k
源码类别:

Windows CE

开发平台:

C/C++

  1. void DEF(put, pixels8)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  2. {
  3.     int stride = line_size;
  4.     __asm__ __volatile__ (
  5.         "and r12, %[pixels], #7 nt"
  6.         "bic %[pixels], %[pixels], #7 nt"
  7.         "tmcr wcgr1, r12 nt"
  8.         "add r4, %[pixels], %[line_size] nt"
  9.         "add r5, %[block], %[line_size] nt"
  10.         "mov %[line_size], %[line_size], lsl #1 nt"
  11.         "1: nt"
  12.         "wldrd wr0, [%[pixels]] nt"
  13.         "subs %[h], %[h], #2 nt"
  14.         "wldrd wr1, [%[pixels], #8] nt"
  15.         "add %[pixels], %[pixels], %[line_size] nt"
  16.         "wldrd wr3, [r4] nt"
  17.         "pld [%[pixels]] nt"
  18.         "pld [%[pixels], #32] nt"
  19.         "wldrd wr4, [r4, #8] nt"
  20.         "add r4, r4, %[line_size] nt"
  21.         "walignr1 wr8, wr0, wr1 nt"
  22.         "pld [r4] nt"
  23.         "pld [r4, #32] nt"
  24.         "walignr1 wr10, wr3, wr4 nt"
  25.         "wstrd wr8, [%[block]] nt"
  26.         "add %[block], %[block], %[line_size] nt"
  27.         "wstrd wr10, [r5] nt"
  28.         "add r5, r5, %[line_size] nt"
  29.         "bne 1b nt"
  30.         : [block]"+r"(block), [pixels]"+r"(pixels), [line_size]"+r"(stride), [h]"+r"(h)
  31.         :
  32.         : "memory", "r4", "r5", "r12");
  33. }
  34. void DEF(avg, pixels8)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  35. {
  36.     int stride = line_size;
  37.     __asm__ __volatile__ (
  38.         "and r12, %[pixels], #7 nt"
  39.         "bic %[pixels], %[pixels], #7 nt"
  40.         "tmcr wcgr1, r12 nt"
  41.         "add r4, %[pixels], %[line_size] nt"
  42.         "add r5, %[block], %[line_size] nt"
  43.         "mov %[line_size], %[line_size], lsl #1 nt"
  44.         "1: nt"
  45.         "wldrd wr0, [%[pixels]] nt"
  46.         "subs %[h], %[h], #2 nt"
  47.         "wldrd wr1, [%[pixels], #8] nt"
  48.         "add %[pixels], %[pixels], %[line_size] nt"
  49.         "wldrd wr3, [r4] nt"
  50.         "pld [%[pixels]] nt"
  51.         "pld [%[pixels], #32] nt"
  52.         "wldrd wr4, [r4, #8] nt"
  53.         "add r4, r4, %[line_size] nt"
  54.         "walignr1 wr8, wr0, wr1 nt"
  55.         "wldrd wr0, [%[block]] nt"
  56.         "wldrd wr2, [r5] nt"
  57.         "pld [r4] nt"
  58.         "pld [r4, #32] nt"
  59.         "walignr1 wr10, wr3, wr4 nt"
  60.         WAVG2B" wr8, wr8, wr0 nt"
  61.         WAVG2B" wr10, wr10, wr2 nt"
  62.         "wstrd wr8, [%[block]] nt"
  63.         "add %[block], %[block], %[line_size] nt"
  64.         "wstrd wr10, [r5] nt"
  65.         "pld [%[block]] nt"
  66.         "pld [%[block], #32] nt"
  67.         "add r5, r5, %[line_size] nt"
  68.         "pld [r5] nt"
  69.         "pld [r5, #32] nt"
  70.         "bne 1b nt"
  71.         : [block]"+r"(block), [pixels]"+r"(pixels), [line_size]"+r"(stride), [h]"+r"(h)
  72.         :
  73.         : "memory", "r4", "r5", "r12");
  74. }
  75. void DEF(put, pixels16)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  76. {
  77.     int stride = line_size;
  78.     __asm__ __volatile__ (
  79.         "and r12, %[pixels], #7 nt"
  80.         "bic %[pixels], %[pixels], #7 nt"
  81.         "tmcr wcgr1, r12 nt"
  82.         "add r4, %[pixels], %[line_size] nt"
  83.         "add r5, %[block], %[line_size] nt"
  84.         "mov %[line_size], %[line_size], lsl #1 nt"
  85.         "1: nt"
  86.         "wldrd wr0, [%[pixels]] nt"
  87.         "wldrd wr1, [%[pixels], #8] nt"
  88.         "subs %[h], %[h], #2 nt"
  89.         "wldrd wr2, [%[pixels], #16] nt"
  90.         "add %[pixels], %[pixels], %[line_size] nt"
  91.         "wldrd wr3, [r4] nt"
  92.         "pld [%[pixels]] nt"
  93.         "pld [%[pixels], #32] nt"
  94.         "walignr1 wr8, wr0, wr1 nt"
  95.         "wldrd wr4, [r4, #8] nt"
  96.         "walignr1 wr9, wr1, wr2 nt"
  97.         "wldrd wr5, [r4, #16] nt"
  98.         "add r4, r4, %[line_size] nt"
  99.         "pld [r4] nt"
  100.         "pld [r4, #32] nt"
  101.         "walignr1 wr10, wr3, wr4 nt"
  102.         "wstrd wr8, [%[block]] nt"
  103.         "walignr1 wr11, wr4, wr5 nt"
  104.         "wstrd wr9, [%[block], #8] nt"
  105.         "add %[block], %[block], %[line_size] nt"
  106.         "wstrd wr10, [r5] nt"
  107.         "wstrd wr11, [r5, #8] nt"
  108.         "add r5, r5, %[line_size] nt"
  109.         "bne 1b nt"
  110.         : [block]"+r"(block), [pixels]"+r"(pixels), [line_size]"+r"(stride), [h]"+r"(h)
  111.         :
  112.         : "memory", "r4", "r5", "r12");
  113. }
  114. void DEF(avg, pixels16)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  115. {
  116.     int stride = line_size;
  117.     __asm__ __volatile__ (
  118.         "pld [%[pixels]]                nt"
  119.         "pld [%[pixels], #32]           nt"
  120.         "pld [%[block]]                 nt"
  121.         "pld [%[block], #32]            nt"
  122.         "and r12, %[pixels], #7         nt"
  123.         "bic %[pixels], %[pixels], #7   nt"
  124.         "tmcr wcgr1, r12                nt"
  125.         "add r4, %[pixels], %[line_size]nt"
  126.         "add r5, %[block], %[line_size] nt"
  127.         "mov %[line_size], %[line_size], lsl #1 nt"
  128.         "1:                             nt"
  129.         "wldrd wr0, [%[pixels]]         nt"
  130.         "wldrd wr1, [%[pixels], #8]     nt"
  131.         "subs %[h], %[h], #2            nt"
  132.         "wldrd wr2, [%[pixels], #16]    nt"
  133.         "add %[pixels], %[pixels], %[line_size] nt"
  134.         "wldrd wr3, [r4]                nt"
  135.         "pld [%[pixels]]                nt"
  136.         "pld [%[pixels], #32]           nt"
  137.         "walignr1 wr8, wr0, wr1         nt"
  138.         "wldrd wr4, [r4, #8]            nt"
  139.         "walignr1 wr9, wr1, wr2         nt"
  140.         "wldrd wr5, [r4, #16]           nt"
  141.         "add r4, r4, %[line_size]       nt"
  142.         "wldrd wr0, [%[block]]          nt"
  143.         "pld [r4]                       nt"
  144.         "wldrd wr1, [%[block], #8]      nt"
  145.         "pld [r4, #32]                  nt"
  146.         "wldrd wr2, [r5]                nt"
  147.         "walignr1 wr10, wr3, wr4        nt"
  148.         "wldrd wr3, [r5, #8]            nt"
  149.         WAVG2B" wr8, wr8, wr0           nt"
  150.         WAVG2B" wr9, wr9, wr1           nt"
  151.         WAVG2B" wr10, wr10, wr2         nt"
  152.         "wstrd wr8, [%[block]]          nt"
  153.         "walignr1 wr11, wr4, wr5        nt"
  154.         WAVG2B" wr11, wr11, wr3         nt"
  155.         "wstrd wr9, [%[block], #8]      nt"
  156.         "add %[block], %[block], %[line_size] nt"
  157.         "wstrd wr10, [r5]               nt"
  158.         "pld [%[block]]                 nt"
  159.         "pld [%[block], #32]            nt"
  160.         "wstrd wr11, [r5, #8]           nt"
  161.         "add r5, r5, %[line_size]       nt"
  162.         "pld [r5]                       nt"
  163.         "pld [r5, #32]                  nt"
  164.         "bne 1b nt"
  165.         : [block]"+r"(block), [pixels]"+r"(pixels), [line_size]"+r"(stride), [h]"+r"(h)
  166.         :
  167.         : "memory", "r4", "r5", "r12");
  168. }
  169. void DEF(put, pixels8_x2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  170. {
  171.     int stride = line_size;
  172.     // [wr0 wr1 wr2 wr3] for previous line
  173.     // [wr4 wr5 wr6 wr7] for current line
  174.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  175.     __asm__ __volatile__(
  176.         "pld [%[pixels]]                nt"
  177.         "pld [%[pixels], #32]           nt"
  178.         "and r12, %[pixels], #7         nt"
  179.         "bic %[pixels], %[pixels], #7   nt"
  180.         "tmcr wcgr1, r12                nt"
  181.         "add r12, r12, #1               nt"
  182.         "add r4, %[pixels], %[line_size]nt"
  183.         "tmcr wcgr2, r12                nt"
  184.         "add r5, %[block], %[line_size] nt"
  185.         "mov %[line_size], %[line_size], lsl #1 nt"
  186.         "1:                             nt"
  187.         "wldrd wr10, [%[pixels]]        nt"
  188.         "cmp r12, #8                    nt"
  189.         "wldrd wr11, [%[pixels], #8]    nt"
  190.         "add %[pixels], %[pixels], %[line_size] nt"
  191.         "wldrd wr13, [r4]               nt"
  192.         "pld [%[pixels]]                nt"
  193.         "wldrd wr14, [r4, #8]           nt"
  194.         "pld [%[pixels], #32]           nt"
  195.         "add r4, r4, %[line_size]       nt"
  196.         "walignr1 wr0, wr10, wr11       nt"
  197.         "pld [r4]                       nt"
  198.         "pld [r4, #32]                  nt"
  199.         "walignr1 wr2, wr13, wr14       nt"
  200.         "wmoveq wr4, wr11               nt"
  201.         "wmoveq wr6, wr14               nt"
  202.         "walignr2ne wr4, wr10, wr11     nt"
  203.         "walignr2ne wr6, wr13, wr14     nt"
  204.         WAVG2B" wr0, wr0, wr4           nt"
  205.         WAVG2B" wr2, wr2, wr6           nt"
  206.         "wstrd wr0, [%[block]]          nt"
  207.         "subs %[h], %[h], #2            nt"
  208.         "wstrd wr2, [r5]                nt"
  209.         "add %[block], %[block], %[line_size]   nt"
  210.         "add r5, r5, %[line_size]       nt"
  211.         "bne 1b                         nt"
  212.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  213.         :
  214.         : "r4", "r5", "r12", "memory");
  215. }
  216. void DEF(put, pixels16_x2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  217. {
  218.     int stride = line_size;
  219.     // [wr0 wr1 wr2 wr3] for previous line
  220.     // [wr4 wr5 wr6 wr7] for current line
  221.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  222.     __asm__ __volatile__(
  223.         "pld [%[pixels]]                nt"
  224.         "pld [%[pixels], #32]           nt"
  225.         "and r12, %[pixels], #7         nt"
  226.         "bic %[pixels], %[pixels], #7   nt"
  227.         "tmcr wcgr1, r12                nt"
  228.         "add r12, r12, #1               nt"
  229.         "add r4, %[pixels], %[line_size]nt"
  230.         "tmcr wcgr2, r12                nt"
  231.         "add r5, %[block], %[line_size] nt"
  232.         "mov %[line_size], %[line_size], lsl #1 nt"
  233.         "1:                             nt"
  234.         "wldrd wr10, [%[pixels]]        nt"
  235.         "cmp r12, #8                    nt"
  236.         "wldrd wr11, [%[pixels], #8]    nt"
  237.         "wldrd wr12, [%[pixels], #16]   nt"
  238.         "add %[pixels], %[pixels], %[line_size] nt"
  239.         "wldrd wr13, [r4]               nt"
  240.         "pld [%[pixels]]                nt"
  241.         "wldrd wr14, [r4, #8]           nt"
  242.         "pld [%[pixels], #32]           nt"
  243.         "wldrd wr15, [r4, #16]          nt"
  244.         "add r4, r4, %[line_size]       nt"
  245.         "walignr1 wr0, wr10, wr11       nt"
  246.         "pld [r4]                       nt"
  247.         "pld [r4, #32]                  nt"
  248.         "walignr1 wr1, wr11, wr12       nt"
  249.         "walignr1 wr2, wr13, wr14       nt"
  250.         "walignr1 wr3, wr14, wr15       nt"
  251.         "wmoveq wr4, wr11               nt"
  252.         "wmoveq wr5, wr12               nt"
  253.         "wmoveq wr6, wr14               nt"
  254.         "wmoveq wr7, wr15               nt"
  255.         "walignr2ne wr4, wr10, wr11     nt"
  256.         "walignr2ne wr5, wr11, wr12     nt"
  257.         "walignr2ne wr6, wr13, wr14     nt"
  258.         "walignr2ne wr7, wr14, wr15     nt"
  259.         WAVG2B" wr0, wr0, wr4           nt"
  260.         WAVG2B" wr1, wr1, wr5           nt"
  261.         "wstrd wr0, [%[block]]          nt"
  262.         WAVG2B" wr2, wr2, wr6           nt"
  263.         "wstrd wr1, [%[block], #8]      nt"
  264.         WAVG2B" wr3, wr3, wr7           nt"
  265.         "add %[block], %[block], %[line_size]   nt"
  266.         "wstrd wr2, [r5]                nt"
  267.         "subs %[h], %[h], #2            nt"
  268.         "wstrd wr3, [r5, #8]            nt"
  269.         "add r5, r5, %[line_size]       nt"
  270.         "bne 1b                         nt"
  271.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  272.         :
  273.         : "r4", "r5", "r12", "memory");
  274. }
  275. void DEF(avg, pixels8_x2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  276. {
  277.     int stride = line_size;
  278.     // [wr0 wr1 wr2 wr3] for previous line
  279.     // [wr4 wr5 wr6 wr7] for current line
  280.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  281.     __asm__ __volatile__(
  282.         "pld [%[pixels]]                nt"
  283.         "pld [%[pixels], #32]           nt"
  284.         "pld [%[block]]                 nt"
  285.         "pld [%[block], #32]            nt"
  286.         "and r12, %[pixels], #7         nt"
  287.         "bic %[pixels], %[pixels], #7   nt"
  288.         "tmcr wcgr1, r12                nt"
  289.         "add r12, r12, #1               nt"
  290.         "add r4, %[pixels], %[line_size]nt"
  291.         "tmcr wcgr2, r12                nt"
  292.         "add r5, %[block], %[line_size] nt"
  293.         "mov %[line_size], %[line_size], lsl #1 nt"
  294.         "pld [r5]                       nt"
  295.         "pld [r5, #32]                  nt"
  296.         "1:                             nt"
  297.         "wldrd wr10, [%[pixels]]        nt"
  298.         "cmp r12, #8                    nt"
  299.         "wldrd wr11, [%[pixels], #8]    nt"
  300.         "add %[pixels], %[pixels], %[line_size] nt"
  301.         "wldrd wr13, [r4]               nt"
  302.         "pld [%[pixels]]                nt"
  303.         "wldrd wr14, [r4, #8]           nt"
  304.         "pld [%[pixels], #32]           nt"
  305.         "add r4, r4, %[line_size]       nt"
  306.         "walignr1 wr0, wr10, wr11       nt"
  307.         "pld [r4]                       nt"
  308.         "pld [r4, #32]                  nt"
  309.         "walignr1 wr2, wr13, wr14       nt"
  310.         "wmoveq wr4, wr11               nt"
  311.         "wmoveq wr6, wr14               nt"
  312.         "walignr2ne wr4, wr10, wr11     nt"
  313.         "wldrd wr10, [%[block]]         nt"
  314.         "walignr2ne wr6, wr13, wr14     nt"
  315.         "wldrd wr12, [r5]               nt"
  316.         WAVG2B" wr0, wr0, wr4           nt"
  317.         WAVG2B" wr2, wr2, wr6           nt"
  318.         WAVG2B" wr0, wr0, wr10          nt"
  319.         WAVG2B" wr2, wr2, wr12          nt"
  320.         "wstrd wr0, [%[block]]          nt"
  321.         "subs %[h], %[h], #2            nt"
  322.         "wstrd wr2, [r5]                nt"
  323.         "add %[block], %[block], %[line_size]   nt"
  324.         "add r5, r5, %[line_size]       nt"
  325.         "pld [%[block]]                 nt"
  326.         "pld [%[block], #32]            nt"
  327.         "pld [r5]                       nt"
  328.         "pld [r5, #32]                  nt"
  329.         "bne 1b                         nt"
  330.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  331.         :
  332.         : "r4", "r5", "r12", "memory");
  333. }
  334. void DEF(avg, pixels16_x2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  335. {
  336.     int stride = line_size;
  337.     // [wr0 wr1 wr2 wr3] for previous line
  338.     // [wr4 wr5 wr6 wr7] for current line
  339.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  340.     __asm__ __volatile__(
  341.         "pld [%[pixels]]                nt"
  342.         "pld [%[pixels], #32]           nt"
  343.         "pld [%[block]]                 nt"
  344.         "pld [%[block], #32]            nt"
  345.         "and r12, %[pixels], #7         nt"
  346.         "bic %[pixels], %[pixels], #7   nt"
  347.         "tmcr wcgr1, r12                nt"
  348.         "add r12, r12, #1               nt"
  349.         "add r4, %[pixels], %[line_size]nt"
  350.         "tmcr wcgr2, r12                nt"
  351.         "add r5, %[block], %[line_size] nt"
  352.         "mov %[line_size], %[line_size], lsl #1 nt"
  353.         "pld [r5]                       nt"
  354.         "pld [r5, #32]                  nt"
  355.         "1:                             nt"
  356.         "wldrd wr10, [%[pixels]]        nt"
  357.         "cmp r12, #8                    nt"
  358.         "wldrd wr11, [%[pixels], #8]    nt"
  359.         "wldrd wr12, [%[pixels], #16]   nt"
  360.         "add %[pixels], %[pixels], %[line_size] nt"
  361.         "wldrd wr13, [r4]               nt"
  362.         "pld [%[pixels]]                nt"
  363.         "wldrd wr14, [r4, #8]           nt"
  364.         "pld [%[pixels], #32]           nt"
  365.         "wldrd wr15, [r4, #16]          nt"
  366.         "add r4, r4, %[line_size]       nt"
  367.         "walignr1 wr0, wr10, wr11       nt"
  368.         "pld [r4]                       nt"
  369.         "pld [r4, #32]                  nt"
  370.         "walignr1 wr1, wr11, wr12       nt"
  371.         "walignr1 wr2, wr13, wr14       nt"
  372.         "walignr1 wr3, wr14, wr15       nt"
  373.         "wmoveq wr4, wr11               nt"
  374.         "wmoveq wr5, wr12               nt"
  375.         "wmoveq wr6, wr14               nt"
  376.         "wmoveq wr7, wr15               nt"
  377.         "walignr2ne wr4, wr10, wr11     nt"
  378.         "walignr2ne wr5, wr11, wr12     nt"
  379.         "walignr2ne wr6, wr13, wr14     nt"
  380.         "walignr2ne wr7, wr14, wr15     nt"
  381.         "wldrd wr10, [%[block]]         nt"
  382.         WAVG2B" wr0, wr0, wr4           nt"
  383.         "wldrd wr11, [%[block], #8]     nt"
  384.         WAVG2B" wr1, wr1, wr5           nt"
  385.         "wldrd wr12, [r5]               nt"
  386.         WAVG2B" wr2, wr2, wr6           nt"
  387.         "wldrd wr13, [r5, #8]           nt"
  388.         WAVG2B" wr3, wr3, wr7           nt"
  389.         WAVG2B" wr0, wr0, wr10          nt"
  390.         WAVG2B" wr1, wr1, wr11          nt"
  391.         WAVG2B" wr2, wr2, wr12          nt"
  392.         WAVG2B" wr3, wr3, wr13          nt"
  393.         "wstrd wr0, [%[block]]          nt"
  394.         "subs %[h], %[h], #2            nt"
  395.         "wstrd wr1, [%[block], #8]      nt"
  396.         "add %[block], %[block], %[line_size]   nt"
  397.         "wstrd wr2, [r5]                nt"
  398.         "pld [%[block]]                 nt"
  399.         "wstrd wr3, [r5, #8]            nt"
  400.         "add r5, r5, %[line_size]       nt"
  401.         "pld [%[block], #32]            nt"
  402.         "pld [r5]                       nt"
  403.         "pld [r5, #32]                  nt"
  404.         "bne 1b                         nt"
  405.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  406.         :
  407.         :"r4", "r5", "r12", "memory");
  408. }
  409. void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  410. {
  411.     int stride = line_size;
  412.     // [wr0 wr1 wr2 wr3] for previous line
  413.     // [wr4 wr5 wr6 wr7] for current line
  414.     __asm__ __volatile__(
  415.         "pld            [%[pixels]]                             nt"
  416.         "pld            [%[pixels], #32]                        nt"
  417.         "and            r12, %[pixels], #7                      nt"
  418.         "tmcr           wcgr1, r12                              nt"
  419.         "bic            %[pixels], %[pixels], #7                nt"
  420.         "wldrd          wr10, [%[pixels]]                       nt"
  421.         "wldrd          wr11, [%[pixels], #8]                   nt"
  422.         "pld            [%[block]]                              nt"
  423.         "add            %[pixels], %[pixels], %[line_size]      nt"
  424.         "walignr1       wr0, wr10, wr11                         nt"
  425.         "pld            [%[pixels]]                             nt"
  426.         "pld            [%[pixels], #32]                        nt"
  427.       "1:                                                       nt"
  428.         "wldrd          wr10, [%[pixels]]                       nt"
  429.         "wldrd          wr11, [%[pixels], #8]                   nt"
  430.         "add            %[pixels], %[pixels], %[line_size]      nt"
  431.         "pld            [%[pixels]]                             nt"
  432.         "pld            [%[pixels], #32]                        nt"
  433.         "walignr1       wr4, wr10, wr11                         nt"
  434.         "wldrd          wr10, [%[block]]                        nt"
  435.          WAVG2B"        wr8, wr0, wr4                           nt"
  436.          WAVG2B"        wr8, wr8, wr10                          nt"
  437.         "wstrd          wr8, [%[block]]                         nt"
  438.         "add            %[block], %[block], %[line_size]        nt"
  439.         "wldrd          wr10, [%[pixels]]                       nt"
  440.         "wldrd          wr11, [%[pixels], #8]                   nt"
  441.         "pld            [%[block]]                              nt"
  442.         "add            %[pixels], %[pixels], %[line_size]      nt"
  443.         "pld            [%[pixels]]                             nt"
  444.         "pld            [%[pixels], #32]                        nt"
  445.         "walignr1       wr0, wr10, wr11                         nt"
  446.         "wldrd          wr10, [%[block]]                        nt"
  447.          WAVG2B"        wr8, wr0, wr4                           nt"
  448.          WAVG2B"        wr8, wr8, wr10                          nt"
  449.         "wstrd          wr8, [%[block]]                         nt"
  450.         "add            %[block], %[block], %[line_size]        nt"
  451.         "subs           %[h], %[h], #2                          nt"
  452.         "pld            [%[block]]                              nt"
  453.         "bne            1b                                      nt"
  454.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  455.         :
  456.         : "cc", "memory", "r12");
  457. }
  458. void DEF(put, pixels16_y2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  459. {
  460.     int stride = line_size;
  461.     // [wr0 wr1 wr2 wr3] for previous line
  462.     // [wr4 wr5 wr6 wr7] for current line
  463.     __asm__ __volatile__(
  464.         "pld [%[pixels]]                nt"
  465.         "pld [%[pixels], #32]           nt"
  466.         "and r12, %[pixels], #7         nt"
  467.         "tmcr wcgr1, r12                nt"
  468.         "bic %[pixels], %[pixels], #7   nt"
  469.         "wldrd wr10, [%[pixels]]        nt"
  470.         "wldrd wr11, [%[pixels], #8]    nt"
  471.         "wldrd wr12, [%[pixels], #16]   nt"
  472.         "add %[pixels], %[pixels], %[line_size] nt"
  473.         "pld [%[pixels]]                nt"
  474.         "pld [%[pixels], #32]           nt"
  475.         "walignr1 wr0, wr10, wr11       nt"
  476.         "walignr1 wr1, wr11, wr12       nt"
  477.         "1:                             nt"
  478.         "wldrd wr10, [%[pixels]]        nt"
  479.         "wldrd wr11, [%[pixels], #8]    nt"
  480.         "wldrd wr12, [%[pixels], #16]   nt"
  481.         "add %[pixels], %[pixels], %[line_size] nt"
  482.         "pld [%[pixels]]                nt"
  483.         "pld [%[pixels], #32]           nt"
  484.         "walignr1 wr4, wr10, wr11       nt"
  485.         "walignr1 wr5, wr11, wr12       nt"
  486.         WAVG2B" wr8, wr0, wr4           nt"
  487.         WAVG2B" wr9, wr1, wr5           nt"
  488.         "wstrd wr8, [%[block]]          nt"
  489.         "wstrd wr9, [%[block], #8]      nt"
  490.         "add %[block], %[block], %[line_size]   nt"
  491.         "wldrd wr10, [%[pixels]]        nt"
  492.         "wldrd wr11, [%[pixels], #8]    nt"
  493.         "wldrd wr12, [%[pixels], #16]   nt"
  494.         "add %[pixels], %[pixels], %[line_size] nt"
  495.         "pld [%[pixels]]                nt"
  496.         "pld [%[pixels], #32]           nt"
  497.         "walignr1 wr0, wr10, wr11       nt"
  498.         "walignr1 wr1, wr11, wr12       nt"
  499.         WAVG2B" wr8, wr0, wr4           nt"
  500.         WAVG2B" wr9, wr1, wr5           nt"
  501.         "wstrd wr8, [%[block]]          nt"
  502.         "wstrd wr9, [%[block], #8]      nt"
  503.         "add %[block], %[block], %[line_size]   nt"
  504.         "subs %[h], %[h], #2            nt"
  505.         "bne 1b                         nt"
  506.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  507.         :
  508.         : "r4", "r5", "r12", "memory");
  509. }
  510. void DEF(avg, pixels16_y2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  511. {
  512.     int stride = line_size;
  513.     // [wr0 wr1 wr2 wr3] for previous line
  514.     // [wr4 wr5 wr6 wr7] for current line
  515.     __asm__ __volatile__(
  516.         "pld [%[pixels]]                nt"
  517.         "pld [%[pixels], #32]           nt"
  518.         "and r12, %[pixels], #7         nt"
  519.         "tmcr wcgr1, r12                nt"
  520.         "bic %[pixels], %[pixels], #7   nt"
  521.         "wldrd wr10, [%[pixels]]        nt"
  522.         "wldrd wr11, [%[pixels], #8]    nt"
  523.         "pld [%[block]]                 nt"
  524.         "wldrd wr12, [%[pixels], #16]   nt"
  525.         "add %[pixels], %[pixels], %[line_size] nt"
  526.         "pld [%[pixels]]                nt"
  527.         "pld [%[pixels], #32]           nt"
  528.         "walignr1 wr0, wr10, wr11       nt"
  529.         "walignr1 wr1, wr11, wr12       nt"
  530.         "1:                             nt"
  531.         "wldrd wr10, [%[pixels]]        nt"
  532.         "wldrd wr11, [%[pixels], #8]    nt"
  533.         "wldrd wr12, [%[pixels], #16]   nt"
  534.         "add %[pixels], %[pixels], %[line_size] nt"
  535.         "pld [%[pixels]]                nt"
  536.         "pld [%[pixels], #32]           nt"
  537.         "walignr1 wr4, wr10, wr11       nt"
  538.         "walignr1 wr5, wr11, wr12       nt"
  539.         "wldrd wr10, [%[block]]         nt"
  540.         "wldrd wr11, [%[block], #8]     nt"
  541.         WAVG2B" wr8, wr0, wr4           nt"
  542.         WAVG2B" wr9, wr1, wr5           nt"
  543.         WAVG2B" wr8, wr8, wr10          nt"
  544.         WAVG2B" wr9, wr9, wr11          nt"
  545.         "wstrd wr8, [%[block]]          nt"
  546.         "wstrd wr9, [%[block], #8]      nt"
  547.         "add %[block], %[block], %[line_size]   nt"
  548.         "wldrd wr10, [%[pixels]]        nt"
  549.         "wldrd wr11, [%[pixels], #8]    nt"
  550.         "pld [%[block]]                 nt"
  551.         "wldrd wr12, [%[pixels], #16]   nt"
  552.         "add %[pixels], %[pixels], %[line_size] nt"
  553.         "pld [%[pixels]]                nt"
  554.         "pld [%[pixels], #32]           nt"
  555.         "walignr1 wr0, wr10, wr11       nt"
  556.         "walignr1 wr1, wr11, wr12       nt"
  557.         "wldrd wr10, [%[block]]         nt"
  558.         "wldrd wr11, [%[block], #8]     nt"
  559.         WAVG2B" wr8, wr0, wr4           nt"
  560.         WAVG2B" wr9, wr1, wr5           nt"
  561.         WAVG2B" wr8, wr8, wr10          nt"
  562.         WAVG2B" wr9, wr9, wr11          nt"
  563.         "wstrd wr8, [%[block]]          nt"
  564.         "wstrd wr9, [%[block], #8]      nt"
  565.         "add %[block], %[block], %[line_size]   nt"
  566.         "subs %[h], %[h], #2            nt"
  567.         "pld [%[block]]                 nt"
  568.         "bne 1b                         nt"
  569.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block), [line_size]"+r"(stride)
  570.         :
  571.         : "r4", "r5", "r12", "memory");
  572. }
  573. void DEF(put, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  574. {
  575.     // [wr0 wr1 wr2 wr3] for previous line
  576.     // [wr4 wr5 wr6 wr7] for current line
  577.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  578.     __asm__ __volatile__(
  579.         "pld [%[pixels]]                nt"
  580.         "mov r12, #2                    nt"
  581.         "pld [%[pixels], #32]           nt"
  582.         "tmcr wcgr0, r12                nt" /* for shift value */
  583.         "and r12, %[pixels], #7         nt"
  584.         "bic %[pixels], %[pixels], #7   nt"
  585.         "tmcr wcgr1, r12                nt"
  586.         // [wr0 wr1 wr2 wr3] <= *
  587.         // [wr4 wr5 wr6 wr7]
  588.         "wldrd wr12, [%[pixels]]        nt"
  589.         "add r12, r12, #1               nt"
  590.         "wldrd wr13, [%[pixels], #8]    nt"
  591.         "tmcr wcgr2, r12                nt"
  592.         "add %[pixels], %[pixels], %[line_size] nt"
  593.         "cmp r12, #8                    nt"
  594.         "pld [%[pixels]]                nt"
  595.         "pld [%[pixels], #32]           nt"
  596.         "walignr1 wr2, wr12, wr13       nt"
  597.         "wmoveq wr10, wr13              nt"
  598.         "walignr2ne wr10, wr12, wr13    nt"
  599.         "wunpckelub wr0, wr2            nt"
  600.         "wunpckehub wr1, wr2            nt"
  601.         "wunpckelub wr8, wr10           nt"
  602.         "wunpckehub wr9, wr10           nt"
  603.         "waddhus wr0, wr0, wr8          nt"
  604.         "waddhus wr1, wr1, wr9          nt"
  605.         "1:                             nt"
  606.         // [wr0 wr1 wr2 wr3]
  607.         // [wr4 wr5 wr6 wr7] <= *
  608.         "wldrd wr12, [%[pixels]]        nt"
  609.         "cmp r12, #8                    nt"
  610.         "wldrd wr13, [%[pixels], #8]    nt"
  611.         "add %[pixels], %[pixels], %[line_size] nt"
  612.         "walignr1 wr6, wr12, wr13       nt"
  613.         "pld [%[pixels]]                nt"
  614.         "pld [%[pixels], #32]           nt"
  615.         "wmoveq wr10, wr13              nt"
  616.         "walignr2ne wr10, wr12, wr13    nt"
  617.         "wunpckelub wr4, wr6            nt"
  618.         "wunpckehub wr5, wr6            nt"
  619.         "wunpckelub wr8, wr10           nt"
  620.         "wunpckehub wr9, wr10           nt"
  621.         "waddhus wr4, wr4, wr8          nt"
  622.         "waddhus wr5, wr5, wr9          nt"
  623.         "waddhus wr8, wr0, wr4          nt"
  624.         "waddhus wr9, wr1, wr5          nt"
  625.         "waddhus wr8, wr8, wr15         nt"
  626.         "waddhus wr9, wr9, wr15         nt"
  627.         "wsrlhg wr8, wr8, wcgr0         nt"
  628.         "wsrlhg wr9, wr9, wcgr0         nt"
  629.         "wpackhus wr8, wr8, wr9         nt"
  630.         "wstrd wr8, [%[block]]          nt"
  631.         "add %[block], %[block], %[line_size]   nt"
  632.         // [wr0 wr1 wr2 wr3] <= *
  633.         // [wr4 wr5 wr6 wr7]
  634.         "wldrd wr12, [%[pixels]]        nt"
  635.         "wldrd wr13, [%[pixels], #8]    nt"
  636.         "add %[pixels], %[pixels], %[line_size] nt"
  637.         "walignr1 wr2, wr12, wr13       nt"
  638.         "pld [%[pixels]]                nt"
  639.         "pld [%[pixels], #32]           nt"
  640.         "wmoveq wr10, wr13              nt"
  641.         "walignr2ne wr10, wr12, wr13    nt"
  642.         "wunpckelub wr0, wr2            nt"
  643.         "wunpckehub wr1, wr2            nt"
  644.         "wunpckelub wr8, wr10           nt"
  645.         "wunpckehub wr9, wr10           nt"
  646.         "waddhus wr0, wr0, wr8          nt"
  647.         "waddhus wr1, wr1, wr9          nt"
  648.         "waddhus wr8, wr0, wr4          nt"
  649.         "waddhus wr9, wr1, wr5          nt"
  650.         "waddhus wr8, wr8, wr15         nt"
  651.         "waddhus wr9, wr9, wr15         nt"
  652.         "wsrlhg wr8, wr8, wcgr0         nt"
  653.         "wsrlhg wr9, wr9, wcgr0         nt"
  654.         "wpackhus wr8, wr8, wr9         nt"
  655.         "subs %[h], %[h], #2            nt"
  656.         "wstrd wr8, [%[block]]          nt"
  657.         "add %[block], %[block], %[line_size]   nt"
  658.         "bne 1b                         nt"
  659.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block)
  660.         : [line_size]"r"(line_size)
  661.         : "r12", "memory");
  662. }
  663. void DEF(put, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  664. {
  665.     // [wr0 wr1 wr2 wr3] for previous line
  666.     // [wr4 wr5 wr6 wr7] for current line
  667.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  668.     __asm__ __volatile__(
  669.         "pld [%[pixels]]                nt"
  670.         "mov r12, #2                    nt"
  671.         "pld [%[pixels], #32]           nt"
  672.         "tmcr wcgr0, r12                nt" /* for shift value */
  673.         /* alignment */
  674.         "and r12, %[pixels], #7         nt"
  675.         "bic %[pixels], %[pixels], #7   nt"
  676.         "tmcr wcgr1, r12                nt"
  677.         "add r12, r12, #1               nt"
  678.         "tmcr wcgr2, r12                nt"
  679.         // [wr0 wr1 wr2 wr3] <= *
  680.         // [wr4 wr5 wr6 wr7]
  681.         "wldrd wr12, [%[pixels]]        nt"
  682.         "cmp r12, #8                    nt"
  683.         "wldrd wr13, [%[pixels], #8]    nt"
  684.         "wldrd wr14, [%[pixels], #16]   nt"
  685.         "add %[pixels], %[pixels], %[line_size] nt"
  686.         "pld [%[pixels]]                nt"
  687.         "walignr1 wr2, wr12, wr13       nt"
  688.         "pld [%[pixels], #32]           nt"
  689.         "walignr1 wr3, wr13, wr14       nt"
  690.         "wmoveq wr10, wr13              nt"
  691.         "wmoveq wr11, wr14              nt"
  692.         "walignr2ne wr10, wr12, wr13    nt"
  693.         "walignr2ne wr11, wr13, wr14    nt"
  694.         "wunpckelub wr0, wr2            nt"
  695.         "wunpckehub wr1, wr2            nt"
  696.         "wunpckelub wr2, wr3            nt"
  697.         "wunpckehub wr3, wr3            nt"
  698.         "wunpckelub wr8, wr10           nt"
  699.         "wunpckehub wr9, wr10           nt"
  700.         "wunpckelub wr10, wr11          nt"
  701.         "wunpckehub wr11, wr11          nt"
  702.         "waddhus wr0, wr0, wr8          nt"
  703.         "waddhus wr1, wr1, wr9          nt"
  704.         "waddhus wr2, wr2, wr10         nt"
  705.         "waddhus wr3, wr3, wr11         nt"
  706.         "1:                             nt"
  707.         // [wr0 wr1 wr2 wr3]
  708.         // [wr4 wr5 wr6 wr7] <= *
  709.         "wldrd wr12, [%[pixels]]        nt"
  710.         "cmp r12, #8                    nt"
  711.         "wldrd wr13, [%[pixels], #8]    nt"
  712.         "wldrd wr14, [%[pixels], #16]   nt"
  713.         "add %[pixels], %[pixels], %[line_size] nt"
  714.         "walignr1 wr6, wr12, wr13       nt"
  715.         "pld [%[pixels]]                nt"
  716.         "pld [%[pixels], #32]           nt"
  717.         "walignr1 wr7, wr13, wr14       nt"
  718.         "wmoveq wr10, wr13              nt"
  719.         "wmoveq wr11, wr14              nt"
  720.         "walignr2ne wr10, wr12, wr13    nt"
  721.         "walignr2ne wr11, wr13, wr14    nt"
  722.         "wunpckelub wr4, wr6            nt"
  723.         "wunpckehub wr5, wr6            nt"
  724.         "wunpckelub wr6, wr7            nt"
  725.         "wunpckehub wr7, wr7            nt"
  726.         "wunpckelub wr8, wr10           nt"
  727.         "wunpckehub wr9, wr10           nt"
  728.         "wunpckelub wr10, wr11          nt"
  729.         "wunpckehub wr11, wr11          nt"
  730.         "waddhus wr4, wr4, wr8          nt"
  731.         "waddhus wr5, wr5, wr9          nt"
  732.         "waddhus wr6, wr6, wr10         nt"
  733.         "waddhus wr7, wr7, wr11         nt"
  734.         "waddhus wr8, wr0, wr4          nt"
  735.         "waddhus wr9, wr1, wr5          nt"
  736.         "waddhus wr10, wr2, wr6         nt"
  737.         "waddhus wr11, wr3, wr7         nt"
  738.         "waddhus wr8, wr8, wr15         nt"
  739.         "waddhus wr9, wr9, wr15         nt"
  740.         "waddhus wr10, wr10, wr15       nt"
  741.         "waddhus wr11, wr11, wr15       nt"
  742.         "wsrlhg wr8, wr8, wcgr0         nt"
  743.         "wsrlhg wr9, wr9, wcgr0         nt"
  744.         "wsrlhg wr10, wr10, wcgr0       nt"
  745.         "wsrlhg wr11, wr11, wcgr0       nt"
  746.         "wpackhus wr8, wr8, wr9         nt"
  747.         "wpackhus wr9, wr10, wr11       nt"
  748.         "wstrd wr8, [%[block]]          nt"
  749.         "wstrd wr9, [%[block], #8]      nt"
  750.         "add %[block], %[block], %[line_size]   nt"
  751.         // [wr0 wr1 wr2 wr3] <= *
  752.         // [wr4 wr5 wr6 wr7]
  753.         "wldrd wr12, [%[pixels]]        nt"
  754.         "wldrd wr13, [%[pixels], #8]    nt"
  755.         "wldrd wr14, [%[pixels], #16]   nt"
  756.         "add %[pixels], %[pixels], %[line_size] nt"
  757.         "walignr1 wr2, wr12, wr13       nt"
  758.         "pld [%[pixels]]                nt"
  759.         "pld [%[pixels], #32]           nt"
  760.         "walignr1 wr3, wr13, wr14       nt"
  761.         "wmoveq wr10, wr13              nt"
  762.         "wmoveq wr11, wr14              nt"
  763.         "walignr2ne wr10, wr12, wr13    nt"
  764.         "walignr2ne wr11, wr13, wr14    nt"
  765.         "wunpckelub wr0, wr2            nt"
  766.         "wunpckehub wr1, wr2            nt"
  767.         "wunpckelub wr2, wr3            nt"
  768.         "wunpckehub wr3, wr3            nt"
  769.         "wunpckelub wr8, wr10           nt"
  770.         "wunpckehub wr9, wr10           nt"
  771.         "wunpckelub wr10, wr11          nt"
  772.         "wunpckehub wr11, wr11          nt"
  773.         "waddhus wr0, wr0, wr8          nt"
  774.         "waddhus wr1, wr1, wr9          nt"
  775.         "waddhus wr2, wr2, wr10         nt"
  776.         "waddhus wr3, wr3, wr11         nt"
  777.         "waddhus wr8, wr0, wr4          nt"
  778.         "waddhus wr9, wr1, wr5          nt"
  779.         "waddhus wr10, wr2, wr6         nt"
  780.         "waddhus wr11, wr3, wr7         nt"
  781.         "waddhus wr8, wr8, wr15         nt"
  782.         "waddhus wr9, wr9, wr15         nt"
  783.         "waddhus wr10, wr10, wr15       nt"
  784.         "waddhus wr11, wr11, wr15       nt"
  785.         "wsrlhg wr8, wr8, wcgr0         nt"
  786.         "wsrlhg wr9, wr9, wcgr0         nt"
  787.         "wsrlhg wr10, wr10, wcgr0       nt"
  788.         "wsrlhg wr11, wr11, wcgr0       nt"
  789.         "wpackhus wr8, wr8, wr9         nt"
  790.         "wpackhus wr9, wr10, wr11       nt"
  791.         "wstrd wr8, [%[block]]          nt"
  792.         "wstrd wr9, [%[block], #8]      nt"
  793.         "add %[block], %[block], %[line_size]   nt"
  794.         "subs %[h], %[h], #2            nt"
  795.         "bne 1b                         nt"
  796.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block)
  797.         : [line_size]"r"(line_size)
  798.         : "r12", "memory");
  799. }
  800. void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  801. {
  802.     // [wr0 wr1 wr2 wr3] for previous line
  803.     // [wr4 wr5 wr6 wr7] for current line
  804.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  805.     __asm__ __volatile__(
  806.         "pld [%[block]]                 nt"
  807.         "pld [%[block], #32]            nt"
  808.         "pld [%[pixels]]                nt"
  809.         "mov r12, #2                    nt"
  810.         "pld [%[pixels], #32]           nt"
  811.         "tmcr wcgr0, r12                nt" /* for shift value */
  812.         "and r12, %[pixels], #7         nt"
  813.         "bic %[pixels], %[pixels], #7   nt"
  814.         "tmcr wcgr1, r12                nt"
  815.         // [wr0 wr1 wr2 wr3] <= *
  816.         // [wr4 wr5 wr6 wr7]
  817.         "wldrd wr12, [%[pixels]]        nt"
  818.         "add r12, r12, #1               nt"
  819.         "wldrd wr13, [%[pixels], #8]    nt"
  820.         "tmcr wcgr2, r12                nt"
  821.         "add %[pixels], %[pixels], %[line_size] nt"
  822.         "cmp r12, #8                    nt"
  823.         "pld [%[pixels]]                nt"
  824.         "pld [%[pixels], #32]           nt"
  825.         "walignr1 wr2, wr12, wr13       nt"
  826.         "wmoveq wr10, wr13              nt"
  827.         "walignr2ne wr10, wr12, wr13    nt"
  828.         "wunpckelub wr0, wr2            nt"
  829.         "wunpckehub wr1, wr2            nt"
  830.         "wunpckelub wr8, wr10           nt"
  831.         "wunpckehub wr9, wr10           nt"
  832.         "waddhus wr0, wr0, wr8          nt"
  833.         "waddhus wr1, wr1, wr9          nt"
  834.         "1:                             nt"
  835.         // [wr0 wr1 wr2 wr3]
  836.         // [wr4 wr5 wr6 wr7] <= *
  837.         "wldrd wr12, [%[pixels]]        nt"
  838.         "cmp r12, #8                    nt"
  839.         "wldrd wr13, [%[pixels], #8]    nt"
  840.         "add %[pixels], %[pixels], %[line_size] nt"
  841.         "walignr1 wr6, wr12, wr13       nt"
  842.         "pld [%[pixels]]                nt"
  843.         "pld [%[pixels], #32]           nt"
  844.         "wmoveq wr10, wr13              nt"
  845.         "walignr2ne wr10, wr12, wr13    nt"
  846.         "wunpckelub wr4, wr6            nt"
  847.         "wunpckehub wr5, wr6            nt"
  848.         "wunpckelub wr8, wr10           nt"
  849.         "wunpckehub wr9, wr10           nt"
  850.         "waddhus wr4, wr4, wr8          nt"
  851.         "waddhus wr5, wr5, wr9          nt"
  852.         "waddhus wr8, wr0, wr4          nt"
  853.         "waddhus wr9, wr1, wr5          nt"
  854.         "waddhus wr8, wr8, wr15         nt"
  855.         "waddhus wr9, wr9, wr15         nt"
  856.         "wldrd wr12, [%[block]]         nt"
  857.         "wsrlhg wr8, wr8, wcgr0         nt"
  858.         "wsrlhg wr9, wr9, wcgr0         nt"
  859.         "wpackhus wr8, wr8, wr9         nt"
  860.         WAVG2B" wr8, wr8, wr12          nt"
  861.         "wstrd wr8, [%[block]]          nt"
  862.         "add %[block], %[block], %[line_size]   nt"
  863.         "wldrd wr12, [%[pixels]]        nt"
  864.         "pld [%[block]]                 nt"
  865.         "pld [%[block], #32]            nt"
  866.         // [wr0 wr1 wr2 wr3] <= *
  867.         // [wr4 wr5 wr6 wr7]
  868.         "wldrd wr13, [%[pixels], #8]    nt"
  869.         "add %[pixels], %[pixels], %[line_size] nt"
  870.         "walignr1 wr2, wr12, wr13       nt"
  871.         "pld [%[pixels]]                nt"
  872.         "pld [%[pixels], #32]           nt"
  873.         "wmoveq wr10, wr13              nt"
  874.         "walignr2ne wr10, wr12, wr13    nt"
  875.         "wunpckelub wr0, wr2            nt"
  876.         "wunpckehub wr1, wr2            nt"
  877.         "wunpckelub wr8, wr10           nt"
  878.         "wunpckehub wr9, wr10           nt"
  879.         "waddhus wr0, wr0, wr8          nt"
  880.         "waddhus wr1, wr1, wr9          nt"
  881.         "waddhus wr8, wr0, wr4          nt"
  882.         "waddhus wr9, wr1, wr5          nt"
  883.         "waddhus wr8, wr8, wr15         nt"
  884.         "waddhus wr9, wr9, wr15         nt"
  885.         "wldrd wr12, [%[block]]         nt"
  886.         "wsrlhg wr8, wr8, wcgr0         nt"
  887.         "wsrlhg wr9, wr9, wcgr0         nt"
  888.         "wpackhus wr8, wr8, wr9         nt"
  889.         "subs %[h], %[h], #2            nt"
  890.         WAVG2B" wr8, wr8, wr12          nt"
  891.         "wstrd wr8, [%[block]]          nt"
  892.         "add %[block], %[block], %[line_size]   nt"
  893.         "pld [%[block]]                 nt"
  894.         "pld [%[block], #32]            nt"
  895.         "bne 1b                         nt"
  896.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block)
  897.         : [line_size]"r"(line_size)
  898.         : "r12", "memory");
  899. }
  900. void DEF(avg, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, const int line_size, int h)
  901. {
  902.     // [wr0 wr1 wr2 wr3] for previous line
  903.     // [wr4 wr5 wr6 wr7] for current line
  904.     SET_RND(wr15); // =2 for rnd  and  =1 for no_rnd version
  905.     __asm__ __volatile__(
  906.         "pld [%[block]]                 nt"
  907.         "pld [%[block], #32]            nt"
  908.         "pld [%[pixels]]                nt"
  909.         "mov r12, #2                    nt"
  910.         "pld [%[pixels], #32]           nt"
  911.         "tmcr wcgr0, r12                nt" /* for shift value */
  912.         /* alignment */
  913.         "and r12, %[pixels], #7         nt"
  914.         "bic %[pixels], %[pixels], #7           nt"
  915.         "tmcr wcgr1, r12                nt"
  916.         "add r12, r12, #1               nt"
  917.         "tmcr wcgr2, r12                nt"
  918.         // [wr0 wr1 wr2 wr3] <= *
  919.         // [wr4 wr5 wr6 wr7]
  920.         "wldrd wr12, [%[pixels]]        nt"
  921.         "cmp r12, #8                    nt"
  922.         "wldrd wr13, [%[pixels], #8]    nt"
  923.         "wldrd wr14, [%[pixels], #16]   nt"
  924.         "add %[pixels], %[pixels], %[line_size] nt"
  925.         "pld [%[pixels]]                nt"
  926.         "walignr1 wr2, wr12, wr13       nt"
  927.         "pld [%[pixels], #32]           nt"
  928.         "walignr1 wr3, wr13, wr14       nt"
  929.         "wmoveq wr10, wr13              nt"
  930.         "wmoveq wr11, wr14              nt"
  931.         "walignr2ne wr10, wr12, wr13    nt"
  932.         "walignr2ne wr11, wr13, wr14    nt"
  933.         "wunpckelub wr0, wr2            nt"
  934.         "wunpckehub wr1, wr2            nt"
  935.         "wunpckelub wr2, wr3            nt"
  936.         "wunpckehub wr3, wr3            nt"
  937.         "wunpckelub wr8, wr10           nt"
  938.         "wunpckehub wr9, wr10           nt"
  939.         "wunpckelub wr10, wr11          nt"
  940.         "wunpckehub wr11, wr11          nt"
  941.         "waddhus wr0, wr0, wr8          nt"
  942.         "waddhus wr1, wr1, wr9          nt"
  943.         "waddhus wr2, wr2, wr10         nt"
  944.         "waddhus wr3, wr3, wr11         nt"
  945.         "1:                             nt"
  946.         // [wr0 wr1 wr2 wr3]
  947.         // [wr4 wr5 wr6 wr7] <= *
  948.         "wldrd wr12, [%[pixels]]        nt"
  949.         "cmp r12, #8                    nt"
  950.         "wldrd wr13, [%[pixels], #8]    nt"
  951.         "wldrd wr14, [%[pixels], #16]   nt"
  952.         "add %[pixels], %[pixels], %[line_size] nt"
  953.         "walignr1 wr6, wr12, wr13       nt"
  954.         "pld [%[pixels]]                nt"
  955.         "pld [%[pixels], #32]           nt"
  956.         "walignr1 wr7, wr13, wr14       nt"
  957.         "wmoveq wr10, wr13              nt"
  958.         "wmoveq wr11, wr14              nt"
  959.         "walignr2ne wr10, wr12, wr13    nt"
  960.         "walignr2ne wr11, wr13, wr14    nt"
  961.         "wunpckelub wr4, wr6            nt"
  962.         "wunpckehub wr5, wr6            nt"
  963.         "wunpckelub wr6, wr7            nt"
  964.         "wunpckehub wr7, wr7            nt"
  965.         "wunpckelub wr8, wr10           nt"
  966.         "wunpckehub wr9, wr10           nt"
  967.         "wunpckelub wr10, wr11          nt"
  968.         "wunpckehub wr11, wr11          nt"
  969.         "waddhus wr4, wr4, wr8          nt"
  970.         "waddhus wr5, wr5, wr9          nt"
  971.         "waddhus wr6, wr6, wr10         nt"
  972.         "waddhus wr7, wr7, wr11         nt"
  973.         "waddhus wr8, wr0, wr4          nt"
  974.         "waddhus wr9, wr1, wr5          nt"
  975.         "waddhus wr10, wr2, wr6         nt"
  976.         "waddhus wr11, wr3, wr7         nt"
  977.         "waddhus wr8, wr8, wr15         nt"
  978.         "waddhus wr9, wr9, wr15         nt"
  979.         "waddhus wr10, wr10, wr15       nt"
  980.         "waddhus wr11, wr11, wr15       nt"
  981.         "wsrlhg wr8, wr8, wcgr0         nt"
  982.         "wsrlhg wr9, wr9, wcgr0         nt"
  983.         "wldrd wr12, [%[block]]         nt"
  984.         "wldrd wr13, [%[block], #8]     nt"
  985.         "wsrlhg wr10, wr10, wcgr0       nt"
  986.         "wsrlhg wr11, wr11, wcgr0       nt"
  987.         "wpackhus wr8, wr8, wr9         nt"
  988.         "wpackhus wr9, wr10, wr11       nt"
  989.         WAVG2B" wr8, wr8, wr12          nt"
  990.         WAVG2B" wr9, wr9, wr13          nt"
  991.         "wstrd wr8, [%[block]]          nt"
  992.         "wstrd wr9, [%[block], #8]      nt"
  993.         "add %[block], %[block], %[line_size]   nt"
  994.         // [wr0 wr1 wr2 wr3] <= *
  995.         // [wr4 wr5 wr6 wr7]
  996.         "wldrd wr12, [%[pixels]]        nt"
  997.         "pld [%[block]]                 nt"
  998.         "wldrd wr13, [%[pixels], #8]    nt"
  999.         "pld [%[block], #32]            nt"
  1000.         "wldrd wr14, [%[pixels], #16]   nt"
  1001.         "add %[pixels], %[pixels], %[line_size] nt"
  1002.         "walignr1 wr2, wr12, wr13       nt"
  1003.         "pld [%[pixels]]                nt"
  1004.         "pld [%[pixels], #32]           nt"
  1005.         "walignr1 wr3, wr13, wr14       nt"
  1006.         "wmoveq wr10, wr13              nt"
  1007.         "wmoveq wr11, wr14              nt"
  1008.         "walignr2ne wr10, wr12, wr13    nt"
  1009.         "walignr2ne wr11, wr13, wr14    nt"
  1010.         "wunpckelub wr0, wr2            nt"
  1011.         "wunpckehub wr1, wr2            nt"
  1012.         "wunpckelub wr2, wr3            nt"
  1013.         "wunpckehub wr3, wr3            nt"
  1014.         "wunpckelub wr8, wr10           nt"
  1015.         "wunpckehub wr9, wr10           nt"
  1016.         "wunpckelub wr10, wr11          nt"
  1017.         "wunpckehub wr11, wr11          nt"
  1018.         "waddhus wr0, wr0, wr8          nt"
  1019.         "waddhus wr1, wr1, wr9          nt"
  1020.         "waddhus wr2, wr2, wr10         nt"
  1021.         "waddhus wr3, wr3, wr11         nt"
  1022.         "waddhus wr8, wr0, wr4          nt"
  1023.         "waddhus wr9, wr1, wr5          nt"
  1024.         "waddhus wr10, wr2, wr6         nt"
  1025.         "waddhus wr11, wr3, wr7         nt"
  1026.         "waddhus wr8, wr8, wr15         nt"
  1027.         "waddhus wr9, wr9, wr15         nt"
  1028.         "waddhus wr10, wr10, wr15       nt"
  1029.         "waddhus wr11, wr11, wr15       nt"
  1030.         "wsrlhg wr8, wr8, wcgr0         nt"
  1031.         "wsrlhg wr9, wr9, wcgr0         nt"
  1032.         "wldrd wr12, [%[block]]         nt"
  1033.         "wldrd wr13, [%[block], #8]     nt"
  1034.         "wsrlhg wr10, wr10, wcgr0       nt"
  1035.         "wsrlhg wr11, wr11, wcgr0       nt"
  1036.         "wpackhus wr8, wr8, wr9         nt"
  1037.         "wpackhus wr9, wr10, wr11       nt"
  1038.         WAVG2B" wr8, wr8, wr12          nt"
  1039.         WAVG2B" wr9, wr9, wr13          nt"
  1040.         "wstrd wr8, [%[block]]          nt"
  1041.         "wstrd wr9, [%[block], #8]      nt"
  1042.         "add %[block], %[block], %[line_size]   nt"
  1043.         "subs %[h], %[h], #2            nt"
  1044.         "pld [%[block]]                 nt"
  1045.         "pld [%[block], #32]            nt"
  1046.         "bne 1b                         nt"
  1047.         : [h]"+r"(h), [pixels]"+r"(pixels), [block]"+r"(block)
  1048.         : [line_size]"r"(line_size)
  1049.         : "r12", "memory");
  1050. }