1/* 2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com> 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#include "libavutil/arm/asm.S" 22 23function ff_h264_idct_add_neon, export=1 24h264_idct_add_neon_nothumb: 25 vld1.64 {d0-d3}, [r1,:128] 26 vmov.i16 q15, #0 27 28 vswp d1, d2 29 vst1.16 {q15}, [r1,:128]! 30 vadd.i16 d4, d0, d1 31 vst1.16 {q15}, [r1,:128]! 32 vshr.s16 q8, q1, #1 33 vsub.i16 d5, d0, d1 34 vadd.i16 d6, d2, d17 35 vsub.i16 d7, d16, d3 36 vadd.i16 q0, q2, q3 37 vsub.i16 q1, q2, q3 38 39 vtrn.16 d0, d1 40 vtrn.16 d3, d2 41 vtrn.32 d0, d3 42 vtrn.32 d1, d2 43 44 vadd.i16 d4, d0, d3 45 vld1.32 {d18[0]}, [r0,:32], r2 46 vswp d1, d3 47 vshr.s16 q8, q1, #1 48 vld1.32 {d19[1]}, [r0,:32], r2 49 vsub.i16 d5, d0, d1 50 vld1.32 {d18[1]}, [r0,:32], r2 51 vadd.i16 d6, d16, d3 52 vld1.32 {d19[0]}, [r0,:32], r2 53 vsub.i16 d7, d2, d17 54 sub r0, r0, r2, lsl #2 55 vadd.i16 q0, q2, q3 56 vsub.i16 q1, q2, q3 57 58 vrshr.s16 q0, q0, #6 59 vrshr.s16 q1, q1, #6 60 61 vaddw.u8 q0, q0, d18 62 vaddw.u8 q1, q1, d19 63 64 vqmovun.s16 d0, q0 65 vqmovun.s16 d1, q1 66 67 vst1.32 {d0[0]}, [r0,:32], r2 68 vst1.32 {d1[1]}, [r0,:32], r2 69 vst1.32 {d0[1]}, [r0,:32], r2 70 vst1.32 {d1[0]}, [r0,:32], r2 71 72 sub r1, r1, #32 73 bx lr 74endfunc 75 76function ff_h264_idct_dc_add_neon, export=1 77h264_idct_dc_add_neon_nothumb: 78 mov r3, #0 79 vld1.16 {d2[],d3[]}, [r1,:16] 80 strh r3, [r1] 81 vrshr.s16 q1, q1, #6 82 vld1.32 {d0[0]}, [r0,:32], r2 83 vld1.32 {d0[1]}, [r0,:32], r2 84 vaddw.u8 q2, q1, d0 85 vld1.32 {d1[0]}, [r0,:32], r2 86 vld1.32 {d1[1]}, [r0,:32], r2 87 vaddw.u8 q1, q1, d1 88 vqmovun.s16 d0, q2 89 vqmovun.s16 d1, q1 90 sub r0, r0, r2, lsl #2 91 vst1.32 {d0[0]}, [r0,:32], r2 92 vst1.32 {d0[1]}, [r0,:32], r2 93 vst1.32 {d1[0]}, [r0,:32], r2 94 vst1.32 {d1[1]}, [r0,:32], r2 95 bx lr 96endfunc 97 98function ff_h264_idct_add16_neon, export=1 99 push {r4-r8,lr} 100 mov r4, r0 101 mov r5, r1 102 mov r1, r2 103 mov r2, r3 104 ldr r6, [sp, #24] 105 movrel r7, scan8 106 mov ip, #16 1071: ldrb r8, [r7], #1 108 ldr r0, [r5], #4 109 ldrb r8, [r6, r8] 110 subs r8, r8, #1 111 blt 2f 112 ldrsh lr, [r1] 113 add r0, r0, r4 114 it ne 115 movne lr, #0 116 cmp lr, #0 117 ite ne 118 adrne lr, h264_idct_dc_add_neon_nothumb + CONFIG_THUMB 119 adreq lr, h264_idct_add_neon_nothumb + CONFIG_THUMB 120 blx lr 1212: subs ip, ip, #1 122 add r1, r1, #32 123 bne 1b 124 pop {r4-r8,pc} 125endfunc 126 127function ff_h264_idct_add16intra_neon, export=1 128 push {r4-r8,lr} 129 mov r4, r0 130 mov r5, r1 131 mov r1, r2 132 mov r2, r3 133 ldr r6, [sp, #24] 134 movrel r7, scan8 135 mov ip, #16 1361: ldrb r8, [r7], #1 137 ldr r0, [r5], #4 138 ldrb r8, [r6, r8] 139 add r0, r0, r4 140 cmp r8, #0 141 ldrsh r8, [r1] 142 iteet ne 143 adrne lr, h264_idct_add_neon_nothumb + CONFIG_THUMB 144 adreq lr, h264_idct_dc_add_neon_nothumb + CONFIG_THUMB 145 cmpeq r8, #0 146 blxne lr 147 subs ip, ip, #1 148 add r1, r1, #32 149 bne 1b 150 pop {r4-r8,pc} 151endfunc 152 153function ff_h264_idct_add8_neon, export=1 154 push {r4-r10,lr} 155 ldm r0, {r4,r9} 156 add r5, r1, #16*4 157 add r1, r2, #16*32 158 mov r2, r3 159 mov r10, r1 160 ldr r6, [sp, #32] 161 movrel r7, scan8+16 162 mov r12, #0 1631: ldrb r8, [r7, r12] 164 ldr r0, [r5, r12, lsl #2] 165 ldrb r8, [r6, r8] 166 add r0, r0, r4 167 add r1, r10, r12, lsl #5 168 cmp r8, #0 169 ldrsh r8, [r1] 170 iteet ne 171 adrne lr, h264_idct_add_neon_nothumb + CONFIG_THUMB 172 adreq lr, h264_idct_dc_add_neon_nothumb + CONFIG_THUMB 173 cmpeq r8, #0 174 blxne lr 175 add r12, r12, #1 176 cmp r12, #4 177 itt eq 178 moveq r12, #16 179 moveq r4, r9 180 cmp r12, #20 181 blt 1b 182 pop {r4-r10,pc} 183endfunc 184 185.macro idct8x8_cols pass 186 .if \pass == 0 187 qa .req q2 188 qb .req q14 189 vshr.s16 q2, q10, #1 190 vadd.i16 q0, q8, q12 191 vld1.16 {q14-q15},[r1,:128] 192 vst1.16 {q3}, [r1,:128]! 193 vst1.16 {q3}, [r1,:128]! 194 vsub.i16 q1, q8, q12 195 vshr.s16 q3, q14, #1 196 vsub.i16 q2, q2, q14 197 vadd.i16 q3, q3, q10 198 .else 199 qa .req q14 200 qb .req q2 201 vtrn.32 q8, q10 202 vtrn.16 q12, q13 203 vtrn.32 q9, q11 204 vtrn.32 q12, q2 205 vtrn.32 q13, q15 206 vswp d21, d4 207 vshr.s16 q14, q10, #1 208 vswp d17, d24 209 vshr.s16 q3, q2, #1 210 vswp d19, d26 211 vadd.i16 q0, q8, q12 212 vswp d23, d30 213 vsub.i16 q1, q8, q12 214 vsub.i16 q14, q14, q2 215 vadd.i16 q3, q3, q10 216 .endif 217 vadd.i16 q10, q1, qa 218 vsub.i16 q12, q1, qa 219 vadd.i16 q8, q0, q3 220 vsub.i16 qb, q0, q3 221 vsub.i16 q0, q13, q11 222 vadd.i16 q1, q15, q9 223 vsub.i16 qa, q15, q9 224 vadd.i16 q3, q13, q11 225 vsub.i16 q0, q0, q15 226 vsub.i16 q1, q1, q11 227 vadd.i16 qa, qa, q13 228 vadd.i16 q3, q3, q9 229 vshr.s16 q9, q9, #1 230 vshr.s16 q11, q11, #1 231 vshr.s16 q13, q13, #1 232 vshr.s16 q15, q15, #1 233 vsub.i16 q0, q0, q15 234 vsub.i16 q1, q1, q11 235 vadd.i16 qa, qa, q13 236 vadd.i16 q3, q3, q9 237 vshr.s16 q9, q0, #2 238 vshr.s16 q11, q1, #2 239 vshr.s16 q13, qa, #2 240 vshr.s16 q15, q3, #2 241 vsub.i16 q3, q3, q9 242 vsub.i16 qa, q11, qa 243 vadd.i16 q1, q1, q13 244 vadd.i16 q0, q0, q15 245 .if \pass == 0 246 vsub.i16 q15, q8, q3 247 vadd.i16 q8, q8, q3 248 vadd.i16 q9, q10, q2 249 vsub.i16 q2, q10, q2 250 vtrn.16 q8, q9 251 vadd.i16 q10, q12, q1 252 vtrn.16 q2, q15 253 vadd.i16 q11, q14, q0 254 vsub.i16 q13, q12, q1 255 vtrn.16 q10, q11 256 vsub.i16 q12, q14, q0 257 .else 258 vsub.i16 q15, q8, q3 259 vadd.i16 q8, q8, q3 260 vadd.i16 q9, q10, q14 261 vsub.i16 q14, q10, q14 262 vadd.i16 q10, q12, q1 263 vsub.i16 q13, q12, q1 264 vadd.i16 q11, q2, q0 265 vsub.i16 q12, q2, q0 266 .endif 267 .unreq qa 268 .unreq qb 269.endm 270 271function ff_h264_idct8_add_neon, export=1 272h264_idct8_add_neon_nothumb: 273 vmov.i16 q3, #0 274 vld1.16 {q8-q9}, [r1,:128] 275 vst1.16 {q3}, [r1,:128]! 276 vst1.16 {q3}, [r1,:128]! 277 vld1.16 {q10-q11},[r1,:128] 278 vst1.16 {q3}, [r1,:128]! 279 vst1.16 {q3}, [r1,:128]! 280 vld1.16 {q12-q13},[r1,:128] 281 vst1.16 {q3}, [r1,:128]! 282 vst1.16 {q3}, [r1,:128]! 283 284 idct8x8_cols 0 285 idct8x8_cols 1 286 287 mov r3, r0 288 vrshr.s16 q8, q8, #6 289 vld1.8 {d0}, [r0,:64], r2 290 vrshr.s16 q9, q9, #6 291 vld1.8 {d1}, [r0,:64], r2 292 vrshr.s16 q10, q10, #6 293 vld1.8 {d2}, [r0,:64], r2 294 vrshr.s16 q11, q11, #6 295 vld1.8 {d3}, [r0,:64], r2 296 vrshr.s16 q12, q12, #6 297 vld1.8 {d4}, [r0,:64], r2 298 vrshr.s16 q13, q13, #6 299 vld1.8 {d5}, [r0,:64], r2 300 vrshr.s16 q14, q14, #6 301 vld1.8 {d6}, [r0,:64], r2 302 vrshr.s16 q15, q15, #6 303 vld1.8 {d7}, [r0,:64], r2 304 vaddw.u8 q8, q8, d0 305 vaddw.u8 q9, q9, d1 306 vaddw.u8 q10, q10, d2 307 vqmovun.s16 d0, q8 308 vaddw.u8 q11, q11, d3 309 vqmovun.s16 d1, q9 310 vaddw.u8 q12, q12, d4 311 vqmovun.s16 d2, q10 312 vst1.8 {d0}, [r3,:64], r2 313 vaddw.u8 q13, q13, d5 314 vqmovun.s16 d3, q11 315 vst1.8 {d1}, [r3,:64], r2 316 vaddw.u8 q14, q14, d6 317 vqmovun.s16 d4, q12 318 vst1.8 {d2}, [r3,:64], r2 319 vaddw.u8 q15, q15, d7 320 vqmovun.s16 d5, q13 321 vst1.8 {d3}, [r3,:64], r2 322 vqmovun.s16 d6, q14 323 vqmovun.s16 d7, q15 324 vst1.8 {d4}, [r3,:64], r2 325 vst1.8 {d5}, [r3,:64], r2 326 vst1.8 {d6}, [r3,:64], r2 327 vst1.8 {d7}, [r3,:64], r2 328 329 sub r1, r1, #128 330 bx lr 331endfunc 332 333function ff_h264_idct8_dc_add_neon, export=1 334h264_idct8_dc_add_neon_nothumb: 335 mov r3, #0 336 vld1.16 {d30[],d31[]},[r1,:16] 337 strh r3, [r1] 338 vld1.32 {d0}, [r0,:64], r2 339 vrshr.s16 q15, q15, #6 340 vld1.32 {d1}, [r0,:64], r2 341 vld1.32 {d2}, [r0,:64], r2 342 vaddw.u8 q8, q15, d0 343 vld1.32 {d3}, [r0,:64], r2 344 vaddw.u8 q9, q15, d1 345 vld1.32 {d4}, [r0,:64], r2 346 vaddw.u8 q10, q15, d2 347 vld1.32 {d5}, [r0,:64], r2 348 vaddw.u8 q11, q15, d3 349 vld1.32 {d6}, [r0,:64], r2 350 vaddw.u8 q12, q15, d4 351 vld1.32 {d7}, [r0,:64], r2 352 vaddw.u8 q13, q15, d5 353 vaddw.u8 q14, q15, d6 354 vaddw.u8 q15, q15, d7 355 vqmovun.s16 d0, q8 356 vqmovun.s16 d1, q9 357 vqmovun.s16 d2, q10 358 vqmovun.s16 d3, q11 359 sub r0, r0, r2, lsl #3 360 vst1.32 {d0}, [r0,:64], r2 361 vqmovun.s16 d4, q12 362 vst1.32 {d1}, [r0,:64], r2 363 vqmovun.s16 d5, q13 364 vst1.32 {d2}, [r0,:64], r2 365 vqmovun.s16 d6, q14 366 vst1.32 {d3}, [r0,:64], r2 367 vqmovun.s16 d7, q15 368 vst1.32 {d4}, [r0,:64], r2 369 vst1.32 {d5}, [r0,:64], r2 370 vst1.32 {d6}, [r0,:64], r2 371 vst1.32 {d7}, [r0,:64], r2 372 bx lr 373endfunc 374 375function ff_h264_idct8_add4_neon, export=1 376 push {r4-r8,lr} 377 mov r4, r0 378 mov r5, r1 379 mov r1, r2 380 mov r2, r3 381 ldr r6, [sp, #24] 382 movrel r7, scan8 383 mov r12, #16 3841: ldrb r8, [r7], #4 385 ldr r0, [r5], #16 386 ldrb r8, [r6, r8] 387 subs r8, r8, #1 388 blt 2f 389 ldrsh lr, [r1] 390 add r0, r0, r4 391 it ne 392 movne lr, #0 393 cmp lr, #0 394 ite ne 395 adrne lr, h264_idct8_dc_add_neon_nothumb + CONFIG_THUMB 396 adreq lr, h264_idct8_add_neon_nothumb + CONFIG_THUMB 397 blx lr 3982: subs r12, r12, #4 399 add r1, r1, #128 400 bne 1b 401 pop {r4-r8,pc} 402endfunc 403 404const scan8 405 .byte 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8 406 .byte 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8 407 .byte 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8 408 .byte 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8 409 .byte 4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8 410 .byte 6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8 411 .byte 4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8 412 .byte 6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8 413 .byte 4+11*8, 5+11*8, 4+12*8, 5+12*8 414 .byte 6+11*8, 7+11*8, 6+12*8, 7+12*8 415 .byte 4+13*8, 5+13*8, 4+14*8, 5+14*8 416 .byte 6+13*8, 7+13*8, 6+14*8, 7+14*8 417endconst 418