deblock-a.S 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. /*****************************************************************************
  2. * deblock.S: arm deblocking
  3. *****************************************************************************
  4. * Copyright (C) 2009-2018 x264 project
  5. *
  6. * Authors: Mans Rullgard <mans@mansr.com>
  7. * Martin Storsjo <martin@martin.st>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
  22. *
  23. * This program is also available under a commercial proprietary license.
  24. * For more information, contact us at licensing@x264.com.
  25. *****************************************************************************/
  26. #include "asm.S"
  27. .macro h264_loop_filter_start
  28. ldr ip, [sp]
  29. ldr ip, [ip]
  30. vdup.32 d24, ip
  31. and ip, ip, ip, lsl #16
  32. ands ip, ip, ip, lsl #8
  33. bxlt lr
  34. .endm
  35. .macro align_push_regs
  36. and ip, sp, #15
  37. add ip, ip, #32
  38. sub sp, sp, ip
  39. vst1.64 {d12-d15}, [sp,:128]
  40. sub sp, sp, #32
  41. vst1.64 {d8-d11}, [sp,:128]
  42. .endm
  43. .macro align_pop_regs
  44. vld1.64 {d8-d11}, [sp,:128]!
  45. vld1.64 {d12-d15}, [sp,:128], ip
  46. .endm
  47. .macro h264_loop_filter_luma
  48. vdup.8 q11, r2 @ alpha
  49. vmovl.u8 q12, d24
  50. vabd.u8 q6, q8, q0 @ abs(p0 - q0)
  51. vmovl.u16 q12, d24
  52. vabd.u8 q14, q9, q8 @ abs(p1 - p0)
  53. vsli.16 q12, q12, #8
  54. vabd.u8 q15, q1, q0 @ abs(q1 - q0)
  55. vsli.32 q12, q12, #16
  56. vclt.u8 q6, q6, q11 @ < alpha
  57. vdup.8 q11, r3 @ beta
  58. vclt.s8 q7, q12, #0
  59. vclt.u8 q14, q14, q11 @ < beta
  60. vclt.u8 q15, q15, q11 @ < beta
  61. vbic q6, q6, q7
  62. vabd.u8 q4, q10, q8 @ abs(p2 - p0)
  63. vand q6, q6, q14
  64. vabd.u8 q5, q2, q0 @ abs(q2 - q0)
  65. vclt.u8 q4, q4, q11 @ < beta
  66. vand q6, q6, q15
  67. vclt.u8 q5, q5, q11 @ < beta
  68. vand q4, q4, q6
  69. vand q5, q5, q6
  70. vand q12, q12, q6
  71. vrhadd.u8 q14, q8, q0
  72. vsub.i8 q6, q12, q4
  73. vqadd.u8 q7, q9, q12
  74. vhadd.u8 q10, q10, q14
  75. vsub.i8 q6, q6, q5
  76. vhadd.u8 q14, q2, q14
  77. vmin.u8 q7, q7, q10
  78. vqsub.u8 q11, q9, q12
  79. vqadd.u8 q2, q1, q12
  80. vmax.u8 q7, q7, q11
  81. vqsub.u8 q11, q1, q12
  82. vmin.u8 q14, q2, q14
  83. vmovl.u8 q2, d0
  84. vmax.u8 q14, q14, q11
  85. vmovl.u8 q10, d1
  86. vsubw.u8 q2, q2, d16
  87. vsubw.u8 q10, q10, d17
  88. vshl.i16 q2, q2, #2
  89. vshl.i16 q10, q10, #2
  90. vaddw.u8 q2, q2, d18
  91. vaddw.u8 q10, q10, d19
  92. vsubw.u8 q2, q2, d2
  93. vsubw.u8 q10, q10, d3
  94. vrshrn.i16 d4, q2, #3
  95. vrshrn.i16 d5, q10, #3
  96. vbsl q4, q7, q9
  97. vbsl q5, q14, q1
  98. vneg.s8 q7, q6
  99. vmovl.u8 q14, d16
  100. vmin.s8 q2, q2, q6
  101. vmovl.u8 q6, d17
  102. vmax.s8 q2, q2, q7
  103. vmovl.u8 q11, d0
  104. vmovl.u8 q12, d1
  105. vaddw.s8 q14, q14, d4
  106. vaddw.s8 q6, q6, d5
  107. vsubw.s8 q11, q11, d4
  108. vsubw.s8 q12, q12, d5
  109. vqmovun.s16 d16, q14
  110. vqmovun.s16 d17, q6
  111. vqmovun.s16 d0, q11
  112. vqmovun.s16 d1, q12
  113. .endm
  114. function deblock_v_luma_neon
  115. h264_loop_filter_start
  116. vld1.64 {d0, d1}, [r0,:128], r1
  117. vld1.64 {d2, d3}, [r0,:128], r1
  118. vld1.64 {d4, d5}, [r0,:128], r1
  119. sub r0, r0, r1, lsl #2
  120. sub r0, r0, r1, lsl #1
  121. vld1.64 {d20,d21}, [r0,:128], r1
  122. vld1.64 {d18,d19}, [r0,:128], r1
  123. vld1.64 {d16,d17}, [r0,:128], r1
  124. align_push_regs
  125. h264_loop_filter_luma
  126. sub r0, r0, r1, lsl #1
  127. vst1.64 {d8, d9}, [r0,:128], r1
  128. vst1.64 {d16,d17}, [r0,:128], r1
  129. vst1.64 {d0, d1}, [r0,:128], r1
  130. vst1.64 {d10,d11}, [r0,:128]
  131. align_pop_regs
  132. bx lr
  133. endfunc
  134. function deblock_h_luma_neon
  135. h264_loop_filter_start
  136. sub r0, r0, #4
  137. vld1.64 {d6}, [r0], r1
  138. vld1.64 {d20}, [r0], r1
  139. vld1.64 {d18}, [r0], r1
  140. vld1.64 {d16}, [r0], r1
  141. vld1.64 {d0}, [r0], r1
  142. vld1.64 {d2}, [r0], r1
  143. vld1.64 {d4}, [r0], r1
  144. vld1.64 {d26}, [r0], r1
  145. vld1.64 {d7}, [r0], r1
  146. vld1.64 {d21}, [r0], r1
  147. vld1.64 {d19}, [r0], r1
  148. vld1.64 {d17}, [r0], r1
  149. vld1.64 {d1}, [r0], r1
  150. vld1.64 {d3}, [r0], r1
  151. vld1.64 {d5}, [r0], r1
  152. vld1.64 {d27}, [r0], r1
  153. TRANSPOSE8x8 q3, q10, q9, q8, q0, q1, q2, q13
  154. align_push_regs
  155. h264_loop_filter_luma
  156. TRANSPOSE4x4 q4, q8, q0, q5
  157. sub r0, r0, r1, lsl #4
  158. add r0, r0, #2
  159. vst1.32 {d8[0]}, [r0], r1
  160. vst1.32 {d16[0]}, [r0], r1
  161. vst1.32 {d0[0]}, [r0], r1
  162. vst1.32 {d10[0]}, [r0], r1
  163. vst1.32 {d8[1]}, [r0], r1
  164. vst1.32 {d16[1]}, [r0], r1
  165. vst1.32 {d0[1]}, [r0], r1
  166. vst1.32 {d10[1]}, [r0], r1
  167. vst1.32 {d9[0]}, [r0], r1
  168. vst1.32 {d17[0]}, [r0], r1
  169. vst1.32 {d1[0]}, [r0], r1
  170. vst1.32 {d11[0]}, [r0], r1
  171. vst1.32 {d9[1]}, [r0], r1
  172. vst1.32 {d17[1]}, [r0], r1
  173. vst1.32 {d1[1]}, [r0], r1
  174. vst1.32 {d11[1]}, [r0], r1
  175. align_pop_regs
  176. bx lr
  177. endfunc
  178. .macro h264_loop_filter_luma_intra
  179. vdup.8 q14, r2 @ alpha
  180. vabd.u8 q4, q8, q0 @ abs(p0 - q0)
  181. vabd.u8 q5, q9, q8 @ abs(p1 - p0)
  182. vabd.u8 q6, q1, q0 @ abs(q1 - q0)
  183. vdup.8 q15, r3 @ beta
  184. vmov.u8 q13, #2
  185. vclt.u8 q7, q4, q14 @ < alpha
  186. vshr.u8 q14, q14, #2 @ alpha >> 2
  187. vclt.u8 q5, q5, q15 @ < beta
  188. vadd.u8 q14, q14, q13 @ (alpha >> 2) + 2
  189. vand q7, q7, q5
  190. vclt.u8 q6, q6, q15 @ < beta
  191. vclt.u8 q13, q4, q14 @ < (alpha >> 2) + 2 if_2
  192. vand q12, q7, q6 @ if_1
  193. vshrn.u16 d28, q12, #4
  194. vmov r2, lr, d28
  195. orrs r2, r2, lr
  196. beq 9f
  197. sub sp, sp, #32
  198. vst1.8 {q12-q13}, [sp,:128]
  199. vshll.u8 q4, d18, #1 @ 2*p1
  200. vshll.u8 q5, d19, #1
  201. vaddw.u8 q4, q4, d16 @ 2*p1 + p0
  202. vaddw.u8 q5, q5, d17
  203. vaddw.u8 q4, q4, d2 @ 2*p1 + p0 + q1
  204. vaddw.u8 q5, q5, d3
  205. vrshrn.u16 d24, q4, #2
  206. vrshrn.u16 d25, q5, #2
  207. vaddl.u8 q6, d20, d16 @ p2 + p0
  208. vaddl.u8 q7, d21, d17
  209. vaddw.u8 q6, q6, d0 @ p2 + p0 + q0
  210. vaddw.u8 q7, q7, d1
  211. vadd.u16 q4, q4, q6 @ p2 + 2*p1 + 2*p0 + q0 + q1
  212. vadd.u16 q5, q5, q7
  213. vaddw.u8 q4, q4, d0 @ p2 + 2*p1 + 2*p0 + 2*q0 + q1
  214. vaddw.u8 q5, q5, d1
  215. vrshrn.u16 d26, q4, #3 @ p0'_2
  216. vrshrn.u16 d27, q5, #3
  217. vaddw.u8 q6, q6, d18 @ p2 + p1 + p0 + q0
  218. vaddw.u8 q7, q7, d19
  219. vrshrn.u16 d28, q6, #2 @ p1'_2
  220. vrshrn.u16 d29, q7, #2
  221. vaddl.u8 q4, d22, d20 @ p3 + p2
  222. vaddl.u8 q5, d23, d21
  223. vshl.u16 q4, q4, #1 @ 2*p3 + 2*p2
  224. vshl.u16 q5, q5, #1
  225. vadd.u16 q4, q4, q6 @ 2*p3 + 3*p2 + p1 + p0 + q0
  226. vadd.u16 q5, q5, q7
  227. vrshrn.u16 d30, q4, #3 @ p2'_2
  228. vrshrn.u16 d31, q5, #3
  229. vdup.8 q4, r3 @ beta
  230. vabd.u8 q5, q10, q8 @ abs(p2 - p0)
  231. vld1.8 {q6-q7}, [sp,:128] @ if_1, if_2
  232. vclt.u8 q5, q5, q4 @ < beta if_3
  233. vand q7, q7, q5 @ if_2 && if_3
  234. vmvn q4, q7
  235. vand q7, q7, q6 @ if_1 && if_2 && if_3
  236. vand q6, q4, q6 @ if_1 && !(if_2 && if_3)
  237. @ copy p0 to q15 so it can be clobbered
  238. vbit q10, q15, q7
  239. vmov q15, q8
  240. vbit q8, q12, q6
  241. @ wait for q9 to clobber
  242. vshll.u8 q4, d2, #1 @ 2*q1
  243. vshll.u8 q5, d3, #1
  244. vbit q8, q12, q6
  245. vaddw.u8 q4, q4, d0 @ 2*q1 + q0
  246. vaddw.u8 q5, q5, d1
  247. vbit q8, q13, q7
  248. vaddw.u8 q4, q4, d18 @ 2*q1 + q0 + p1
  249. vaddw.u8 q5, q5, d19
  250. vbit q9, q14, q7
  251. vrshrn.u16 d24, q4, #2
  252. vrshrn.u16 d25, q5, #2
  253. vaddl.u8 q6, d4, d0 @ q2 + q0
  254. vaddl.u8 q7, d5, d1
  255. vaddw.u8 q6, q6, d30 @ q2 + q0 + p0
  256. vaddw.u8 q7, q7, d31
  257. vadd.u16 q4, q4, q6 @ q2 + 2*q1 + 2*q0 + p0 + p1
  258. vadd.u16 q5, q5, q7
  259. vaddw.u8 q4, q4, d30 @ q2 + 2*q1 + 2*q0 + 2*p0 + p1
  260. vaddw.u8 q5, q5, d31
  261. vrshrn.u16 d26, q4, #3 @ q0'_2
  262. vrshrn.u16 d27, q5, #3
  263. vaddw.u8 q6, q6, d2 @ q2 + q1 + q0 + p0
  264. vaddw.u8 q7, q7, d3
  265. vrshrn.u16 d28, q6, #2 @ q1'_2
  266. vrshrn.u16 d29, q7, #2
  267. vaddl.u8 q4, d6, d4 @ q3 + q2
  268. vaddl.u8 q5, d7, d5
  269. vshl.u16 q4, q4, #1 @ 2*q3 + 2*q2
  270. vshl.u16 q5, q5, #1
  271. vadd.u16 q4, q4, q6 @ 2*q3 + 3*q2 + q1 + q0 + p0
  272. vadd.u16 q5, q5, q7
  273. vrshrn.u16 d30, q4, #3 @ q2'_2
  274. vrshrn.u16 d31, q5, #3
  275. vdup.8 q4, r3 @ beta
  276. vabd.u8 q5, q2, q0 @ abs(q2 - q0)
  277. vld1.8 {q6-q7}, [sp,:128]! @ if_1, if_2
  278. vclt.u8 q5, q5, q4 @ < beta if_4
  279. vand q7, q7, q5 @ if_2 && if_4
  280. vmvn q4, q7
  281. vand q7, q6, q7 @ if_1 && if_2 && if_4
  282. vand q6, q6, q4 @ if_1 && !(if_2 && if_4)
  283. vbit q0, q12, q6
  284. vbit q1, q14, q7
  285. vbit q0, q13, q7
  286. vbit q2, q15, q7
  287. .endm
  288. function deblock_v_luma_intra_neon
  289. push {lr}
  290. vld1.64 {d0, d1}, [r0,:128], r1
  291. vld1.64 {d2, d3}, [r0,:128], r1
  292. vld1.64 {d4, d5}, [r0,:128], r1
  293. vld1.64 {d6, d7}, [r0,:128], r1
  294. sub r0, r0, r1, lsl #3
  295. vld1.64 {d22,d23}, [r0,:128], r1
  296. vld1.64 {d20,d21}, [r0,:128], r1
  297. vld1.64 {d18,d19}, [r0,:128], r1
  298. vld1.64 {d16,d17}, [r0,:128]
  299. align_push_regs
  300. h264_loop_filter_luma_intra
  301. sub r0, r0, r1, lsl #1
  302. vst1.64 {d20,d21}, [r0,:128], r1
  303. vst1.64 {d18,d19}, [r0,:128], r1
  304. vst1.64 {d16,d17}, [r0,:128], r1
  305. vst1.64 {d0, d1}, [r0,:128], r1
  306. vst1.64 {d2, d3}, [r0,:128], r1
  307. vst1.64 {d4, d5}, [r0,:128]
  308. 9:
  309. align_pop_regs
  310. pop {pc}
  311. endfunc
  312. function deblock_h_luma_intra_neon
  313. push {lr}
  314. sub r0, r0, #4
  315. vld1.64 {d22}, [r0], r1
  316. vld1.64 {d20}, [r0], r1
  317. vld1.64 {d18}, [r0], r1
  318. vld1.64 {d16}, [r0], r1
  319. vld1.64 {d0}, [r0], r1
  320. vld1.64 {d2}, [r0], r1
  321. vld1.64 {d4}, [r0], r1
  322. vld1.64 {d6}, [r0], r1
  323. vld1.64 {d23}, [r0], r1
  324. vld1.64 {d21}, [r0], r1
  325. vld1.64 {d19}, [r0], r1
  326. vld1.64 {d17}, [r0], r1
  327. vld1.64 {d1}, [r0], r1
  328. vld1.64 {d3}, [r0], r1
  329. vld1.64 {d5}, [r0], r1
  330. vld1.64 {d7}, [r0], r1
  331. TRANSPOSE8x8 q11, q10, q9, q8, q0, q1, q2, q3
  332. align_push_regs
  333. h264_loop_filter_luma_intra
  334. TRANSPOSE8x8 q11, q10, q9, q8, q0, q1, q2, q3
  335. sub r0, r0, r1, lsl #4
  336. vst1.64 {d22}, [r0], r1
  337. vst1.64 {d20}, [r0], r1
  338. vst1.64 {d18}, [r0], r1
  339. vst1.64 {d16}, [r0], r1
  340. vst1.64 {d0}, [r0], r1
  341. vst1.64 {d2}, [r0], r1
  342. vst1.64 {d4}, [r0], r1
  343. vst1.64 {d6}, [r0], r1
  344. vst1.64 {d23}, [r0], r1
  345. vst1.64 {d21}, [r0], r1
  346. vst1.64 {d19}, [r0], r1
  347. vst1.64 {d17}, [r0], r1
  348. vst1.64 {d1}, [r0], r1
  349. vst1.64 {d3}, [r0], r1
  350. vst1.64 {d5}, [r0], r1
  351. vst1.64 {d7}, [r0], r1
  352. 9:
  353. align_pop_regs
  354. pop {pc}
  355. endfunc
  356. .macro h264_loop_filter_chroma
  357. vdup.8 q11, r2 // alpha
  358. vmovl.u8 q12, d24
  359. vabd.u8 q13, q8, q0 // abs(p0 - q0)
  360. vabd.u8 q14, q9, q8 // abs(p1 - p0)
  361. vsubl.u8 q2, d0, d16
  362. vsubl.u8 q3, d1, d17
  363. vsli.16 q12, q12, #8
  364. vshl.i16 q2, q2, #2
  365. vshl.i16 q3, q3, #2
  366. vabd.u8 q15, q1, q0 // abs(q1 - q0)
  367. vmovl.u8 q12, d24
  368. vaddw.u8 q2, q2, d18
  369. vaddw.u8 q3, q3, d19
  370. vclt.u8 q13, q13, q11 // < alpha
  371. vsubw.u8 q2, q2, d2
  372. vsubw.u8 q3, q3, d3
  373. vsli.16 q12, q12, #8
  374. vdup.8 q11, r3 // beta
  375. vclt.s8 q10, q12, #0
  376. vrshrn.i16 d4, q2, #3
  377. vrshrn.i16 d5, q3, #3
  378. vclt.u8 q14, q14, q11 // < beta
  379. vbic q13, q13, q10
  380. vclt.u8 q15, q15, q11 // < beta
  381. vand q13, q13, q14
  382. vneg.s8 q10, q12
  383. vand q13, q13, q15
  384. vmin.s8 q2, q2, q12
  385. vmovl.u8 q14, d16
  386. vand q2, q2, q13
  387. vmovl.u8 q15, d17
  388. vmax.s8 q2, q2, q10
  389. vmovl.u8 q11, d0
  390. vmovl.u8 q12, d1
  391. vaddw.s8 q14, q14, d4
  392. vaddw.s8 q15, q15, d5
  393. vsubw.s8 q11, q11, d4
  394. vsubw.s8 q12, q12, d5
  395. vqmovun.s16 d16, q14
  396. vqmovun.s16 d17, q15
  397. vqmovun.s16 d0, q11
  398. vqmovun.s16 d1, q12
  399. .endm
  400. function deblock_v_chroma_neon
  401. h264_loop_filter_start
  402. sub r0, r0, r1, lsl #1
  403. vld1.8 {d18,d19}, [r0,:128], r1
  404. vld1.8 {d16,d17}, [r0,:128], r1
  405. vld1.8 {d0, d1}, [r0,:128], r1
  406. vld1.8 {d2, d3}, [r0,:128]
  407. h264_loop_filter_chroma
  408. sub r0, r0, r1, lsl #1
  409. vst1.8 {d16,d17}, [r0,:128], r1
  410. vst1.8 {d0, d1}, [r0,:128], r1
  411. bx lr
  412. endfunc
  413. function deblock_h_chroma_neon
  414. h264_loop_filter_start
  415. sub r0, r0, #4
  416. deblock_h_chroma:
  417. vld1.8 {d18}, [r0], r1
  418. vld1.8 {d16}, [r0], r1
  419. vld1.8 {d0}, [r0], r1
  420. vld1.8 {d2}, [r0], r1
  421. vld1.8 {d19}, [r0], r1
  422. vld1.8 {d17}, [r0], r1
  423. vld1.8 {d1}, [r0], r1
  424. vld1.8 {d3}, [r0], r1
  425. TRANSPOSE4x4_16 q9, q8, q0, q1
  426. h264_loop_filter_chroma
  427. vtrn.16 q8, q0
  428. sub r0, r0, r1, lsl #3
  429. add r0, r0, #2
  430. vst1.32 {d16[0]}, [r0], r1
  431. vst1.32 {d0[0]}, [r0], r1
  432. vst1.32 {d16[1]}, [r0], r1
  433. vst1.32 {d0[1]}, [r0], r1
  434. vst1.32 {d17[0]}, [r0], r1
  435. vst1.32 {d1[0]}, [r0], r1
  436. vst1.32 {d17[1]}, [r0], r1
  437. vst1.32 {d1[1]}, [r0], r1
  438. bx lr
  439. endfunc
  440. function deblock_h_chroma_422_neon
  441. h264_loop_filter_start
  442. push {lr}
  443. sub r0, r0, #4
  444. add r1, r1, r1
  445. bl deblock_h_chroma
  446. ldr ip, [sp, #4]
  447. ldr ip, [ip]
  448. vdup.32 d24, ip
  449. sub r0, r0, r1, lsl #3
  450. add r0, r0, r1, lsr #1
  451. sub r0, r0, #2
  452. pop {lr}
  453. b deblock_h_chroma
  454. endfunc
  455. .macro h264_loop_filter_chroma8
  456. vdup.8 d22, r2 @ alpha
  457. vmovl.u8 q12, d24
  458. vabd.u8 d26, d16, d0 @ abs(p0 - q0)
  459. vabd.u8 d28, d18, d16 @ abs(p1 - p0)
  460. vsubl.u8 q2, d0, d16
  461. vsli.16 d24, d24, #8
  462. vshl.i16 q2, q2, #2
  463. vabd.u8 d30, d2, d0 @ abs(q1 - q0)
  464. vaddw.u8 q2, q2, d18
  465. vclt.u8 d26, d26, d22 @ < alpha
  466. vsubw.u8 q2, q2, d2
  467. vdup.8 d22, r3 @ beta
  468. vclt.s8 d20, d24, #0
  469. vrshrn.i16 d4, q2, #3
  470. vclt.u8 d28, d28, d22 @ < beta
  471. vbic d26, d26, d20
  472. vclt.u8 d30, d30, d22 @ < beta
  473. vand d26, d26, d28
  474. vneg.s8 d20, d24
  475. vand d26, d26, d30
  476. vmin.s8 d4, d4, d24
  477. vmovl.u8 q14, d16
  478. vand d4, d4, d26
  479. vmax.s8 d4, d4, d20
  480. vmovl.u8 q11, d0
  481. vaddw.s8 q14, q14, d4
  482. vsubw.s8 q11, q11, d4
  483. vqmovun.s16 d16, q14
  484. vqmovun.s16 d0, q11
  485. .endm
  486. function deblock_h_chroma_mbaff_neon
  487. h264_loop_filter_start
  488. sub r0, r0, #4
  489. vld1.8 {d18}, [r0], r1
  490. vld1.8 {d16}, [r0], r1
  491. vld1.8 {d0}, [r0], r1
  492. vld1.8 {d2}, [r0], r1
  493. TRANSPOSE4x4_16 d18, d16, d0, d2
  494. h264_loop_filter_chroma8
  495. vtrn.16 d16, d0
  496. sub r0, r0, r1, lsl #2
  497. add r0, r0, #2
  498. vst1.32 {d16[0]}, [r0], r1
  499. vst1.32 {d0[0]}, [r0], r1
  500. vst1.32 {d16[1]}, [r0], r1
  501. vst1.32 {d0[1]}, [r0]
  502. bx lr
  503. endfunc
  504. .macro h264_loop_filter_chroma_intra, width=16
  505. vdup.8 q11, r2 @ alpha
  506. vabd.u8 q13, q8, q0 @ abs(p0 - q0)
  507. vabd.u8 q14, q9, q8 @ abs(p1 - p0)
  508. vabd.u8 q15, q1, q0 @ abs(q1 - q0)
  509. vclt.u8 q13, q13, q11 @ < alpha
  510. vdup.8 q11, r3 @ beta
  511. vclt.u8 q14, q14, q11 @ < beta
  512. vclt.u8 q15, q15, q11 @ < beta
  513. vand q13, q13, q14
  514. vand q13, q13, q15
  515. vshll.u8 q14, d18, #1
  516. vshll.u8 q2, d2, #1
  517. .ifc \width, 16
  518. vshll.u8 q15, d19, #1
  519. vshll.u8 q3, d3, #1
  520. vaddl.u8 q12, d17, d3
  521. vaddl.u8 q10, d1, d19
  522. .endif
  523. vaddl.u8 q11, d16, d2
  524. vaddl.u8 q1, d18, d0 @ or vaddw q2, to not clobber q1
  525. vadd.u16 q14, q14, q11
  526. vadd.u16 q2, q2, q1
  527. .ifc \width, 16
  528. vadd.u16 q15, q15, q12
  529. vadd.u16 q3, q3, q10
  530. .endif
  531. vqrshrn.u16 d28, q14, #2
  532. vqrshrn.u16 d4, q2, #2
  533. .ifc \width, 16
  534. vqrshrn.u16 d29, q15, #2
  535. vqrshrn.u16 d5, q3, #2
  536. .endif
  537. vbit q8, q14, q13
  538. vbit q0, q2, q13
  539. .endm
  540. function deblock_v_chroma_intra_neon
  541. sub r0, r0, r1, lsl #1
  542. vld2.8 {d18,d19}, [r0,:128], r1
  543. vld2.8 {d16,d17}, [r0,:128], r1
  544. vld2.8 {d0, d1}, [r0,:128], r1
  545. vld2.8 {d2, d3}, [r0,:128]
  546. h264_loop_filter_chroma_intra
  547. sub r0, r0, r1, lsl #1
  548. vst2.8 {d16,d17}, [r0,:128], r1
  549. vst2.8 {d0, d1}, [r0,:128], r1
  550. bx lr
  551. endfunc
  552. function deblock_h_chroma_intra_neon
  553. sub r0, r0, #4
  554. vld1.8 {d18}, [r0], r1
  555. vld1.8 {d16}, [r0], r1
  556. vld1.8 {d0}, [r0], r1
  557. vld1.8 {d2}, [r0], r1
  558. vld1.8 {d19}, [r0], r1
  559. vld1.8 {d17}, [r0], r1
  560. vld1.8 {d1}, [r0], r1
  561. vld1.8 {d3}, [r0], r1
  562. TRANSPOSE4x4_16 q9, q8, q0, q1
  563. h264_loop_filter_chroma_intra
  564. vtrn.16 q8, q0
  565. sub r0, r0, r1, lsl #3
  566. add r0, r0, #2
  567. vst1.32 {d16[0]}, [r0], r1
  568. vst1.32 {d0[0]}, [r0], r1
  569. vst1.32 {d16[1]}, [r0], r1
  570. vst1.32 {d0[1]}, [r0], r1
  571. vst1.32 {d17[0]}, [r0], r1
  572. vst1.32 {d1[0]}, [r0], r1
  573. vst1.32 {d17[1]}, [r0], r1
  574. vst1.32 {d1[1]}, [r0], r1
  575. bx lr
  576. endfunc
  577. function deblock_h_chroma_422_intra_neon
  578. push {lr}
  579. bl X(deblock_h_chroma_intra_neon)
  580. add r0, r0, #2
  581. pop {lr}
  582. b X(deblock_h_chroma_intra_neon)
  583. endfunc
  584. function deblock_h_chroma_intra_mbaff_neon
  585. sub r0, r0, #4
  586. vld1.8 {d18}, [r0], r1
  587. vld1.8 {d16}, [r0], r1
  588. vld1.8 {d0}, [r0], r1
  589. vld1.8 {d2}, [r0], r1
  590. TRANSPOSE4x4_16 d18, d16, d0, d2
  591. h264_loop_filter_chroma_intra width=8
  592. vtrn.16 d16, d0
  593. sub r0, r0, r1, lsl #2
  594. add r0, r0, #2
  595. vst1.32 {d16[0]}, [r0], r1
  596. vst1.32 {d0[0]}, [r0], r1
  597. vst1.32 {d16[1]}, [r0], r1
  598. vst1.32 {d0[1]}, [r0]
  599. bx lr
  600. endfunc
  601. function deblock_strength_neon
  602. ldr ip, [sp]
  603. vmov.i8 q8, #0
  604. lsl ip, ip, #8
  605. add r3, r3, #32
  606. sub ip, ip, #(1<<8)-3
  607. vmov.i8 q9, #0
  608. vdup.16 q10, ip
  609. ldr ip, [sp, #4]
  610. lists:
  611. @ load bytes ref
  612. vld1.8 {d31}, [r1]!
  613. add r2, r2, #16
  614. vld1.8 {q1}, [r1]!
  615. vmov.i8 q0, #0
  616. vld1.8 {q2}, [r1]!
  617. vext.8 q3, q0, q1, #15
  618. vext.8 q0, q0, q2, #15
  619. vuzp.32 q1, q2
  620. vuzp.32 q3, q0
  621. vext.8 q1, q15, q2, #12
  622. veor q0, q0, q2
  623. veor q1, q1, q2
  624. vorr q8, q8, q0
  625. vorr q9, q9, q1
  626. vld1.16 {q11}, [r2,:128]! @ mv + 0x10
  627. vld1.16 {q3}, [r2,:128]! @ mv + 0x20
  628. vld1.16 {q12}, [r2,:128]! @ mv + 0x30
  629. vld1.16 {q2}, [r2,:128]! @ mv + 0x40
  630. vld1.16 {q13}, [r2,:128]! @ mv + 0x50
  631. vext.8 q3, q3, q12, #12
  632. vext.8 q2, q2, q13, #12
  633. vabd.s16 q0, q12, q3
  634. vld1.16 {q3}, [r2,:128]! @ mv + 0x60
  635. vabd.s16 q1, q13, q2
  636. vld1.16 {q14}, [r2,:128]! @ mv + 0x70
  637. vqmovn.u16 d0, q0
  638. vld1.16 {q2}, [r2,:128]! @ mv + 0x80
  639. vld1.16 {q15}, [r2,:128]! @ mv + 0x90
  640. vqmovn.u16 d1, q1
  641. vext.8 q3, q3, q14, #12
  642. vext.8 q2, q2, q15, #12
  643. vabd.s16 q3, q14, q3
  644. vabd.s16 q2, q15, q2
  645. vqmovn.u16 d2, q3
  646. vqmovn.u16 d3, q2
  647. vqsub.u8 q0, q0, q10
  648. vqsub.u8 q1, q1, q10
  649. vqmovn.u16 d0, q0
  650. vqmovn.u16 d1, q1
  651. vabd.s16 q1, q12, q13
  652. vorr q8, q8, q0
  653. vabd.s16 q0, q11, q12
  654. vabd.s16 q2, q13, q14
  655. vabd.s16 q3, q14, q15
  656. vqmovn.u16 d0, q0
  657. vqmovn.u16 d1, q1
  658. vqmovn.u16 d2, q2
  659. vqmovn.u16 d3, q3
  660. vqsub.u8 q0, q0, q10
  661. vqsub.u8 q1, q1, q10
  662. vqmovn.u16 d0, q0
  663. vqmovn.u16 d1, q1
  664. subs ip, ip, #1
  665. vorr q9, q9, q0
  666. beq lists
  667. mov ip, #-32
  668. @ load bytes nnz
  669. vld1.8 {d31}, [r0]!
  670. vld1.8 {q1}, [r0]!
  671. vmov.i8 q0, #0
  672. vld1.8 {q2}, [r0]
  673. vext.8 q3, q0, q1, #15
  674. vext.8 q0, q0, q2, #15
  675. vuzp.32 q1, q2
  676. vuzp.32 q3, q0
  677. vext.8 q1, q15, q2, #12
  678. vorr q0, q0, q2
  679. vorr q1, q1, q2
  680. vmov.u8 q10, #1
  681. vmin.u8 q0, q0, q10
  682. vmin.u8 q1, q1, q10
  683. vmin.u8 q8, q8, q10 @ mv ? 1 : 0
  684. vmin.u8 q9, q9, q10
  685. vadd.u8 q0, q0, q0 @ nnz ? 2 : 0
  686. vadd.u8 q1, q1, q1
  687. vmax.u8 q8, q8, q0
  688. vmax.u8 q9, q9, q1
  689. vzip.16 d16, d17
  690. vst1.8 {q9}, [r3,:128], ip @ bs[1]
  691. vtrn.8 d16, d17
  692. vtrn.32 d16, d17
  693. vst1.8 {q8}, [r3,:128] @ bs[0]
  694. bx lr
  695. endfunc