highbd_vpx_convolve_avg_neon.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * Copyright (c) 2016 The WebM project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #include <arm_neon.h>
  11. #include "./vpx_dsp_rtcd.h"
  12. #include "vpx/vpx_integer.h"
  13. void vpx_highbd_convolve_avg_neon(const uint16_t *src, ptrdiff_t src_stride,
  14. uint16_t *dst, ptrdiff_t dst_stride,
  15. const InterpKernel *filter, int x0_q4,
  16. int x_step_q4, int y0_q4, int y_step_q4,
  17. int w, int h, int bd) {
  18. (void)filter;
  19. (void)x0_q4;
  20. (void)x_step_q4;
  21. (void)y0_q4;
  22. (void)y_step_q4;
  23. (void)bd;
  24. if (w < 8) { // avg4
  25. uint16x4_t s0, s1, d0, d1;
  26. uint16x8_t s01, d01;
  27. do {
  28. s0 = vld1_u16(src);
  29. d0 = vld1_u16(dst);
  30. src += src_stride;
  31. s1 = vld1_u16(src);
  32. d1 = vld1_u16(dst + dst_stride);
  33. src += src_stride;
  34. s01 = vcombine_u16(s0, s1);
  35. d01 = vcombine_u16(d0, d1);
  36. d01 = vrhaddq_u16(s01, d01);
  37. vst1_u16(dst, vget_low_u16(d01));
  38. dst += dst_stride;
  39. vst1_u16(dst, vget_high_u16(d01));
  40. dst += dst_stride;
  41. h -= 2;
  42. } while (h > 0);
  43. } else if (w == 8) { // avg8
  44. uint16x8_t s0, s1, d0, d1;
  45. do {
  46. s0 = vld1q_u16(src);
  47. d0 = vld1q_u16(dst);
  48. src += src_stride;
  49. s1 = vld1q_u16(src);
  50. d1 = vld1q_u16(dst + dst_stride);
  51. src += src_stride;
  52. d0 = vrhaddq_u16(s0, d0);
  53. d1 = vrhaddq_u16(s1, d1);
  54. vst1q_u16(dst, d0);
  55. dst += dst_stride;
  56. vst1q_u16(dst, d1);
  57. dst += dst_stride;
  58. h -= 2;
  59. } while (h > 0);
  60. } else if (w < 32) { // avg16
  61. uint16x8_t s0l, s0h, s1l, s1h, d0l, d0h, d1l, d1h;
  62. do {
  63. s0l = vld1q_u16(src);
  64. s0h = vld1q_u16(src + 8);
  65. d0l = vld1q_u16(dst);
  66. d0h = vld1q_u16(dst + 8);
  67. src += src_stride;
  68. s1l = vld1q_u16(src);
  69. s1h = vld1q_u16(src + 8);
  70. d1l = vld1q_u16(dst + dst_stride);
  71. d1h = vld1q_u16(dst + dst_stride + 8);
  72. src += src_stride;
  73. d0l = vrhaddq_u16(s0l, d0l);
  74. d0h = vrhaddq_u16(s0h, d0h);
  75. d1l = vrhaddq_u16(s1l, d1l);
  76. d1h = vrhaddq_u16(s1h, d1h);
  77. vst1q_u16(dst, d0l);
  78. vst1q_u16(dst + 8, d0h);
  79. dst += dst_stride;
  80. vst1q_u16(dst, d1l);
  81. vst1q_u16(dst + 8, d1h);
  82. dst += dst_stride;
  83. h -= 2;
  84. } while (h > 0);
  85. } else if (w == 32) { // avg32
  86. uint16x8_t s0, s1, s2, s3, d0, d1, d2, d3;
  87. do {
  88. s0 = vld1q_u16(src);
  89. s1 = vld1q_u16(src + 8);
  90. s2 = vld1q_u16(src + 16);
  91. s3 = vld1q_u16(src + 24);
  92. d0 = vld1q_u16(dst);
  93. d1 = vld1q_u16(dst + 8);
  94. d2 = vld1q_u16(dst + 16);
  95. d3 = vld1q_u16(dst + 24);
  96. src += src_stride;
  97. d0 = vrhaddq_u16(s0, d0);
  98. d1 = vrhaddq_u16(s1, d1);
  99. d2 = vrhaddq_u16(s2, d2);
  100. d3 = vrhaddq_u16(s3, d3);
  101. vst1q_u16(dst, d0);
  102. vst1q_u16(dst + 8, d1);
  103. vst1q_u16(dst + 16, d2);
  104. vst1q_u16(dst + 24, d3);
  105. dst += dst_stride;
  106. s0 = vld1q_u16(src);
  107. s1 = vld1q_u16(src + 8);
  108. s2 = vld1q_u16(src + 16);
  109. s3 = vld1q_u16(src + 24);
  110. d0 = vld1q_u16(dst);
  111. d1 = vld1q_u16(dst + 8);
  112. d2 = vld1q_u16(dst + 16);
  113. d3 = vld1q_u16(dst + 24);
  114. src += src_stride;
  115. d0 = vrhaddq_u16(s0, d0);
  116. d1 = vrhaddq_u16(s1, d1);
  117. d2 = vrhaddq_u16(s2, d2);
  118. d3 = vrhaddq_u16(s3, d3);
  119. vst1q_u16(dst, d0);
  120. vst1q_u16(dst + 8, d1);
  121. vst1q_u16(dst + 16, d2);
  122. vst1q_u16(dst + 24, d3);
  123. dst += dst_stride;
  124. h -= 2;
  125. } while (h > 0);
  126. } else { // avg64
  127. uint16x8_t s0, s1, s2, s3, d0, d1, d2, d3;
  128. do {
  129. s0 = vld1q_u16(src);
  130. s1 = vld1q_u16(src + 8);
  131. s2 = vld1q_u16(src + 16);
  132. s3 = vld1q_u16(src + 24);
  133. d0 = vld1q_u16(dst);
  134. d1 = vld1q_u16(dst + 8);
  135. d2 = vld1q_u16(dst + 16);
  136. d3 = vld1q_u16(dst + 24);
  137. d0 = vrhaddq_u16(s0, d0);
  138. d1 = vrhaddq_u16(s1, d1);
  139. d2 = vrhaddq_u16(s2, d2);
  140. d3 = vrhaddq_u16(s3, d3);
  141. vst1q_u16(dst, d0);
  142. vst1q_u16(dst + 8, d1);
  143. vst1q_u16(dst + 16, d2);
  144. vst1q_u16(dst + 24, d3);
  145. s0 = vld1q_u16(src + 32);
  146. s1 = vld1q_u16(src + 40);
  147. s2 = vld1q_u16(src + 48);
  148. s3 = vld1q_u16(src + 56);
  149. d0 = vld1q_u16(dst + 32);
  150. d1 = vld1q_u16(dst + 40);
  151. d2 = vld1q_u16(dst + 48);
  152. d3 = vld1q_u16(dst + 56);
  153. d0 = vrhaddq_u16(s0, d0);
  154. d1 = vrhaddq_u16(s1, d1);
  155. d2 = vrhaddq_u16(s2, d2);
  156. d3 = vrhaddq_u16(s3, d3);
  157. vst1q_u16(dst + 32, d0);
  158. vst1q_u16(dst + 40, d1);
  159. vst1q_u16(dst + 48, d2);
  160. vst1q_u16(dst + 56, d3);
  161. src += src_stride;
  162. dst += dst_stride;
  163. } while (--h);
  164. }
  165. }