annotate libavcodec/arm/h264dsp_neon.S @ 2:897f711a7157

rearrange to work with autoconf
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 25 Sep 2012 15:55:33 +0200
parents
children
rev   line source
nengel@2 1 /*
nengel@2 2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
nengel@2 3 *
nengel@2 4 * This file is part of FFmpeg.
nengel@2 5 *
nengel@2 6 * FFmpeg is free software; you can redistribute it and/or
nengel@2 7 * modify it under the terms of the GNU Lesser General Public
nengel@2 8 * License as published by the Free Software Foundation; either
nengel@2 9 * version 2.1 of the License, or (at your option) any later version.
nengel@2 10 *
nengel@2 11 * FFmpeg is distributed in the hope that it will be useful,
nengel@2 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nengel@2 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
nengel@2 14 * Lesser General Public License for more details.
nengel@2 15 *
nengel@2 16 * You should have received a copy of the GNU Lesser General Public
nengel@2 17 * License along with FFmpeg; if not, write to the Free Software
nengel@2 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
nengel@2 19 */
nengel@2 20
nengel@2 21 #include "asm.S"
nengel@2 22
nengel@2 23 .macro transpose_8x8 r0 r1 r2 r3 r4 r5 r6 r7
nengel@2 24 vtrn.32 \r0, \r4
nengel@2 25 vtrn.32 \r1, \r5
nengel@2 26 vtrn.32 \r2, \r6
nengel@2 27 vtrn.32 \r3, \r7
nengel@2 28 vtrn.16 \r0, \r2
nengel@2 29 vtrn.16 \r1, \r3
nengel@2 30 vtrn.16 \r4, \r6
nengel@2 31 vtrn.16 \r5, \r7
nengel@2 32 vtrn.8 \r0, \r1
nengel@2 33 vtrn.8 \r2, \r3
nengel@2 34 vtrn.8 \r4, \r5
nengel@2 35 vtrn.8 \r6, \r7
nengel@2 36 .endm
nengel@2 37
nengel@2 38 .macro transpose_4x4 r0 r1 r2 r3
nengel@2 39 vtrn.16 \r0, \r2
nengel@2 40 vtrn.16 \r1, \r3
nengel@2 41 vtrn.8 \r0, \r1
nengel@2 42 vtrn.8 \r2, \r3
nengel@2 43 .endm
nengel@2 44
nengel@2 45 .macro swap4 r0 r1 r2 r3 r4 r5 r6 r7
nengel@2 46 vswp \r0, \r4
nengel@2 47 vswp \r1, \r5
nengel@2 48 vswp \r2, \r6
nengel@2 49 vswp \r3, \r7
nengel@2 50 .endm
nengel@2 51
nengel@2 52 .macro transpose16_4x4 r0 r1 r2 r3 r4 r5 r6 r7
nengel@2 53 vtrn.32 \r0, \r2
nengel@2 54 vtrn.32 \r1, \r3
nengel@2 55 vtrn.32 \r4, \r6
nengel@2 56 vtrn.32 \r5, \r7
nengel@2 57 vtrn.16 \r0, \r1
nengel@2 58 vtrn.16 \r2, \r3
nengel@2 59 vtrn.16 \r4, \r5
nengel@2 60 vtrn.16 \r6, \r7
nengel@2 61 .endm
nengel@2 62
nengel@2 63 /* chroma_mc8(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
nengel@2 64 .macro h264_chroma_mc8 type
nengel@2 65 function ff_\type\()_h264_chroma_mc8_neon, export=1
nengel@2 66 push {r4-r7, lr}
nengel@2 67 ldrd r4, [sp, #20]
nengel@2 68 .ifc \type,avg
nengel@2 69 mov lr, r0
nengel@2 70 .endif
nengel@2 71 pld [r1]
nengel@2 72 pld [r1, r2]
nengel@2 73
nengel@2 74 muls r7, r4, r5
nengel@2 75 rsb r6, r7, r5, lsl #3
nengel@2 76 rsb ip, r7, r4, lsl #3
nengel@2 77 sub r4, r7, r4, lsl #3
nengel@2 78 sub r4, r4, r5, lsl #3
nengel@2 79 add r4, r4, #64
nengel@2 80
nengel@2 81 beq 2f
nengel@2 82
nengel@2 83 add r5, r1, r2
nengel@2 84
nengel@2 85 vdup.8 d0, r4
nengel@2 86 lsl r4, r2, #1
nengel@2 87 vdup.8 d1, ip
nengel@2 88 vld1.64 {d4, d5}, [r1], r4
nengel@2 89 vdup.8 d2, r6
nengel@2 90 vld1.64 {d6, d7}, [r5], r4
nengel@2 91 vdup.8 d3, r7
nengel@2 92
nengel@2 93 vext.8 d5, d4, d5, #1
nengel@2 94 vext.8 d7, d6, d7, #1
nengel@2 95
nengel@2 96 1: pld [r5]
nengel@2 97 vmull.u8 q8, d4, d0
nengel@2 98 vmlal.u8 q8, d5, d1
nengel@2 99 vld1.64 {d4, d5}, [r1], r4
nengel@2 100 vmlal.u8 q8, d6, d2
nengel@2 101 vext.8 d5, d4, d5, #1
nengel@2 102 vmlal.u8 q8, d7, d3
nengel@2 103 vmull.u8 q9, d6, d0
nengel@2 104 subs r3, r3, #2
nengel@2 105 vmlal.u8 q9, d7, d1
nengel@2 106 vmlal.u8 q9, d4, d2
nengel@2 107 vmlal.u8 q9, d5, d3
nengel@2 108 vrshrn.u16 d16, q8, #6
nengel@2 109 vld1.64 {d6, d7}, [r5], r4
nengel@2 110 pld [r1]
nengel@2 111 vrshrn.u16 d17, q9, #6
nengel@2 112 .ifc \type,avg
nengel@2 113 vld1.64 {d20}, [lr,:64], r2
nengel@2 114 vld1.64 {d21}, [lr,:64], r2
nengel@2 115 vrhadd.u8 q8, q8, q10
nengel@2 116 .endif
nengel@2 117 vext.8 d7, d6, d7, #1
nengel@2 118 vst1.64 {d16}, [r0,:64], r2
nengel@2 119 vst1.64 {d17}, [r0,:64], r2
nengel@2 120 bgt 1b
nengel@2 121
nengel@2 122 pop {r4-r7, pc}
nengel@2 123
nengel@2 124 2: tst r6, r6
nengel@2 125 add ip, ip, r6
nengel@2 126 vdup.8 d0, r4
nengel@2 127 vdup.8 d1, ip
nengel@2 128
nengel@2 129 beq 4f
nengel@2 130
nengel@2 131 add r5, r1, r2
nengel@2 132 lsl r4, r2, #1
nengel@2 133 vld1.64 {d4}, [r1], r4
nengel@2 134 vld1.64 {d6}, [r5], r4
nengel@2 135
nengel@2 136 3: pld [r5]
nengel@2 137 vmull.u8 q8, d4, d0
nengel@2 138 vmlal.u8 q8, d6, d1
nengel@2 139 vld1.64 {d4}, [r1], r4
nengel@2 140 vmull.u8 q9, d6, d0
nengel@2 141 vmlal.u8 q9, d4, d1
nengel@2 142 vld1.64 {d6}, [r5], r4
nengel@2 143 vrshrn.u16 d16, q8, #6
nengel@2 144 vrshrn.u16 d17, q9, #6
nengel@2 145 .ifc \type,avg
nengel@2 146 vld1.64 {d20}, [lr,:64], r2
nengel@2 147 vld1.64 {d21}, [lr,:64], r2
nengel@2 148 vrhadd.u8 q8, q8, q10
nengel@2 149 .endif
nengel@2 150 subs r3, r3, #2
nengel@2 151 pld [r1]
nengel@2 152 vst1.64 {d16}, [r0,:64], r2
nengel@2 153 vst1.64 {d17}, [r0,:64], r2
nengel@2 154 bgt 3b
nengel@2 155
nengel@2 156 pop {r4-r7, pc}
nengel@2 157
nengel@2 158 4: vld1.64 {d4, d5}, [r1], r2
nengel@2 159 vld1.64 {d6, d7}, [r1], r2
nengel@2 160 vext.8 d5, d4, d5, #1
nengel@2 161 vext.8 d7, d6, d7, #1
nengel@2 162
nengel@2 163 5: pld [r1]
nengel@2 164 subs r3, r3, #2
nengel@2 165 vmull.u8 q8, d4, d0
nengel@2 166 vmlal.u8 q8, d5, d1
nengel@2 167 vld1.64 {d4, d5}, [r1], r2
nengel@2 168 vmull.u8 q9, d6, d0
nengel@2 169 vmlal.u8 q9, d7, d1
nengel@2 170 pld [r1]
nengel@2 171 vext.8 d5, d4, d5, #1
nengel@2 172 vrshrn.u16 d16, q8, #6
nengel@2 173 vrshrn.u16 d17, q9, #6
nengel@2 174 .ifc \type,avg
nengel@2 175 vld1.64 {d20}, [lr,:64], r2
nengel@2 176 vld1.64 {d21}, [lr,:64], r2
nengel@2 177 vrhadd.u8 q8, q8, q10
nengel@2 178 .endif
nengel@2 179 vld1.64 {d6, d7}, [r1], r2
nengel@2 180 vext.8 d7, d6, d7, #1
nengel@2 181 vst1.64 {d16}, [r0,:64], r2
nengel@2 182 vst1.64 {d17}, [r0,:64], r2
nengel@2 183 bgt 5b
nengel@2 184
nengel@2 185 pop {r4-r7, pc}
nengel@2 186 endfunc
nengel@2 187 .endm
nengel@2 188
nengel@2 189 /* chroma_mc4(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
nengel@2 190 .macro h264_chroma_mc4 type
nengel@2 191 function ff_\type\()_h264_chroma_mc4_neon, export=1
nengel@2 192 push {r4-r7, lr}
nengel@2 193 ldrd r4, [sp, #20]
nengel@2 194 .ifc \type,avg
nengel@2 195 mov lr, r0
nengel@2 196 .endif
nengel@2 197 pld [r1]
nengel@2 198 pld [r1, r2]
nengel@2 199
nengel@2 200 muls r7, r4, r5
nengel@2 201 rsb r6, r7, r5, lsl #3
nengel@2 202 rsb ip, r7, r4, lsl #3
nengel@2 203 sub r4, r7, r4, lsl #3
nengel@2 204 sub r4, r4, r5, lsl #3
nengel@2 205 add r4, r4, #64
nengel@2 206
nengel@2 207 beq 2f
nengel@2 208
nengel@2 209 add r5, r1, r2
nengel@2 210
nengel@2 211 vdup.8 d0, r4
nengel@2 212 lsl r4, r2, #1
nengel@2 213 vdup.8 d1, ip
nengel@2 214 vld1.64 {d4}, [r1], r4
nengel@2 215 vdup.8 d2, r6
nengel@2 216 vld1.64 {d6}, [r5], r4
nengel@2 217 vdup.8 d3, r7
nengel@2 218
nengel@2 219 vext.8 d5, d4, d5, #1
nengel@2 220 vext.8 d7, d6, d7, #1
nengel@2 221 vtrn.32 d4, d5
nengel@2 222 vtrn.32 d6, d7
nengel@2 223
nengel@2 224 vtrn.32 d0, d1
nengel@2 225 vtrn.32 d2, d3
nengel@2 226
nengel@2 227 1: pld [r5]
nengel@2 228 vmull.u8 q8, d4, d0
nengel@2 229 vmlal.u8 q8, d6, d2
nengel@2 230 vld1.64 {d4}, [r1], r4
nengel@2 231 vext.8 d5, d4, d5, #1
nengel@2 232 vtrn.32 d4, d5
nengel@2 233 vmull.u8 q9, d6, d0
nengel@2 234 vmlal.u8 q9, d4, d2
nengel@2 235 vld1.64 {d6}, [r5], r4
nengel@2 236 vadd.i16 d16, d16, d17
nengel@2 237 vadd.i16 d17, d18, d19
nengel@2 238 vrshrn.u16 d16, q8, #6
nengel@2 239 subs r3, r3, #2
nengel@2 240 pld [r1]
nengel@2 241 .ifc \type,avg
nengel@2 242 vld1.32 {d20[0]}, [lr,:32], r2
nengel@2 243 vld1.32 {d20[1]}, [lr,:32], r2
nengel@2 244 vrhadd.u8 d16, d16, d20
nengel@2 245 .endif
nengel@2 246 vext.8 d7, d6, d7, #1
nengel@2 247 vtrn.32 d6, d7
nengel@2 248 vst1.32 {d16[0]}, [r0,:32], r2
nengel@2 249 vst1.32 {d16[1]}, [r0,:32], r2
nengel@2 250 bgt 1b
nengel@2 251
nengel@2 252 pop {r4-r7, pc}
nengel@2 253
nengel@2 254 2: tst r6, r6
nengel@2 255 add ip, ip, r6
nengel@2 256 vdup.8 d0, r4
nengel@2 257 vdup.8 d1, ip
nengel@2 258 vtrn.32 d0, d1
nengel@2 259
nengel@2 260 beq 4f
nengel@2 261
nengel@2 262 vext.32 d1, d0, d1, #1
nengel@2 263 add r5, r1, r2
nengel@2 264 lsl r4, r2, #1
nengel@2 265 vld1.32 {d4[0]}, [r1], r4
nengel@2 266 vld1.32 {d4[1]}, [r5], r4
nengel@2 267
nengel@2 268 3: pld [r5]
nengel@2 269 vmull.u8 q8, d4, d0
nengel@2 270 vld1.32 {d4[0]}, [r1], r4
nengel@2 271 vmull.u8 q9, d4, d1
nengel@2 272 vld1.32 {d4[1]}, [r5], r4
nengel@2 273 vadd.i16 d16, d16, d17
nengel@2 274 vadd.i16 d17, d18, d19
nengel@2 275 vrshrn.u16 d16, q8, #6
nengel@2 276 .ifc \type,avg
nengel@2 277 vld1.32 {d20[0]}, [lr,:32], r2
nengel@2 278 vld1.32 {d20[1]}, [lr,:32], r2
nengel@2 279 vrhadd.u8 d16, d16, d20
nengel@2 280 .endif
nengel@2 281 subs r3, r3, #2
nengel@2 282 pld [r1]
nengel@2 283 vst1.32 {d16[0]}, [r0,:32], r2
nengel@2 284 vst1.32 {d16[1]}, [r0,:32], r2
nengel@2 285 bgt 3b
nengel@2 286
nengel@2 287 pop {r4-r7, pc}
nengel@2 288
nengel@2 289 4: vld1.64 {d4}, [r1], r2
nengel@2 290 vld1.64 {d6}, [r1], r2
nengel@2 291 vext.8 d5, d4, d5, #1
nengel@2 292 vext.8 d7, d6, d7, #1
nengel@2 293 vtrn.32 d4, d5
nengel@2 294 vtrn.32 d6, d7
nengel@2 295
nengel@2 296 5: vmull.u8 q8, d4, d0
nengel@2 297 vmull.u8 q9, d6, d0
nengel@2 298 subs r3, r3, #2
nengel@2 299 vld1.64 {d4}, [r1], r2
nengel@2 300 vext.8 d5, d4, d5, #1
nengel@2 301 vtrn.32 d4, d5
nengel@2 302 vadd.i16 d16, d16, d17
nengel@2 303 vadd.i16 d17, d18, d19
nengel@2 304 pld [r1]
nengel@2 305 vrshrn.u16 d16, q8, #6
nengel@2 306 .ifc \type,avg
nengel@2 307 vld1.32 {d20[0]}, [lr,:32], r2
nengel@2 308 vld1.32 {d20[1]}, [lr,:32], r2
nengel@2 309 vrhadd.u8 d16, d16, d20
nengel@2 310 .endif
nengel@2 311 vld1.64 {d6}, [r1], r2
nengel@2 312 vext.8 d7, d6, d7, #1
nengel@2 313 vtrn.32 d6, d7
nengel@2 314 pld [r1]
nengel@2 315 vst1.32 {d16[0]}, [r0,:32], r2
nengel@2 316 vst1.32 {d16[1]}, [r0,:32], r2
nengel@2 317 bgt 5b
nengel@2 318
nengel@2 319 pop {r4-r7, pc}
nengel@2 320 endfunc
nengel@2 321 .endm
nengel@2 322
nengel@2 323 .macro h264_chroma_mc2 type
nengel@2 324 function ff_\type\()_h264_chroma_mc2_neon, export=1
nengel@2 325 push {r4-r6, lr}
nengel@2 326 ldr r4, [sp, #16]
nengel@2 327 ldr lr, [sp, #20]
nengel@2 328 pld [r1]
nengel@2 329 pld [r1, r2]
nengel@2 330 orrs r5, r4, lr
nengel@2 331 beq 2f
nengel@2 332
nengel@2 333 mul r5, r4, lr
nengel@2 334 rsb r6, r5, lr, lsl #3
nengel@2 335 rsb r12, r5, r4, lsl #3
nengel@2 336 sub r4, r5, r4, lsl #3
nengel@2 337 sub r4, r4, lr, lsl #3
nengel@2 338 add r4, r4, #64
nengel@2 339 vdup.8 d0, r4
nengel@2 340 vdup.8 d2, r12
nengel@2 341 vdup.8 d1, r6
nengel@2 342 vdup.8 d3, r5
nengel@2 343 vtrn.16 q0, q1
nengel@2 344 1:
nengel@2 345 vld1.32 {d4[0]}, [r1], r2
nengel@2 346 vld1.32 {d4[1]}, [r1], r2
nengel@2 347 vrev64.32 d5, d4
nengel@2 348 vld1.32 {d5[1]}, [r1]
nengel@2 349 vext.8 q3, q2, q2, #1
nengel@2 350 vtrn.16 q2, q3
nengel@2 351 vmull.u8 q8, d4, d0
nengel@2 352 vmlal.u8 q8, d5, d1
nengel@2 353 .ifc \type,avg
nengel@2 354 vld1.16 {d18[0]}, [r0,:16], r2
nengel@2 355 vld1.16 {d18[1]}, [r0,:16]
nengel@2 356 sub r0, r0, r2
nengel@2 357 .endif
nengel@2 358 vtrn.32 d16, d17
nengel@2 359 vadd.i16 d16, d16, d17
nengel@2 360 vrshrn.u16 d16, q8, #6
nengel@2 361 .ifc \type,avg
nengel@2 362 vrhadd.u8 d16, d16, d18
nengel@2 363 .endif
nengel@2 364 vst1.16 {d16[0]}, [r0,:16], r2
nengel@2 365 vst1.16 {d16[1]}, [r0,:16], r2
nengel@2 366 subs r3, r3, #2
nengel@2 367 bgt 1b
nengel@2 368 pop {r4-r6, pc}
nengel@2 369 2:
nengel@2 370 .ifc \type,put
nengel@2 371 ldrh r5, [r1], r2
nengel@2 372 strh r5, [r0], r2
nengel@2 373 ldrh r6, [r1], r2
nengel@2 374 strh r6, [r0], r2
nengel@2 375 .else
nengel@2 376 vld1.16 {d16[0]}, [r1], r2
nengel@2 377 vld1.16 {d16[1]}, [r1], r2
nengel@2 378 vld1.16 {d18[0]}, [r0,:16], r2
nengel@2 379 vld1.16 {d18[1]}, [r0,:16]
nengel@2 380 sub r0, r0, r2
nengel@2 381 vrhadd.u8 d16, d16, d18
nengel@2 382 vst1.16 {d16[0]}, [r0,:16], r2
nengel@2 383 vst1.16 {d16[1]}, [r0,:16], r2
nengel@2 384 .endif
nengel@2 385 subs r3, r3, #2
nengel@2 386 bgt 2b
nengel@2 387 pop {r4-r6, pc}
nengel@2 388 endfunc
nengel@2 389 .endm
nengel@2 390
nengel@2 391 .text
nengel@2 392 .align
nengel@2 393
nengel@2 394 h264_chroma_mc8 put
nengel@2 395 h264_chroma_mc8 avg
nengel@2 396 h264_chroma_mc4 put
nengel@2 397 h264_chroma_mc4 avg
nengel@2 398 h264_chroma_mc2 put
nengel@2 399 h264_chroma_mc2 avg
nengel@2 400
nengel@2 401 /* H.264 loop filter */
nengel@2 402
nengel@2 403 .macro h264_loop_filter_start
nengel@2 404 ldr ip, [sp]
nengel@2 405 tst r2, r2
nengel@2 406 ldr ip, [ip]
nengel@2 407 tstne r3, r3
nengel@2 408 vmov.32 d24[0], ip
nengel@2 409 and ip, ip, ip, lsl #16
nengel@2 410 bxeq lr
nengel@2 411 ands ip, ip, ip, lsl #8
nengel@2 412 bxlt lr
nengel@2 413 .endm
nengel@2 414
nengel@2 415 .macro align_push_regs
nengel@2 416 and ip, sp, #15
nengel@2 417 add ip, ip, #32
nengel@2 418 sub sp, sp, ip
nengel@2 419 vst1.64 {d12-d15}, [sp,:128]
nengel@2 420 sub sp, sp, #32
nengel@2 421 vst1.64 {d8-d11}, [sp,:128]
nengel@2 422 .endm
nengel@2 423
nengel@2 424 .macro align_pop_regs
nengel@2 425 vld1.64 {d8-d11}, [sp,:128]!
nengel@2 426 vld1.64 {d12-d15}, [sp,:128], ip
nengel@2 427 .endm
nengel@2 428
nengel@2 429 .macro h264_loop_filter_luma
nengel@2 430 vdup.8 q11, r2 @ alpha
nengel@2 431 vmovl.u8 q12, d24
nengel@2 432 vabd.u8 q6, q8, q0 @ abs(p0 - q0)
nengel@2 433 vmovl.u16 q12, d24
nengel@2 434 vabd.u8 q14, q9, q8 @ abs(p1 - p0)
nengel@2 435 vsli.16 q12, q12, #8
nengel@2 436 vabd.u8 q15, q1, q0 @ abs(q1 - q0)
nengel@2 437 vsli.32 q12, q12, #16
nengel@2 438 vclt.u8 q6, q6, q11 @ < alpha
nengel@2 439 vdup.8 q11, r3 @ beta
nengel@2 440 vclt.s8 q7, q12, #0
nengel@2 441 vclt.u8 q14, q14, q11 @ < beta
nengel@2 442 vclt.u8 q15, q15, q11 @ < beta
nengel@2 443 vbic q6, q6, q7
nengel@2 444 vabd.u8 q4, q10, q8 @ abs(p2 - p0)
nengel@2 445 vand q6, q6, q14
nengel@2 446 vabd.u8 q5, q2, q0 @ abs(q2 - q0)
nengel@2 447 vclt.u8 q4, q4, q11 @ < beta
nengel@2 448 vand q6, q6, q15
nengel@2 449 vclt.u8 q5, q5, q11 @ < beta
nengel@2 450 vand q4, q4, q6
nengel@2 451 vand q5, q5, q6
nengel@2 452 vand q12, q12, q6
nengel@2 453 vrhadd.u8 q14, q8, q0
nengel@2 454 vsub.i8 q6, q12, q4
nengel@2 455 vqadd.u8 q7, q9, q12
nengel@2 456 vhadd.u8 q10, q10, q14
nengel@2 457 vsub.i8 q6, q6, q5
nengel@2 458 vhadd.u8 q14, q2, q14
nengel@2 459 vmin.u8 q7, q7, q10
nengel@2 460 vqsub.u8 q11, q9, q12
nengel@2 461 vqadd.u8 q2, q1, q12
nengel@2 462 vmax.u8 q7, q7, q11
nengel@2 463 vqsub.u8 q11, q1, q12
nengel@2 464 vmin.u8 q14, q2, q14
nengel@2 465 vmovl.u8 q2, d0
nengel@2 466 vmax.u8 q14, q14, q11
nengel@2 467 vmovl.u8 q10, d1
nengel@2 468 vsubw.u8 q2, q2, d16
nengel@2 469 vsubw.u8 q10, q10, d17
nengel@2 470 vshl.i16 q2, q2, #2
nengel@2 471 vshl.i16 q10, q10, #2
nengel@2 472 vaddw.u8 q2, q2, d18
nengel@2 473 vaddw.u8 q10, q10, d19
nengel@2 474 vsubw.u8 q2, q2, d2
nengel@2 475 vsubw.u8 q10, q10, d3
nengel@2 476 vrshrn.i16 d4, q2, #3
nengel@2 477 vrshrn.i16 d5, q10, #3
nengel@2 478 vbsl q4, q7, q9
nengel@2 479 vbsl q5, q14, q1
nengel@2 480 vneg.s8 q7, q6
nengel@2 481 vmovl.u8 q14, d16
nengel@2 482 vmin.s8 q2, q2, q6
nengel@2 483 vmovl.u8 q6, d17
nengel@2 484 vmax.s8 q2, q2, q7
nengel@2 485 vmovl.u8 q11, d0
nengel@2 486 vmovl.u8 q12, d1
nengel@2 487 vaddw.s8 q14, q14, d4
nengel@2 488 vaddw.s8 q6, q6, d5
nengel@2 489 vsubw.s8 q11, q11, d4
nengel@2 490 vsubw.s8 q12, q12, d5
nengel@2 491 vqmovun.s16 d16, q14
nengel@2 492 vqmovun.s16 d17, q6
nengel@2 493 vqmovun.s16 d0, q11
nengel@2 494 vqmovun.s16 d1, q12
nengel@2 495 .endm
nengel@2 496
nengel@2 497 function ff_h264_v_loop_filter_luma_neon, export=1
nengel@2 498 h264_loop_filter_start
nengel@2 499
nengel@2 500 vld1.64 {d0, d1}, [r0,:128], r1
nengel@2 501 vld1.64 {d2, d3}, [r0,:128], r1
nengel@2 502 vld1.64 {d4, d5}, [r0,:128], r1
nengel@2 503 sub r0, r0, r1, lsl #2
nengel@2 504 sub r0, r0, r1, lsl #1
nengel@2 505 vld1.64 {d20,d21}, [r0,:128], r1
nengel@2 506 vld1.64 {d18,d19}, [r0,:128], r1
nengel@2 507 vld1.64 {d16,d17}, [r0,:128], r1
nengel@2 508
nengel@2 509 align_push_regs
nengel@2 510
nengel@2 511 h264_loop_filter_luma
nengel@2 512
nengel@2 513 sub r0, r0, r1, lsl #1
nengel@2 514 vst1.64 {d8, d9}, [r0,:128], r1
nengel@2 515 vst1.64 {d16,d17}, [r0,:128], r1
nengel@2 516 vst1.64 {d0, d1}, [r0,:128], r1
nengel@2 517 vst1.64 {d10,d11}, [r0,:128]
nengel@2 518
nengel@2 519 align_pop_regs
nengel@2 520 bx lr
nengel@2 521 endfunc
nengel@2 522
nengel@2 523 function ff_h264_h_loop_filter_luma_neon, export=1
nengel@2 524 h264_loop_filter_start
nengel@2 525
nengel@2 526 sub r0, r0, #4
nengel@2 527 vld1.64 {d6}, [r0], r1
nengel@2 528 vld1.64 {d20}, [r0], r1
nengel@2 529 vld1.64 {d18}, [r0], r1
nengel@2 530 vld1.64 {d16}, [r0], r1
nengel@2 531 vld1.64 {d0}, [r0], r1
nengel@2 532 vld1.64 {d2}, [r0], r1
nengel@2 533 vld1.64 {d4}, [r0], r1
nengel@2 534 vld1.64 {d26}, [r0], r1
nengel@2 535 vld1.64 {d7}, [r0], r1
nengel@2 536 vld1.64 {d21}, [r0], r1
nengel@2 537 vld1.64 {d19}, [r0], r1
nengel@2 538 vld1.64 {d17}, [r0], r1
nengel@2 539 vld1.64 {d1}, [r0], r1
nengel@2 540 vld1.64 {d3}, [r0], r1
nengel@2 541 vld1.64 {d5}, [r0], r1
nengel@2 542 vld1.64 {d27}, [r0], r1
nengel@2 543
nengel@2 544 transpose_8x8 q3, q10, q9, q8, q0, q1, q2, q13
nengel@2 545
nengel@2 546 align_push_regs
nengel@2 547
nengel@2 548 h264_loop_filter_luma
nengel@2 549
nengel@2 550 transpose_4x4 q4, q8, q0, q5
nengel@2 551
nengel@2 552 sub r0, r0, r1, lsl #4
nengel@2 553 add r0, r0, #2
nengel@2 554 vst1.32 {d8[0]}, [r0], r1
nengel@2 555 vst1.32 {d16[0]}, [r0], r1
nengel@2 556 vst1.32 {d0[0]}, [r0], r1
nengel@2 557 vst1.32 {d10[0]}, [r0], r1
nengel@2 558 vst1.32 {d8[1]}, [r0], r1
nengel@2 559 vst1.32 {d16[1]}, [r0], r1
nengel@2 560 vst1.32 {d0[1]}, [r0], r1
nengel@2 561 vst1.32 {d10[1]}, [r0], r1
nengel@2 562 vst1.32 {d9[0]}, [r0], r1
nengel@2 563 vst1.32 {d17[0]}, [r0], r1
nengel@2 564 vst1.32 {d1[0]}, [r0], r1
nengel@2 565 vst1.32 {d11[0]}, [r0], r1
nengel@2 566 vst1.32 {d9[1]}, [r0], r1
nengel@2 567 vst1.32 {d17[1]}, [r0], r1
nengel@2 568 vst1.32 {d1[1]}, [r0], r1
nengel@2 569 vst1.32 {d11[1]}, [r0], r1
nengel@2 570
nengel@2 571 align_pop_regs
nengel@2 572 bx lr
nengel@2 573 endfunc
nengel@2 574
nengel@2 575 .macro h264_loop_filter_chroma
nengel@2 576 vdup.8 d22, r2 @ alpha
nengel@2 577 vmovl.u8 q12, d24
nengel@2 578 vabd.u8 d26, d16, d0 @ abs(p0 - q0)
nengel@2 579 vmovl.u8 q2, d0
nengel@2 580 vabd.u8 d28, d18, d16 @ abs(p1 - p0)
nengel@2 581 vsubw.u8 q2, q2, d16
nengel@2 582 vsli.16 d24, d24, #8
nengel@2 583 vshl.i16 q2, q2, #2
nengel@2 584 vabd.u8 d30, d2, d0 @ abs(q1 - q0)
nengel@2 585 vaddw.u8 q2, q2, d18
nengel@2 586 vclt.u8 d26, d26, d22 @ < alpha
nengel@2 587 vsubw.u8 q2, q2, d2
nengel@2 588 vdup.8 d22, r3 @ beta
nengel@2 589 vclt.s8 d25, d24, #0
nengel@2 590 vrshrn.i16 d4, q2, #3
nengel@2 591 vclt.u8 d28, d28, d22 @ < beta
nengel@2 592 vbic d26, d26, d25
nengel@2 593 vclt.u8 d30, d30, d22 @ < beta
nengel@2 594 vand d26, d26, d28
nengel@2 595 vneg.s8 d25, d24
nengel@2 596 vand d26, d26, d30
nengel@2 597 vmin.s8 d4, d4, d24
nengel@2 598 vmovl.u8 q14, d16
nengel@2 599 vand d4, d4, d26
nengel@2 600 vmax.s8 d4, d4, d25
nengel@2 601 vmovl.u8 q11, d0
nengel@2 602 vaddw.s8 q14, q14, d4
nengel@2 603 vsubw.s8 q11, q11, d4
nengel@2 604 vqmovun.s16 d16, q14
nengel@2 605 vqmovun.s16 d0, q11
nengel@2 606 .endm
nengel@2 607
nengel@2 608 function ff_h264_v_loop_filter_chroma_neon, export=1
nengel@2 609 h264_loop_filter_start
nengel@2 610
nengel@2 611 sub r0, r0, r1, lsl #1
nengel@2 612 vld1.64 {d18}, [r0,:64], r1
nengel@2 613 vld1.64 {d16}, [r0,:64], r1
nengel@2 614 vld1.64 {d0}, [r0,:64], r1
nengel@2 615 vld1.64 {d2}, [r0,:64]
nengel@2 616
nengel@2 617 h264_loop_filter_chroma
nengel@2 618
nengel@2 619 sub r0, r0, r1, lsl #1
nengel@2 620 vst1.64 {d16}, [r0,:64], r1
nengel@2 621 vst1.64 {d0}, [r0,:64], r1
nengel@2 622
nengel@2 623 bx lr
nengel@2 624 endfunc
nengel@2 625
nengel@2 626 function ff_h264_h_loop_filter_chroma_neon, export=1
nengel@2 627 h264_loop_filter_start
nengel@2 628
nengel@2 629 sub r0, r0, #2
nengel@2 630 vld1.32 {d18[0]}, [r0], r1
nengel@2 631 vld1.32 {d16[0]}, [r0], r1
nengel@2 632 vld1.32 {d0[0]}, [r0], r1
nengel@2 633 vld1.32 {d2[0]}, [r0], r1
nengel@2 634 vld1.32 {d18[1]}, [r0], r1
nengel@2 635 vld1.32 {d16[1]}, [r0], r1
nengel@2 636 vld1.32 {d0[1]}, [r0], r1
nengel@2 637 vld1.32 {d2[1]}, [r0], r1
nengel@2 638
nengel@2 639 vtrn.16 d18, d0
nengel@2 640 vtrn.16 d16, d2
nengel@2 641 vtrn.8 d18, d16
nengel@2 642 vtrn.8 d0, d2
nengel@2 643
nengel@2 644 h264_loop_filter_chroma
nengel@2 645
nengel@2 646 vtrn.16 d18, d0
nengel@2 647 vtrn.16 d16, d2
nengel@2 648 vtrn.8 d18, d16
nengel@2 649 vtrn.8 d0, d2
nengel@2 650
nengel@2 651 sub r0, r0, r1, lsl #3
nengel@2 652 vst1.32 {d18[0]}, [r0], r1
nengel@2 653 vst1.32 {d16[0]}, [r0], r1
nengel@2 654 vst1.32 {d0[0]}, [r0], r1
nengel@2 655 vst1.32 {d2[0]}, [r0], r1
nengel@2 656 vst1.32 {d18[1]}, [r0], r1
nengel@2 657 vst1.32 {d16[1]}, [r0], r1
nengel@2 658 vst1.32 {d0[1]}, [r0], r1
nengel@2 659 vst1.32 {d2[1]}, [r0], r1
nengel@2 660
nengel@2 661 bx lr
nengel@2 662 endfunc
nengel@2 663
nengel@2 664 /* H.264 qpel MC */
nengel@2 665
nengel@2 666 .macro lowpass_const r
nengel@2 667 movw \r, #5
nengel@2 668 movt \r, #20
nengel@2 669 vmov.32 d6[0], \r
nengel@2 670 .endm
nengel@2 671
nengel@2 672 .macro lowpass_8 r0, r1, r2, r3, d0, d1, narrow=1
nengel@2 673 .if \narrow
nengel@2 674 t0 .req q0
nengel@2 675 t1 .req q8
nengel@2 676 .else
nengel@2 677 t0 .req \d0
nengel@2 678 t1 .req \d1
nengel@2 679 .endif
nengel@2 680 vext.8 d2, \r0, \r1, #2
nengel@2 681 vext.8 d3, \r0, \r1, #3
nengel@2 682 vaddl.u8 q1, d2, d3
nengel@2 683 vext.8 d4, \r0, \r1, #1
nengel@2 684 vext.8 d5, \r0, \r1, #4
nengel@2 685 vaddl.u8 q2, d4, d5
nengel@2 686 vext.8 d30, \r0, \r1, #5
nengel@2 687 vaddl.u8 t0, \r0, d30
nengel@2 688 vext.8 d18, \r2, \r3, #2
nengel@2 689 vmla.i16 t0, q1, d6[1]
nengel@2 690 vext.8 d19, \r2, \r3, #3
nengel@2 691 vaddl.u8 q9, d18, d19
nengel@2 692 vext.8 d20, \r2, \r3, #1
nengel@2 693 vmls.i16 t0, q2, d6[0]
nengel@2 694 vext.8 d21, \r2, \r3, #4
nengel@2 695 vaddl.u8 q10, d20, d21
nengel@2 696 vext.8 d31, \r2, \r3, #5
nengel@2 697 vaddl.u8 t1, \r2, d31
nengel@2 698 vmla.i16 t1, q9, d6[1]
nengel@2 699 vmls.i16 t1, q10, d6[0]
nengel@2 700 .if \narrow
nengel@2 701 vqrshrun.s16 \d0, t0, #5
nengel@2 702 vqrshrun.s16 \d1, t1, #5
nengel@2 703 .endif
nengel@2 704 .unreq t0
nengel@2 705 .unreq t1
nengel@2 706 .endm
nengel@2 707
nengel@2 708 .macro lowpass_8_1 r0, r1, d0, narrow=1
nengel@2 709 .if \narrow
nengel@2 710 t0 .req q0
nengel@2 711 .else
nengel@2 712 t0 .req \d0
nengel@2 713 .endif
nengel@2 714 vext.8 d2, \r0, \r1, #2
nengel@2 715 vext.8 d3, \r0, \r1, #3
nengel@2 716 vaddl.u8 q1, d2, d3
nengel@2 717 vext.8 d4, \r0, \r1, #1
nengel@2 718 vext.8 d5, \r0, \r1, #4
nengel@2 719 vaddl.u8 q2, d4, d5
nengel@2 720 vext.8 d30, \r0, \r1, #5
nengel@2 721 vaddl.u8 t0, \r0, d30
nengel@2 722 vmla.i16 t0, q1, d6[1]
nengel@2 723 vmls.i16 t0, q2, d6[0]
nengel@2 724 .if \narrow
nengel@2 725 vqrshrun.s16 \d0, t0, #5
nengel@2 726 .endif
nengel@2 727 .unreq t0
nengel@2 728 .endm
nengel@2 729
nengel@2 730 .macro lowpass_8.16 r0, r1, l0, h0, l1, h1, d
nengel@2 731 vext.16 q1, \r0, \r1, #2
nengel@2 732 vext.16 q0, \r0, \r1, #3
nengel@2 733 vaddl.s16 q9, d2, d0
nengel@2 734 vext.16 q2, \r0, \r1, #1
nengel@2 735 vaddl.s16 q1, d3, d1
nengel@2 736 vext.16 q3, \r0, \r1, #4
nengel@2 737 vaddl.s16 q10, d4, d6
nengel@2 738 vext.16 \r1, \r0, \r1, #5
nengel@2 739 vaddl.s16 q2, d5, d7
nengel@2 740 vaddl.s16 q0, \h0, \h1
nengel@2 741 vaddl.s16 q8, \l0, \l1
nengel@2 742
nengel@2 743 vshl.i32 q3, q9, #4
nengel@2 744 vshl.i32 q9, q9, #2
nengel@2 745 vshl.i32 q15, q10, #2
nengel@2 746 vadd.i32 q9, q9, q3
nengel@2 747 vadd.i32 q10, q10, q15
nengel@2 748
nengel@2 749 vshl.i32 q3, q1, #4
nengel@2 750 vshl.i32 q1, q1, #2
nengel@2 751 vshl.i32 q15, q2, #2
nengel@2 752 vadd.i32 q1, q1, q3
nengel@2 753 vadd.i32 q2, q2, q15
nengel@2 754
nengel@2 755 vadd.i32 q9, q9, q8
nengel@2 756 vsub.i32 q9, q9, q10
nengel@2 757
nengel@2 758 vadd.i32 q1, q1, q0
nengel@2 759 vsub.i32 q1, q1, q2
nengel@2 760
nengel@2 761 vrshrn.s32 d18, q9, #10
nengel@2 762 vrshrn.s32 d19, q1, #10
nengel@2 763
nengel@2 764 vqmovun.s16 \d, q9
nengel@2 765 .endm
nengel@2 766
nengel@2 767 function put_h264_qpel16_h_lowpass_neon_packed
nengel@2 768 mov r4, lr
nengel@2 769 mov ip, #16
nengel@2 770 mov r3, #8
nengel@2 771 bl put_h264_qpel8_h_lowpass_neon
nengel@2 772 sub r1, r1, r2, lsl #4
nengel@2 773 add r1, r1, #8
nengel@2 774 mov ip, #16
nengel@2 775 mov lr, r4
nengel@2 776 b put_h264_qpel8_h_lowpass_neon
nengel@2 777 endfunc
nengel@2 778
nengel@2 779 .macro h264_qpel_h_lowpass type
nengel@2 780 function \type\()_h264_qpel16_h_lowpass_neon
nengel@2 781 push {lr}
nengel@2 782 mov ip, #16
nengel@2 783 bl \type\()_h264_qpel8_h_lowpass_neon
nengel@2 784 sub r0, r0, r3, lsl #4
nengel@2 785 sub r1, r1, r2, lsl #4
nengel@2 786 add r0, r0, #8
nengel@2 787 add r1, r1, #8
nengel@2 788 mov ip, #16
nengel@2 789 pop {lr}
nengel@2 790 endfunc
nengel@2 791
nengel@2 792 function \type\()_h264_qpel8_h_lowpass_neon
nengel@2 793 1: vld1.64 {d0, d1}, [r1], r2
nengel@2 794 vld1.64 {d16,d17}, [r1], r2
nengel@2 795 subs ip, ip, #2
nengel@2 796 lowpass_8 d0, d1, d16, d17, d0, d16
nengel@2 797 .ifc \type,avg
nengel@2 798 vld1.8 {d2}, [r0,:64], r3
nengel@2 799 vrhadd.u8 d0, d0, d2
nengel@2 800 vld1.8 {d3}, [r0,:64]
nengel@2 801 vrhadd.u8 d16, d16, d3
nengel@2 802 sub r0, r0, r3
nengel@2 803 .endif
nengel@2 804 vst1.64 {d0}, [r0,:64], r3
nengel@2 805 vst1.64 {d16}, [r0,:64], r3
nengel@2 806 bne 1b
nengel@2 807 bx lr
nengel@2 808 endfunc
nengel@2 809 .endm
nengel@2 810
nengel@2 811 h264_qpel_h_lowpass put
nengel@2 812 h264_qpel_h_lowpass avg
nengel@2 813
nengel@2 814 .macro h264_qpel_h_lowpass_l2 type
nengel@2 815 function \type\()_h264_qpel16_h_lowpass_l2_neon
nengel@2 816 push {lr}
nengel@2 817 mov ip, #16
nengel@2 818 bl \type\()_h264_qpel8_h_lowpass_l2_neon
nengel@2 819 sub r0, r0, r2, lsl #4
nengel@2 820 sub r1, r1, r2, lsl #4
nengel@2 821 sub r3, r3, r2, lsl #4
nengel@2 822 add r0, r0, #8
nengel@2 823 add r1, r1, #8
nengel@2 824 add r3, r3, #8
nengel@2 825 mov ip, #16
nengel@2 826 pop {lr}
nengel@2 827 endfunc
nengel@2 828
nengel@2 829 function \type\()_h264_qpel8_h_lowpass_l2_neon
nengel@2 830 1: vld1.64 {d0, d1}, [r1], r2
nengel@2 831 vld1.64 {d16,d17}, [r1], r2
nengel@2 832 vld1.64 {d28}, [r3], r2
nengel@2 833 vld1.64 {d29}, [r3], r2
nengel@2 834 subs ip, ip, #2
nengel@2 835 lowpass_8 d0, d1, d16, d17, d0, d1
nengel@2 836 vrhadd.u8 q0, q0, q14
nengel@2 837 .ifc \type,avg
nengel@2 838 vld1.8 {d2}, [r0,:64], r2
nengel@2 839 vrhadd.u8 d0, d0, d2
nengel@2 840 vld1.8 {d3}, [r0,:64]
nengel@2 841 vrhadd.u8 d1, d1, d3
nengel@2 842 sub r0, r0, r2
nengel@2 843 .endif
nengel@2 844 vst1.64 {d0}, [r0,:64], r2
nengel@2 845 vst1.64 {d1}, [r0,:64], r2
nengel@2 846 bne 1b
nengel@2 847 bx lr
nengel@2 848 endfunc
nengel@2 849 .endm
nengel@2 850
nengel@2 851 h264_qpel_h_lowpass_l2 put
nengel@2 852 h264_qpel_h_lowpass_l2 avg
nengel@2 853
nengel@2 854 function put_h264_qpel16_v_lowpass_neon_packed
nengel@2 855 mov r4, lr
nengel@2 856 mov r2, #8
nengel@2 857 bl put_h264_qpel8_v_lowpass_neon
nengel@2 858 sub r1, r1, r3, lsl #2
nengel@2 859 bl put_h264_qpel8_v_lowpass_neon
nengel@2 860 sub r1, r1, r3, lsl #4
nengel@2 861 sub r1, r1, r3, lsl #2
nengel@2 862 add r1, r1, #8
nengel@2 863 bl put_h264_qpel8_v_lowpass_neon
nengel@2 864 sub r1, r1, r3, lsl #2
nengel@2 865 mov lr, r4
nengel@2 866 b put_h264_qpel8_v_lowpass_neon
nengel@2 867 endfunc
nengel@2 868
nengel@2 869 .macro h264_qpel_v_lowpass type
nengel@2 870 function \type\()_h264_qpel16_v_lowpass_neon
nengel@2 871 mov r4, lr
nengel@2 872 bl \type\()_h264_qpel8_v_lowpass_neon
nengel@2 873 sub r1, r1, r3, lsl #2
nengel@2 874 bl \type\()_h264_qpel8_v_lowpass_neon
nengel@2 875 sub r0, r0, r2, lsl #4
nengel@2 876 add r0, r0, #8
nengel@2 877 sub r1, r1, r3, lsl #4
nengel@2 878 sub r1, r1, r3, lsl #2
nengel@2 879 add r1, r1, #8
nengel@2 880 bl \type\()_h264_qpel8_v_lowpass_neon
nengel@2 881 sub r1, r1, r3, lsl #2
nengel@2 882 mov lr, r4
nengel@2 883 endfunc
nengel@2 884
nengel@2 885 function \type\()_h264_qpel8_v_lowpass_neon
nengel@2 886 vld1.64 {d8}, [r1], r3
nengel@2 887 vld1.64 {d10}, [r1], r3
nengel@2 888 vld1.64 {d12}, [r1], r3
nengel@2 889 vld1.64 {d14}, [r1], r3
nengel@2 890 vld1.64 {d22}, [r1], r3
nengel@2 891 vld1.64 {d24}, [r1], r3
nengel@2 892 vld1.64 {d26}, [r1], r3
nengel@2 893 vld1.64 {d28}, [r1], r3
nengel@2 894 vld1.64 {d9}, [r1], r3
nengel@2 895 vld1.64 {d11}, [r1], r3
nengel@2 896 vld1.64 {d13}, [r1], r3
nengel@2 897 vld1.64 {d15}, [r1], r3
nengel@2 898 vld1.64 {d23}, [r1]
nengel@2 899
nengel@2 900 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
nengel@2 901 lowpass_8 d8, d9, d10, d11, d8, d10
nengel@2 902 lowpass_8 d12, d13, d14, d15, d12, d14
nengel@2 903 lowpass_8 d22, d23, d24, d25, d22, d24
nengel@2 904 lowpass_8 d26, d27, d28, d29, d26, d28
nengel@2 905 transpose_8x8 d8, d10, d12, d14, d22, d24, d26, d28
nengel@2 906
nengel@2 907 .ifc \type,avg
nengel@2 908 vld1.8 {d9}, [r0,:64], r2
nengel@2 909 vrhadd.u8 d8, d8, d9
nengel@2 910 vld1.8 {d11}, [r0,:64], r2
nengel@2 911 vrhadd.u8 d10, d10, d11
nengel@2 912 vld1.8 {d13}, [r0,:64], r2
nengel@2 913 vrhadd.u8 d12, d12, d13
nengel@2 914 vld1.8 {d15}, [r0,:64], r2
nengel@2 915 vrhadd.u8 d14, d14, d15
nengel@2 916 vld1.8 {d23}, [r0,:64], r2
nengel@2 917 vrhadd.u8 d22, d22, d23
nengel@2 918 vld1.8 {d25}, [r0,:64], r2
nengel@2 919 vrhadd.u8 d24, d24, d25
nengel@2 920 vld1.8 {d27}, [r0,:64], r2
nengel@2 921 vrhadd.u8 d26, d26, d27
nengel@2 922 vld1.8 {d29}, [r0,:64], r2
nengel@2 923 vrhadd.u8 d28, d28, d29
nengel@2 924 sub r0, r0, r2, lsl #3
nengel@2 925 .endif
nengel@2 926
nengel@2 927 vst1.64 {d8}, [r0,:64], r2
nengel@2 928 vst1.64 {d10}, [r0,:64], r2
nengel@2 929 vst1.64 {d12}, [r0,:64], r2
nengel@2 930 vst1.64 {d14}, [r0,:64], r2
nengel@2 931 vst1.64 {d22}, [r0,:64], r2
nengel@2 932 vst1.64 {d24}, [r0,:64], r2
nengel@2 933 vst1.64 {d26}, [r0,:64], r2
nengel@2 934 vst1.64 {d28}, [r0,:64], r2
nengel@2 935
nengel@2 936 bx lr
nengel@2 937 endfunc
nengel@2 938 .endm
nengel@2 939
nengel@2 940 h264_qpel_v_lowpass put
nengel@2 941 h264_qpel_v_lowpass avg
nengel@2 942
nengel@2 943 .macro h264_qpel_v_lowpass_l2 type
nengel@2 944 function \type\()_h264_qpel16_v_lowpass_l2_neon
nengel@2 945 mov r4, lr
nengel@2 946 bl \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 947 sub r1, r1, r3, lsl #2
nengel@2 948 bl \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 949 sub r0, r0, r3, lsl #4
nengel@2 950 sub ip, ip, r2, lsl #4
nengel@2 951 add r0, r0, #8
nengel@2 952 add ip, ip, #8
nengel@2 953 sub r1, r1, r3, lsl #4
nengel@2 954 sub r1, r1, r3, lsl #2
nengel@2 955 add r1, r1, #8
nengel@2 956 bl \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 957 sub r1, r1, r3, lsl #2
nengel@2 958 mov lr, r4
nengel@2 959 endfunc
nengel@2 960
nengel@2 961 function \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 962 vld1.64 {d8}, [r1], r3
nengel@2 963 vld1.64 {d10}, [r1], r3
nengel@2 964 vld1.64 {d12}, [r1], r3
nengel@2 965 vld1.64 {d14}, [r1], r3
nengel@2 966 vld1.64 {d22}, [r1], r3
nengel@2 967 vld1.64 {d24}, [r1], r3
nengel@2 968 vld1.64 {d26}, [r1], r3
nengel@2 969 vld1.64 {d28}, [r1], r3
nengel@2 970 vld1.64 {d9}, [r1], r3
nengel@2 971 vld1.64 {d11}, [r1], r3
nengel@2 972 vld1.64 {d13}, [r1], r3
nengel@2 973 vld1.64 {d15}, [r1], r3
nengel@2 974 vld1.64 {d23}, [r1]
nengel@2 975
nengel@2 976 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
nengel@2 977 lowpass_8 d8, d9, d10, d11, d8, d9
nengel@2 978 lowpass_8 d12, d13, d14, d15, d12, d13
nengel@2 979 lowpass_8 d22, d23, d24, d25, d22, d23
nengel@2 980 lowpass_8 d26, d27, d28, d29, d26, d27
nengel@2 981 transpose_8x8 d8, d9, d12, d13, d22, d23, d26, d27
nengel@2 982
nengel@2 983 vld1.64 {d0}, [ip], r2
nengel@2 984 vld1.64 {d1}, [ip], r2
nengel@2 985 vld1.64 {d2}, [ip], r2
nengel@2 986 vld1.64 {d3}, [ip], r2
nengel@2 987 vld1.64 {d4}, [ip], r2
nengel@2 988 vrhadd.u8 q0, q0, q4
nengel@2 989 vld1.64 {d5}, [ip], r2
nengel@2 990 vrhadd.u8 q1, q1, q6
nengel@2 991 vld1.64 {d10}, [ip], r2
nengel@2 992 vrhadd.u8 q2, q2, q11
nengel@2 993 vld1.64 {d11}, [ip], r2
nengel@2 994 vrhadd.u8 q5, q5, q13
nengel@2 995
nengel@2 996 .ifc \type,avg
nengel@2 997 vld1.8 {d16}, [r0,:64], r3
nengel@2 998 vrhadd.u8 d0, d0, d16
nengel@2 999 vld1.8 {d17}, [r0,:64], r3
nengel@2 1000 vrhadd.u8 d1, d1, d17
nengel@2 1001 vld1.8 {d16}, [r0,:64], r3
nengel@2 1002 vrhadd.u8 d2, d2, d16
nengel@2 1003 vld1.8 {d17}, [r0,:64], r3
nengel@2 1004 vrhadd.u8 d3, d3, d17
nengel@2 1005 vld1.8 {d16}, [r0,:64], r3
nengel@2 1006 vrhadd.u8 d4, d4, d16
nengel@2 1007 vld1.8 {d17}, [r0,:64], r3
nengel@2 1008 vrhadd.u8 d5, d5, d17
nengel@2 1009 vld1.8 {d16}, [r0,:64], r3
nengel@2 1010 vrhadd.u8 d10, d10, d16
nengel@2 1011 vld1.8 {d17}, [r0,:64], r3
nengel@2 1012 vrhadd.u8 d11, d11, d17
nengel@2 1013 sub r0, r0, r3, lsl #3
nengel@2 1014 .endif
nengel@2 1015
nengel@2 1016 vst1.64 {d0}, [r0,:64], r3
nengel@2 1017 vst1.64 {d1}, [r0,:64], r3
nengel@2 1018 vst1.64 {d2}, [r0,:64], r3
nengel@2 1019 vst1.64 {d3}, [r0,:64], r3
nengel@2 1020 vst1.64 {d4}, [r0,:64], r3
nengel@2 1021 vst1.64 {d5}, [r0,:64], r3
nengel@2 1022 vst1.64 {d10}, [r0,:64], r3
nengel@2 1023 vst1.64 {d11}, [r0,:64], r3
nengel@2 1024
nengel@2 1025 bx lr
nengel@2 1026 endfunc
nengel@2 1027 .endm
nengel@2 1028
nengel@2 1029 h264_qpel_v_lowpass_l2 put
nengel@2 1030 h264_qpel_v_lowpass_l2 avg
nengel@2 1031
nengel@2 1032 function put_h264_qpel8_hv_lowpass_neon_top
nengel@2 1033 lowpass_const ip
nengel@2 1034 mov ip, #12
nengel@2 1035 1: vld1.64 {d0, d1}, [r1], r3
nengel@2 1036 vld1.64 {d16,d17}, [r1], r3
nengel@2 1037 subs ip, ip, #2
nengel@2 1038 lowpass_8 d0, d1, d16, d17, q11, q12, narrow=0
nengel@2 1039 vst1.64 {d22-d25}, [r4,:128]!
nengel@2 1040 bne 1b
nengel@2 1041
nengel@2 1042 vld1.64 {d0, d1}, [r1]
nengel@2 1043 lowpass_8_1 d0, d1, q12, narrow=0
nengel@2 1044
nengel@2 1045 mov ip, #-16
nengel@2 1046 add r4, r4, ip
nengel@2 1047 vld1.64 {d30,d31}, [r4,:128], ip
nengel@2 1048 vld1.64 {d20,d21}, [r4,:128], ip
nengel@2 1049 vld1.64 {d18,d19}, [r4,:128], ip
nengel@2 1050 vld1.64 {d16,d17}, [r4,:128], ip
nengel@2 1051 vld1.64 {d14,d15}, [r4,:128], ip
nengel@2 1052 vld1.64 {d12,d13}, [r4,:128], ip
nengel@2 1053 vld1.64 {d10,d11}, [r4,:128], ip
nengel@2 1054 vld1.64 {d8, d9}, [r4,:128], ip
nengel@2 1055 vld1.64 {d6, d7}, [r4,:128], ip
nengel@2 1056 vld1.64 {d4, d5}, [r4,:128], ip
nengel@2 1057 vld1.64 {d2, d3}, [r4,:128], ip
nengel@2 1058 vld1.64 {d0, d1}, [r4,:128]
nengel@2 1059
nengel@2 1060 swap4 d1, d3, d5, d7, d8, d10, d12, d14
nengel@2 1061 transpose16_4x4 q0, q1, q2, q3, q4, q5, q6, q7
nengel@2 1062
nengel@2 1063 swap4 d17, d19, d21, d31, d24, d26, d28, d22
nengel@2 1064 transpose16_4x4 q8, q9, q10, q15, q12, q13, q14, q11
nengel@2 1065
nengel@2 1066 vst1.64 {d30,d31}, [r4,:128]!
nengel@2 1067 vst1.64 {d6, d7}, [r4,:128]!
nengel@2 1068 vst1.64 {d20,d21}, [r4,:128]!
nengel@2 1069 vst1.64 {d4, d5}, [r4,:128]!
nengel@2 1070 vst1.64 {d18,d19}, [r4,:128]!
nengel@2 1071 vst1.64 {d2, d3}, [r4,:128]!
nengel@2 1072 vst1.64 {d16,d17}, [r4,:128]!
nengel@2 1073 vst1.64 {d0, d1}, [r4,:128]
nengel@2 1074
nengel@2 1075 lowpass_8.16 q4, q12, d8, d9, d24, d25, d8
nengel@2 1076 lowpass_8.16 q5, q13, d10, d11, d26, d27, d9
nengel@2 1077 lowpass_8.16 q6, q14, d12, d13, d28, d29, d10
nengel@2 1078 lowpass_8.16 q7, q11, d14, d15, d22, d23, d11
nengel@2 1079
nengel@2 1080 vld1.64 {d16,d17}, [r4,:128], ip
nengel@2 1081 vld1.64 {d30,d31}, [r4,:128], ip
nengel@2 1082 lowpass_8.16 q8, q15, d16, d17, d30, d31, d12
nengel@2 1083 vld1.64 {d16,d17}, [r4,:128], ip
nengel@2 1084 vld1.64 {d30,d31}, [r4,:128], ip
nengel@2 1085 lowpass_8.16 q8, q15, d16, d17, d30, d31, d13
nengel@2 1086 vld1.64 {d16,d17}, [r4,:128], ip
nengel@2 1087 vld1.64 {d30,d31}, [r4,:128], ip
nengel@2 1088 lowpass_8.16 q8, q15, d16, d17, d30, d31, d14
nengel@2 1089 vld1.64 {d16,d17}, [r4,:128], ip
nengel@2 1090 vld1.64 {d30,d31}, [r4,:128]
nengel@2 1091 lowpass_8.16 q8, q15, d16, d17, d30, d31, d15
nengel@2 1092
nengel@2 1093 transpose_8x8 d12, d13, d14, d15, d8, d9, d10, d11
nengel@2 1094
nengel@2 1095 bx lr
nengel@2 1096 endfunc
nengel@2 1097
nengel@2 1098 .macro h264_qpel8_hv_lowpass type
nengel@2 1099 function \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1100 mov r10, lr
nengel@2 1101 bl put_h264_qpel8_hv_lowpass_neon_top
nengel@2 1102 .ifc \type,avg
nengel@2 1103 vld1.8 {d0}, [r0,:64], r2
nengel@2 1104 vrhadd.u8 d12, d12, d0
nengel@2 1105 vld1.8 {d1}, [r0,:64], r2
nengel@2 1106 vrhadd.u8 d13, d13, d1
nengel@2 1107 vld1.8 {d2}, [r0,:64], r2
nengel@2 1108 vrhadd.u8 d14, d14, d2
nengel@2 1109 vld1.8 {d3}, [r0,:64], r2
nengel@2 1110 vrhadd.u8 d15, d15, d3
nengel@2 1111 vld1.8 {d4}, [r0,:64], r2
nengel@2 1112 vrhadd.u8 d8, d8, d4
nengel@2 1113 vld1.8 {d5}, [r0,:64], r2
nengel@2 1114 vrhadd.u8 d9, d9, d5
nengel@2 1115 vld1.8 {d6}, [r0,:64], r2
nengel@2 1116 vrhadd.u8 d10, d10, d6
nengel@2 1117 vld1.8 {d7}, [r0,:64], r2
nengel@2 1118 vrhadd.u8 d11, d11, d7
nengel@2 1119 sub r0, r0, r2, lsl #3
nengel@2 1120 .endif
nengel@2 1121 vst1.64 {d12}, [r0,:64], r2
nengel@2 1122 vst1.64 {d13}, [r0,:64], r2
nengel@2 1123 vst1.64 {d14}, [r0,:64], r2
nengel@2 1124 vst1.64 {d15}, [r0,:64], r2
nengel@2 1125 vst1.64 {d8}, [r0,:64], r2
nengel@2 1126 vst1.64 {d9}, [r0,:64], r2
nengel@2 1127 vst1.64 {d10}, [r0,:64], r2
nengel@2 1128 vst1.64 {d11}, [r0,:64], r2
nengel@2 1129
nengel@2 1130 mov lr, r10
nengel@2 1131 bx lr
nengel@2 1132 endfunc
nengel@2 1133 .endm
nengel@2 1134
nengel@2 1135 h264_qpel8_hv_lowpass put
nengel@2 1136 h264_qpel8_hv_lowpass avg
nengel@2 1137
nengel@2 1138 .macro h264_qpel8_hv_lowpass_l2 type
nengel@2 1139 function \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1140 mov r10, lr
nengel@2 1141 bl put_h264_qpel8_hv_lowpass_neon_top
nengel@2 1142
nengel@2 1143 vld1.64 {d0, d1}, [r2,:128]!
nengel@2 1144 vld1.64 {d2, d3}, [r2,:128]!
nengel@2 1145 vrhadd.u8 q0, q0, q6
nengel@2 1146 vld1.64 {d4, d5}, [r2,:128]!
nengel@2 1147 vrhadd.u8 q1, q1, q7
nengel@2 1148 vld1.64 {d6, d7}, [r2,:128]!
nengel@2 1149 vrhadd.u8 q2, q2, q4
nengel@2 1150 vrhadd.u8 q3, q3, q5
nengel@2 1151 .ifc \type,avg
nengel@2 1152 vld1.8 {d16}, [r0,:64], r3
nengel@2 1153 vrhadd.u8 d0, d0, d16
nengel@2 1154 vld1.8 {d17}, [r0,:64], r3
nengel@2 1155 vrhadd.u8 d1, d1, d17
nengel@2 1156 vld1.8 {d18}, [r0,:64], r3
nengel@2 1157 vrhadd.u8 d2, d2, d18
nengel@2 1158 vld1.8 {d19}, [r0,:64], r3
nengel@2 1159 vrhadd.u8 d3, d3, d19
nengel@2 1160 vld1.8 {d20}, [r0,:64], r3
nengel@2 1161 vrhadd.u8 d4, d4, d20
nengel@2 1162 vld1.8 {d21}, [r0,:64], r3
nengel@2 1163 vrhadd.u8 d5, d5, d21
nengel@2 1164 vld1.8 {d22}, [r0,:64], r3
nengel@2 1165 vrhadd.u8 d6, d6, d22
nengel@2 1166 vld1.8 {d23}, [r0,:64], r3
nengel@2 1167 vrhadd.u8 d7, d7, d23
nengel@2 1168 sub r0, r0, r3, lsl #3
nengel@2 1169 .endif
nengel@2 1170 vst1.64 {d0}, [r0,:64], r3
nengel@2 1171 vst1.64 {d1}, [r0,:64], r3
nengel@2 1172 vst1.64 {d2}, [r0,:64], r3
nengel@2 1173 vst1.64 {d3}, [r0,:64], r3
nengel@2 1174 vst1.64 {d4}, [r0,:64], r3
nengel@2 1175 vst1.64 {d5}, [r0,:64], r3
nengel@2 1176 vst1.64 {d6}, [r0,:64], r3
nengel@2 1177 vst1.64 {d7}, [r0,:64], r3
nengel@2 1178
nengel@2 1179 mov lr, r10
nengel@2 1180 bx lr
nengel@2 1181 endfunc
nengel@2 1182 .endm
nengel@2 1183
nengel@2 1184 h264_qpel8_hv_lowpass_l2 put
nengel@2 1185 h264_qpel8_hv_lowpass_l2 avg
nengel@2 1186
nengel@2 1187 .macro h264_qpel16_hv type
nengel@2 1188 function \type\()_h264_qpel16_hv_lowpass_neon
nengel@2 1189 mov r9, lr
nengel@2 1190 bl \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1191 sub r1, r1, r3, lsl #2
nengel@2 1192 bl \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1193 sub r1, r1, r3, lsl #4
nengel@2 1194 sub r1, r1, r3, lsl #2
nengel@2 1195 add r1, r1, #8
nengel@2 1196 sub r0, r0, r2, lsl #4
nengel@2 1197 add r0, r0, #8
nengel@2 1198 bl \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1199 sub r1, r1, r3, lsl #2
nengel@2 1200 mov lr, r9
nengel@2 1201 b \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1202 endfunc
nengel@2 1203
nengel@2 1204 function \type\()_h264_qpel16_hv_lowpass_l2_neon
nengel@2 1205 mov r9, lr
nengel@2 1206 sub r2, r4, #256
nengel@2 1207 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1208 sub r1, r1, r3, lsl #2
nengel@2 1209 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1210 sub r1, r1, r3, lsl #4
nengel@2 1211 sub r1, r1, r3, lsl #2
nengel@2 1212 add r1, r1, #8
nengel@2 1213 sub r0, r0, r3, lsl #4
nengel@2 1214 add r0, r0, #8
nengel@2 1215 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1216 sub r1, r1, r3, lsl #2
nengel@2 1217 mov lr, r9
nengel@2 1218 b \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1219 endfunc
nengel@2 1220 .endm
nengel@2 1221
nengel@2 1222 h264_qpel16_hv put
nengel@2 1223 h264_qpel16_hv avg
nengel@2 1224
nengel@2 1225 .macro h264_qpel8 type
nengel@2 1226 function ff_\type\()_h264_qpel8_mc10_neon, export=1
nengel@2 1227 lowpass_const r3
nengel@2 1228 mov r3, r1
nengel@2 1229 sub r1, r1, #2
nengel@2 1230 mov ip, #8
nengel@2 1231 b \type\()_h264_qpel8_h_lowpass_l2_neon
nengel@2 1232 endfunc
nengel@2 1233
nengel@2 1234 function ff_\type\()_h264_qpel8_mc20_neon, export=1
nengel@2 1235 lowpass_const r3
nengel@2 1236 sub r1, r1, #2
nengel@2 1237 mov r3, r2
nengel@2 1238 mov ip, #8
nengel@2 1239 b \type\()_h264_qpel8_h_lowpass_neon
nengel@2 1240 endfunc
nengel@2 1241
nengel@2 1242 function ff_\type\()_h264_qpel8_mc30_neon, export=1
nengel@2 1243 lowpass_const r3
nengel@2 1244 add r3, r1, #1
nengel@2 1245 sub r1, r1, #2
nengel@2 1246 mov ip, #8
nengel@2 1247 b \type\()_h264_qpel8_h_lowpass_l2_neon
nengel@2 1248 endfunc
nengel@2 1249
nengel@2 1250 function ff_\type\()_h264_qpel8_mc01_neon, export=1
nengel@2 1251 push {lr}
nengel@2 1252 mov ip, r1
nengel@2 1253 \type\()_h264_qpel8_mc01:
nengel@2 1254 lowpass_const r3
nengel@2 1255 mov r3, r2
nengel@2 1256 sub r1, r1, r2, lsl #1
nengel@2 1257 vpush {d8-d15}
nengel@2 1258 bl \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 1259 vpop {d8-d15}
nengel@2 1260 pop {pc}
nengel@2 1261 endfunc
nengel@2 1262
nengel@2 1263 function ff_\type\()_h264_qpel8_mc11_neon, export=1
nengel@2 1264 push {r0, r1, r11, lr}
nengel@2 1265 \type\()_h264_qpel8_mc11:
nengel@2 1266 lowpass_const r3
nengel@2 1267 mov r11, sp
nengel@2 1268 bic sp, sp, #15
nengel@2 1269 sub sp, sp, #64
nengel@2 1270 mov r0, sp
nengel@2 1271 sub r1, r1, #2
nengel@2 1272 mov r3, #8
nengel@2 1273 mov ip, #8
nengel@2 1274 vpush {d8-d15}
nengel@2 1275 bl put_h264_qpel8_h_lowpass_neon
nengel@2 1276 ldrd r0, [r11]
nengel@2 1277 mov r3, r2
nengel@2 1278 add ip, sp, #64
nengel@2 1279 sub r1, r1, r2, lsl #1
nengel@2 1280 mov r2, #8
nengel@2 1281 bl \type\()_h264_qpel8_v_lowpass_l2_neon
nengel@2 1282 vpop {d8-d15}
nengel@2 1283 add sp, r11, #8
nengel@2 1284 pop {r11, pc}
nengel@2 1285 endfunc
nengel@2 1286
nengel@2 1287 function ff_\type\()_h264_qpel8_mc21_neon, export=1
nengel@2 1288 push {r0, r1, r4, r10, r11, lr}
nengel@2 1289 \type\()_h264_qpel8_mc21:
nengel@2 1290 lowpass_const r3
nengel@2 1291 mov r11, sp
nengel@2 1292 bic sp, sp, #15
nengel@2 1293 sub sp, sp, #(8*8+16*12)
nengel@2 1294 sub r1, r1, #2
nengel@2 1295 mov r3, #8
nengel@2 1296 mov r0, sp
nengel@2 1297 mov ip, #8
nengel@2 1298 vpush {d8-d15}
nengel@2 1299 bl put_h264_qpel8_h_lowpass_neon
nengel@2 1300 mov r4, r0
nengel@2 1301 ldrd r0, [r11]
nengel@2 1302 sub r1, r1, r2, lsl #1
nengel@2 1303 sub r1, r1, #2
nengel@2 1304 mov r3, r2
nengel@2 1305 sub r2, r4, #64
nengel@2 1306 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1307 vpop {d8-d15}
nengel@2 1308 add sp, r11, #8
nengel@2 1309 pop {r4, r10, r11, pc}
nengel@2 1310 endfunc
nengel@2 1311
nengel@2 1312 function ff_\type\()_h264_qpel8_mc31_neon, export=1
nengel@2 1313 add r1, r1, #1
nengel@2 1314 push {r0, r1, r11, lr}
nengel@2 1315 sub r1, r1, #1
nengel@2 1316 b \type\()_h264_qpel8_mc11
nengel@2 1317 endfunc
nengel@2 1318
nengel@2 1319 function ff_\type\()_h264_qpel8_mc02_neon, export=1
nengel@2 1320 push {lr}
nengel@2 1321 lowpass_const r3
nengel@2 1322 sub r1, r1, r2, lsl #1
nengel@2 1323 mov r3, r2
nengel@2 1324 vpush {d8-d15}
nengel@2 1325 bl \type\()_h264_qpel8_v_lowpass_neon
nengel@2 1326 vpop {d8-d15}
nengel@2 1327 pop {pc}
nengel@2 1328 endfunc
nengel@2 1329
nengel@2 1330 function ff_\type\()_h264_qpel8_mc12_neon, export=1
nengel@2 1331 push {r0, r1, r4, r10, r11, lr}
nengel@2 1332 \type\()_h264_qpel8_mc12:
nengel@2 1333 lowpass_const r3
nengel@2 1334 mov r11, sp
nengel@2 1335 bic sp, sp, #15
nengel@2 1336 sub sp, sp, #(8*8+16*12)
nengel@2 1337 sub r1, r1, r2, lsl #1
nengel@2 1338 mov r3, r2
nengel@2 1339 mov r2, #8
nengel@2 1340 mov r0, sp
nengel@2 1341 vpush {d8-d15}
nengel@2 1342 bl put_h264_qpel8_v_lowpass_neon
nengel@2 1343 mov r4, r0
nengel@2 1344 ldrd r0, [r11]
nengel@2 1345 sub r1, r1, r3, lsl #1
nengel@2 1346 sub r1, r1, #2
nengel@2 1347 sub r2, r4, #64
nengel@2 1348 bl \type\()_h264_qpel8_hv_lowpass_l2_neon
nengel@2 1349 vpop {d8-d15}
nengel@2 1350 add sp, r11, #8
nengel@2 1351 pop {r4, r10, r11, pc}
nengel@2 1352 endfunc
nengel@2 1353
nengel@2 1354 function ff_\type\()_h264_qpel8_mc22_neon, export=1
nengel@2 1355 push {r4, r10, r11, lr}
nengel@2 1356 mov r11, sp
nengel@2 1357 bic sp, sp, #15
nengel@2 1358 sub r1, r1, r2, lsl #1
nengel@2 1359 sub r1, r1, #2
nengel@2 1360 mov r3, r2
nengel@2 1361 sub sp, sp, #(16*12)
nengel@2 1362 mov r4, sp
nengel@2 1363 vpush {d8-d15}
nengel@2 1364 bl \type\()_h264_qpel8_hv_lowpass_neon
nengel@2 1365 vpop {d8-d15}
nengel@2 1366 mov sp, r11
nengel@2 1367 pop {r4, r10, r11, pc}
nengel@2 1368 endfunc
nengel@2 1369
nengel@2 1370 function ff_\type\()_h264_qpel8_mc32_neon, export=1
nengel@2 1371 push {r0, r1, r4, r10, r11, lr}
nengel@2 1372 add r1, r1, #1
nengel@2 1373 b \type\()_h264_qpel8_mc12
nengel@2 1374 endfunc
nengel@2 1375
nengel@2 1376 function ff_\type\()_h264_qpel8_mc03_neon, export=1
nengel@2 1377 push {lr}
nengel@2 1378 add ip, r1, r2
nengel@2 1379 b \type\()_h264_qpel8_mc01
nengel@2 1380 endfunc
nengel@2 1381
nengel@2 1382 function ff_\type\()_h264_qpel8_mc13_neon, export=1
nengel@2 1383 push {r0, r1, r11, lr}
nengel@2 1384 add r1, r1, r2
nengel@2 1385 b \type\()_h264_qpel8_mc11
nengel@2 1386 endfunc
nengel@2 1387
nengel@2 1388 function ff_\type\()_h264_qpel8_mc23_neon, export=1
nengel@2 1389 push {r0, r1, r4, r10, r11, lr}
nengel@2 1390 add r1, r1, r2
nengel@2 1391 b \type\()_h264_qpel8_mc21
nengel@2 1392 endfunc
nengel@2 1393
nengel@2 1394 function ff_\type\()_h264_qpel8_mc33_neon, export=1
nengel@2 1395 add r1, r1, #1
nengel@2 1396 push {r0, r1, r11, lr}
nengel@2 1397 add r1, r1, r2
nengel@2 1398 sub r1, r1, #1
nengel@2 1399 b \type\()_h264_qpel8_mc11
nengel@2 1400 endfunc
nengel@2 1401 .endm
nengel@2 1402
nengel@2 1403 h264_qpel8 put
nengel@2 1404 h264_qpel8 avg
nengel@2 1405
nengel@2 1406 .macro h264_qpel16 type
nengel@2 1407 function ff_\type\()_h264_qpel16_mc10_neon, export=1
nengel@2 1408 lowpass_const r3
nengel@2 1409 mov r3, r1
nengel@2 1410 sub r1, r1, #2
nengel@2 1411 b \type\()_h264_qpel16_h_lowpass_l2_neon
nengel@2 1412 endfunc
nengel@2 1413
nengel@2 1414 function ff_\type\()_h264_qpel16_mc20_neon, export=1
nengel@2 1415 lowpass_const r3
nengel@2 1416 sub r1, r1, #2
nengel@2 1417 mov r3, r2
nengel@2 1418 b \type\()_h264_qpel16_h_lowpass_neon
nengel@2 1419 endfunc
nengel@2 1420
nengel@2 1421 function ff_\type\()_h264_qpel16_mc30_neon, export=1
nengel@2 1422 lowpass_const r3
nengel@2 1423 add r3, r1, #1
nengel@2 1424 sub r1, r1, #2
nengel@2 1425 b \type\()_h264_qpel16_h_lowpass_l2_neon
nengel@2 1426 endfunc
nengel@2 1427
nengel@2 1428 function ff_\type\()_h264_qpel16_mc01_neon, export=1
nengel@2 1429 push {r4, lr}
nengel@2 1430 mov ip, r1
nengel@2 1431 \type\()_h264_qpel16_mc01:
nengel@2 1432 lowpass_const r3
nengel@2 1433 mov r3, r2
nengel@2 1434 sub r1, r1, r2, lsl #1
nengel@2 1435 vpush {d8-d15}
nengel@2 1436 bl \type\()_h264_qpel16_v_lowpass_l2_neon
nengel@2 1437 vpop {d8-d15}
nengel@2 1438 pop {r4, pc}
nengel@2 1439 endfunc
nengel@2 1440
nengel@2 1441 function ff_\type\()_h264_qpel16_mc11_neon, export=1
nengel@2 1442 push {r0, r1, r4, r11, lr}
nengel@2 1443 \type\()_h264_qpel16_mc11:
nengel@2 1444 lowpass_const r3
nengel@2 1445 mov r11, sp
nengel@2 1446 bic sp, sp, #15
nengel@2 1447 sub sp, sp, #256
nengel@2 1448 mov r0, sp
nengel@2 1449 sub r1, r1, #2
nengel@2 1450 mov r3, #16
nengel@2 1451 vpush {d8-d15}
nengel@2 1452 bl put_h264_qpel16_h_lowpass_neon
nengel@2 1453 ldrd r0, [r11]
nengel@2 1454 mov r3, r2
nengel@2 1455 add ip, sp, #64
nengel@2 1456 sub r1, r1, r2, lsl #1
nengel@2 1457 mov r2, #16
nengel@2 1458 bl \type\()_h264_qpel16_v_lowpass_l2_neon
nengel@2 1459 vpop {d8-d15}
nengel@2 1460 add sp, r11, #8
nengel@2 1461 pop {r4, r11, pc}
nengel@2 1462 endfunc
nengel@2 1463
nengel@2 1464 function ff_\type\()_h264_qpel16_mc21_neon, export=1
nengel@2 1465 push {r0, r1, r4-r5, r9-r11, lr}
nengel@2 1466 \type\()_h264_qpel16_mc21:
nengel@2 1467 lowpass_const r3
nengel@2 1468 mov r11, sp
nengel@2 1469 bic sp, sp, #15
nengel@2 1470 sub sp, sp, #(16*16+16*12)
nengel@2 1471 sub r1, r1, #2
nengel@2 1472 mov r0, sp
nengel@2 1473 vpush {d8-d15}
nengel@2 1474 bl put_h264_qpel16_h_lowpass_neon_packed
nengel@2 1475 mov r4, r0
nengel@2 1476 ldrd r0, [r11]
nengel@2 1477 sub r1, r1, r2, lsl #1
nengel@2 1478 sub r1, r1, #2
nengel@2 1479 mov r3, r2
nengel@2 1480 bl \type\()_h264_qpel16_hv_lowpass_l2_neon
nengel@2 1481 vpop {d8-d15}
nengel@2 1482 add sp, r11, #8
nengel@2 1483 pop {r4-r5, r9-r11, pc}
nengel@2 1484 endfunc
nengel@2 1485
nengel@2 1486 function ff_\type\()_h264_qpel16_mc31_neon, export=1
nengel@2 1487 add r1, r1, #1
nengel@2 1488 push {r0, r1, r4, r11, lr}
nengel@2 1489 sub r1, r1, #1
nengel@2 1490 b \type\()_h264_qpel16_mc11
nengel@2 1491 endfunc
nengel@2 1492
nengel@2 1493 function ff_\type\()_h264_qpel16_mc02_neon, export=1
nengel@2 1494 push {r4, lr}
nengel@2 1495 lowpass_const r3
nengel@2 1496 sub r1, r1, r2, lsl #1
nengel@2 1497 mov r3, r2
nengel@2 1498 vpush {d8-d15}
nengel@2 1499 bl \type\()_h264_qpel16_v_lowpass_neon
nengel@2 1500 vpop {d8-d15}
nengel@2 1501 pop {r4, pc}
nengel@2 1502 endfunc
nengel@2 1503
nengel@2 1504 function ff_\type\()_h264_qpel16_mc12_neon, export=1
nengel@2 1505 push {r0, r1, r4-r5, r9-r11, lr}
nengel@2 1506 \type\()_h264_qpel16_mc12:
nengel@2 1507 lowpass_const r3
nengel@2 1508 mov r11, sp
nengel@2 1509 bic sp, sp, #15
nengel@2 1510 sub sp, sp, #(16*16+16*12)
nengel@2 1511 sub r1, r1, r2, lsl #1
nengel@2 1512 mov r0, sp
nengel@2 1513 mov r3, r2
nengel@2 1514 vpush {d8-d15}
nengel@2 1515 bl put_h264_qpel16_v_lowpass_neon_packed
nengel@2 1516 mov r4, r0
nengel@2 1517 ldrd r0, [r11]
nengel@2 1518 sub r1, r1, r3, lsl #1
nengel@2 1519 sub r1, r1, #2
nengel@2 1520 mov r2, r3
nengel@2 1521 bl \type\()_h264_qpel16_hv_lowpass_l2_neon
nengel@2 1522 vpop {d8-d15}
nengel@2 1523 add sp, r11, #8
nengel@2 1524 pop {r4-r5, r9-r11, pc}
nengel@2 1525 endfunc
nengel@2 1526
nengel@2 1527 function ff_\type\()_h264_qpel16_mc22_neon, export=1
nengel@2 1528 push {r4, r9-r11, lr}
nengel@2 1529 lowpass_const r3
nengel@2 1530 mov r11, sp
nengel@2 1531 bic sp, sp, #15
nengel@2 1532 sub r1, r1, r2, lsl #1
nengel@2 1533 sub r1, r1, #2
nengel@2 1534 mov r3, r2
nengel@2 1535 sub sp, sp, #(16*12)
nengel@2 1536 mov r4, sp
nengel@2 1537 vpush {d8-d15}
nengel@2 1538 bl \type\()_h264_qpel16_hv_lowpass_neon
nengel@2 1539 vpop {d8-d15}
nengel@2 1540 mov sp, r11
nengel@2 1541 pop {r4, r9-r11, pc}
nengel@2 1542 endfunc
nengel@2 1543
nengel@2 1544 function ff_\type\()_h264_qpel16_mc32_neon, export=1
nengel@2 1545 push {r0, r1, r4-r5, r9-r11, lr}
nengel@2 1546 add r1, r1, #1
nengel@2 1547 b \type\()_h264_qpel16_mc12
nengel@2 1548 endfunc
nengel@2 1549
nengel@2 1550 function ff_\type\()_h264_qpel16_mc03_neon, export=1
nengel@2 1551 push {r4, lr}
nengel@2 1552 add ip, r1, r2
nengel@2 1553 b \type\()_h264_qpel16_mc01
nengel@2 1554 endfunc
nengel@2 1555
nengel@2 1556 function ff_\type\()_h264_qpel16_mc13_neon, export=1
nengel@2 1557 push {r0, r1, r4, r11, lr}
nengel@2 1558 add r1, r1, r2
nengel@2 1559 b \type\()_h264_qpel16_mc11
nengel@2 1560 endfunc
nengel@2 1561
nengel@2 1562 function ff_\type\()_h264_qpel16_mc23_neon, export=1
nengel@2 1563 push {r0, r1, r4-r5, r9-r11, lr}
nengel@2 1564 add r1, r1, r2
nengel@2 1565 b \type\()_h264_qpel16_mc21
nengel@2 1566 endfunc
nengel@2 1567
nengel@2 1568 function ff_\type\()_h264_qpel16_mc33_neon, export=1
nengel@2 1569 add r1, r1, #1
nengel@2 1570 push {r0, r1, r4, r11, lr}
nengel@2 1571 add r1, r1, r2
nengel@2 1572 sub r1, r1, #1
nengel@2 1573 b \type\()_h264_qpel16_mc11
nengel@2 1574 endfunc
nengel@2 1575 .endm
nengel@2 1576
nengel@2 1577 h264_qpel16 put
nengel@2 1578 h264_qpel16 avg
nengel@2 1579
nengel@2 1580 @ Biweighted prediction
nengel@2 1581
nengel@2 1582 .macro biweight_16 macs, macd
nengel@2 1583 vdup.8 d0, r4
nengel@2 1584 vdup.8 d1, r5
nengel@2 1585 vmov q2, q8
nengel@2 1586 vmov q3, q8
nengel@2 1587 1: subs ip, ip, #2
nengel@2 1588 vld1.8 {d20-d21},[r0,:128], r2
nengel@2 1589 \macd q2, d0, d20
nengel@2 1590 pld [r0]
nengel@2 1591 \macd q3, d0, d21
nengel@2 1592 vld1.8 {d22-d23},[r1,:128], r2
nengel@2 1593 \macs q2, d1, d22
nengel@2 1594 pld [r1]
nengel@2 1595 \macs q3, d1, d23
nengel@2 1596 vmov q12, q8
nengel@2 1597 vld1.8 {d28-d29},[r0,:128], r2
nengel@2 1598 vmov q13, q8
nengel@2 1599 \macd q12, d0, d28
nengel@2 1600 pld [r0]
nengel@2 1601 \macd q13, d0, d29
nengel@2 1602 vld1.8 {d30-d31},[r1,:128], r2
nengel@2 1603 \macs q12, d1, d30
nengel@2 1604 pld [r1]
nengel@2 1605 \macs q13, d1, d31
nengel@2 1606 vshl.s16 q2, q2, q9
nengel@2 1607 vshl.s16 q3, q3, q9
nengel@2 1608 vqmovun.s16 d4, q2
nengel@2 1609 vqmovun.s16 d5, q3
nengel@2 1610 vshl.s16 q12, q12, q9
nengel@2 1611 vshl.s16 q13, q13, q9
nengel@2 1612 vqmovun.s16 d24, q12
nengel@2 1613 vqmovun.s16 d25, q13
nengel@2 1614 vmov q3, q8
nengel@2 1615 vst1.8 {d4- d5}, [r6,:128], r2
nengel@2 1616 vmov q2, q8
nengel@2 1617 vst1.8 {d24-d25},[r6,:128], r2
nengel@2 1618 bne 1b
nengel@2 1619 pop {r4-r6, pc}
nengel@2 1620 .endm
nengel@2 1621
nengel@2 1622 .macro biweight_8 macs, macd
nengel@2 1623 vdup.8 d0, r4
nengel@2 1624 vdup.8 d1, r5
nengel@2 1625 vmov q1, q8
nengel@2 1626 vmov q10, q8
nengel@2 1627 1: subs ip, ip, #2
nengel@2 1628 vld1.8 {d4},[r0,:64], r2
nengel@2 1629 \macd q1, d0, d4
nengel@2 1630 pld [r0]
nengel@2 1631 vld1.8 {d5},[r1,:64], r2
nengel@2 1632 \macs q1, d1, d5
nengel@2 1633 pld [r1]
nengel@2 1634 vld1.8 {d6},[r0,:64], r2
nengel@2 1635 \macd q10, d0, d6
nengel@2 1636 pld [r0]
nengel@2 1637 vld1.8 {d7},[r1,:64], r2
nengel@2 1638 \macs q10, d1, d7
nengel@2 1639 pld [r1]
nengel@2 1640 vshl.s16 q1, q1, q9
nengel@2 1641 vqmovun.s16 d2, q1
nengel@2 1642 vshl.s16 q10, q10, q9
nengel@2 1643 vqmovun.s16 d4, q10
nengel@2 1644 vmov q10, q8
nengel@2 1645 vst1.8 {d2},[r6,:64], r2
nengel@2 1646 vmov q1, q8
nengel@2 1647 vst1.8 {d4},[r6,:64], r2
nengel@2 1648 bne 1b
nengel@2 1649 pop {r4-r6, pc}
nengel@2 1650 .endm
nengel@2 1651
nengel@2 1652 .macro biweight_4 macs, macd
nengel@2 1653 vdup.8 d0, r4
nengel@2 1654 vdup.8 d1, r5
nengel@2 1655 vmov q1, q8
nengel@2 1656 vmov q10, q8
nengel@2 1657 1: subs ip, ip, #4
nengel@2 1658 vld1.32 {d4[0]},[r0,:32], r2
nengel@2 1659 vld1.32 {d4[1]},[r0,:32], r2
nengel@2 1660 \macd q1, d0, d4
nengel@2 1661 pld [r0]
nengel@2 1662 vld1.32 {d5[0]},[r1,:32], r2
nengel@2 1663 vld1.32 {d5[1]},[r1,:32], r2
nengel@2 1664 \macs q1, d1, d5
nengel@2 1665 pld [r1]
nengel@2 1666 blt 2f
nengel@2 1667 vld1.32 {d6[0]},[r0,:32], r2
nengel@2 1668 vld1.32 {d6[1]},[r0,:32], r2
nengel@2 1669 \macd q10, d0, d6
nengel@2 1670 pld [r0]
nengel@2 1671 vld1.32 {d7[0]},[r1,:32], r2
nengel@2 1672 vld1.32 {d7[1]},[r1,:32], r2
nengel@2 1673 \macs q10, d1, d7
nengel@2 1674 pld [r1]
nengel@2 1675 vshl.s16 q1, q1, q9
nengel@2 1676 vqmovun.s16 d2, q1
nengel@2 1677 vshl.s16 q10, q10, q9
nengel@2 1678 vqmovun.s16 d4, q10
nengel@2 1679 vmov q10, q8
nengel@2 1680 vst1.32 {d2[0]},[r6,:32], r2
nengel@2 1681 vst1.32 {d2[1]},[r6,:32], r2
nengel@2 1682 vmov q1, q8
nengel@2 1683 vst1.32 {d4[0]},[r6,:32], r2
nengel@2 1684 vst1.32 {d4[1]},[r6,:32], r2
nengel@2 1685 bne 1b
nengel@2 1686 pop {r4-r6, pc}
nengel@2 1687 2: vshl.s16 q1, q1, q9
nengel@2 1688 vqmovun.s16 d2, q1
nengel@2 1689 vst1.32 {d2[0]},[r6,:32], r2
nengel@2 1690 vst1.32 {d2[1]},[r6,:32], r2
nengel@2 1691 pop {r4-r6, pc}
nengel@2 1692 .endm
nengel@2 1693
nengel@2 1694 .macro biweight_func w
nengel@2 1695 function biweight_h264_pixels_\w\()_neon
nengel@2 1696 push {r4-r6, lr}
nengel@2 1697 add r4, sp, #16
nengel@2 1698 ldm r4, {r4-r6}
nengel@2 1699 lsr lr, r4, #31
nengel@2 1700 add r6, r6, #1
nengel@2 1701 eors lr, lr, r5, lsr #30
nengel@2 1702 orr r6, r6, #1
nengel@2 1703 vdup.16 q9, r3
nengel@2 1704 lsl r6, r6, r3
nengel@2 1705 vmvn q9, q9
nengel@2 1706 vdup.16 q8, r6
nengel@2 1707 mov r6, r0
nengel@2 1708 beq 10f
nengel@2 1709 subs lr, lr, #1
nengel@2 1710 beq 20f
nengel@2 1711 subs lr, lr, #1
nengel@2 1712 beq 30f
nengel@2 1713 b 40f
nengel@2 1714 10: biweight_\w vmlal.u8, vmlal.u8
nengel@2 1715 20: rsb r4, r4, #0
nengel@2 1716 biweight_\w vmlal.u8, vmlsl.u8
nengel@2 1717 30: rsb r4, r4, #0
nengel@2 1718 rsb r5, r5, #0
nengel@2 1719 biweight_\w vmlsl.u8, vmlsl.u8
nengel@2 1720 40: rsb r5, r5, #0
nengel@2 1721 biweight_\w vmlsl.u8, vmlal.u8
nengel@2 1722 endfunc
nengel@2 1723 .endm
nengel@2 1724
nengel@2 1725 .macro biweight_entry w, h, b=1
nengel@2 1726 function ff_biweight_h264_pixels_\w\()x\h\()_neon, export=1
nengel@2 1727 mov ip, #\h
nengel@2 1728 .if \b
nengel@2 1729 b biweight_h264_pixels_\w\()_neon
nengel@2 1730 .endif
nengel@2 1731 endfunc
nengel@2 1732 .endm
nengel@2 1733
nengel@2 1734 biweight_entry 16, 8
nengel@2 1735 biweight_entry 16, 16, b=0
nengel@2 1736 biweight_func 16
nengel@2 1737
nengel@2 1738 biweight_entry 8, 16
nengel@2 1739 biweight_entry 8, 4
nengel@2 1740 biweight_entry 8, 8, b=0
nengel@2 1741 biweight_func 8
nengel@2 1742
nengel@2 1743 biweight_entry 4, 8
nengel@2 1744 biweight_entry 4, 2
nengel@2 1745 biweight_entry 4, 4, b=0
nengel@2 1746 biweight_func 4
nengel@2 1747
nengel@2 1748 @ Weighted prediction
nengel@2 1749
nengel@2 1750 .macro weight_16 add
nengel@2 1751 vdup.8 d0, r3
nengel@2 1752 1: subs ip, ip, #2
nengel@2 1753 vld1.8 {d20-d21},[r0,:128], r1
nengel@2 1754 vmull.u8 q2, d0, d20
nengel@2 1755 pld [r0]
nengel@2 1756 vmull.u8 q3, d0, d21
nengel@2 1757 vld1.8 {d28-d29},[r0,:128], r1
nengel@2 1758 vmull.u8 q12, d0, d28
nengel@2 1759 pld [r0]
nengel@2 1760 vmull.u8 q13, d0, d29
nengel@2 1761 \add q2, q8, q2
nengel@2 1762 vrshl.s16 q2, q2, q9
nengel@2 1763 \add q3, q8, q3
nengel@2 1764 vrshl.s16 q3, q3, q9
nengel@2 1765 vqmovun.s16 d4, q2
nengel@2 1766 vqmovun.s16 d5, q3
nengel@2 1767 \add q12, q8, q12
nengel@2 1768 vrshl.s16 q12, q12, q9
nengel@2 1769 \add q13, q8, q13
nengel@2 1770 vrshl.s16 q13, q13, q9
nengel@2 1771 vqmovun.s16 d24, q12
nengel@2 1772 vqmovun.s16 d25, q13
nengel@2 1773 vst1.8 {d4- d5}, [r4,:128], r1
nengel@2 1774 vst1.8 {d24-d25},[r4,:128], r1
nengel@2 1775 bne 1b
nengel@2 1776 pop {r4, pc}
nengel@2 1777 .endm
nengel@2 1778
nengel@2 1779 .macro weight_8 add
nengel@2 1780 vdup.8 d0, r3
nengel@2 1781 1: subs ip, ip, #2
nengel@2 1782 vld1.8 {d4},[r0,:64], r1
nengel@2 1783 vmull.u8 q1, d0, d4
nengel@2 1784 pld [r0]
nengel@2 1785 vld1.8 {d6},[r0,:64], r1
nengel@2 1786 vmull.u8 q10, d0, d6
nengel@2 1787 \add q1, q8, q1
nengel@2 1788 pld [r0]
nengel@2 1789 vrshl.s16 q1, q1, q9
nengel@2 1790 vqmovun.s16 d2, q1
nengel@2 1791 \add q10, q8, q10
nengel@2 1792 vrshl.s16 q10, q10, q9
nengel@2 1793 vqmovun.s16 d4, q10
nengel@2 1794 vst1.8 {d2},[r4,:64], r1
nengel@2 1795 vst1.8 {d4},[r4,:64], r1
nengel@2 1796 bne 1b
nengel@2 1797 pop {r4, pc}
nengel@2 1798 .endm
nengel@2 1799
nengel@2 1800 .macro weight_4 add
nengel@2 1801 vdup.8 d0, r3
nengel@2 1802 vmov q1, q8
nengel@2 1803 vmov q10, q8
nengel@2 1804 1: subs ip, ip, #4
nengel@2 1805 vld1.32 {d4[0]},[r0,:32], r1
nengel@2 1806 vld1.32 {d4[1]},[r0,:32], r1
nengel@2 1807 vmull.u8 q1, d0, d4
nengel@2 1808 pld [r0]
nengel@2 1809 blt 2f
nengel@2 1810 vld1.32 {d6[0]},[r0,:32], r1
nengel@2 1811 vld1.32 {d6[1]},[r0,:32], r1
nengel@2 1812 vmull.u8 q10, d0, d6
nengel@2 1813 pld [r0]
nengel@2 1814 \add q1, q8, q1
nengel@2 1815 vrshl.s16 q1, q1, q9
nengel@2 1816 vqmovun.s16 d2, q1
nengel@2 1817 \add q10, q8, q10
nengel@2 1818 vrshl.s16 q10, q10, q9
nengel@2 1819 vqmovun.s16 d4, q10
nengel@2 1820 vmov q10, q8
nengel@2 1821 vst1.32 {d2[0]},[r4,:32], r1
nengel@2 1822 vst1.32 {d2[1]},[r4,:32], r1
nengel@2 1823 vmov q1, q8
nengel@2 1824 vst1.32 {d4[0]},[r4,:32], r1
nengel@2 1825 vst1.32 {d4[1]},[r4,:32], r1
nengel@2 1826 bne 1b
nengel@2 1827 pop {r4, pc}
nengel@2 1828 2: \add q1, q8, q1
nengel@2 1829 vrshl.s16 q1, q1, q9
nengel@2 1830 vqmovun.s16 d2, q1
nengel@2 1831 vst1.32 {d2[0]},[r4,:32], r1
nengel@2 1832 vst1.32 {d2[1]},[r4,:32], r1
nengel@2 1833 pop {r4, pc}
nengel@2 1834 .endm
nengel@2 1835
nengel@2 1836 .macro weight_func w
nengel@2 1837 function weight_h264_pixels_\w\()_neon
nengel@2 1838 push {r4, lr}
nengel@2 1839 ldr r4, [sp, #8]
nengel@2 1840 cmp r2, #1
nengel@2 1841 lsl r4, r4, r2
nengel@2 1842 vdup.16 q8, r4
nengel@2 1843 mov r4, r0
nengel@2 1844 ble 20f
nengel@2 1845 rsb lr, r2, #1
nengel@2 1846 vdup.16 q9, lr
nengel@2 1847 cmp r3, #0
nengel@2 1848 blt 10f
nengel@2 1849 weight_\w vhadd.s16
nengel@2 1850 10: rsb r3, r3, #0
nengel@2 1851 weight_\w vhsub.s16
nengel@2 1852 20: rsb lr, r2, #0
nengel@2 1853 vdup.16 q9, lr
nengel@2 1854 cmp r3, #0
nengel@2 1855 blt 10f
nengel@2 1856 weight_\w vadd.s16
nengel@2 1857 10: rsb r3, r3, #0
nengel@2 1858 weight_\w vsub.s16
nengel@2 1859 endfunc
nengel@2 1860 .endm
nengel@2 1861
nengel@2 1862 .macro weight_entry w, h, b=1
nengel@2 1863 function ff_weight_h264_pixels_\w\()x\h\()_neon, export=1
nengel@2 1864 mov ip, #\h
nengel@2 1865 .if \b
nengel@2 1866 b weight_h264_pixels_\w\()_neon
nengel@2 1867 .endif
nengel@2 1868 endfunc
nengel@2 1869 .endm
nengel@2 1870
nengel@2 1871 weight_entry 16, 8
nengel@2 1872 weight_entry 16, 16, b=0
nengel@2 1873 weight_func 16
nengel@2 1874
nengel@2 1875 weight_entry 8, 16
nengel@2 1876 weight_entry 8, 4
nengel@2 1877 weight_entry 8, 8, b=0
nengel@2 1878 weight_func 8
nengel@2 1879
nengel@2 1880 weight_entry 4, 8
nengel@2 1881 weight_entry 4, 2
nengel@2 1882 weight_entry 4, 4, b=0
nengel@2 1883 weight_func 4