You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1147 lines
40KB

  1. /*
  2. * ARM NEON optimised DSP functions
  3. * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "config.h"
  22. #include "asm.S"
  23. preserve8
  24. .text
  25. .macro pixels16 avg=0
  26. .if \avg
  27. mov ip, r0
  28. .endif
  29. 1: vld1.64 {d0, d1}, [r1], r2
  30. vld1.64 {d2, d3}, [r1], r2
  31. vld1.64 {d4, d5}, [r1], r2
  32. pld [r1, r2, lsl #2]
  33. vld1.64 {d6, d7}, [r1], r2
  34. pld [r1]
  35. pld [r1, r2]
  36. pld [r1, r2, lsl #1]
  37. .if \avg
  38. vld1.64 {d16,d17}, [ip,:128], r2
  39. vrhadd.u8 q0, q0, q8
  40. vld1.64 {d18,d19}, [ip,:128], r2
  41. vrhadd.u8 q1, q1, q9
  42. vld1.64 {d20,d21}, [ip,:128], r2
  43. vrhadd.u8 q2, q2, q10
  44. vld1.64 {d22,d23}, [ip,:128], r2
  45. vrhadd.u8 q3, q3, q11
  46. .endif
  47. subs r3, r3, #4
  48. vst1.64 {d0, d1}, [r0,:128], r2
  49. vst1.64 {d2, d3}, [r0,:128], r2
  50. vst1.64 {d4, d5}, [r0,:128], r2
  51. vst1.64 {d6, d7}, [r0,:128], r2
  52. bne 1b
  53. bx lr
  54. .endm
  55. .macro pixels16_x2 vhadd=vrhadd.u8
  56. 1: vld1.64 {d0-d2}, [r1], r2
  57. vld1.64 {d4-d6}, [r1], r2
  58. pld [r1]
  59. pld [r1, r2]
  60. subs r3, r3, #2
  61. vext.8 q1, q0, q1, #1
  62. \vhadd q0, q0, q1
  63. vext.8 q3, q2, q3, #1
  64. \vhadd q2, q2, q3
  65. vst1.64 {d0, d1}, [r0,:128], r2
  66. vst1.64 {d4, d5}, [r0,:128], r2
  67. bne 1b
  68. bx lr
  69. .endm
  70. .macro pixels16_y2 vhadd=vrhadd.u8
  71. vld1.64 {d0, d1}, [r1], r2
  72. vld1.64 {d2, d3}, [r1], r2
  73. 1: subs r3, r3, #2
  74. \vhadd q2, q0, q1
  75. vld1.64 {d0, d1}, [r1], r2
  76. \vhadd q3, q0, q1
  77. vld1.64 {d2, d3}, [r1], r2
  78. pld [r1]
  79. pld [r1, r2]
  80. vst1.64 {d4, d5}, [r0,:128], r2
  81. vst1.64 {d6, d7}, [r0,:128], r2
  82. bne 1b
  83. bx lr
  84. .endm
  85. .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0
  86. vld1.64 {d0-d2}, [r1], r2
  87. vld1.64 {d4-d6}, [r1], r2
  88. .if \no_rnd
  89. vmov.i16 q13, #1
  90. .endif
  91. pld [r1]
  92. pld [r1, r2]
  93. vext.8 q1, q0, q1, #1
  94. vext.8 q3, q2, q3, #1
  95. vaddl.u8 q8, d0, d2
  96. vaddl.u8 q10, d1, d3
  97. vaddl.u8 q9, d4, d6
  98. vaddl.u8 q11, d5, d7
  99. 1: subs r3, r3, #2
  100. vld1.64 {d0-d2}, [r1], r2
  101. vadd.u16 q12, q8, q9
  102. pld [r1]
  103. .if \no_rnd
  104. vadd.u16 q12, q12, q13
  105. .endif
  106. vext.8 q15, q0, q1, #1
  107. vadd.u16 q1 , q10, q11
  108. \vshrn d28, q12, #2
  109. .if \no_rnd
  110. vadd.u16 q1, q1, q13
  111. .endif
  112. \vshrn d29, q1, #2
  113. vaddl.u8 q8, d0, d30
  114. vld1.64 {d2-d4}, [r1], r2
  115. vaddl.u8 q10, d1, d31
  116. vst1.64 {d28,d29}, [r0,:128], r2
  117. vadd.u16 q12, q8, q9
  118. pld [r1, r2]
  119. .if \no_rnd
  120. vadd.u16 q12, q12, q13
  121. .endif
  122. vext.8 q2, q1, q2, #1
  123. vadd.u16 q0, q10, q11
  124. \vshrn d30, q12, #2
  125. .if \no_rnd
  126. vadd.u16 q0, q0, q13
  127. .endif
  128. \vshrn d31, q0, #2
  129. vaddl.u8 q9, d2, d4
  130. vaddl.u8 q11, d3, d5
  131. vst1.64 {d30,d31}, [r0,:128], r2
  132. bgt 1b
  133. bx lr
  134. .endm
  135. .macro pixels8 avg=0
  136. 1: vld1.64 {d0}, [r1], r2
  137. vld1.64 {d1}, [r1], r2
  138. vld1.64 {d2}, [r1], r2
  139. pld [r1, r2, lsl #2]
  140. vld1.64 {d3}, [r1], r2
  141. pld [r1]
  142. pld [r1, r2]
  143. pld [r1, r2, lsl #1]
  144. .if \avg
  145. vld1.64 {d4}, [r0,:64], r2
  146. vrhadd.u8 d0, d0, d4
  147. vld1.64 {d5}, [r0,:64], r2
  148. vrhadd.u8 d1, d1, d5
  149. vld1.64 {d6}, [r0,:64], r2
  150. vrhadd.u8 d2, d2, d6
  151. vld1.64 {d7}, [r0,:64], r2
  152. vrhadd.u8 d3, d3, d7
  153. sub r0, r0, r2, lsl #2
  154. .endif
  155. subs r3, r3, #4
  156. vst1.64 {d0}, [r0,:64], r2
  157. vst1.64 {d1}, [r0,:64], r2
  158. vst1.64 {d2}, [r0,:64], r2
  159. vst1.64 {d3}, [r0,:64], r2
  160. bne 1b
  161. bx lr
  162. .endm
  163. .macro pixels8_x2 vhadd=vrhadd.u8
  164. 1: vld1.64 {d0, d1}, [r1], r2
  165. vext.8 d1, d0, d1, #1
  166. vld1.64 {d2, d3}, [r1], r2
  167. vext.8 d3, d2, d3, #1
  168. pld [r1]
  169. pld [r1, r2]
  170. subs r3, r3, #2
  171. vswp d1, d2
  172. \vhadd q0, q0, q1
  173. vst1.64 {d0}, [r0,:64], r2
  174. vst1.64 {d1}, [r0,:64], r2
  175. bne 1b
  176. bx lr
  177. .endm
  178. .macro pixels8_y2 vhadd=vrhadd.u8
  179. vld1.64 {d0}, [r1], r2
  180. vld1.64 {d1}, [r1], r2
  181. 1: subs r3, r3, #2
  182. \vhadd d4, d0, d1
  183. vld1.64 {d0}, [r1], r2
  184. \vhadd d5, d0, d1
  185. vld1.64 {d1}, [r1], r2
  186. pld [r1]
  187. pld [r1, r2]
  188. vst1.64 {d4}, [r0,:64], r2
  189. vst1.64 {d5}, [r0,:64], r2
  190. bne 1b
  191. bx lr
  192. .endm
  193. .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0
  194. vld1.64 {d0, d1}, [r1], r2
  195. vld1.64 {d2, d3}, [r1], r2
  196. .if \no_rnd
  197. vmov.i16 q11, #1
  198. .endif
  199. pld [r1]
  200. pld [r1, r2]
  201. vext.8 d4, d0, d1, #1
  202. vext.8 d6, d2, d3, #1
  203. vaddl.u8 q8, d0, d4
  204. vaddl.u8 q9, d2, d6
  205. 1: subs r3, r3, #2
  206. vld1.64 {d0, d1}, [r1], r2
  207. pld [r1]
  208. vadd.u16 q10, q8, q9
  209. vext.8 d4, d0, d1, #1
  210. .if \no_rnd
  211. vadd.u16 q10, q10, q11
  212. .endif
  213. vaddl.u8 q8, d0, d4
  214. \vshrn d5, q10, #2
  215. vld1.64 {d2, d3}, [r1], r2
  216. vadd.u16 q10, q8, q9
  217. pld [r1, r2]
  218. .if \no_rnd
  219. vadd.u16 q10, q10, q11
  220. .endif
  221. vst1.64 {d5}, [r0,:64], r2
  222. \vshrn d7, q10, #2
  223. vext.8 d6, d2, d3, #1
  224. vaddl.u8 q9, d2, d6
  225. vst1.64 {d7}, [r0,:64], r2
  226. bgt 1b
  227. bx lr
  228. .endm
  229. .macro pixfunc pfx name suf rnd_op args:vararg
  230. function ff_\pfx\name\suf\()_neon, export=1
  231. \name \rnd_op \args
  232. endfunc
  233. .endm
  234. .macro pixfunc2 pfx name args:vararg
  235. pixfunc \pfx \name
  236. pixfunc \pfx \name \args
  237. .endm
  238. function ff_put_h264_qpel16_mc00_neon, export=1
  239. mov r3, #16
  240. endfunc
  241. pixfunc put_ pixels16
  242. pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8
  243. pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8
  244. pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1
  245. function ff_avg_h264_qpel16_mc00_neon, export=1
  246. mov r3, #16
  247. endfunc
  248. pixfunc avg_ pixels16,, 1
  249. function ff_put_h264_qpel8_mc00_neon, export=1
  250. mov r3, #8
  251. endfunc
  252. pixfunc put_ pixels8
  253. pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8
  254. pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8
  255. pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1
  256. function ff_avg_h264_qpel8_mc00_neon, export=1
  257. mov r3, #8
  258. endfunc
  259. pixfunc avg_ pixels8,, 1
  260. function ff_put_pixels_clamped_neon, export=1
  261. vld1.64 {d16-d19}, [r0,:128]!
  262. vqmovun.s16 d0, q8
  263. vld1.64 {d20-d23}, [r0,:128]!
  264. vqmovun.s16 d1, q9
  265. vld1.64 {d24-d27}, [r0,:128]!
  266. vqmovun.s16 d2, q10
  267. vld1.64 {d28-d31}, [r0,:128]!
  268. vqmovun.s16 d3, q11
  269. vst1.64 {d0}, [r1,:64], r2
  270. vqmovun.s16 d4, q12
  271. vst1.64 {d1}, [r1,:64], r2
  272. vqmovun.s16 d5, q13
  273. vst1.64 {d2}, [r1,:64], r2
  274. vqmovun.s16 d6, q14
  275. vst1.64 {d3}, [r1,:64], r2
  276. vqmovun.s16 d7, q15
  277. vst1.64 {d4}, [r1,:64], r2
  278. vst1.64 {d5}, [r1,:64], r2
  279. vst1.64 {d6}, [r1,:64], r2
  280. vst1.64 {d7}, [r1,:64], r2
  281. bx lr
  282. endfunc
  283. function ff_put_signed_pixels_clamped_neon, export=1
  284. vmov.u8 d31, #128
  285. vld1.64 {d16-d17}, [r0,:128]!
  286. vqmovn.s16 d0, q8
  287. vld1.64 {d18-d19}, [r0,:128]!
  288. vqmovn.s16 d1, q9
  289. vld1.64 {d16-d17}, [r0,:128]!
  290. vqmovn.s16 d2, q8
  291. vld1.64 {d18-d19}, [r0,:128]!
  292. vadd.u8 d0, d0, d31
  293. vld1.64 {d20-d21}, [r0,:128]!
  294. vadd.u8 d1, d1, d31
  295. vld1.64 {d22-d23}, [r0,:128]!
  296. vadd.u8 d2, d2, d31
  297. vst1.64 {d0}, [r1,:64], r2
  298. vqmovn.s16 d3, q9
  299. vst1.64 {d1}, [r1,:64], r2
  300. vqmovn.s16 d4, q10
  301. vst1.64 {d2}, [r1,:64], r2
  302. vqmovn.s16 d5, q11
  303. vld1.64 {d24-d25}, [r0,:128]!
  304. vadd.u8 d3, d3, d31
  305. vld1.64 {d26-d27}, [r0,:128]!
  306. vadd.u8 d4, d4, d31
  307. vadd.u8 d5, d5, d31
  308. vst1.64 {d3}, [r1,:64], r2
  309. vqmovn.s16 d6, q12
  310. vst1.64 {d4}, [r1,:64], r2
  311. vqmovn.s16 d7, q13
  312. vst1.64 {d5}, [r1,:64], r2
  313. vadd.u8 d6, d6, d31
  314. vadd.u8 d7, d7, d31
  315. vst1.64 {d6}, [r1,:64], r2
  316. vst1.64 {d7}, [r1,:64], r2
  317. bx lr
  318. endfunc
  319. function ff_add_pixels_clamped_neon, export=1
  320. mov r3, r1
  321. vld1.64 {d16}, [r1,:64], r2
  322. vld1.64 {d0-d1}, [r0,:128]!
  323. vaddw.u8 q0, q0, d16
  324. vld1.64 {d17}, [r1,:64], r2
  325. vld1.64 {d2-d3}, [r0,:128]!
  326. vqmovun.s16 d0, q0
  327. vld1.64 {d18}, [r1,:64], r2
  328. vaddw.u8 q1, q1, d17
  329. vld1.64 {d4-d5}, [r0,:128]!
  330. vaddw.u8 q2, q2, d18
  331. vst1.64 {d0}, [r3,:64], r2
  332. vqmovun.s16 d2, q1
  333. vld1.64 {d19}, [r1,:64], r2
  334. vld1.64 {d6-d7}, [r0,:128]!
  335. vaddw.u8 q3, q3, d19
  336. vqmovun.s16 d4, q2
  337. vst1.64 {d2}, [r3,:64], r2
  338. vld1.64 {d16}, [r1,:64], r2
  339. vqmovun.s16 d6, q3
  340. vld1.64 {d0-d1}, [r0,:128]!
  341. vaddw.u8 q0, q0, d16
  342. vst1.64 {d4}, [r3,:64], r2
  343. vld1.64 {d17}, [r1,:64], r2
  344. vld1.64 {d2-d3}, [r0,:128]!
  345. vaddw.u8 q1, q1, d17
  346. vst1.64 {d6}, [r3,:64], r2
  347. vqmovun.s16 d0, q0
  348. vld1.64 {d18}, [r1,:64], r2
  349. vld1.64 {d4-d5}, [r0,:128]!
  350. vaddw.u8 q2, q2, d18
  351. vst1.64 {d0}, [r3,:64], r2
  352. vqmovun.s16 d2, q1
  353. vld1.64 {d19}, [r1,:64], r2
  354. vqmovun.s16 d4, q2
  355. vld1.64 {d6-d7}, [r0,:128]!
  356. vaddw.u8 q3, q3, d19
  357. vst1.64 {d2}, [r3,:64], r2
  358. vqmovun.s16 d6, q3
  359. vst1.64 {d4}, [r3,:64], r2
  360. vst1.64 {d6}, [r3,:64], r2
  361. bx lr
  362. endfunc
  363. function ff_float_to_int16_neon, export=1
  364. subs r2, r2, #8
  365. vld1.64 {d0-d1}, [r1,:128]!
  366. vcvt.s32.f32 q8, q0, #16
  367. vld1.64 {d2-d3}, [r1,:128]!
  368. vcvt.s32.f32 q9, q1, #16
  369. beq 3f
  370. bics ip, r2, #15
  371. beq 2f
  372. 1: subs ip, ip, #16
  373. vshrn.s32 d4, q8, #16
  374. vld1.64 {d0-d1}, [r1,:128]!
  375. vcvt.s32.f32 q0, q0, #16
  376. vshrn.s32 d5, q9, #16
  377. vld1.64 {d2-d3}, [r1,:128]!
  378. vcvt.s32.f32 q1, q1, #16
  379. vshrn.s32 d6, q0, #16
  380. vst1.64 {d4-d5}, [r0,:128]!
  381. vshrn.s32 d7, q1, #16
  382. vld1.64 {d16-d17},[r1,:128]!
  383. vcvt.s32.f32 q8, q8, #16
  384. vld1.64 {d18-d19},[r1,:128]!
  385. vcvt.s32.f32 q9, q9, #16
  386. vst1.64 {d6-d7}, [r0,:128]!
  387. bne 1b
  388. ands r2, r2, #15
  389. beq 3f
  390. 2: vld1.64 {d0-d1}, [r1,:128]!
  391. vshrn.s32 d4, q8, #16
  392. vcvt.s32.f32 q0, q0, #16
  393. vld1.64 {d2-d3}, [r1,:128]!
  394. vshrn.s32 d5, q9, #16
  395. vcvt.s32.f32 q1, q1, #16
  396. vshrn.s32 d6, q0, #16
  397. vst1.64 {d4-d5}, [r0,:128]!
  398. vshrn.s32 d7, q1, #16
  399. vst1.64 {d6-d7}, [r0,:128]!
  400. bx lr
  401. 3: vshrn.s32 d4, q8, #16
  402. vshrn.s32 d5, q9, #16
  403. vst1.64 {d4-d5}, [r0,:128]!
  404. bx lr
  405. endfunc
  406. function ff_float_to_int16_interleave_neon, export=1
  407. cmp r3, #2
  408. ldrlt r1, [r1]
  409. blt ff_float_to_int16_neon
  410. bne 4f
  411. ldr r3, [r1]
  412. ldr r1, [r1, #4]
  413. subs r2, r2, #8
  414. vld1.64 {d0-d1}, [r3,:128]!
  415. vcvt.s32.f32 q8, q0, #16
  416. vld1.64 {d2-d3}, [r3,:128]!
  417. vcvt.s32.f32 q9, q1, #16
  418. vld1.64 {d20-d21},[r1,:128]!
  419. vcvt.s32.f32 q10, q10, #16
  420. vld1.64 {d22-d23},[r1,:128]!
  421. vcvt.s32.f32 q11, q11, #16
  422. beq 3f
  423. bics ip, r2, #15
  424. beq 2f
  425. 1: subs ip, ip, #16
  426. vld1.64 {d0-d1}, [r3,:128]!
  427. vcvt.s32.f32 q0, q0, #16
  428. vsri.32 q10, q8, #16
  429. vld1.64 {d2-d3}, [r3,:128]!
  430. vcvt.s32.f32 q1, q1, #16
  431. vld1.64 {d24-d25},[r1,:128]!
  432. vcvt.s32.f32 q12, q12, #16
  433. vld1.64 {d26-d27},[r1,:128]!
  434. vsri.32 q11, q9, #16
  435. vst1.64 {d20-d21},[r0,:128]!
  436. vcvt.s32.f32 q13, q13, #16
  437. vst1.64 {d22-d23},[r0,:128]!
  438. vsri.32 q12, q0, #16
  439. vld1.64 {d16-d17},[r3,:128]!
  440. vsri.32 q13, q1, #16
  441. vst1.64 {d24-d25},[r0,:128]!
  442. vcvt.s32.f32 q8, q8, #16
  443. vld1.64 {d18-d19},[r3,:128]!
  444. vcvt.s32.f32 q9, q9, #16
  445. vld1.64 {d20-d21},[r1,:128]!
  446. vcvt.s32.f32 q10, q10, #16
  447. vld1.64 {d22-d23},[r1,:128]!
  448. vcvt.s32.f32 q11, q11, #16
  449. vst1.64 {d26-d27},[r0,:128]!
  450. bne 1b
  451. ands r2, r2, #15
  452. beq 3f
  453. 2: vsri.32 q10, q8, #16
  454. vld1.64 {d0-d1}, [r3,:128]!
  455. vcvt.s32.f32 q0, q0, #16
  456. vld1.64 {d2-d3}, [r3,:128]!
  457. vcvt.s32.f32 q1, q1, #16
  458. vld1.64 {d24-d25},[r1,:128]!
  459. vcvt.s32.f32 q12, q12, #16
  460. vsri.32 q11, q9, #16
  461. vld1.64 {d26-d27},[r1,:128]!
  462. vcvt.s32.f32 q13, q13, #16
  463. vst1.64 {d20-d21},[r0,:128]!
  464. vsri.32 q12, q0, #16
  465. vst1.64 {d22-d23},[r0,:128]!
  466. vsri.32 q13, q1, #16
  467. vst1.64 {d24-d27},[r0,:128]!
  468. bx lr
  469. 3: vsri.32 q10, q8, #16
  470. vsri.32 q11, q9, #16
  471. vst1.64 {d20-d23},[r0,:128]!
  472. bx lr
  473. 4: push {r4-r8,lr}
  474. cmp r3, #4
  475. lsl ip, r3, #1
  476. blt 4f
  477. @ 4 channels
  478. 5: ldmia r1!, {r4-r7}
  479. mov lr, r2
  480. mov r8, r0
  481. vld1.64 {d16-d17},[r4,:128]!
  482. vcvt.s32.f32 q8, q8, #16
  483. vld1.64 {d18-d19},[r5,:128]!
  484. vcvt.s32.f32 q9, q9, #16
  485. vld1.64 {d20-d21},[r6,:128]!
  486. vcvt.s32.f32 q10, q10, #16
  487. vld1.64 {d22-d23},[r7,:128]!
  488. vcvt.s32.f32 q11, q11, #16
  489. 6: subs lr, lr, #8
  490. vld1.64 {d0-d1}, [r4,:128]!
  491. vcvt.s32.f32 q0, q0, #16
  492. vsri.32 q9, q8, #16
  493. vld1.64 {d2-d3}, [r5,:128]!
  494. vcvt.s32.f32 q1, q1, #16
  495. vsri.32 q11, q10, #16
  496. vld1.64 {d4-d5}, [r6,:128]!
  497. vcvt.s32.f32 q2, q2, #16
  498. vzip.32 d18, d22
  499. vld1.64 {d6-d7}, [r7,:128]!
  500. vcvt.s32.f32 q3, q3, #16
  501. vzip.32 d19, d23
  502. vst1.64 {d18}, [r8], ip
  503. vsri.32 q1, q0, #16
  504. vst1.64 {d22}, [r8], ip
  505. vsri.32 q3, q2, #16
  506. vst1.64 {d19}, [r8], ip
  507. vzip.32 d2, d6
  508. vst1.64 {d23}, [r8], ip
  509. vzip.32 d3, d7
  510. beq 7f
  511. vld1.64 {d16-d17},[r4,:128]!
  512. vcvt.s32.f32 q8, q8, #16
  513. vst1.64 {d2}, [r8], ip
  514. vld1.64 {d18-d19},[r5,:128]!
  515. vcvt.s32.f32 q9, q9, #16
  516. vst1.64 {d6}, [r8], ip
  517. vld1.64 {d20-d21},[r6,:128]!
  518. vcvt.s32.f32 q10, q10, #16
  519. vst1.64 {d3}, [r8], ip
  520. vld1.64 {d22-d23},[r7,:128]!
  521. vcvt.s32.f32 q11, q11, #16
  522. vst1.64 {d7}, [r8], ip
  523. b 6b
  524. 7: vst1.64 {d2}, [r8], ip
  525. vst1.64 {d6}, [r8], ip
  526. vst1.64 {d3}, [r8], ip
  527. vst1.64 {d7}, [r8], ip
  528. subs r3, r3, #4
  529. popeq {r4-r8,pc}
  530. cmp r3, #4
  531. add r0, r0, #8
  532. bge 5b
  533. @ 2 channels
  534. 4: cmp r3, #2
  535. blt 4f
  536. ldmia r1!, {r4-r5}
  537. mov lr, r2
  538. mov r8, r0
  539. tst lr, #8
  540. vld1.64 {d16-d17},[r4,:128]!
  541. vcvt.s32.f32 q8, q8, #16
  542. vld1.64 {d18-d19},[r5,:128]!
  543. vcvt.s32.f32 q9, q9, #16
  544. vld1.64 {d20-d21},[r4,:128]!
  545. vcvt.s32.f32 q10, q10, #16
  546. vld1.64 {d22-d23},[r5,:128]!
  547. vcvt.s32.f32 q11, q11, #16
  548. beq 6f
  549. subs lr, lr, #8
  550. beq 7f
  551. vsri.32 d18, d16, #16
  552. vsri.32 d19, d17, #16
  553. vld1.64 {d16-d17},[r4,:128]!
  554. vcvt.s32.f32 q8, q8, #16
  555. vst1.32 {d18[0]}, [r8], ip
  556. vsri.32 d22, d20, #16
  557. vst1.32 {d18[1]}, [r8], ip
  558. vsri.32 d23, d21, #16
  559. vst1.32 {d19[0]}, [r8], ip
  560. vst1.32 {d19[1]}, [r8], ip
  561. vld1.64 {d18-d19},[r5,:128]!
  562. vcvt.s32.f32 q9, q9, #16
  563. vst1.32 {d22[0]}, [r8], ip
  564. vst1.32 {d22[1]}, [r8], ip
  565. vld1.64 {d20-d21},[r4,:128]!
  566. vcvt.s32.f32 q10, q10, #16
  567. vst1.32 {d23[0]}, [r8], ip
  568. vst1.32 {d23[1]}, [r8], ip
  569. vld1.64 {d22-d23},[r5,:128]!
  570. vcvt.s32.f32 q11, q11, #16
  571. 6: subs lr, lr, #16
  572. vld1.64 {d0-d1}, [r4,:128]!
  573. vcvt.s32.f32 q0, q0, #16
  574. vsri.32 d18, d16, #16
  575. vld1.64 {d2-d3}, [r5,:128]!
  576. vcvt.s32.f32 q1, q1, #16
  577. vsri.32 d19, d17, #16
  578. vld1.64 {d4-d5}, [r4,:128]!
  579. vcvt.s32.f32 q2, q2, #16
  580. vld1.64 {d6-d7}, [r5,:128]!
  581. vcvt.s32.f32 q3, q3, #16
  582. vst1.32 {d18[0]}, [r8], ip
  583. vsri.32 d22, d20, #16
  584. vst1.32 {d18[1]}, [r8], ip
  585. vsri.32 d23, d21, #16
  586. vst1.32 {d19[0]}, [r8], ip
  587. vsri.32 d2, d0, #16
  588. vst1.32 {d19[1]}, [r8], ip
  589. vsri.32 d3, d1, #16
  590. vst1.32 {d22[0]}, [r8], ip
  591. vsri.32 d6, d4, #16
  592. vst1.32 {d22[1]}, [r8], ip
  593. vsri.32 d7, d5, #16
  594. vst1.32 {d23[0]}, [r8], ip
  595. vst1.32 {d23[1]}, [r8], ip
  596. beq 6f
  597. vld1.64 {d16-d17},[r4,:128]!
  598. vcvt.s32.f32 q8, q8, #16
  599. vst1.32 {d2[0]}, [r8], ip
  600. vst1.32 {d2[1]}, [r8], ip
  601. vld1.64 {d18-d19},[r5,:128]!
  602. vcvt.s32.f32 q9, q9, #16
  603. vst1.32 {d3[0]}, [r8], ip
  604. vst1.32 {d3[1]}, [r8], ip
  605. vld1.64 {d20-d21},[r4,:128]!
  606. vcvt.s32.f32 q10, q10, #16
  607. vst1.32 {d6[0]}, [r8], ip
  608. vst1.32 {d6[1]}, [r8], ip
  609. vld1.64 {d22-d23},[r5,:128]!
  610. vcvt.s32.f32 q11, q11, #16
  611. vst1.32 {d7[0]}, [r8], ip
  612. vst1.32 {d7[1]}, [r8], ip
  613. bgt 6b
  614. 6: vst1.32 {d2[0]}, [r8], ip
  615. vst1.32 {d2[1]}, [r8], ip
  616. vst1.32 {d3[0]}, [r8], ip
  617. vst1.32 {d3[1]}, [r8], ip
  618. vst1.32 {d6[0]}, [r8], ip
  619. vst1.32 {d6[1]}, [r8], ip
  620. vst1.32 {d7[0]}, [r8], ip
  621. vst1.32 {d7[1]}, [r8], ip
  622. b 8f
  623. 7: vsri.32 d18, d16, #16
  624. vsri.32 d19, d17, #16
  625. vst1.32 {d18[0]}, [r8], ip
  626. vsri.32 d22, d20, #16
  627. vst1.32 {d18[1]}, [r8], ip
  628. vsri.32 d23, d21, #16
  629. vst1.32 {d19[0]}, [r8], ip
  630. vst1.32 {d19[1]}, [r8], ip
  631. vst1.32 {d22[0]}, [r8], ip
  632. vst1.32 {d22[1]}, [r8], ip
  633. vst1.32 {d23[0]}, [r8], ip
  634. vst1.32 {d23[1]}, [r8], ip
  635. 8: subs r3, r3, #2
  636. add r0, r0, #4
  637. popeq {r4-r8,pc}
  638. @ 1 channel
  639. 4: ldr r4, [r1],#4
  640. tst r2, #8
  641. mov lr, r2
  642. mov r5, r0
  643. vld1.64 {d0-d1}, [r4,:128]!
  644. vcvt.s32.f32 q0, q0, #16
  645. vld1.64 {d2-d3}, [r4,:128]!
  646. vcvt.s32.f32 q1, q1, #16
  647. bne 8f
  648. 6: subs lr, lr, #16
  649. vld1.64 {d4-d5}, [r4,:128]!
  650. vcvt.s32.f32 q2, q2, #16
  651. vld1.64 {d6-d7}, [r4,:128]!
  652. vcvt.s32.f32 q3, q3, #16
  653. vst1.16 {d0[1]}, [r5,:16], ip
  654. vst1.16 {d0[3]}, [r5,:16], ip
  655. vst1.16 {d1[1]}, [r5,:16], ip
  656. vst1.16 {d1[3]}, [r5,:16], ip
  657. vst1.16 {d2[1]}, [r5,:16], ip
  658. vst1.16 {d2[3]}, [r5,:16], ip
  659. vst1.16 {d3[1]}, [r5,:16], ip
  660. vst1.16 {d3[3]}, [r5,:16], ip
  661. beq 7f
  662. vld1.64 {d0-d1}, [r4,:128]!
  663. vcvt.s32.f32 q0, q0, #16
  664. vld1.64 {d2-d3}, [r4,:128]!
  665. vcvt.s32.f32 q1, q1, #16
  666. 7: vst1.16 {d4[1]}, [r5,:16], ip
  667. vst1.16 {d4[3]}, [r5,:16], ip
  668. vst1.16 {d5[1]}, [r5,:16], ip
  669. vst1.16 {d5[3]}, [r5,:16], ip
  670. vst1.16 {d6[1]}, [r5,:16], ip
  671. vst1.16 {d6[3]}, [r5,:16], ip
  672. vst1.16 {d7[1]}, [r5,:16], ip
  673. vst1.16 {d7[3]}, [r5,:16], ip
  674. bgt 6b
  675. pop {r4-r8,pc}
  676. 8: subs lr, lr, #8
  677. vst1.16 {d0[1]}, [r5,:16], ip
  678. vst1.16 {d0[3]}, [r5,:16], ip
  679. vst1.16 {d1[1]}, [r5,:16], ip
  680. vst1.16 {d1[3]}, [r5,:16], ip
  681. vst1.16 {d2[1]}, [r5,:16], ip
  682. vst1.16 {d2[3]}, [r5,:16], ip
  683. vst1.16 {d3[1]}, [r5,:16], ip
  684. vst1.16 {d3[3]}, [r5,:16], ip
  685. popeq {r4-r8,pc}
  686. vld1.64 {d0-d1}, [r4,:128]!
  687. vcvt.s32.f32 q0, q0, #16
  688. vld1.64 {d2-d3}, [r4,:128]!
  689. vcvt.s32.f32 q1, q1, #16
  690. b 6b
  691. endfunc
  692. function ff_vector_fmul_neon, export=1
  693. mov r3, r0
  694. subs r2, r2, #8
  695. vld1.64 {d0-d3}, [r0,:128]!
  696. vld1.64 {d4-d7}, [r1,:128]!
  697. vmul.f32 q8, q0, q2
  698. vmul.f32 q9, q1, q3
  699. beq 3f
  700. bics ip, r2, #15
  701. beq 2f
  702. 1: subs ip, ip, #16
  703. vld1.64 {d0-d1}, [r0,:128]!
  704. vld1.64 {d4-d5}, [r1,:128]!
  705. vmul.f32 q10, q0, q2
  706. vld1.64 {d2-d3}, [r0,:128]!
  707. vld1.64 {d6-d7}, [r1,:128]!
  708. vmul.f32 q11, q1, q3
  709. vst1.64 {d16-d19},[r3,:128]!
  710. vld1.64 {d0-d1}, [r0,:128]!
  711. vld1.64 {d4-d5}, [r1,:128]!
  712. vmul.f32 q8, q0, q2
  713. vld1.64 {d2-d3}, [r0,:128]!
  714. vld1.64 {d6-d7}, [r1,:128]!
  715. vmul.f32 q9, q1, q3
  716. vst1.64 {d20-d23},[r3,:128]!
  717. bne 1b
  718. ands r2, r2, #15
  719. beq 3f
  720. 2: vld1.64 {d0-d1}, [r0,:128]!
  721. vld1.64 {d4-d5}, [r1,:128]!
  722. vst1.64 {d16-d17},[r3,:128]!
  723. vmul.f32 q8, q0, q2
  724. vld1.64 {d2-d3}, [r0,:128]!
  725. vld1.64 {d6-d7}, [r1,:128]!
  726. vst1.64 {d18-d19},[r3,:128]!
  727. vmul.f32 q9, q1, q3
  728. 3: vst1.64 {d16-d19},[r3,:128]!
  729. bx lr
  730. endfunc
  731. function ff_vector_fmul_window_neon, export=1
  732. VFP vdup.32 q8, d0[0]
  733. NOVFP vld1.32 {d16[],d17[]}, [sp,:32]
  734. push {r4,r5,lr}
  735. VFP ldr lr, [sp, #12]
  736. NOVFP ldr lr, [sp, #16]
  737. sub r2, r2, #8
  738. sub r5, lr, #2
  739. add r2, r2, r5, lsl #2
  740. add r4, r3, r5, lsl #3
  741. add ip, r0, r5, lsl #3
  742. mov r5, #-16
  743. vld1.64 {d0,d1}, [r1,:128]!
  744. vld1.64 {d2,d3}, [r2,:128], r5
  745. vld1.64 {d4,d5}, [r3,:128]!
  746. vld1.64 {d6,d7}, [r4,:128], r5
  747. 1: subs lr, lr, #4
  748. vmov q11, q8
  749. vmla.f32 d22, d0, d4
  750. vmov q10, q8
  751. vmla.f32 d23, d1, d5
  752. vrev64.32 q3, q3
  753. vmla.f32 d20, d0, d7
  754. vrev64.32 q1, q1
  755. vmla.f32 d21, d1, d6
  756. beq 2f
  757. vmla.f32 d22, d3, d7
  758. vld1.64 {d0,d1}, [r1,:128]!
  759. vmla.f32 d23, d2, d6
  760. vld1.64 {d18,d19},[r2,:128], r5
  761. vmls.f32 d20, d3, d4
  762. vld1.64 {d24,d25},[r3,:128]!
  763. vmls.f32 d21, d2, d5
  764. vld1.64 {d6,d7}, [r4,:128], r5
  765. vmov q1, q9
  766. vrev64.32 q11, q11
  767. vmov q2, q12
  768. vswp d22, d23
  769. vst1.64 {d20,d21},[r0,:128]!
  770. vst1.64 {d22,d23},[ip,:128], r5
  771. b 1b
  772. 2: vmla.f32 d22, d3, d7
  773. vmla.f32 d23, d2, d6
  774. vmls.f32 d20, d3, d4
  775. vmls.f32 d21, d2, d5
  776. vrev64.32 q11, q11
  777. vswp d22, d23
  778. vst1.64 {d20,d21},[r0,:128]!
  779. vst1.64 {d22,d23},[ip,:128], r5
  780. pop {r4,r5,pc}
  781. endfunc
  782. #if CONFIG_VORBIS_DECODER
  783. function ff_vorbis_inverse_coupling_neon, export=1
  784. vmov.i32 q10, #1<<31
  785. subs r2, r2, #4
  786. mov r3, r0
  787. mov r12, r1
  788. beq 3f
  789. vld1.32 {d24-d25},[r1,:128]!
  790. vld1.32 {d22-d23},[r0,:128]!
  791. vcle.s32 q8, q12, #0
  792. vand q9, q11, q10
  793. veor q12, q12, q9
  794. vand q2, q12, q8
  795. vbic q3, q12, q8
  796. vadd.f32 q12, q11, q2
  797. vsub.f32 q11, q11, q3
  798. 1: vld1.32 {d2-d3}, [r1,:128]!
  799. vld1.32 {d0-d1}, [r0,:128]!
  800. vcle.s32 q8, q1, #0
  801. vand q9, q0, q10
  802. veor q1, q1, q9
  803. vst1.32 {d24-d25},[r3, :128]!
  804. vst1.32 {d22-d23},[r12,:128]!
  805. vand q2, q1, q8
  806. vbic q3, q1, q8
  807. vadd.f32 q1, q0, q2
  808. vsub.f32 q0, q0, q3
  809. subs r2, r2, #8
  810. ble 2f
  811. vld1.32 {d24-d25},[r1,:128]!
  812. vld1.32 {d22-d23},[r0,:128]!
  813. vcle.s32 q8, q12, #0
  814. vand q9, q11, q10
  815. veor q12, q12, q9
  816. vst1.32 {d2-d3}, [r3, :128]!
  817. vst1.32 {d0-d1}, [r12,:128]!
  818. vand q2, q12, q8
  819. vbic q3, q12, q8
  820. vadd.f32 q12, q11, q2
  821. vsub.f32 q11, q11, q3
  822. b 1b
  823. 2: vst1.32 {d2-d3}, [r3, :128]!
  824. vst1.32 {d0-d1}, [r12,:128]!
  825. bxlt lr
  826. 3: vld1.32 {d2-d3}, [r1,:128]
  827. vld1.32 {d0-d1}, [r0,:128]
  828. vcle.s32 q8, q1, #0
  829. vand q9, q0, q10
  830. veor q1, q1, q9
  831. vand q2, q1, q8
  832. vbic q3, q1, q8
  833. vadd.f32 q1, q0, q2
  834. vsub.f32 q0, q0, q3
  835. vst1.32 {d2-d3}, [r0,:128]!
  836. vst1.32 {d0-d1}, [r1,:128]!
  837. bx lr
  838. endfunc
  839. #endif
  840. function ff_vector_fmul_scalar_neon, export=1
  841. VFP len .req r2
  842. NOVFP len .req r3
  843. VFP vdup.32 q8, d0[0]
  844. NOVFP vdup.32 q8, r2
  845. bics r12, len, #15
  846. beq 3f
  847. vld1.32 {q0},[r1,:128]!
  848. vld1.32 {q1},[r1,:128]!
  849. 1: vmul.f32 q0, q0, q8
  850. vld1.32 {q2},[r1,:128]!
  851. vmul.f32 q1, q1, q8
  852. vld1.32 {q3},[r1,:128]!
  853. vmul.f32 q2, q2, q8
  854. vst1.32 {q0},[r0,:128]!
  855. vmul.f32 q3, q3, q8
  856. vst1.32 {q1},[r0,:128]!
  857. subs r12, r12, #16
  858. beq 2f
  859. vld1.32 {q0},[r1,:128]!
  860. vst1.32 {q2},[r0,:128]!
  861. vld1.32 {q1},[r1,:128]!
  862. vst1.32 {q3},[r0,:128]!
  863. b 1b
  864. 2: vst1.32 {q2},[r0,:128]!
  865. vst1.32 {q3},[r0,:128]!
  866. ands len, len, #15
  867. bxeq lr
  868. 3: vld1.32 {q0},[r1,:128]!
  869. vmul.f32 q0, q0, q8
  870. vst1.32 {q0},[r0,:128]!
  871. subs len, len, #4
  872. bgt 3b
  873. bx lr
  874. .unreq len
  875. endfunc
  876. function ff_vector_fmul_sv_scalar_2_neon, export=1
  877. VFP vdup.32 d16, d0[0]
  878. NOVFP vdup.32 d16, r3
  879. NOVFP ldr r3, [sp]
  880. vld1.32 {d0},[r1,:64]!
  881. vld1.32 {d1},[r1,:64]!
  882. 1: subs r3, r3, #4
  883. vmul.f32 d4, d0, d16
  884. vmul.f32 d5, d1, d16
  885. ldr r12, [r2], #4
  886. vld1.32 {d2},[r12,:64]
  887. ldr r12, [r2], #4
  888. vld1.32 {d3},[r12,:64]
  889. vmul.f32 d4, d4, d2
  890. vmul.f32 d5, d5, d3
  891. beq 2f
  892. vld1.32 {d0},[r1,:64]!
  893. vld1.32 {d1},[r1,:64]!
  894. vst1.32 {d4},[r0,:64]!
  895. vst1.32 {d5},[r0,:64]!
  896. b 1b
  897. 2: vst1.32 {d4},[r0,:64]!
  898. vst1.32 {d5},[r0,:64]!
  899. bx lr
  900. endfunc
  901. function ff_vector_fmul_sv_scalar_4_neon, export=1
  902. VFP vdup.32 q10, d0[0]
  903. NOVFP vdup.32 q10, r3
  904. NOVFP ldr r3, [sp]
  905. push {lr}
  906. bics lr, r3, #7
  907. beq 3f
  908. vld1.32 {q0},[r1,:128]!
  909. vld1.32 {q2},[r1,:128]!
  910. 1: ldr r12, [r2], #4
  911. vld1.32 {q1},[r12,:128]
  912. ldr r12, [r2], #4
  913. vld1.32 {q3},[r12,:128]
  914. vmul.f32 q8, q0, q10
  915. vmul.f32 q8, q8, q1
  916. vmul.f32 q9, q2, q10
  917. vmul.f32 q9, q9, q3
  918. subs lr, lr, #8
  919. beq 2f
  920. vld1.32 {q0},[r1,:128]!
  921. vld1.32 {q2},[r1,:128]!
  922. vst1.32 {q8},[r0,:128]!
  923. vst1.32 {q9},[r0,:128]!
  924. b 1b
  925. 2: vst1.32 {q8},[r0,:128]!
  926. vst1.32 {q9},[r0,:128]!
  927. ands r3, r3, #7
  928. popeq {pc}
  929. 3: vld1.32 {q0},[r1,:128]!
  930. ldr r12, [r2], #4
  931. vld1.32 {q1},[r12,:128]
  932. vmul.f32 q0, q0, q10
  933. vmul.f32 q0, q0, q1
  934. vst1.32 {q0},[r0,:128]!
  935. subs r3, r3, #4
  936. bgt 3b
  937. pop {pc}
  938. endfunc
  939. function ff_sv_fmul_scalar_2_neon, export=1
  940. VFP len .req r2
  941. NOVFP len .req r3
  942. VFP vdup.32 q8, d0[0]
  943. NOVFP vdup.32 q8, r2
  944. ldr r12, [r1], #4
  945. vld1.32 {d0},[r12,:64]
  946. ldr r12, [r1], #4
  947. vld1.32 {d1},[r12,:64]
  948. 1: vmul.f32 q1, q0, q8
  949. subs len, len, #4
  950. beq 2f
  951. ldr r12, [r1], #4
  952. vld1.32 {d0},[r12,:64]
  953. ldr r12, [r1], #4
  954. vld1.32 {d1},[r12,:64]
  955. vst1.32 {q1},[r0,:128]!
  956. b 1b
  957. 2: vst1.32 {q1},[r0,:128]!
  958. bx lr
  959. .unreq len
  960. endfunc
  961. function ff_sv_fmul_scalar_4_neon, export=1
  962. VFP len .req r2
  963. NOVFP len .req r3
  964. VFP vdup.32 q8, d0[0]
  965. NOVFP vdup.32 q8, r2
  966. 1: ldr r12, [r1], #4
  967. vld1.32 {q0},[r12,:128]
  968. vmul.f32 q0, q0, q8
  969. vst1.32 {q0},[r0,:128]!
  970. subs len, len, #4
  971. bgt 1b
  972. bx lr
  973. .unreq len
  974. endfunc
  975. function ff_butterflies_float_neon, export=1
  976. 1: vld1.32 {q0},[r0,:128]
  977. vld1.32 {q1},[r1,:128]
  978. vsub.f32 q2, q0, q1
  979. vadd.f32 q1, q0, q1
  980. vst1.32 {q2},[r1,:128]!
  981. vst1.32 {q1},[r0,:128]!
  982. subs r2, r2, #4
  983. bgt 1b
  984. bx lr
  985. endfunc
  986. function ff_scalarproduct_float_neon, export=1
  987. vmov.f32 q2, #0.0
  988. 1: vld1.32 {q0},[r0,:128]!
  989. vld1.32 {q1},[r1,:128]!
  990. vmla.f32 q2, q0, q1
  991. subs r2, r2, #4
  992. bgt 1b
  993. vadd.f32 d0, d4, d5
  994. vpadd.f32 d0, d0, d0
  995. NOVFP vmov.32 r0, d0[0]
  996. bx lr
  997. endfunc
  998. function ff_int32_to_float_fmul_scalar_neon, export=1
  999. VFP vdup.32 q0, d0[0]
  1000. VFP len .req r2
  1001. NOVFP vdup.32 q0, r2
  1002. NOVFP len .req r3
  1003. vld1.32 {q1},[r1,:128]!
  1004. vcvt.f32.s32 q3, q1
  1005. vld1.32 {q2},[r1,:128]!
  1006. vcvt.f32.s32 q8, q2
  1007. 1: subs len, len, #8
  1008. pld [r1, #16]
  1009. vmul.f32 q9, q3, q0
  1010. vmul.f32 q10, q8, q0
  1011. beq 2f
  1012. vld1.32 {q1},[r1,:128]!
  1013. vcvt.f32.s32 q3, q1
  1014. vld1.32 {q2},[r1,:128]!
  1015. vcvt.f32.s32 q8, q2
  1016. vst1.32 {q9}, [r0,:128]!
  1017. vst1.32 {q10},[r0,:128]!
  1018. b 1b
  1019. 2: vst1.32 {q9}, [r0,:128]!
  1020. vst1.32 {q10},[r0,:128]!
  1021. bx lr
  1022. .unreq len
  1023. endfunc
  1024. function ff_vector_fmul_reverse_neon, export=1
  1025. add r2, r2, r3, lsl #2
  1026. sub r2, r2, #32
  1027. mov r12, #-32
  1028. vld1.32 {q0-q1}, [r1,:128]!
  1029. vld1.32 {q2-q3}, [r2,:128], r12
  1030. 1: pld [r1, #32]
  1031. vrev64.32 q3, q3
  1032. vmul.f32 d16, d0, d7
  1033. vmul.f32 d17, d1, d6
  1034. pld [r2, #-32]
  1035. vrev64.32 q2, q2
  1036. vmul.f32 d18, d2, d5
  1037. vmul.f32 d19, d3, d4
  1038. subs r3, r3, #8
  1039. beq 2f
  1040. vld1.32 {q0-q1}, [r1,:128]!
  1041. vld1.32 {q2-q3}, [r2,:128], r12
  1042. vst1.32 {q8-q9}, [r0,:128]!
  1043. b 1b
  1044. 2: vst1.32 {q8-q9}, [r0,:128]!
  1045. bx lr
  1046. endfunc
  1047. function ff_vector_fmul_add_neon, export=1
  1048. ldr r12, [sp]
  1049. vld1.32 {q0-q1}, [r1,:128]!
  1050. vld1.32 {q8-q9}, [r2,:128]!
  1051. vld1.32 {q2-q3}, [r3,:128]!
  1052. vmul.f32 q10, q0, q8
  1053. vmul.f32 q11, q1, q9
  1054. 1: vadd.f32 q12, q2, q10
  1055. vadd.f32 q13, q3, q11
  1056. pld [r1, #16]
  1057. pld [r2, #16]
  1058. pld [r3, #16]
  1059. subs r12, r12, #8
  1060. beq 2f
  1061. vld1.32 {q0}, [r1,:128]!
  1062. vld1.32 {q8}, [r2,:128]!
  1063. vmul.f32 q10, q0, q8
  1064. vld1.32 {q1}, [r1,:128]!
  1065. vld1.32 {q9}, [r2,:128]!
  1066. vmul.f32 q11, q1, q9
  1067. vld1.32 {q2-q3}, [r3,:128]!
  1068. vst1.32 {q12-q13},[r0,:128]!
  1069. b 1b
  1070. 2: vst1.32 {q12-q13},[r0,:128]!
  1071. bx lr
  1072. endfunc
  1073. function ff_vector_clipf_neon, export=1
  1074. VFP vdup.32 q1, d0[1]
  1075. VFP vdup.32 q0, d0[0]
  1076. NOVFP vdup.32 q0, r2
  1077. NOVFP vdup.32 q1, r3
  1078. NOVFP ldr r2, [sp]
  1079. vld1.f32 {q2},[r1,:128]!
  1080. vmin.f32 q10, q2, q1
  1081. vld1.f32 {q3},[r1,:128]!
  1082. vmin.f32 q11, q3, q1
  1083. 1: vmax.f32 q8, q10, q0
  1084. vmax.f32 q9, q11, q0
  1085. subs r2, r2, #8
  1086. beq 2f
  1087. vld1.f32 {q2},[r1,:128]!
  1088. vmin.f32 q10, q2, q1
  1089. vld1.f32 {q3},[r1,:128]!
  1090. vmin.f32 q11, q3, q1
  1091. vst1.f32 {q8},[r0,:128]!
  1092. vst1.f32 {q9},[r0,:128]!
  1093. b 1b
  1094. 2: vst1.f32 {q8},[r0,:128]!
  1095. vst1.f32 {q9},[r0,:128]!
  1096. bx lr
  1097. endfunc