resample.S 5.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2017 Matthieu Bouron <matthieu.bouron gmail.com>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "libavutil/aarch64/asm.S"
  21. function ff_resample_common_apply_filter_x4_float_neon, export=1
  22. movi v0.4S, #0 // accumulator
  23. 1: ld1 {v1.4S}, [x1], #16 // src[0..3]
  24. ld1 {v2.4S}, [x2], #16 // filter[0..3]
  25. fmla v0.4S, v1.4S, v2.4S // accumulator += src[0..3] * filter[0..3]
  26. subs w3, w3, #4 // filter_length -= 4
  27. b.gt 1b // loop until filter_length
  28. faddp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  29. faddp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  30. st1 {v0.S}[0], [x0], #4 // write accumulator
  31. ret
  32. endfunc
  33. function ff_resample_common_apply_filter_x8_float_neon, export=1
  34. movi v0.4S, #0 // accumulator
  35. 1: ld1 {v1.4S}, [x1], #16 // src[0..3]
  36. ld1 {v2.4S}, [x2], #16 // filter[0..3]
  37. ld1 {v3.4S}, [x1], #16 // src[4..7]
  38. ld1 {v4.4S}, [x2], #16 // filter[4..7]
  39. fmla v0.4S, v1.4S, v2.4S // accumulator += src[0..3] * filter[0..3]
  40. fmla v0.4S, v3.4S, v4.4S // accumulator += src[4..7] * filter[4..7]
  41. subs w3, w3, #8 // filter_length -= 8
  42. b.gt 1b // loop until filter_length
  43. faddp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  44. faddp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  45. st1 {v0.S}[0], [x0], #4 // write accumulator
  46. ret
  47. endfunc
  48. function ff_resample_common_apply_filter_x4_s16_neon, export=1
  49. movi v0.4S, #0 // accumulator
  50. 1: ld1 {v1.4H}, [x1], #8 // src[0..3]
  51. ld1 {v2.4H}, [x2], #8 // filter[0..3]
  52. smlal v0.4S, v1.4H, v2.4H // accumulator += src[0..3] * filter[0..3]
  53. subs w3, w3, #4 // filter_length -= 4
  54. b.gt 1b // loop until filter_length
  55. addp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  56. addp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  57. st1 {v0.S}[0], [x0], #4 // write accumulator
  58. ret
  59. endfunc
  60. function ff_resample_common_apply_filter_x8_s16_neon, export=1
  61. movi v0.4S, #0 // accumulator
  62. 1: ld1 {v1.8H}, [x1], #16 // src[0..7]
  63. ld1 {v2.8H}, [x2], #16 // filter[0..7]
  64. smlal v0.4S, v1.4H, v2.4H // accumulator += src[0..3] * filter[0..3]
  65. smlal2 v0.4S, v1.8H, v2.8H // accumulator += src[4..7] * filter[4..7]
  66. subs w3, w3, #8 // filter_length -= 8
  67. b.gt 1b // loop until filter_length
  68. addp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  69. addp v0.4S, v0.4S, v0.4S // pair adding of the 4x32-bit accumulated values
  70. st1 {v0.S}[0], [x0], #4 // write accumulator
  71. ret
  72. endfunc