armencfrag.s 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. ;********************************************************************
  2. ;* *
  3. ;* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
  4. ;* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
  5. ;* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  6. ;* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
  7. ;* *
  8. ;* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
  9. ;* by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
  10. ;* *
  11. ;********************************************************************
  12. ;
  13. ; function:
  14. ; last mod: $Id: mmxstate.c 17247 2010-05-28 05:35:32Z tterribe $
  15. ;
  16. ;********************************************************************
  17. AREA |.text|, CODE, READONLY
  18. GET armopts.s
  19. [ OC_ARM_ASM_NEON
  20. EXPORT oc_enc_frag_satd_neon
  21. EXPORT oc_enc_frag_satd2_neon
  22. EXPORT oc_enc_frag_intra_satd_neon
  23. oc_enc_frag_satd_neon PROC
  24. ; r0 = int *_dc
  25. ; r1 = const unsigned char *_src
  26. ; r2 = const unsigned char *_ref
  27. ; r3 = int _ystride
  28. ; Load src and subtract ref, expanding to 16 bits.
  29. VLD1.64 {D16},[r1@64],r3
  30. VLD1.64 {D0}, [r2],r3
  31. VSUBL.U8 Q8, D16,D0
  32. VLD1.64 {D18},[r1@64],r3
  33. VLD1.64 {D1}, [r2],r3
  34. VSUBL.U8 Q9, D18,D1
  35. VLD1.64 {D20},[r1@64],r3
  36. VLD1.64 {D2}, [r2],r3
  37. VSUBL.U8 Q10,D20,D2
  38. VLD1.64 {D22},[r1@64],r3
  39. VLD1.64 {D3}, [r2],r3
  40. VSUBL.U8 Q11,D22,D3
  41. VLD1.64 {D24},[r1@64],r3
  42. VLD1.64 {D4}, [r2],r3
  43. VSUBL.U8 Q12,D24,D4
  44. VLD1.64 {D26},[r1@64],r3
  45. VLD1.64 {D5}, [r2],r3
  46. VSUBL.U8 Q13,D26,D5
  47. VLD1.64 {D28},[r1@64],r3
  48. VLD1.64 {D6}, [r2],r3
  49. VSUBL.U8 Q14,D28,D6
  50. VLD1.64 {D30},[r1@64]
  51. VLD1.64 {D7}, [r2]
  52. VSUBL.U8 Q15,D30,D7
  53. oc_int_frag_satd_neon
  54. ; Hadamard Stage A
  55. VADD.I16 Q0, Q8, Q12
  56. VSUB.I16 Q12,Q8, Q12
  57. VSUB.I16 Q1, Q9, Q13
  58. VADD.I16 Q9, Q9, Q13
  59. VSUB.I16 Q2, Q10,Q14
  60. VADD.I16 Q10,Q10,Q14
  61. VADD.I16 Q3, Q11,Q15
  62. VSUB.I16 Q15,Q11,Q15
  63. ; Hadamard Stage B
  64. VADD.I16 Q8, Q0, Q10
  65. VSUB.I16 Q0, Q0, Q10
  66. VSUB.I16 Q11,Q9, Q3
  67. VADD.I16 Q3, Q9, Q3
  68. VSUB.I16 Q14,Q12,Q2
  69. VADD.I16 Q2, Q12,Q2
  70. VADD.I16 Q13,Q1, Q15
  71. VSUB.I16 Q1, Q1, Q15
  72. ; Hadamard Stage C & Start 8x8 Transpose
  73. VSUB.I16 Q9, Q8, Q3
  74. VADD.I16 Q8, Q8, Q3
  75. VTRN.16 Q8, Q9
  76. VADD.I16 Q10,Q0, Q11
  77. VSUB.I16 Q11,Q0, Q11
  78. VTRN.16 Q10,Q11
  79. VADD.I16 Q12,Q2, Q13
  80. VTRN.32 Q8, Q10
  81. VSUB.I16 Q13,Q2, Q13
  82. VTRN.32 Q9, Q11
  83. VSUB.I16 Q15,Q14,Q1
  84. VTRN.16 Q12,Q13
  85. VADD.I16 Q14,Q14,Q1
  86. VTRN.16 Q14,Q15
  87. VTRN.32 Q12,Q14
  88. VSWP D17,D24
  89. ; Hadamard Stage A & Finish 8x8 Transpose
  90. VADD.I16 Q0, Q8, Q12
  91. VTRN.32 Q13,Q15
  92. VSUB.I16 Q12,Q8, Q12
  93. VSWP D19,D26
  94. VSUB.I16 Q1, Q9, Q13
  95. VSWP D21,D28
  96. VADD.I16 Q9, Q9, Q13
  97. VSWP D23,D30
  98. VSUB.I16 Q2, Q10,Q14
  99. VADD.I16 Q10,Q10,Q14
  100. VADD.I16 Q3, Q11,Q15
  101. VSUB.I16 Q15,Q11,Q15
  102. ; Hadamard Stage B
  103. VADD.I16 Q8, Q0, Q10
  104. VSUB.I16 Q0, Q0, Q10
  105. VSUB.I16 Q11,Q9, Q3
  106. VADD.I16 Q3, Q9, Q3
  107. VSUB.I16 Q14,Q12,Q2
  108. VADD.I16 Q2, Q12,Q2
  109. VADD.I16 Q13,Q1, Q15
  110. VSUB.I16 Q1, Q1, Q15
  111. ; Hadamard Stage C & abs & accum
  112. VNEG.S16 Q9, Q3
  113. ; Compute the (signed) DC component and save it off.
  114. VADDL.S16 Q10,D16,D6
  115. VABD.S16 Q12,Q8, Q9
  116. VABD.S16 Q15,Q11,Q0
  117. VST1.32 D20[0],[r0]
  118. ; Remove the (abs) DC component from the total.
  119. MOV r3,#0
  120. VMOV.I16 D24[0],r3
  121. VABA.S16 Q12,Q13,Q2
  122. VABA.S16 Q15,Q14,Q1
  123. VNEG.S16 Q0, Q0
  124. VNEG.S16 Q2, Q2
  125. VNEG.S16 Q1, Q1
  126. VABA.S16 Q12,Q8, Q3
  127. VABA.S16 Q15,Q11,Q0
  128. VABA.S16 Q12,Q13,Q2
  129. VABA.S16 Q15,Q14,Q1
  130. ; We're now using all 16 bits of each value.
  131. VPADDL.U16 Q12,Q12
  132. VPADAL.U16 Q12,Q15
  133. VADD.U32 D24,D24,D25
  134. VPADDL.U32 D24,D24
  135. VMOV.U32 r0, D24[0]
  136. MOV PC, r14
  137. ENDP
  138. oc_enc_frag_satd2_neon PROC
  139. ; r0 = int *_dc
  140. ; r1 = const unsigned char *_src
  141. ; r2 = const unsigned char *_ref1
  142. ; r3 = const unsigned char *_ref2
  143. ; r12= int _ystride
  144. LDR r12,[r13]
  145. ; Load src and subtract (ref1+ref2>>1), expanding to 16 bits.
  146. VLD1.64 {D0}, [r2],r12
  147. VLD1.64 {D1}, [r3],r12
  148. VLD1.64 {D16},[r1@64],r12
  149. VHADD.U8 D0, D0, D1
  150. VLD1.64 {D2}, [r2],r12
  151. VLD1.64 {D3}, [r3],r12
  152. VSUBL.U8 Q8, D16,D0
  153. VLD1.64 {D18},[r1@64],r12
  154. VHADD.U8 D2, D2, D3
  155. VLD1.64 {D4}, [r2],r12
  156. VLD1.64 {D5}, [r3],r12
  157. VSUBL.U8 Q9, D18,D2
  158. VLD1.64 {D20},[r1@64],r12
  159. VHADD.U8 D4, D4, D5
  160. VLD1.64 {D6}, [r2],r12
  161. VLD1.64 {D7}, [r3],r12
  162. VSUBL.U8 Q10,D20,D4
  163. VLD1.64 {D22},[r1@64],r12
  164. VHADD.U8 D6, D6, D7
  165. VLD1.64 {D0}, [r2],r12
  166. VLD1.64 {D1}, [r3],r12
  167. VSUBL.U8 Q11,D22,D6
  168. VLD1.64 {D24},[r1@64],r12
  169. VHADD.U8 D0, D0, D1
  170. VLD1.64 {D2}, [r2],r12
  171. VLD1.64 {D3}, [r3],r12
  172. VSUBL.U8 Q12,D24,D0
  173. VLD1.64 {D26},[r1@64],r12
  174. VHADD.U8 D2, D2, D3
  175. VLD1.64 {D4}, [r2],r12
  176. VLD1.64 {D5}, [r3],r12
  177. VSUBL.U8 Q13,D26,D2
  178. VLD1.64 {D28},[r1@64],r12
  179. VHADD.U8 D4, D4, D5
  180. VLD1.64 {D6}, [r2]
  181. VSUBL.U8 Q14,D28,D4
  182. VLD1.64 {D7}, [r3]
  183. VHADD.U8 D6, D6, D7
  184. VLD1.64 {D30},[r1@64]
  185. VSUBL.U8 Q15,D30,D6
  186. B oc_int_frag_satd_neon
  187. ENDP
  188. oc_enc_frag_intra_satd_neon PROC
  189. ; r0 = int *_dc
  190. ; r1 = const unsigned char *_src
  191. ; r2 = int _ystride
  192. ; Load and subtract 128 from src, expanding to 16 bits.
  193. VMOV.I8 D0,#128
  194. VLD1.64 {D16},[r1@64],r2
  195. VSUBL.U8 Q8, D16,D0
  196. VLD1.64 {D18},[r1@64],r2
  197. VSUBL.U8 Q9, D18,D0
  198. VLD1.64 {D20},[r1@64],r2
  199. VSUBL.U8 Q10,D20,D0
  200. VLD1.64 {D22},[r1@64],r2
  201. VSUBL.U8 Q11,D22,D0
  202. VLD1.64 {D24},[r1@64],r2
  203. VSUBL.U8 Q12,D24,D0
  204. VLD1.64 {D26},[r1@64],r2
  205. VSUBL.U8 Q13,D26,D0
  206. VLD1.64 {D28},[r1@64],r2
  207. VSUBL.U8 Q14,D28,D0
  208. VLD1.64 {D30},[r1@64]
  209. VSUBL.U8 Q15,D30,D0
  210. B oc_int_frag_satd_neon
  211. ENDP
  212. ]
  213. END