intrapred_neon_asm.asm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  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. EXPORT |vpx_v_predictor_4x4_neon|
  11. EXPORT |vpx_v_predictor_8x8_neon|
  12. EXPORT |vpx_v_predictor_16x16_neon|
  13. EXPORT |vpx_v_predictor_32x32_neon|
  14. EXPORT |vpx_h_predictor_4x4_neon|
  15. EXPORT |vpx_h_predictor_8x8_neon|
  16. EXPORT |vpx_h_predictor_16x16_neon|
  17. EXPORT |vpx_h_predictor_32x32_neon|
  18. EXPORT |vpx_tm_predictor_4x4_neon|
  19. EXPORT |vpx_tm_predictor_8x8_neon|
  20. EXPORT |vpx_tm_predictor_16x16_neon|
  21. EXPORT |vpx_tm_predictor_32x32_neon|
  22. ARM
  23. REQUIRE8
  24. PRESERVE8
  25. AREA ||.text||, CODE, READONLY, ALIGN=2
  26. ;void vpx_v_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride,
  27. ; const uint8_t *above,
  28. ; const uint8_t *left)
  29. ; r0 uint8_t *dst
  30. ; r1 ptrdiff_t y_stride
  31. ; r2 const uint8_t *above
  32. ; r3 const uint8_t *left
  33. |vpx_v_predictor_4x4_neon| PROC
  34. vld1.32 {d0[0]}, [r2]
  35. vst1.32 {d0[0]}, [r0], r1
  36. vst1.32 {d0[0]}, [r0], r1
  37. vst1.32 {d0[0]}, [r0], r1
  38. vst1.32 {d0[0]}, [r0], r1
  39. bx lr
  40. ENDP ; |vpx_v_predictor_4x4_neon|
  41. ;void vpx_v_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride,
  42. ; const uint8_t *above,
  43. ; const uint8_t *left)
  44. ; r0 uint8_t *dst
  45. ; r1 ptrdiff_t y_stride
  46. ; r2 const uint8_t *above
  47. ; r3 const uint8_t *left
  48. |vpx_v_predictor_8x8_neon| PROC
  49. vld1.8 {d0}, [r2]
  50. vst1.8 {d0}, [r0], r1
  51. vst1.8 {d0}, [r0], r1
  52. vst1.8 {d0}, [r0], r1
  53. vst1.8 {d0}, [r0], r1
  54. vst1.8 {d0}, [r0], r1
  55. vst1.8 {d0}, [r0], r1
  56. vst1.8 {d0}, [r0], r1
  57. vst1.8 {d0}, [r0], r1
  58. bx lr
  59. ENDP ; |vpx_v_predictor_8x8_neon|
  60. ;void vpx_v_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride,
  61. ; const uint8_t *above,
  62. ; const uint8_t *left)
  63. ; r0 uint8_t *dst
  64. ; r1 ptrdiff_t y_stride
  65. ; r2 const uint8_t *above
  66. ; r3 const uint8_t *left
  67. |vpx_v_predictor_16x16_neon| PROC
  68. vld1.8 {q0}, [r2]
  69. vst1.8 {q0}, [r0], r1
  70. vst1.8 {q0}, [r0], r1
  71. vst1.8 {q0}, [r0], r1
  72. vst1.8 {q0}, [r0], r1
  73. vst1.8 {q0}, [r0], r1
  74. vst1.8 {q0}, [r0], r1
  75. vst1.8 {q0}, [r0], r1
  76. vst1.8 {q0}, [r0], r1
  77. vst1.8 {q0}, [r0], r1
  78. vst1.8 {q0}, [r0], r1
  79. vst1.8 {q0}, [r0], r1
  80. vst1.8 {q0}, [r0], r1
  81. vst1.8 {q0}, [r0], r1
  82. vst1.8 {q0}, [r0], r1
  83. vst1.8 {q0}, [r0], r1
  84. vst1.8 {q0}, [r0], r1
  85. bx lr
  86. ENDP ; |vpx_v_predictor_16x16_neon|
  87. ;void vpx_v_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride,
  88. ; const uint8_t *above,
  89. ; const uint8_t *left)
  90. ; r0 uint8_t *dst
  91. ; r1 ptrdiff_t y_stride
  92. ; r2 const uint8_t *above
  93. ; r3 const uint8_t *left
  94. |vpx_v_predictor_32x32_neon| PROC
  95. vld1.8 {q0, q1}, [r2]
  96. mov r2, #2
  97. loop_v
  98. vst1.8 {q0, q1}, [r0], r1
  99. vst1.8 {q0, q1}, [r0], r1
  100. vst1.8 {q0, q1}, [r0], r1
  101. vst1.8 {q0, q1}, [r0], r1
  102. vst1.8 {q0, q1}, [r0], r1
  103. vst1.8 {q0, q1}, [r0], r1
  104. vst1.8 {q0, q1}, [r0], r1
  105. vst1.8 {q0, q1}, [r0], r1
  106. vst1.8 {q0, q1}, [r0], r1
  107. vst1.8 {q0, q1}, [r0], r1
  108. vst1.8 {q0, q1}, [r0], r1
  109. vst1.8 {q0, q1}, [r0], r1
  110. vst1.8 {q0, q1}, [r0], r1
  111. vst1.8 {q0, q1}, [r0], r1
  112. vst1.8 {q0, q1}, [r0], r1
  113. vst1.8 {q0, q1}, [r0], r1
  114. subs r2, r2, #1
  115. bgt loop_v
  116. bx lr
  117. ENDP ; |vpx_v_predictor_32x32_neon|
  118. ;void vpx_h_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride,
  119. ; const uint8_t *above,
  120. ; const uint8_t *left)
  121. ; r0 uint8_t *dst
  122. ; r1 ptrdiff_t y_stride
  123. ; r2 const uint8_t *above
  124. ; r3 const uint8_t *left
  125. |vpx_h_predictor_4x4_neon| PROC
  126. vld1.32 {d1[0]}, [r3]
  127. vdup.8 d0, d1[0]
  128. vst1.32 {d0[0]}, [r0], r1
  129. vdup.8 d0, d1[1]
  130. vst1.32 {d0[0]}, [r0], r1
  131. vdup.8 d0, d1[2]
  132. vst1.32 {d0[0]}, [r0], r1
  133. vdup.8 d0, d1[3]
  134. vst1.32 {d0[0]}, [r0], r1
  135. bx lr
  136. ENDP ; |vpx_h_predictor_4x4_neon|
  137. ;void vpx_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride,
  138. ; const uint8_t *above,
  139. ; const uint8_t *left)
  140. ; r0 uint8_t *dst
  141. ; r1 ptrdiff_t y_stride
  142. ; r2 const uint8_t *above
  143. ; r3 const uint8_t *left
  144. |vpx_h_predictor_8x8_neon| PROC
  145. vld1.64 {d1}, [r3]
  146. vdup.8 d0, d1[0]
  147. vst1.64 {d0}, [r0], r1
  148. vdup.8 d0, d1[1]
  149. vst1.64 {d0}, [r0], r1
  150. vdup.8 d0, d1[2]
  151. vst1.64 {d0}, [r0], r1
  152. vdup.8 d0, d1[3]
  153. vst1.64 {d0}, [r0], r1
  154. vdup.8 d0, d1[4]
  155. vst1.64 {d0}, [r0], r1
  156. vdup.8 d0, d1[5]
  157. vst1.64 {d0}, [r0], r1
  158. vdup.8 d0, d1[6]
  159. vst1.64 {d0}, [r0], r1
  160. vdup.8 d0, d1[7]
  161. vst1.64 {d0}, [r0], r1
  162. bx lr
  163. ENDP ; |vpx_h_predictor_8x8_neon|
  164. ;void vpx_h_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride,
  165. ; const uint8_t *above,
  166. ; const uint8_t *left)
  167. ; r0 uint8_t *dst
  168. ; r1 ptrdiff_t y_stride
  169. ; r2 const uint8_t *above
  170. ; r3 const uint8_t *left
  171. |vpx_h_predictor_16x16_neon| PROC
  172. vld1.8 {q1}, [r3]
  173. vdup.8 q0, d2[0]
  174. vst1.8 {q0}, [r0], r1
  175. vdup.8 q0, d2[1]
  176. vst1.8 {q0}, [r0], r1
  177. vdup.8 q0, d2[2]
  178. vst1.8 {q0}, [r0], r1
  179. vdup.8 q0, d2[3]
  180. vst1.8 {q0}, [r0], r1
  181. vdup.8 q0, d2[4]
  182. vst1.8 {q0}, [r0], r1
  183. vdup.8 q0, d2[5]
  184. vst1.8 {q0}, [r0], r1
  185. vdup.8 q0, d2[6]
  186. vst1.8 {q0}, [r0], r1
  187. vdup.8 q0, d2[7]
  188. vst1.8 {q0}, [r0], r1
  189. vdup.8 q0, d3[0]
  190. vst1.8 {q0}, [r0], r1
  191. vdup.8 q0, d3[1]
  192. vst1.8 {q0}, [r0], r1
  193. vdup.8 q0, d3[2]
  194. vst1.8 {q0}, [r0], r1
  195. vdup.8 q0, d3[3]
  196. vst1.8 {q0}, [r0], r1
  197. vdup.8 q0, d3[4]
  198. vst1.8 {q0}, [r0], r1
  199. vdup.8 q0, d3[5]
  200. vst1.8 {q0}, [r0], r1
  201. vdup.8 q0, d3[6]
  202. vst1.8 {q0}, [r0], r1
  203. vdup.8 q0, d3[7]
  204. vst1.8 {q0}, [r0], r1
  205. bx lr
  206. ENDP ; |vpx_h_predictor_16x16_neon|
  207. ;void vpx_h_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride,
  208. ; const uint8_t *above,
  209. ; const uint8_t *left)
  210. ; r0 uint8_t *dst
  211. ; r1 ptrdiff_t y_stride
  212. ; r2 const uint8_t *above
  213. ; r3 const uint8_t *left
  214. |vpx_h_predictor_32x32_neon| PROC
  215. sub r1, r1, #16
  216. mov r2, #2
  217. loop_h
  218. vld1.8 {q1}, [r3]!
  219. vdup.8 q0, d2[0]
  220. vst1.8 {q0}, [r0]!
  221. vst1.8 {q0}, [r0], r1
  222. vdup.8 q0, d2[1]
  223. vst1.8 {q0}, [r0]!
  224. vst1.8 {q0}, [r0], r1
  225. vdup.8 q0, d2[2]
  226. vst1.8 {q0}, [r0]!
  227. vst1.8 {q0}, [r0], r1
  228. vdup.8 q0, d2[3]
  229. vst1.8 {q0}, [r0]!
  230. vst1.8 {q0}, [r0], r1
  231. vdup.8 q0, d2[4]
  232. vst1.8 {q0}, [r0]!
  233. vst1.8 {q0}, [r0], r1
  234. vdup.8 q0, d2[5]
  235. vst1.8 {q0}, [r0]!
  236. vst1.8 {q0}, [r0], r1
  237. vdup.8 q0, d2[6]
  238. vst1.8 {q0}, [r0]!
  239. vst1.8 {q0}, [r0], r1
  240. vdup.8 q0, d2[7]
  241. vst1.8 {q0}, [r0]!
  242. vst1.8 {q0}, [r0], r1
  243. vdup.8 q0, d3[0]
  244. vst1.8 {q0}, [r0]!
  245. vst1.8 {q0}, [r0], r1
  246. vdup.8 q0, d3[1]
  247. vst1.8 {q0}, [r0]!
  248. vst1.8 {q0}, [r0], r1
  249. vdup.8 q0, d3[2]
  250. vst1.8 {q0}, [r0]!
  251. vst1.8 {q0}, [r0], r1
  252. vdup.8 q0, d3[3]
  253. vst1.8 {q0}, [r0]!
  254. vst1.8 {q0}, [r0], r1
  255. vdup.8 q0, d3[4]
  256. vst1.8 {q0}, [r0]!
  257. vst1.8 {q0}, [r0], r1
  258. vdup.8 q0, d3[5]
  259. vst1.8 {q0}, [r0]!
  260. vst1.8 {q0}, [r0], r1
  261. vdup.8 q0, d3[6]
  262. vst1.8 {q0}, [r0]!
  263. vst1.8 {q0}, [r0], r1
  264. vdup.8 q0, d3[7]
  265. vst1.8 {q0}, [r0]!
  266. vst1.8 {q0}, [r0], r1
  267. subs r2, r2, #1
  268. bgt loop_h
  269. bx lr
  270. ENDP ; |vpx_h_predictor_32x32_neon|
  271. ;void vpx_tm_predictor_4x4_neon (uint8_t *dst, ptrdiff_t y_stride,
  272. ; const uint8_t *above,
  273. ; const uint8_t *left)
  274. ; r0 uint8_t *dst
  275. ; r1 ptrdiff_t y_stride
  276. ; r2 const uint8_t *above
  277. ; r3 const uint8_t *left
  278. |vpx_tm_predictor_4x4_neon| PROC
  279. ; Load ytop_left = above[-1];
  280. sub r12, r2, #1
  281. vld1.u8 {d0[]}, [r12]
  282. ; Load above 4 pixels
  283. vld1.32 {d2[0]}, [r2]
  284. ; Compute above - ytop_left
  285. vsubl.u8 q3, d2, d0
  286. ; Load left row by row and compute left + (above - ytop_left)
  287. ; 1st row and 2nd row
  288. vld1.u8 {d2[]}, [r3]!
  289. vld1.u8 {d4[]}, [r3]!
  290. vmovl.u8 q1, d2
  291. vmovl.u8 q2, d4
  292. vadd.s16 q1, q1, q3
  293. vadd.s16 q2, q2, q3
  294. vqmovun.s16 d0, q1
  295. vqmovun.s16 d1, q2
  296. vst1.32 {d0[0]}, [r0], r1
  297. vst1.32 {d1[0]}, [r0], r1
  298. ; 3rd row and 4th row
  299. vld1.u8 {d2[]}, [r3]!
  300. vld1.u8 {d4[]}, [r3]
  301. vmovl.u8 q1, d2
  302. vmovl.u8 q2, d4
  303. vadd.s16 q1, q1, q3
  304. vadd.s16 q2, q2, q3
  305. vqmovun.s16 d0, q1
  306. vqmovun.s16 d1, q2
  307. vst1.32 {d0[0]}, [r0], r1
  308. vst1.32 {d1[0]}, [r0], r1
  309. bx lr
  310. ENDP ; |vpx_tm_predictor_4x4_neon|
  311. ;void vpx_tm_predictor_8x8_neon (uint8_t *dst, ptrdiff_t y_stride,
  312. ; const uint8_t *above,
  313. ; const uint8_t *left)
  314. ; r0 uint8_t *dst
  315. ; r1 ptrdiff_t y_stride
  316. ; r2 const uint8_t *above
  317. ; r3 const uint8_t *left
  318. |vpx_tm_predictor_8x8_neon| PROC
  319. ; Load ytop_left = above[-1];
  320. sub r12, r2, #1
  321. vld1.8 {d0[]}, [r12]
  322. ; preload 8 left
  323. vld1.8 {d30}, [r3]
  324. ; Load above 8 pixels
  325. vld1.64 {d2}, [r2]
  326. vmovl.u8 q10, d30
  327. ; Compute above - ytop_left
  328. vsubl.u8 q3, d2, d0
  329. ; Load left row by row and compute left + (above - ytop_left)
  330. ; 1st row and 2nd row
  331. vdup.16 q0, d20[0]
  332. vdup.16 q1, d20[1]
  333. vadd.s16 q0, q3, q0
  334. vadd.s16 q1, q3, q1
  335. ; 3rd row and 4th row
  336. vdup.16 q8, d20[2]
  337. vdup.16 q9, d20[3]
  338. vadd.s16 q8, q3, q8
  339. vadd.s16 q9, q3, q9
  340. vqmovun.s16 d0, q0
  341. vqmovun.s16 d1, q1
  342. vqmovun.s16 d2, q8
  343. vqmovun.s16 d3, q9
  344. vst1.64 {d0}, [r0], r1
  345. vst1.64 {d1}, [r0], r1
  346. vst1.64 {d2}, [r0], r1
  347. vst1.64 {d3}, [r0], r1
  348. ; 5th row and 6th row
  349. vdup.16 q0, d21[0]
  350. vdup.16 q1, d21[1]
  351. vadd.s16 q0, q3, q0
  352. vadd.s16 q1, q3, q1
  353. ; 7th row and 8th row
  354. vdup.16 q8, d21[2]
  355. vdup.16 q9, d21[3]
  356. vadd.s16 q8, q3, q8
  357. vadd.s16 q9, q3, q9
  358. vqmovun.s16 d0, q0
  359. vqmovun.s16 d1, q1
  360. vqmovun.s16 d2, q8
  361. vqmovun.s16 d3, q9
  362. vst1.64 {d0}, [r0], r1
  363. vst1.64 {d1}, [r0], r1
  364. vst1.64 {d2}, [r0], r1
  365. vst1.64 {d3}, [r0], r1
  366. bx lr
  367. ENDP ; |vpx_tm_predictor_8x8_neon|
  368. ;void vpx_tm_predictor_16x16_neon (uint8_t *dst, ptrdiff_t y_stride,
  369. ; const uint8_t *above,
  370. ; const uint8_t *left)
  371. ; r0 uint8_t *dst
  372. ; r1 ptrdiff_t y_stride
  373. ; r2 const uint8_t *above
  374. ; r3 const uint8_t *left
  375. |vpx_tm_predictor_16x16_neon| PROC
  376. ; Load ytop_left = above[-1];
  377. sub r12, r2, #1
  378. vld1.8 {d0[]}, [r12]
  379. ; Load above 8 pixels
  380. vld1.8 {q1}, [r2]
  381. ; preload 8 left into r12
  382. vld1.8 {d18}, [r3]!
  383. ; Compute above - ytop_left
  384. vsubl.u8 q2, d2, d0
  385. vsubl.u8 q3, d3, d0
  386. vmovl.u8 q10, d18
  387. ; Load left row by row and compute left + (above - ytop_left)
  388. ; Process 8 rows in each single loop and loop 2 times to process 16 rows.
  389. mov r2, #2
  390. loop_16x16_neon
  391. ; Process two rows.
  392. vdup.16 q0, d20[0]
  393. vdup.16 q8, d20[1]
  394. vadd.s16 q1, q0, q2
  395. vadd.s16 q0, q0, q3
  396. vadd.s16 q11, q8, q2
  397. vadd.s16 q8, q8, q3
  398. vqmovun.s16 d2, q1
  399. vqmovun.s16 d3, q0
  400. vqmovun.s16 d22, q11
  401. vqmovun.s16 d23, q8
  402. vdup.16 q0, d20[2] ; proload next 2 rows data
  403. vdup.16 q8, d20[3]
  404. vst1.64 {d2,d3}, [r0], r1
  405. vst1.64 {d22,d23}, [r0], r1
  406. ; Process two rows.
  407. vadd.s16 q1, q0, q2
  408. vadd.s16 q0, q0, q3
  409. vadd.s16 q11, q8, q2
  410. vadd.s16 q8, q8, q3
  411. vqmovun.s16 d2, q1
  412. vqmovun.s16 d3, q0
  413. vqmovun.s16 d22, q11
  414. vqmovun.s16 d23, q8
  415. vdup.16 q0, d21[0] ; proload next 2 rows data
  416. vdup.16 q8, d21[1]
  417. vst1.64 {d2,d3}, [r0], r1
  418. vst1.64 {d22,d23}, [r0], r1
  419. vadd.s16 q1, q0, q2
  420. vadd.s16 q0, q0, q3
  421. vadd.s16 q11, q8, q2
  422. vadd.s16 q8, q8, q3
  423. vqmovun.s16 d2, q1
  424. vqmovun.s16 d3, q0
  425. vqmovun.s16 d22, q11
  426. vqmovun.s16 d23, q8
  427. vdup.16 q0, d21[2] ; proload next 2 rows data
  428. vdup.16 q8, d21[3]
  429. vst1.64 {d2,d3}, [r0], r1
  430. vst1.64 {d22,d23}, [r0], r1
  431. vadd.s16 q1, q0, q2
  432. vadd.s16 q0, q0, q3
  433. vadd.s16 q11, q8, q2
  434. vadd.s16 q8, q8, q3
  435. vqmovun.s16 d2, q1
  436. vqmovun.s16 d3, q0
  437. vqmovun.s16 d22, q11
  438. vqmovun.s16 d23, q8
  439. vld1.8 {d18}, [r3]! ; preload 8 left into r12
  440. vmovl.u8 q10, d18
  441. vst1.64 {d2,d3}, [r0], r1
  442. vst1.64 {d22,d23}, [r0], r1
  443. subs r2, r2, #1
  444. bgt loop_16x16_neon
  445. bx lr
  446. ENDP ; |vpx_tm_predictor_16x16_neon|
  447. ;void vpx_tm_predictor_32x32_neon (uint8_t *dst, ptrdiff_t y_stride,
  448. ; const uint8_t *above,
  449. ; const uint8_t *left)
  450. ; r0 uint8_t *dst
  451. ; r1 ptrdiff_t y_stride
  452. ; r2 const uint8_t *above
  453. ; r3 const uint8_t *left
  454. |vpx_tm_predictor_32x32_neon| PROC
  455. ; Load ytop_left = above[-1];
  456. sub r12, r2, #1
  457. vld1.8 {d0[]}, [r12]
  458. ; Load above 32 pixels
  459. vld1.8 {q1}, [r2]!
  460. vld1.8 {q2}, [r2]
  461. ; preload 8 left pixels
  462. vld1.8 {d26}, [r3]!
  463. ; Compute above - ytop_left
  464. vsubl.u8 q8, d2, d0
  465. vsubl.u8 q9, d3, d0
  466. vsubl.u8 q10, d4, d0
  467. vsubl.u8 q11, d5, d0
  468. vmovl.u8 q3, d26
  469. ; Load left row by row and compute left + (above - ytop_left)
  470. ; Process 8 rows in each single loop and loop 4 times to process 32 rows.
  471. mov r2, #4
  472. loop_32x32_neon
  473. ; Process two rows.
  474. vdup.16 q0, d6[0]
  475. vdup.16 q2, d6[1]
  476. vadd.s16 q12, q0, q8
  477. vadd.s16 q13, q0, q9
  478. vadd.s16 q14, q0, q10
  479. vadd.s16 q15, q0, q11
  480. vqmovun.s16 d0, q12
  481. vqmovun.s16 d1, q13
  482. vadd.s16 q12, q2, q8
  483. vadd.s16 q13, q2, q9
  484. vqmovun.s16 d2, q14
  485. vqmovun.s16 d3, q15
  486. vadd.s16 q14, q2, q10
  487. vadd.s16 q15, q2, q11
  488. vst1.64 {d0-d3}, [r0], r1
  489. vqmovun.s16 d24, q12
  490. vqmovun.s16 d25, q13
  491. vqmovun.s16 d26, q14
  492. vqmovun.s16 d27, q15
  493. vdup.16 q1, d6[2]
  494. vdup.16 q2, d6[3]
  495. vst1.64 {d24-d27}, [r0], r1
  496. ; Process two rows.
  497. vadd.s16 q12, q1, q8
  498. vadd.s16 q13, q1, q9
  499. vadd.s16 q14, q1, q10
  500. vadd.s16 q15, q1, q11
  501. vqmovun.s16 d0, q12
  502. vqmovun.s16 d1, q13
  503. vadd.s16 q12, q2, q8
  504. vadd.s16 q13, q2, q9
  505. vqmovun.s16 d2, q14
  506. vqmovun.s16 d3, q15
  507. vadd.s16 q14, q2, q10
  508. vadd.s16 q15, q2, q11
  509. vst1.64 {d0-d3}, [r0], r1
  510. vqmovun.s16 d24, q12
  511. vqmovun.s16 d25, q13
  512. vqmovun.s16 d26, q14
  513. vqmovun.s16 d27, q15
  514. vdup.16 q0, d7[0]
  515. vdup.16 q2, d7[1]
  516. vst1.64 {d24-d27}, [r0], r1
  517. ; Process two rows.
  518. vadd.s16 q12, q0, q8
  519. vadd.s16 q13, q0, q9
  520. vadd.s16 q14, q0, q10
  521. vadd.s16 q15, q0, q11
  522. vqmovun.s16 d0, q12
  523. vqmovun.s16 d1, q13
  524. vadd.s16 q12, q2, q8
  525. vadd.s16 q13, q2, q9
  526. vqmovun.s16 d2, q14
  527. vqmovun.s16 d3, q15
  528. vadd.s16 q14, q2, q10
  529. vadd.s16 q15, q2, q11
  530. vst1.64 {d0-d3}, [r0], r1
  531. vqmovun.s16 d24, q12
  532. vqmovun.s16 d25, q13
  533. vqmovun.s16 d26, q14
  534. vqmovun.s16 d27, q15
  535. vdup.16 q0, d7[2]
  536. vdup.16 q2, d7[3]
  537. vst1.64 {d24-d27}, [r0], r1
  538. ; Process two rows.
  539. vadd.s16 q12, q0, q8
  540. vadd.s16 q13, q0, q9
  541. vadd.s16 q14, q0, q10
  542. vadd.s16 q15, q0, q11
  543. vqmovun.s16 d0, q12
  544. vqmovun.s16 d1, q13
  545. vadd.s16 q12, q2, q8
  546. vadd.s16 q13, q2, q9
  547. vqmovun.s16 d2, q14
  548. vqmovun.s16 d3, q15
  549. vadd.s16 q14, q2, q10
  550. vadd.s16 q15, q2, q11
  551. vst1.64 {d0-d3}, [r0], r1
  552. vqmovun.s16 d24, q12
  553. vqmovun.s16 d25, q13
  554. vld1.8 {d0}, [r3]! ; preload 8 left pixels
  555. vqmovun.s16 d26, q14
  556. vqmovun.s16 d27, q15
  557. vmovl.u8 q3, d0
  558. vst1.64 {d24-d27}, [r0], r1
  559. subs r2, r2, #1
  560. bgt loop_32x32_neon
  561. bx lr
  562. ENDP ; |vpx_tm_predictor_32x32_neon|
  563. END