1/* 2 * Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 22#include "libavutil/arm/asm.S" 23#include "neon.S" 24 25.macro hevc_loop_filter_chroma_start 26 ldr r12, [r2] 27 ldr r3, [r2, #4] 28 add r2, r3, r12 29 cmp r2, #0 30 it eq 31 bxeq lr 32.endm 33 34.macro hevc_loop_filter_chroma_body 35 vsubl.u8 q3, d4, d2 36 vsubl.u8 q11, d18, d19 37 vshl.i16 q3, #2 38 vadd.i16 q11, q3 39 vdup.16 d0, r12 40 vdup.16 d1, r3 41 vrshr.s16 q11, q11, #3 42 vneg.s16 q12, q0 43 vmovl.u8 q2, d4 44 vmin.s16 q11, q11, q0 45 vmax.s16 q11, q11, q12 46 vaddw.u8 q1, q11, d2 47 vsub.i16 q2, q11 48 vqmovun.s16 d2, q1 49 vqmovun.s16 d4, q2 50.endm 51 52.macro hevc_loop_filter_luma_start 53 ldr r12, [r3] 54 ldr r3, [r3, #4] 55 lsl r3, #16 56 orr r3, r12 57 cmp r3, #0 58 it eq 59 bxeq lr 60 lsr r3, #16 61.endm 62 63.macro hevc_loop_filter_luma_body 64 vmovl.u8 q8, d16 65 vmovl.u8 q9, d18 66 vmovl.u8 q10, d20 67 vmovl.u8 q11, d22 68 vmovl.u8 q12, d24 69 vmovl.u8 q13, d26 70 vmovl.u8 q14, d28 71 vmovl.u8 q15, d30 72 73 vadd.i16 q7, q9, q11 74 vadd.i16 q6, q14, q12 75 vsub.i16 q7, q10 76 vsub.i16 q6, q13 77 vabd.s16 q7, q7, q10 78 vabd.s16 q6, q6, q13 79 80 81 vdup.16 q0, r2 82 vmov q4, q7 83 vmov q5, q6 84 vdup.16 d4, r12 85 vtrn.16 q7, q4 86 vtrn.16 q6, q5 87 88 vshl.u64 q7, #32 89 vshr.u64 q4, #32 90 vshl.u64 q6, #32 91 vshr.u64 q5, #32 92 vshr.u64 q7, #32 93 vshr.u64 q6, #32 94 vshl.u64 q5, #32 95 vshl.u64 q4, #32 96 vorr q6, q5 97 vorr q7, q4 98 vdup.16 d5, r3 99 vadd.i16 q5, q7, q6 100 101 vmov q4, q5 102 vmov q3, q5 103 vtrn.32 q3, q4 104 105 vadd.i16 q4, q3 106 107 vshl.s16 q5, q5, #1 108 vcgt.s16 q3, q0, q4 109 110 vmovn.i16 d6, q3 111 vshr.s16 q1, q0, #2 112 vmovn.i16 d6, q3 113 vcgt.s16 q5, q1, q5 114 vmov r7, s12 115 cmp r7, #0 116 beq bypasswrite 117 118 vpadd.i32 d0, d14, d12 119 vpadd.i32 d1, d15, d13 120 vmov q4, q2 121 vshl.s16 q2, #2 122 vshr.s16 q1, q1, #1 123 vrhadd.s16 q2, q4 124 125 vabd.s16 q7, q8, q11 126 vaba.s16 q7, q15, q12 127 128 vmovn.i32 d0, q0 129 vmov r5, r6, s0, s1 130 vcgt.s16 q6, q1, q7 131 vand q5, q5, q6 132 vabd.s16 q7, q11, q12 133 vcgt.s16 q6, q2, q7 134 vand q5, q5, q6 135 136 vmov q2, q5 137 vtrn.s16 q5, q2 138 vshr.u64 q2, #32 139 vshl.u64 q5, #32 140 vshl.u64 q2, #32 141 vshr.u64 q5, #32 142 vorr q5, q2 143 144 vmov q2, q5 145 vshl.i16 q7, q4, #1 146 vtrn.32 q2, q5 147 vand q5, q2 148 vneg.s16 q6, q7 149 vmovn.i16 d4, q5 150 vmovn.i16 d4, q2 151 vmov r8, s8 152 153 and r9, r8, r7 154 cmp r9, #0 155 beq 1f 156 157 vadd.i16 q2, q11, q12 158 vadd.i16 q4, q9, q8 159 vadd.i16 q1, q2, q10 160 vdup.16 d10, r9 161 vadd.i16 q0, q1, q9 162 vshl.i16 q4, #1 163 lsr r9, #16 164 vadd.i16 q1, q0 165 vrshr.s16 q3, q0, #2 166 vadd.i16 q1, q13 167 vadd.i16 q4, q0 168 vsub.i16 q3, q10 169 vrshr.s16 q1, #3 170 vrshr.s16 q4, #3 171 vmax.s16 q3, q6 172 vsub.i16 q1, q11 173 vsub.i16 q4, q9 174 vmin.s16 q3, q7 175 vmax.s16 q4, q6 176 vmax.s16 q1, q6 177 vadd.i16 q3, q10 178 vmin.s16 q4, q7 179 vmin.s16 q1, q7 180 vdup.16 d11, r9 181 vadd.i16 q4, q9 182 vadd.i16 q1, q11 183 vbit q9, q4, q5 184 vadd.i16 q4, q2, q13 185 vbit q11, q1, q5 186 vadd.i16 q0, q4, q14 187 vadd.i16 q2, q15, q14 188 vadd.i16 q4, q0 189 190 vshl.i16 q2, #1 191 vadd.i16 q4, q10 192 vbit q10, q3, q5 193 vrshr.s16 q4, #3 194 vadd.i16 q2, q0 195 vrshr.s16 q3, q0, #2 196 vsub.i16 q4, q12 197 vrshr.s16 q2, #3 198 vsub.i16 q3, q13 199 vmax.s16 q4, q6 200 vsub.i16 q2, q14 201 vmax.s16 q3, q6 202 vmin.s16 q4, q7 203 vmax.s16 q2, q6 204 vmin.s16 q3, q7 205 vadd.i16 q4, q12 206 vmin.s16 q2, q7 207 vadd.i16 q3, q13 208 vbit q12, q4, q5 209 vadd.i16 q2, q14 210 vbit q13, q3, q5 211 vbit q14, q2, q5 212 2131: 214 mvn r8, r8 215 and r9, r8, r7 216 cmp r9, #0 217 beq 2f 218 219 vdup.16 q4, r2 220 221 vdup.16 d10, r9 222 lsr r9, #16 223 vmov q1, q4 224 vdup.16 d11, r9 225 vshr.s16 q1, #1 226 vsub.i16 q2, q12, q11 227 vadd.i16 q4, q1 228 vshl.s16 q0, q2, #3 229 vshr.s16 q4, #3 230 vadd.i16 q2, q0 231 vsub.i16 q0, q13, q10 232 vsub.i16 q2, q0 233 vshl.i16 q0, q0, #1 234 vsub.i16 q2, q0 235 vshl.s16 q1, q7, 2 236 vrshr.s16 q2, q2, #4 237 vadd.i16 q1, q7 238 vabs.s16 q3, q2 239 vshr.s16 q6, q6, #1 240 vcgt.s16 q1, q1, q3 241 vand q5, q1 242 vshr.s16 q7, q7, #1 243 vmax.s16 q2, q2, q6 244 vmin.s16 q2, q2, q7 245 246 vshr.s16 q7, q7, #1 247 vrhadd.s16 q3, q9, q11 248 vneg.s16 q6, q7 249 vsub.s16 q3, q10 250 vdup.16 d2, r5 251 vhadd.s16 q3, q2 252 vdup.16 d3, r6 253 vmax.s16 q3, q3, q6 254 vcgt.s16 q1, q4, q1 255 vmin.s16 q3, q3, q7 256 vand q1, q5 257 vadd.i16 q3, q10 258 lsr r5, #16 259 lsr r6, #16 260 vbit q10, q3, q1 261 262 vrhadd.s16 q3, q14, q12 263 vdup.16 d2, r5 264 vsub.s16 q3, q13 265 vdup.16 d3, r6 266 vhsub.s16 q3, q2 267 vcgt.s16 q1, q4, q1 268 vmax.s16 q3, q3, q6 269 vand q1, q5 270 vmin.s16 q3, q3, q7 271 vadd.i16 q3, q13 272 vbit q13, q3, q1 273 vadd.i16 q0, q11, q2 274 vsub.i16 q4, q12, q2 275 vbit q11, q0, q5 276 vbit q12, q4, q5 277 2782: 279 vqmovun.s16 d16, q8 280 vqmovun.s16 d18, q9 281 vqmovun.s16 d20, q10 282 vqmovun.s16 d22, q11 283 vqmovun.s16 d24, q12 284 vqmovun.s16 d26, q13 285 vqmovun.s16 d28, q14 286 vqmovun.s16 d30, q15 287.endm 288 289function ff_hevc_v_loop_filter_luma_neon, export=1 290 hevc_loop_filter_luma_start 291 push {r5-r11} 292 vpush {d8-d15} 293 sub r0, #4 294 vld1.8 {d16}, [r0], r1 295 vld1.8 {d18}, [r0], r1 296 vld1.8 {d20}, [r0], r1 297 vld1.8 {d22}, [r0], r1 298 vld1.8 {d24}, [r0], r1 299 vld1.8 {d26}, [r0], r1 300 vld1.8 {d28}, [r0], r1 301 vld1.8 {d30}, [r0], r1 302 sub r0, r0, r1, lsl #3 303 transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 304 hevc_loop_filter_luma_body 305 transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30 306 vst1.8 {d16}, [r0], r1 307 vst1.8 {d18}, [r0], r1 308 vst1.8 {d20}, [r0], r1 309 vst1.8 {d22}, [r0], r1 310 vst1.8 {d24}, [r0], r1 311 vst1.8 {d26}, [r0], r1 312 vst1.8 {d28}, [r0], r1 313 vst1.8 {d30}, [r0] 314 vpop {d8-d15} 315 pop {r5-r11} 316 bx lr 317endfunc 318 319function ff_hevc_h_loop_filter_luma_neon, export=1 320 hevc_loop_filter_luma_start 321 push {r5-r11} 322 vpush {d8-d15} 323 sub r0, r0, r1, lsl #2 324 vld1.8 {d16}, [r0], r1 325 vld1.8 {d18}, [r0], r1 326 vld1.8 {d20}, [r0], r1 327 vld1.8 {d22}, [r0], r1 328 vld1.8 {d24}, [r0], r1 329 vld1.8 {d26}, [r0], r1 330 vld1.8 {d28}, [r0], r1 331 vld1.8 {d30}, [r0], r1 332 sub r0, r0, r1, lsl #3 333 add r0, r1 334 hevc_loop_filter_luma_body 335 vst1.8 {d18}, [r0], r1 336 vst1.8 {d20}, [r0], r1 337 vst1.8 {d22}, [r0], r1 338 vst1.8 {d24}, [r0], r1 339 vst1.8 {d26}, [r0], r1 340 vst1.8 {d28}, [r0] 341bypasswrite: 342 vpop {d8-d15} 343 pop {r5-r11} 344 bx lr 345endfunc 346 347function ff_hevc_v_loop_filter_chroma_neon, export=1 348 hevc_loop_filter_chroma_start 349 sub r0, #4 350 vld1.8 {d16}, [r0], r1 351 vld1.8 {d17}, [r0], r1 352 vld1.8 {d18}, [r0], r1 353 vld1.8 {d2}, [r0], r1 354 vld1.8 {d4}, [r0], r1 355 vld1.8 {d19}, [r0], r1 356 vld1.8 {d20}, [r0], r1 357 vld1.8 {d21}, [r0], r1 358 sub r0, r0, r1, lsl #3 359 transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 360 hevc_loop_filter_chroma_body 361 transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21 362 vst1.8 {d16}, [r0], r1 363 vst1.8 {d17}, [r0], r1 364 vst1.8 {d18}, [r0], r1 365 vst1.8 {d2}, [r0], r1 366 vst1.8 {d4}, [r0], r1 367 vst1.8 {d19}, [r0], r1 368 vst1.8 {d20}, [r0], r1 369 vst1.8 {d21}, [r0] 370 bx lr 371endfunc 372 373function ff_hevc_h_loop_filter_chroma_neon, export=1 374 hevc_loop_filter_chroma_start 375 sub r0, r0, r1, lsl #1 376 vld1.8 {d18}, [r0], r1 377 vld1.8 {d2}, [r0], r1 378 vld1.8 {d4}, [r0], r1 379 vld1.8 {d19}, [r0] 380 sub r0, r0, r1, lsl #1 381 hevc_loop_filter_chroma_body 382 vst1.8 {d2}, [r0], r1 383 vst1.8 {d4}, [r0] 384 bx lr 385endfunc 386