vpx_convolve8_neon.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2014 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_config.h"
  12. #include "./vpx_dsp_rtcd.h"
  13. static INLINE void load_u8_8x4(const uint8_t *s, const ptrdiff_t p,
  14. uint8x8_t *const s0, uint8x8_t *const s1,
  15. uint8x8_t *const s2, uint8x8_t *const s3) {
  16. *s0 = vld1_u8(s);
  17. s += p;
  18. *s1 = vld1_u8(s);
  19. s += p;
  20. *s2 = vld1_u8(s);
  21. s += p;
  22. *s3 = vld1_u8(s);
  23. }
  24. static INLINE void load_u8_8x8(const uint8_t *s, const ptrdiff_t p,
  25. uint8x8_t *const s0, uint8x8_t *const s1,
  26. uint8x8_t *const s2, uint8x8_t *const s3,
  27. uint8x8_t *const s4, uint8x8_t *const s5,
  28. uint8x8_t *const s6, uint8x8_t *const s7) {
  29. *s0 = vld1_u8(s);
  30. s += p;
  31. *s1 = vld1_u8(s);
  32. s += p;
  33. *s2 = vld1_u8(s);
  34. s += p;
  35. *s3 = vld1_u8(s);
  36. s += p;
  37. *s4 = vld1_u8(s);
  38. s += p;
  39. *s5 = vld1_u8(s);
  40. s += p;
  41. *s6 = vld1_u8(s);
  42. s += p;
  43. *s7 = vld1_u8(s);
  44. }
  45. static INLINE int16x4_t convolve8_4(const int16x4_t s0, const int16x4_t s1,
  46. const int16x4_t s2, const int16x4_t s3,
  47. const int16x4_t s4, const int16x4_t s5,
  48. const int16x4_t s6, const int16x4_t s7,
  49. const int16x8_t filters,
  50. const int16x4_t filter3,
  51. const int16x4_t filter4) {
  52. const int16x4_t filters_lo = vget_low_s16(filters);
  53. const int16x4_t filters_hi = vget_high_s16(filters);
  54. int16x4_t sum;
  55. sum = vmul_lane_s16(s0, filters_lo, 0);
  56. sum = vmla_lane_s16(sum, s1, filters_lo, 1);
  57. sum = vmla_lane_s16(sum, s2, filters_lo, 2);
  58. sum = vmla_lane_s16(sum, s5, filters_hi, 1);
  59. sum = vmla_lane_s16(sum, s6, filters_hi, 2);
  60. sum = vmla_lane_s16(sum, s7, filters_hi, 3);
  61. sum = vqadd_s16(sum, vmul_s16(s3, filter3));
  62. sum = vqadd_s16(sum, vmul_s16(s4, filter4));
  63. return sum;
  64. }
  65. static INLINE uint8x8_t convolve8_8(const int16x8_t s0, const int16x8_t s1,
  66. const int16x8_t s2, const int16x8_t s3,
  67. const int16x8_t s4, const int16x8_t s5,
  68. const int16x8_t s6, const int16x8_t s7,
  69. const int16x8_t filters,
  70. const int16x8_t filter3,
  71. const int16x8_t filter4) {
  72. const int16x4_t filters_lo = vget_low_s16(filters);
  73. const int16x4_t filters_hi = vget_high_s16(filters);
  74. int16x8_t sum;
  75. sum = vmulq_lane_s16(s0, filters_lo, 0);
  76. sum = vmlaq_lane_s16(sum, s1, filters_lo, 1);
  77. sum = vmlaq_lane_s16(sum, s2, filters_lo, 2);
  78. sum = vmlaq_lane_s16(sum, s5, filters_hi, 1);
  79. sum = vmlaq_lane_s16(sum, s6, filters_hi, 2);
  80. sum = vmlaq_lane_s16(sum, s7, filters_hi, 3);
  81. sum = vqaddq_s16(sum, vmulq_s16(s3, filter3));
  82. sum = vqaddq_s16(sum, vmulq_s16(s4, filter4));
  83. return vqrshrun_n_s16(sum, 7);
  84. }
  85. static INLINE uint8x8_t scale_filter_8(const uint8x8_t *const s,
  86. const int16x8_t filters) {
  87. const int16x8_t filter3 = vdupq_lane_s16(vget_low_s16(filters), 3);
  88. const int16x8_t filter4 = vdupq_lane_s16(vget_high_s16(filters), 0);
  89. int16x8_t ss[8];
  90. ss[0] = vreinterpretq_s16_u16(vmovl_u8(s[0]));
  91. ss[1] = vreinterpretq_s16_u16(vmovl_u8(s[1]));
  92. ss[2] = vreinterpretq_s16_u16(vmovl_u8(s[2]));
  93. ss[3] = vreinterpretq_s16_u16(vmovl_u8(s[3]));
  94. ss[4] = vreinterpretq_s16_u16(vmovl_u8(s[4]));
  95. ss[5] = vreinterpretq_s16_u16(vmovl_u8(s[5]));
  96. ss[6] = vreinterpretq_s16_u16(vmovl_u8(s[6]));
  97. ss[7] = vreinterpretq_s16_u16(vmovl_u8(s[7]));
  98. return convolve8_8(ss[0], ss[1], ss[2], ss[3], ss[4], ss[5], ss[6], ss[7],
  99. filters, filter3, filter4);
  100. }