/media/libvpx/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.asm

http://github.com/zpao/v8monkey · Assembly · 154 lines · 101 code · 29 blank · 24 comment · 0 complexity · 1d35be9864b3ea51b5ed81de3c048ab4 MD5 · raw file

  1. ;
  2. ; Copyright (c) 2010 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. ;EXPORT |vp8_loop_filter_simple_vertical_edge_neon|
  11. EXPORT |vp8_loop_filter_bvs_neon|
  12. EXPORT |vp8_loop_filter_mbvs_neon|
  13. ARM
  14. PRESERVE8
  15. AREA ||.text||, CODE, READONLY, ALIGN=2
  16. ; r0 unsigned char *s, PRESERVE
  17. ; r1 int p, PRESERVE
  18. ; q1 limit, PRESERVE
  19. |vp8_loop_filter_simple_vertical_edge_neon| PROC
  20. sub r0, r0, #2 ; move src pointer down by 2 columns
  21. add r12, r1, r1
  22. add r3, r0, r1
  23. vld4.8 {d6[0], d7[0], d8[0], d9[0]}, [r0], r12
  24. vld4.8 {d6[1], d7[1], d8[1], d9[1]}, [r3], r12
  25. vld4.8 {d6[2], d7[2], d8[2], d9[2]}, [r0], r12
  26. vld4.8 {d6[3], d7[3], d8[3], d9[3]}, [r3], r12
  27. vld4.8 {d6[4], d7[4], d8[4], d9[4]}, [r0], r12
  28. vld4.8 {d6[5], d7[5], d8[5], d9[5]}, [r3], r12
  29. vld4.8 {d6[6], d7[6], d8[6], d9[6]}, [r0], r12
  30. vld4.8 {d6[7], d7[7], d8[7], d9[7]}, [r3], r12
  31. vld4.8 {d10[0], d11[0], d12[0], d13[0]}, [r0], r12
  32. vld4.8 {d10[1], d11[1], d12[1], d13[1]}, [r3], r12
  33. vld4.8 {d10[2], d11[2], d12[2], d13[2]}, [r0], r12
  34. vld4.8 {d10[3], d11[3], d12[3], d13[3]}, [r3], r12
  35. vld4.8 {d10[4], d11[4], d12[4], d13[4]}, [r0], r12
  36. vld4.8 {d10[5], d11[5], d12[5], d13[5]}, [r3], r12
  37. vld4.8 {d10[6], d11[6], d12[6], d13[6]}, [r0], r12
  38. vld4.8 {d10[7], d11[7], d12[7], d13[7]}, [r3]
  39. vswp d7, d10
  40. vswp d12, d9
  41. ;vp8_filter_mask() function
  42. ;vp8_hevmask() function
  43. sub r0, r0, r1, lsl #4
  44. vabd.u8 q15, q5, q4 ; abs(p0 - q0)
  45. vabd.u8 q14, q3, q6 ; abs(p1 - q1)
  46. vqadd.u8 q15, q15, q15 ; abs(p0 - q0) * 2
  47. vshr.u8 q14, q14, #1 ; abs(p1 - q1) / 2
  48. vmov.u8 q0, #0x80 ; 0x80
  49. vmov.s16 q11, #3
  50. vqadd.u8 q15, q15, q14 ; abs(p0 - q0) * 2 + abs(p1 - q1) / 2
  51. veor q4, q4, q0 ; qs0: q0 offset to convert to a signed value
  52. veor q5, q5, q0 ; ps0: p0 offset to convert to a signed value
  53. veor q3, q3, q0 ; ps1: p1 offset to convert to a signed value
  54. veor q6, q6, q0 ; qs1: q1 offset to convert to a signed value
  55. vcge.u8 q15, q1, q15 ; abs(p0 - q0)*2 + abs(p1-q1)/2 > flimit*2 + limit)*-1
  56. vsubl.s8 q2, d8, d10 ; ( qs0 - ps0)
  57. vsubl.s8 q13, d9, d11
  58. vqsub.s8 q14, q3, q6 ; vp8_filter = vp8_signed_char_clamp(ps1-qs1)
  59. vmul.s16 q2, q2, q11 ; 3 * ( qs0 - ps0)
  60. vmul.s16 q13, q13, q11
  61. vmov.u8 q11, #0x03 ; 0x03
  62. vmov.u8 q12, #0x04 ; 0x04
  63. vaddw.s8 q2, q2, d28 ; vp8_filter + 3 * ( qs0 - ps0)
  64. vaddw.s8 q13, q13, d29
  65. vqmovn.s16 d28, q2 ; vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * ( qs0 - ps0))
  66. vqmovn.s16 d29, q13
  67. add r0, r0, #1
  68. add r3, r0, r1
  69. vand q14, q14, q15 ; vp8_filter &= mask
  70. vqadd.s8 q2, q14, q11 ; Filter2 = vp8_signed_char_clamp(vp8_filter+3)
  71. vqadd.s8 q3, q14, q12 ; Filter1 = vp8_signed_char_clamp(vp8_filter+4)
  72. vshr.s8 q2, q2, #3 ; Filter2 >>= 3
  73. vshr.s8 q14, q3, #3 ; Filter1 >>= 3
  74. ;calculate output
  75. vqadd.s8 q11, q5, q2 ; u = vp8_signed_char_clamp(ps0 + Filter2)
  76. vqsub.s8 q10, q4, q14 ; u = vp8_signed_char_clamp(qs0 - Filter1)
  77. veor q6, q11, q0 ; *op0 = u^0x80
  78. veor q7, q10, q0 ; *oq0 = u^0x80
  79. add r12, r1, r1
  80. vswp d13, d14
  81. ;store op1, op0, oq0, oq1
  82. vst2.8 {d12[0], d13[0]}, [r0], r12
  83. vst2.8 {d12[1], d13[1]}, [r3], r12
  84. vst2.8 {d12[2], d13[2]}, [r0], r12
  85. vst2.8 {d12[3], d13[3]}, [r3], r12
  86. vst2.8 {d12[4], d13[4]}, [r0], r12
  87. vst2.8 {d12[5], d13[5]}, [r3], r12
  88. vst2.8 {d12[6], d13[6]}, [r0], r12
  89. vst2.8 {d12[7], d13[7]}, [r3], r12
  90. vst2.8 {d14[0], d15[0]}, [r0], r12
  91. vst2.8 {d14[1], d15[1]}, [r3], r12
  92. vst2.8 {d14[2], d15[2]}, [r0], r12
  93. vst2.8 {d14[3], d15[3]}, [r3], r12
  94. vst2.8 {d14[4], d15[4]}, [r0], r12
  95. vst2.8 {d14[5], d15[5]}, [r3], r12
  96. vst2.8 {d14[6], d15[6]}, [r0], r12
  97. vst2.8 {d14[7], d15[7]}, [r3]
  98. bx lr
  99. ENDP ; |vp8_loop_filter_simple_vertical_edge_neon|
  100. ; r0 unsigned char *y
  101. ; r1 int ystride
  102. ; r2 const unsigned char *blimit
  103. |vp8_loop_filter_bvs_neon| PROC
  104. push {r4, lr}
  105. ldrb r3, [r2] ; load blim from mem
  106. mov r4, r0
  107. add r0, r0, #4
  108. vdup.s8 q1, r3 ; duplicate blim
  109. bl vp8_loop_filter_simple_vertical_edge_neon
  110. ; vp8_loop_filter_simple_vertical_edge_neon preserves r1 and q1
  111. add r0, r4, #8
  112. bl vp8_loop_filter_simple_vertical_edge_neon
  113. add r0, r4, #12
  114. pop {r4, lr}
  115. b vp8_loop_filter_simple_vertical_edge_neon
  116. ENDP ;|vp8_loop_filter_bvs_neon|
  117. ; r0 unsigned char *y
  118. ; r1 int ystride
  119. ; r2 const unsigned char *blimit
  120. |vp8_loop_filter_mbvs_neon| PROC
  121. ldrb r3, [r2] ; load mblim from mem
  122. vdup.s8 q1, r3 ; duplicate mblim
  123. b vp8_loop_filter_simple_vertical_edge_neon
  124. ENDP ;|vp8_loop_filter_bvs_neon|
  125. END