annotate libavcodec/arm/dsputil_neon.S @ 9:ea1ba68cf0ed

update to match api changes + add sscc produced source
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 05 Jun 2013 14:43:26 +0200
parents
children
rev   line source
nengel@2 1 /*
nengel@2 2 * ARM NEON optimised DSP functions
nengel@2 3 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
nengel@2 4 *
nengel@2 5 * This file is part of FFmpeg.
nengel@2 6 *
nengel@2 7 * FFmpeg is free software; you can redistribute it and/or
nengel@2 8 * modify it under the terms of the GNU Lesser General Public
nengel@2 9 * License as published by the Free Software Foundation; either
nengel@2 10 * version 2.1 of the License, or (at your option) any later version.
nengel@2 11 *
nengel@2 12 * FFmpeg is distributed in the hope that it will be useful,
nengel@2 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nengel@2 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
nengel@2 15 * Lesser General Public License for more details.
nengel@2 16 *
nengel@2 17 * You should have received a copy of the GNU Lesser General Public
nengel@2 18 * License along with FFmpeg; if not, write to the Free Software
nengel@2 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
nengel@2 20 */
nengel@2 21
nengel@2 22 #include "config.h"
nengel@2 23 #include "asm.S"
nengel@2 24
nengel@2 25 preserve8
nengel@2 26 .text
nengel@2 27
nengel@2 28 .macro pixels16 avg=0
nengel@2 29 .if \avg
nengel@2 30 mov ip, r0
nengel@2 31 .endif
nengel@2 32 1: vld1.64 {d0, d1}, [r1], r2
nengel@2 33 vld1.64 {d2, d3}, [r1], r2
nengel@2 34 vld1.64 {d4, d5}, [r1], r2
nengel@2 35 pld [r1, r2, lsl #2]
nengel@2 36 vld1.64 {d6, d7}, [r1], r2
nengel@2 37 pld [r1]
nengel@2 38 pld [r1, r2]
nengel@2 39 pld [r1, r2, lsl #1]
nengel@2 40 .if \avg
nengel@2 41 vld1.64 {d16,d17}, [ip,:128], r2
nengel@2 42 vrhadd.u8 q0, q0, q8
nengel@2 43 vld1.64 {d18,d19}, [ip,:128], r2
nengel@2 44 vrhadd.u8 q1, q1, q9
nengel@2 45 vld1.64 {d20,d21}, [ip,:128], r2
nengel@2 46 vrhadd.u8 q2, q2, q10
nengel@2 47 vld1.64 {d22,d23}, [ip,:128], r2
nengel@2 48 vrhadd.u8 q3, q3, q11
nengel@2 49 .endif
nengel@2 50 subs r3, r3, #4
nengel@2 51 vst1.64 {d0, d1}, [r0,:128], r2
nengel@2 52 vst1.64 {d2, d3}, [r0,:128], r2
nengel@2 53 vst1.64 {d4, d5}, [r0,:128], r2
nengel@2 54 vst1.64 {d6, d7}, [r0,:128], r2
nengel@2 55 bne 1b
nengel@2 56 bx lr
nengel@2 57 .endm
nengel@2 58
nengel@2 59 .macro pixels16_x2 vhadd=vrhadd.u8
nengel@2 60 1: vld1.64 {d0-d2}, [r1], r2
nengel@2 61 vld1.64 {d4-d6}, [r1], r2
nengel@2 62 pld [r1]
nengel@2 63 pld [r1, r2]
nengel@2 64 subs r3, r3, #2
nengel@2 65 vext.8 q1, q0, q1, #1
nengel@2 66 \vhadd q0, q0, q1
nengel@2 67 vext.8 q3, q2, q3, #1
nengel@2 68 \vhadd q2, q2, q3
nengel@2 69 vst1.64 {d0, d1}, [r0,:128], r2
nengel@2 70 vst1.64 {d4, d5}, [r0,:128], r2
nengel@2 71 bne 1b
nengel@2 72 bx lr
nengel@2 73 .endm
nengel@2 74
nengel@2 75 .macro pixels16_y2 vhadd=vrhadd.u8
nengel@2 76 vld1.64 {d0, d1}, [r1], r2
nengel@2 77 vld1.64 {d2, d3}, [r1], r2
nengel@2 78 1: subs r3, r3, #2
nengel@2 79 \vhadd q2, q0, q1
nengel@2 80 vld1.64 {d0, d1}, [r1], r2
nengel@2 81 \vhadd q3, q0, q1
nengel@2 82 vld1.64 {d2, d3}, [r1], r2
nengel@2 83 pld [r1]
nengel@2 84 pld [r1, r2]
nengel@2 85 vst1.64 {d4, d5}, [r0,:128], r2
nengel@2 86 vst1.64 {d6, d7}, [r0,:128], r2
nengel@2 87 bne 1b
nengel@2 88 bx lr
nengel@2 89 .endm
nengel@2 90
nengel@2 91 .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0
nengel@2 92 vld1.64 {d0-d2}, [r1], r2
nengel@2 93 vld1.64 {d4-d6}, [r1], r2
nengel@2 94 .if \no_rnd
nengel@2 95 vmov.i16 q13, #1
nengel@2 96 .endif
nengel@2 97 pld [r1]
nengel@2 98 pld [r1, r2]
nengel@2 99 vext.8 q1, q0, q1, #1
nengel@2 100 vext.8 q3, q2, q3, #1
nengel@2 101 vaddl.u8 q8, d0, d2
nengel@2 102 vaddl.u8 q10, d1, d3
nengel@2 103 vaddl.u8 q9, d4, d6
nengel@2 104 vaddl.u8 q11, d5, d7
nengel@2 105 1: subs r3, r3, #2
nengel@2 106 vld1.64 {d0-d2}, [r1], r2
nengel@2 107 vadd.u16 q12, q8, q9
nengel@2 108 pld [r1]
nengel@2 109 .if \no_rnd
nengel@2 110 vadd.u16 q12, q12, q13
nengel@2 111 .endif
nengel@2 112 vext.8 q15, q0, q1, #1
nengel@2 113 vadd.u16 q1 , q10, q11
nengel@2 114 \vshrn d28, q12, #2
nengel@2 115 .if \no_rnd
nengel@2 116 vadd.u16 q1, q1, q13
nengel@2 117 .endif
nengel@2 118 \vshrn d29, q1, #2
nengel@2 119 vaddl.u8 q8, d0, d30
nengel@2 120 vld1.64 {d2-d4}, [r1], r2
nengel@2 121 vaddl.u8 q10, d1, d31
nengel@2 122 vst1.64 {d28,d29}, [r0,:128], r2
nengel@2 123 vadd.u16 q12, q8, q9
nengel@2 124 pld [r1, r2]
nengel@2 125 .if \no_rnd
nengel@2 126 vadd.u16 q12, q12, q13
nengel@2 127 .endif
nengel@2 128 vext.8 q2, q1, q2, #1
nengel@2 129 vadd.u16 q0, q10, q11
nengel@2 130 \vshrn d30, q12, #2
nengel@2 131 .if \no_rnd
nengel@2 132 vadd.u16 q0, q0, q13
nengel@2 133 .endif
nengel@2 134 \vshrn d31, q0, #2
nengel@2 135 vaddl.u8 q9, d2, d4
nengel@2 136 vaddl.u8 q11, d3, d5
nengel@2 137 vst1.64 {d30,d31}, [r0,:128], r2
nengel@2 138 bgt 1b
nengel@2 139 bx lr
nengel@2 140 .endm
nengel@2 141
nengel@2 142 .macro pixels8 avg=0
nengel@2 143 1: vld1.64 {d0}, [r1], r2
nengel@2 144 vld1.64 {d1}, [r1], r2
nengel@2 145 vld1.64 {d2}, [r1], r2
nengel@2 146 pld [r1, r2, lsl #2]
nengel@2 147 vld1.64 {d3}, [r1], r2
nengel@2 148 pld [r1]
nengel@2 149 pld [r1, r2]
nengel@2 150 pld [r1, r2, lsl #1]
nengel@2 151 .if \avg
nengel@2 152 vld1.64 {d4}, [r0,:64], r2
nengel@2 153 vrhadd.u8 d0, d0, d4
nengel@2 154 vld1.64 {d5}, [r0,:64], r2
nengel@2 155 vrhadd.u8 d1, d1, d5
nengel@2 156 vld1.64 {d6}, [r0,:64], r2
nengel@2 157 vrhadd.u8 d2, d2, d6
nengel@2 158 vld1.64 {d7}, [r0,:64], r2
nengel@2 159 vrhadd.u8 d3, d3, d7
nengel@2 160 sub r0, r0, r2, lsl #2
nengel@2 161 .endif
nengel@2 162 subs r3, r3, #4
nengel@2 163 vst1.64 {d0}, [r0,:64], r2
nengel@2 164 vst1.64 {d1}, [r0,:64], r2
nengel@2 165 vst1.64 {d2}, [r0,:64], r2
nengel@2 166 vst1.64 {d3}, [r0,:64], r2
nengel@2 167 bne 1b
nengel@2 168 bx lr
nengel@2 169 .endm
nengel@2 170
nengel@2 171 .macro pixels8_x2 vhadd=vrhadd.u8
nengel@2 172 1: vld1.64 {d0, d1}, [r1], r2
nengel@2 173 vext.8 d1, d0, d1, #1
nengel@2 174 vld1.64 {d2, d3}, [r1], r2
nengel@2 175 vext.8 d3, d2, d3, #1
nengel@2 176 pld [r1]
nengel@2 177 pld [r1, r2]
nengel@2 178 subs r3, r3, #2
nengel@2 179 vswp d1, d2
nengel@2 180 \vhadd q0, q0, q1
nengel@2 181 vst1.64 {d0}, [r0,:64], r2
nengel@2 182 vst1.64 {d1}, [r0,:64], r2
nengel@2 183 bne 1b
nengel@2 184 bx lr
nengel@2 185 .endm
nengel@2 186
nengel@2 187 .macro pixels8_y2 vhadd=vrhadd.u8
nengel@2 188 vld1.64 {d0}, [r1], r2
nengel@2 189 vld1.64 {d1}, [r1], r2
nengel@2 190 1: subs r3, r3, #2
nengel@2 191 \vhadd d4, d0, d1
nengel@2 192 vld1.64 {d0}, [r1], r2
nengel@2 193 \vhadd d5, d0, d1
nengel@2 194 vld1.64 {d1}, [r1], r2
nengel@2 195 pld [r1]
nengel@2 196 pld [r1, r2]
nengel@2 197 vst1.64 {d4}, [r0,:64], r2
nengel@2 198 vst1.64 {d5}, [r0,:64], r2
nengel@2 199 bne 1b
nengel@2 200 bx lr
nengel@2 201 .endm
nengel@2 202
nengel@2 203 .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0
nengel@2 204 vld1.64 {d0, d1}, [r1], r2
nengel@2 205 vld1.64 {d2, d3}, [r1], r2
nengel@2 206 .if \no_rnd
nengel@2 207 vmov.i16 q11, #1
nengel@2 208 .endif
nengel@2 209 pld [r1]
nengel@2 210 pld [r1, r2]
nengel@2 211 vext.8 d4, d0, d1, #1
nengel@2 212 vext.8 d6, d2, d3, #1
nengel@2 213 vaddl.u8 q8, d0, d4
nengel@2 214 vaddl.u8 q9, d2, d6
nengel@2 215 1: subs r3, r3, #2
nengel@2 216 vld1.64 {d0, d1}, [r1], r2
nengel@2 217 pld [r1]
nengel@2 218 vadd.u16 q10, q8, q9
nengel@2 219 vext.8 d4, d0, d1, #1
nengel@2 220 .if \no_rnd
nengel@2 221 vadd.u16 q10, q10, q11
nengel@2 222 .endif
nengel@2 223 vaddl.u8 q8, d0, d4
nengel@2 224 \vshrn d5, q10, #2
nengel@2 225 vld1.64 {d2, d3}, [r1], r2
nengel@2 226 vadd.u16 q10, q8, q9
nengel@2 227 pld [r1, r2]
nengel@2 228 .if \no_rnd
nengel@2 229 vadd.u16 q10, q10, q11
nengel@2 230 .endif
nengel@2 231 vst1.64 {d5}, [r0,:64], r2
nengel@2 232 \vshrn d7, q10, #2
nengel@2 233 vext.8 d6, d2, d3, #1
nengel@2 234 vaddl.u8 q9, d2, d6
nengel@2 235 vst1.64 {d7}, [r0,:64], r2
nengel@2 236 bgt 1b
nengel@2 237 bx lr
nengel@2 238 .endm
nengel@2 239
nengel@2 240 .macro pixfunc pfx name suf rnd_op args:vararg
nengel@2 241 function ff_\pfx\name\suf\()_neon, export=1
nengel@2 242 \name \rnd_op \args
nengel@2 243 endfunc
nengel@2 244 .endm
nengel@2 245
nengel@2 246 .macro pixfunc2 pfx name args:vararg
nengel@2 247 pixfunc \pfx \name
nengel@2 248 pixfunc \pfx \name \args
nengel@2 249 .endm
nengel@2 250
nengel@2 251 function ff_put_h264_qpel16_mc00_neon, export=1
nengel@2 252 mov r3, #16
nengel@2 253 endfunc
nengel@2 254
nengel@2 255 pixfunc put_ pixels16
nengel@2 256 pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8
nengel@2 257 pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8
nengel@2 258 pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1
nengel@2 259
nengel@2 260 function ff_avg_h264_qpel16_mc00_neon, export=1
nengel@2 261 mov r3, #16
nengel@2 262 endfunc
nengel@2 263
nengel@2 264 pixfunc avg_ pixels16,, 1
nengel@2 265
nengel@2 266 function ff_put_h264_qpel8_mc00_neon, export=1
nengel@2 267 mov r3, #8
nengel@2 268 endfunc
nengel@2 269
nengel@2 270 pixfunc put_ pixels8
nengel@2 271 pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8
nengel@2 272 pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8
nengel@2 273 pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1
nengel@2 274
nengel@2 275 function ff_avg_h264_qpel8_mc00_neon, export=1
nengel@2 276 mov r3, #8
nengel@2 277 endfunc
nengel@2 278
nengel@2 279 pixfunc avg_ pixels8,, 1
nengel@2 280
nengel@2 281 function ff_put_pixels_clamped_neon, export=1
nengel@2 282 vld1.64 {d16-d19}, [r0,:128]!
nengel@2 283 vqmovun.s16 d0, q8
nengel@2 284 vld1.64 {d20-d23}, [r0,:128]!
nengel@2 285 vqmovun.s16 d1, q9
nengel@2 286 vld1.64 {d24-d27}, [r0,:128]!
nengel@2 287 vqmovun.s16 d2, q10
nengel@2 288 vld1.64 {d28-d31}, [r0,:128]!
nengel@2 289 vqmovun.s16 d3, q11
nengel@2 290 vst1.64 {d0}, [r1,:64], r2
nengel@2 291 vqmovun.s16 d4, q12
nengel@2 292 vst1.64 {d1}, [r1,:64], r2
nengel@2 293 vqmovun.s16 d5, q13
nengel@2 294 vst1.64 {d2}, [r1,:64], r2
nengel@2 295 vqmovun.s16 d6, q14
nengel@2 296 vst1.64 {d3}, [r1,:64], r2
nengel@2 297 vqmovun.s16 d7, q15
nengel@2 298 vst1.64 {d4}, [r1,:64], r2
nengel@2 299 vst1.64 {d5}, [r1,:64], r2
nengel@2 300 vst1.64 {d6}, [r1,:64], r2
nengel@2 301 vst1.64 {d7}, [r1,:64], r2
nengel@2 302 bx lr
nengel@2 303 endfunc
nengel@2 304
nengel@2 305 function ff_put_signed_pixels_clamped_neon, export=1
nengel@2 306 vmov.u8 d31, #128
nengel@2 307 vld1.64 {d16-d17}, [r0,:128]!
nengel@2 308 vqmovn.s16 d0, q8
nengel@2 309 vld1.64 {d18-d19}, [r0,:128]!
nengel@2 310 vqmovn.s16 d1, q9
nengel@2 311 vld1.64 {d16-d17}, [r0,:128]!
nengel@2 312 vqmovn.s16 d2, q8
nengel@2 313 vld1.64 {d18-d19}, [r0,:128]!
nengel@2 314 vadd.u8 d0, d0, d31
nengel@2 315 vld1.64 {d20-d21}, [r0,:128]!
nengel@2 316 vadd.u8 d1, d1, d31
nengel@2 317 vld1.64 {d22-d23}, [r0,:128]!
nengel@2 318 vadd.u8 d2, d2, d31
nengel@2 319 vst1.64 {d0}, [r1,:64], r2
nengel@2 320 vqmovn.s16 d3, q9
nengel@2 321 vst1.64 {d1}, [r1,:64], r2
nengel@2 322 vqmovn.s16 d4, q10
nengel@2 323 vst1.64 {d2}, [r1,:64], r2
nengel@2 324 vqmovn.s16 d5, q11
nengel@2 325 vld1.64 {d24-d25}, [r0,:128]!
nengel@2 326 vadd.u8 d3, d3, d31
nengel@2 327 vld1.64 {d26-d27}, [r0,:128]!
nengel@2 328 vadd.u8 d4, d4, d31
nengel@2 329 vadd.u8 d5, d5, d31
nengel@2 330 vst1.64 {d3}, [r1,:64], r2
nengel@2 331 vqmovn.s16 d6, q12
nengel@2 332 vst1.64 {d4}, [r1,:64], r2
nengel@2 333 vqmovn.s16 d7, q13
nengel@2 334 vst1.64 {d5}, [r1,:64], r2
nengel@2 335 vadd.u8 d6, d6, d31
nengel@2 336 vadd.u8 d7, d7, d31
nengel@2 337 vst1.64 {d6}, [r1,:64], r2
nengel@2 338 vst1.64 {d7}, [r1,:64], r2
nengel@2 339 bx lr
nengel@2 340 endfunc
nengel@2 341
nengel@2 342 function ff_add_pixels_clamped_neon, export=1
nengel@2 343 mov r3, r1
nengel@2 344 vld1.64 {d16}, [r1,:64], r2
nengel@2 345 vld1.64 {d0-d1}, [r0,:128]!
nengel@2 346 vaddw.u8 q0, q0, d16
nengel@2 347 vld1.64 {d17}, [r1,:64], r2
nengel@2 348 vld1.64 {d2-d3}, [r0,:128]!
nengel@2 349 vqmovun.s16 d0, q0
nengel@2 350 vld1.64 {d18}, [r1,:64], r2
nengel@2 351 vaddw.u8 q1, q1, d17
nengel@2 352 vld1.64 {d4-d5}, [r0,:128]!
nengel@2 353 vaddw.u8 q2, q2, d18
nengel@2 354 vst1.64 {d0}, [r3,:64], r2
nengel@2 355 vqmovun.s16 d2, q1
nengel@2 356 vld1.64 {d19}, [r1,:64], r2
nengel@2 357 vld1.64 {d6-d7}, [r0,:128]!
nengel@2 358 vaddw.u8 q3, q3, d19
nengel@2 359 vqmovun.s16 d4, q2
nengel@2 360 vst1.64 {d2}, [r3,:64], r2
nengel@2 361 vld1.64 {d16}, [r1,:64], r2
nengel@2 362 vqmovun.s16 d6, q3
nengel@2 363 vld1.64 {d0-d1}, [r0,:128]!
nengel@2 364 vaddw.u8 q0, q0, d16
nengel@2 365 vst1.64 {d4}, [r3,:64], r2
nengel@2 366 vld1.64 {d17}, [r1,:64], r2
nengel@2 367 vld1.64 {d2-d3}, [r0,:128]!
nengel@2 368 vaddw.u8 q1, q1, d17
nengel@2 369 vst1.64 {d6}, [r3,:64], r2
nengel@2 370 vqmovun.s16 d0, q0
nengel@2 371 vld1.64 {d18}, [r1,:64], r2
nengel@2 372 vld1.64 {d4-d5}, [r0,:128]!
nengel@2 373 vaddw.u8 q2, q2, d18
nengel@2 374 vst1.64 {d0}, [r3,:64], r2
nengel@2 375 vqmovun.s16 d2, q1
nengel@2 376 vld1.64 {d19}, [r1,:64], r2
nengel@2 377 vqmovun.s16 d4, q2
nengel@2 378 vld1.64 {d6-d7}, [r0,:128]!
nengel@2 379 vaddw.u8 q3, q3, d19
nengel@2 380 vst1.64 {d2}, [r3,:64], r2
nengel@2 381 vqmovun.s16 d6, q3
nengel@2 382 vst1.64 {d4}, [r3,:64], r2
nengel@2 383 vst1.64 {d6}, [r3,:64], r2
nengel@2 384 bx lr
nengel@2 385 endfunc
nengel@2 386
nengel@2 387 function ff_float_to_int16_neon, export=1
nengel@2 388 subs r2, r2, #8
nengel@2 389 vld1.64 {d0-d1}, [r1,:128]!
nengel@2 390 vcvt.s32.f32 q8, q0, #16
nengel@2 391 vld1.64 {d2-d3}, [r1,:128]!
nengel@2 392 vcvt.s32.f32 q9, q1, #16
nengel@2 393 beq 3f
nengel@2 394 bics ip, r2, #15
nengel@2 395 beq 2f
nengel@2 396 1: subs ip, ip, #16
nengel@2 397 vshrn.s32 d4, q8, #16
nengel@2 398 vld1.64 {d0-d1}, [r1,:128]!
nengel@2 399 vcvt.s32.f32 q0, q0, #16
nengel@2 400 vshrn.s32 d5, q9, #16
nengel@2 401 vld1.64 {d2-d3}, [r1,:128]!
nengel@2 402 vcvt.s32.f32 q1, q1, #16
nengel@2 403 vshrn.s32 d6, q0, #16
nengel@2 404 vst1.64 {d4-d5}, [r0,:128]!
nengel@2 405 vshrn.s32 d7, q1, #16
nengel@2 406 vld1.64 {d16-d17},[r1,:128]!
nengel@2 407 vcvt.s32.f32 q8, q8, #16
nengel@2 408 vld1.64 {d18-d19},[r1,:128]!
nengel@2 409 vcvt.s32.f32 q9, q9, #16
nengel@2 410 vst1.64 {d6-d7}, [r0,:128]!
nengel@2 411 bne 1b
nengel@2 412 ands r2, r2, #15
nengel@2 413 beq 3f
nengel@2 414 2: vld1.64 {d0-d1}, [r1,:128]!
nengel@2 415 vshrn.s32 d4, q8, #16
nengel@2 416 vcvt.s32.f32 q0, q0, #16
nengel@2 417 vld1.64 {d2-d3}, [r1,:128]!
nengel@2 418 vshrn.s32 d5, q9, #16
nengel@2 419 vcvt.s32.f32 q1, q1, #16
nengel@2 420 vshrn.s32 d6, q0, #16
nengel@2 421 vst1.64 {d4-d5}, [r0,:128]!
nengel@2 422 vshrn.s32 d7, q1, #16
nengel@2 423 vst1.64 {d6-d7}, [r0,:128]!
nengel@2 424 bx lr
nengel@2 425 3: vshrn.s32 d4, q8, #16
nengel@2 426 vshrn.s32 d5, q9, #16
nengel@2 427 vst1.64 {d4-d5}, [r0,:128]!
nengel@2 428 bx lr
nengel@2 429 endfunc
nengel@2 430
nengel@2 431 function ff_float_to_int16_interleave_neon, export=1
nengel@2 432 cmp r3, #2
nengel@2 433 ldrlt r1, [r1]
nengel@2 434 blt ff_float_to_int16_neon
nengel@2 435 bne 4f
nengel@2 436
nengel@2 437 ldr r3, [r1]
nengel@2 438 ldr r1, [r1, #4]
nengel@2 439
nengel@2 440 subs r2, r2, #8
nengel@2 441 vld1.64 {d0-d1}, [r3,:128]!
nengel@2 442 vcvt.s32.f32 q8, q0, #16
nengel@2 443 vld1.64 {d2-d3}, [r3,:128]!
nengel@2 444 vcvt.s32.f32 q9, q1, #16
nengel@2 445 vld1.64 {d20-d21},[r1,:128]!
nengel@2 446 vcvt.s32.f32 q10, q10, #16
nengel@2 447 vld1.64 {d22-d23},[r1,:128]!
nengel@2 448 vcvt.s32.f32 q11, q11, #16
nengel@2 449 beq 3f
nengel@2 450 bics ip, r2, #15
nengel@2 451 beq 2f
nengel@2 452 1: subs ip, ip, #16
nengel@2 453 vld1.64 {d0-d1}, [r3,:128]!
nengel@2 454 vcvt.s32.f32 q0, q0, #16
nengel@2 455 vsri.32 q10, q8, #16
nengel@2 456 vld1.64 {d2-d3}, [r3,:128]!
nengel@2 457 vcvt.s32.f32 q1, q1, #16
nengel@2 458 vld1.64 {d24-d25},[r1,:128]!
nengel@2 459 vcvt.s32.f32 q12, q12, #16
nengel@2 460 vld1.64 {d26-d27},[r1,:128]!
nengel@2 461 vsri.32 q11, q9, #16
nengel@2 462 vst1.64 {d20-d21},[r0,:128]!
nengel@2 463 vcvt.s32.f32 q13, q13, #16
nengel@2 464 vst1.64 {d22-d23},[r0,:128]!
nengel@2 465 vsri.32 q12, q0, #16
nengel@2 466 vld1.64 {d16-d17},[r3,:128]!
nengel@2 467 vsri.32 q13, q1, #16
nengel@2 468 vst1.64 {d24-d25},[r0,:128]!
nengel@2 469 vcvt.s32.f32 q8, q8, #16
nengel@2 470 vld1.64 {d18-d19},[r3,:128]!
nengel@2 471 vcvt.s32.f32 q9, q9, #16
nengel@2 472 vld1.64 {d20-d21},[r1,:128]!
nengel@2 473 vcvt.s32.f32 q10, q10, #16
nengel@2 474 vld1.64 {d22-d23},[r1,:128]!
nengel@2 475 vcvt.s32.f32 q11, q11, #16
nengel@2 476 vst1.64 {d26-d27},[r0,:128]!
nengel@2 477 bne 1b
nengel@2 478 ands r2, r2, #15
nengel@2 479 beq 3f
nengel@2 480 2: vsri.32 q10, q8, #16
nengel@2 481 vld1.64 {d0-d1}, [r3,:128]!
nengel@2 482 vcvt.s32.f32 q0, q0, #16
nengel@2 483 vld1.64 {d2-d3}, [r3,:128]!
nengel@2 484 vcvt.s32.f32 q1, q1, #16
nengel@2 485 vld1.64 {d24-d25},[r1,:128]!
nengel@2 486 vcvt.s32.f32 q12, q12, #16
nengel@2 487 vsri.32 q11, q9, #16
nengel@2 488 vld1.64 {d26-d27},[r1,:128]!
nengel@2 489 vcvt.s32.f32 q13, q13, #16
nengel@2 490 vst1.64 {d20-d21},[r0,:128]!
nengel@2 491 vsri.32 q12, q0, #16
nengel@2 492 vst1.64 {d22-d23},[r0,:128]!
nengel@2 493 vsri.32 q13, q1, #16
nengel@2 494 vst1.64 {d24-d27},[r0,:128]!
nengel@2 495 bx lr
nengel@2 496 3: vsri.32 q10, q8, #16
nengel@2 497 vsri.32 q11, q9, #16
nengel@2 498 vst1.64 {d20-d23},[r0,:128]!
nengel@2 499 bx lr
nengel@2 500
nengel@2 501 4: push {r4-r8,lr}
nengel@2 502 cmp r3, #4
nengel@2 503 lsl ip, r3, #1
nengel@2 504 blt 4f
nengel@2 505
nengel@2 506 @ 4 channels
nengel@2 507 5: ldmia r1!, {r4-r7}
nengel@2 508 mov lr, r2
nengel@2 509 mov r8, r0
nengel@2 510 vld1.64 {d16-d17},[r4,:128]!
nengel@2 511 vcvt.s32.f32 q8, q8, #16
nengel@2 512 vld1.64 {d18-d19},[r5,:128]!
nengel@2 513 vcvt.s32.f32 q9, q9, #16
nengel@2 514 vld1.64 {d20-d21},[r6,:128]!
nengel@2 515 vcvt.s32.f32 q10, q10, #16
nengel@2 516 vld1.64 {d22-d23},[r7,:128]!
nengel@2 517 vcvt.s32.f32 q11, q11, #16
nengel@2 518 6: subs lr, lr, #8
nengel@2 519 vld1.64 {d0-d1}, [r4,:128]!
nengel@2 520 vcvt.s32.f32 q0, q0, #16
nengel@2 521 vsri.32 q9, q8, #16
nengel@2 522 vld1.64 {d2-d3}, [r5,:128]!
nengel@2 523 vcvt.s32.f32 q1, q1, #16
nengel@2 524 vsri.32 q11, q10, #16
nengel@2 525 vld1.64 {d4-d5}, [r6,:128]!
nengel@2 526 vcvt.s32.f32 q2, q2, #16
nengel@2 527 vzip.32 d18, d22
nengel@2 528 vld1.64 {d6-d7}, [r7,:128]!
nengel@2 529 vcvt.s32.f32 q3, q3, #16
nengel@2 530 vzip.32 d19, d23
nengel@2 531 vst1.64 {d18}, [r8], ip
nengel@2 532 vsri.32 q1, q0, #16
nengel@2 533 vst1.64 {d22}, [r8], ip
nengel@2 534 vsri.32 q3, q2, #16
nengel@2 535 vst1.64 {d19}, [r8], ip
nengel@2 536 vzip.32 d2, d6
nengel@2 537 vst1.64 {d23}, [r8], ip
nengel@2 538 vzip.32 d3, d7
nengel@2 539 beq 7f
nengel@2 540 vld1.64 {d16-d17},[r4,:128]!
nengel@2 541 vcvt.s32.f32 q8, q8, #16
nengel@2 542 vst1.64 {d2}, [r8], ip
nengel@2 543 vld1.64 {d18-d19},[r5,:128]!
nengel@2 544 vcvt.s32.f32 q9, q9, #16
nengel@2 545 vst1.64 {d6}, [r8], ip
nengel@2 546 vld1.64 {d20-d21},[r6,:128]!
nengel@2 547 vcvt.s32.f32 q10, q10, #16
nengel@2 548 vst1.64 {d3}, [r8], ip
nengel@2 549 vld1.64 {d22-d23},[r7,:128]!
nengel@2 550 vcvt.s32.f32 q11, q11, #16
nengel@2 551 vst1.64 {d7}, [r8], ip
nengel@2 552 b 6b
nengel@2 553 7: vst1.64 {d2}, [r8], ip
nengel@2 554 vst1.64 {d6}, [r8], ip
nengel@2 555 vst1.64 {d3}, [r8], ip
nengel@2 556 vst1.64 {d7}, [r8], ip
nengel@2 557 subs r3, r3, #4
nengel@2 558 popeq {r4-r8,pc}
nengel@2 559 cmp r3, #4
nengel@2 560 add r0, r0, #8
nengel@2 561 bge 5b
nengel@2 562
nengel@2 563 @ 2 channels
nengel@2 564 4: cmp r3, #2
nengel@2 565 blt 4f
nengel@2 566 ldmia r1!, {r4-r5}
nengel@2 567 mov lr, r2
nengel@2 568 mov r8, r0
nengel@2 569 tst lr, #8
nengel@2 570 vld1.64 {d16-d17},[r4,:128]!
nengel@2 571 vcvt.s32.f32 q8, q8, #16
nengel@2 572 vld1.64 {d18-d19},[r5,:128]!
nengel@2 573 vcvt.s32.f32 q9, q9, #16
nengel@2 574 vld1.64 {d20-d21},[r4,:128]!
nengel@2 575 vcvt.s32.f32 q10, q10, #16
nengel@2 576 vld1.64 {d22-d23},[r5,:128]!
nengel@2 577 vcvt.s32.f32 q11, q11, #16
nengel@2 578 beq 6f
nengel@2 579 subs lr, lr, #8
nengel@2 580 beq 7f
nengel@2 581 vsri.32 d18, d16, #16
nengel@2 582 vsri.32 d19, d17, #16
nengel@2 583 vld1.64 {d16-d17},[r4,:128]!
nengel@2 584 vcvt.s32.f32 q8, q8, #16
nengel@2 585 vst1.32 {d18[0]}, [r8], ip
nengel@2 586 vsri.32 d22, d20, #16
nengel@2 587 vst1.32 {d18[1]}, [r8], ip
nengel@2 588 vsri.32 d23, d21, #16
nengel@2 589 vst1.32 {d19[0]}, [r8], ip
nengel@2 590 vst1.32 {d19[1]}, [r8], ip
nengel@2 591 vld1.64 {d18-d19},[r5,:128]!
nengel@2 592 vcvt.s32.f32 q9, q9, #16
nengel@2 593 vst1.32 {d22[0]}, [r8], ip
nengel@2 594 vst1.32 {d22[1]}, [r8], ip
nengel@2 595 vld1.64 {d20-d21},[r4,:128]!
nengel@2 596 vcvt.s32.f32 q10, q10, #16
nengel@2 597 vst1.32 {d23[0]}, [r8], ip
nengel@2 598 vst1.32 {d23[1]}, [r8], ip
nengel@2 599 vld1.64 {d22-d23},[r5,:128]!
nengel@2 600 vcvt.s32.f32 q11, q11, #16
nengel@2 601 6: subs lr, lr, #16
nengel@2 602 vld1.64 {d0-d1}, [r4,:128]!
nengel@2 603 vcvt.s32.f32 q0, q0, #16
nengel@2 604 vsri.32 d18, d16, #16
nengel@2 605 vld1.64 {d2-d3}, [r5,:128]!
nengel@2 606 vcvt.s32.f32 q1, q1, #16
nengel@2 607 vsri.32 d19, d17, #16
nengel@2 608 vld1.64 {d4-d5}, [r4,:128]!
nengel@2 609 vcvt.s32.f32 q2, q2, #16
nengel@2 610 vld1.64 {d6-d7}, [r5,:128]!
nengel@2 611 vcvt.s32.f32 q3, q3, #16
nengel@2 612 vst1.32 {d18[0]}, [r8], ip
nengel@2 613 vsri.32 d22, d20, #16
nengel@2 614 vst1.32 {d18[1]}, [r8], ip
nengel@2 615 vsri.32 d23, d21, #16
nengel@2 616 vst1.32 {d19[0]}, [r8], ip
nengel@2 617 vsri.32 d2, d0, #16
nengel@2 618 vst1.32 {d19[1]}, [r8], ip
nengel@2 619 vsri.32 d3, d1, #16
nengel@2 620 vst1.32 {d22[0]}, [r8], ip
nengel@2 621 vsri.32 d6, d4, #16
nengel@2 622 vst1.32 {d22[1]}, [r8], ip
nengel@2 623 vsri.32 d7, d5, #16
nengel@2 624 vst1.32 {d23[0]}, [r8], ip
nengel@2 625 vst1.32 {d23[1]}, [r8], ip
nengel@2 626 beq 6f
nengel@2 627 vld1.64 {d16-d17},[r4,:128]!
nengel@2 628 vcvt.s32.f32 q8, q8, #16
nengel@2 629 vst1.32 {d2[0]}, [r8], ip
nengel@2 630 vst1.32 {d2[1]}, [r8], ip
nengel@2 631 vld1.64 {d18-d19},[r5,:128]!
nengel@2 632 vcvt.s32.f32 q9, q9, #16
nengel@2 633 vst1.32 {d3[0]}, [r8], ip
nengel@2 634 vst1.32 {d3[1]}, [r8], ip
nengel@2 635 vld1.64 {d20-d21},[r4,:128]!
nengel@2 636 vcvt.s32.f32 q10, q10, #16
nengel@2 637 vst1.32 {d6[0]}, [r8], ip
nengel@2 638 vst1.32 {d6[1]}, [r8], ip
nengel@2 639 vld1.64 {d22-d23},[r5,:128]!
nengel@2 640 vcvt.s32.f32 q11, q11, #16
nengel@2 641 vst1.32 {d7[0]}, [r8], ip
nengel@2 642 vst1.32 {d7[1]}, [r8], ip
nengel@2 643 bgt 6b
nengel@2 644 6: vst1.32 {d2[0]}, [r8], ip
nengel@2 645 vst1.32 {d2[1]}, [r8], ip
nengel@2 646 vst1.32 {d3[0]}, [r8], ip
nengel@2 647 vst1.32 {d3[1]}, [r8], ip
nengel@2 648 vst1.32 {d6[0]}, [r8], ip
nengel@2 649 vst1.32 {d6[1]}, [r8], ip
nengel@2 650 vst1.32 {d7[0]}, [r8], ip
nengel@2 651 vst1.32 {d7[1]}, [r8], ip
nengel@2 652 b 8f
nengel@2 653 7: vsri.32 d18, d16, #16
nengel@2 654 vsri.32 d19, d17, #16
nengel@2 655 vst1.32 {d18[0]}, [r8], ip
nengel@2 656 vsri.32 d22, d20, #16
nengel@2 657 vst1.32 {d18[1]}, [r8], ip
nengel@2 658 vsri.32 d23, d21, #16
nengel@2 659 vst1.32 {d19[0]}, [r8], ip
nengel@2 660 vst1.32 {d19[1]}, [r8], ip
nengel@2 661 vst1.32 {d22[0]}, [r8], ip
nengel@2 662 vst1.32 {d22[1]}, [r8], ip
nengel@2 663 vst1.32 {d23[0]}, [r8], ip
nengel@2 664 vst1.32 {d23[1]}, [r8], ip
nengel@2 665 8: subs r3, r3, #2
nengel@2 666 add r0, r0, #4
nengel@2 667 popeq {r4-r8,pc}
nengel@2 668
nengel@2 669 @ 1 channel
nengel@2 670 4: ldr r4, [r1],#4
nengel@2 671 tst r2, #8
nengel@2 672 mov lr, r2
nengel@2 673 mov r5, r0
nengel@2 674 vld1.64 {d0-d1}, [r4,:128]!
nengel@2 675 vcvt.s32.f32 q0, q0, #16
nengel@2 676 vld1.64 {d2-d3}, [r4,:128]!
nengel@2 677 vcvt.s32.f32 q1, q1, #16
nengel@2 678 bne 8f
nengel@2 679 6: subs lr, lr, #16
nengel@2 680 vld1.64 {d4-d5}, [r4,:128]!
nengel@2 681 vcvt.s32.f32 q2, q2, #16
nengel@2 682 vld1.64 {d6-d7}, [r4,:128]!
nengel@2 683 vcvt.s32.f32 q3, q3, #16
nengel@2 684 vst1.16 {d0[1]}, [r5,:16], ip
nengel@2 685 vst1.16 {d0[3]}, [r5,:16], ip
nengel@2 686 vst1.16 {d1[1]}, [r5,:16], ip
nengel@2 687 vst1.16 {d1[3]}, [r5,:16], ip
nengel@2 688 vst1.16 {d2[1]}, [r5,:16], ip
nengel@2 689 vst1.16 {d2[3]}, [r5,:16], ip
nengel@2 690 vst1.16 {d3[1]}, [r5,:16], ip
nengel@2 691 vst1.16 {d3[3]}, [r5,:16], ip
nengel@2 692 beq 7f
nengel@2 693 vld1.64 {d0-d1}, [r4,:128]!
nengel@2 694 vcvt.s32.f32 q0, q0, #16
nengel@2 695 vld1.64 {d2-d3}, [r4,:128]!
nengel@2 696 vcvt.s32.f32 q1, q1, #16
nengel@2 697 7: vst1.16 {d4[1]}, [r5,:16], ip
nengel@2 698 vst1.16 {d4[3]}, [r5,:16], ip
nengel@2 699 vst1.16 {d5[1]}, [r5,:16], ip
nengel@2 700 vst1.16 {d5[3]}, [r5,:16], ip
nengel@2 701 vst1.16 {d6[1]}, [r5,:16], ip
nengel@2 702 vst1.16 {d6[3]}, [r5,:16], ip
nengel@2 703 vst1.16 {d7[1]}, [r5,:16], ip
nengel@2 704 vst1.16 {d7[3]}, [r5,:16], ip
nengel@2 705 bgt 6b
nengel@2 706 pop {r4-r8,pc}
nengel@2 707 8: subs lr, lr, #8
nengel@2 708 vst1.16 {d0[1]}, [r5,:16], ip
nengel@2 709 vst1.16 {d0[3]}, [r5,:16], ip
nengel@2 710 vst1.16 {d1[1]}, [r5,:16], ip
nengel@2 711 vst1.16 {d1[3]}, [r5,:16], ip
nengel@2 712 vst1.16 {d2[1]}, [r5,:16], ip
nengel@2 713 vst1.16 {d2[3]}, [r5,:16], ip
nengel@2 714 vst1.16 {d3[1]}, [r5,:16], ip
nengel@2 715 vst1.16 {d3[3]}, [r5,:16], ip
nengel@2 716 popeq {r4-r8,pc}
nengel@2 717 vld1.64 {d0-d1}, [r4,:128]!
nengel@2 718 vcvt.s32.f32 q0, q0, #16
nengel@2 719 vld1.64 {d2-d3}, [r4,:128]!
nengel@2 720 vcvt.s32.f32 q1, q1, #16
nengel@2 721 b 6b
nengel@2 722 endfunc
nengel@2 723
nengel@2 724 function ff_vector_fmul_neon, export=1
nengel@2 725 mov r3, r0
nengel@2 726 subs r2, r2, #8
nengel@2 727 vld1.64 {d0-d3}, [r0,:128]!
nengel@2 728 vld1.64 {d4-d7}, [r1,:128]!
nengel@2 729 vmul.f32 q8, q0, q2
nengel@2 730 vmul.f32 q9, q1, q3
nengel@2 731 beq 3f
nengel@2 732 bics ip, r2, #15
nengel@2 733 beq 2f
nengel@2 734 1: subs ip, ip, #16
nengel@2 735 vld1.64 {d0-d1}, [r0,:128]!
nengel@2 736 vld1.64 {d4-d5}, [r1,:128]!
nengel@2 737 vmul.f32 q10, q0, q2
nengel@2 738 vld1.64 {d2-d3}, [r0,:128]!
nengel@2 739 vld1.64 {d6-d7}, [r1,:128]!
nengel@2 740 vmul.f32 q11, q1, q3
nengel@2 741 vst1.64 {d16-d19},[r3,:128]!
nengel@2 742 vld1.64 {d0-d1}, [r0,:128]!
nengel@2 743 vld1.64 {d4-d5}, [r1,:128]!
nengel@2 744 vmul.f32 q8, q0, q2
nengel@2 745 vld1.64 {d2-d3}, [r0,:128]!
nengel@2 746 vld1.64 {d6-d7}, [r1,:128]!
nengel@2 747 vmul.f32 q9, q1, q3
nengel@2 748 vst1.64 {d20-d23},[r3,:128]!
nengel@2 749 bne 1b
nengel@2 750 ands r2, r2, #15
nengel@2 751 beq 3f
nengel@2 752 2: vld1.64 {d0-d1}, [r0,:128]!
nengel@2 753 vld1.64 {d4-d5}, [r1,:128]!
nengel@2 754 vst1.64 {d16-d17},[r3,:128]!
nengel@2 755 vmul.f32 q8, q0, q2
nengel@2 756 vld1.64 {d2-d3}, [r0,:128]!
nengel@2 757 vld1.64 {d6-d7}, [r1,:128]!
nengel@2 758 vst1.64 {d18-d19},[r3,:128]!
nengel@2 759 vmul.f32 q9, q1, q3
nengel@2 760 3: vst1.64 {d16-d19},[r3,:128]!
nengel@2 761 bx lr
nengel@2 762 endfunc
nengel@2 763
nengel@2 764 function ff_vector_fmul_window_neon, export=1
nengel@2 765 VFP vdup.32 q8, d0[0]
nengel@2 766 NOVFP vld1.32 {d16[],d17[]}, [sp,:32]
nengel@2 767 push {r4,r5,lr}
nengel@2 768 VFP ldr lr, [sp, #12]
nengel@2 769 NOVFP ldr lr, [sp, #16]
nengel@2 770 sub r2, r2, #8
nengel@2 771 sub r5, lr, #2
nengel@2 772 add r2, r2, r5, lsl #2
nengel@2 773 add r4, r3, r5, lsl #3
nengel@2 774 add ip, r0, r5, lsl #3
nengel@2 775 mov r5, #-16
nengel@2 776 vld1.64 {d0,d1}, [r1,:128]!
nengel@2 777 vld1.64 {d2,d3}, [r2,:128], r5
nengel@2 778 vld1.64 {d4,d5}, [r3,:128]!
nengel@2 779 vld1.64 {d6,d7}, [r4,:128], r5
nengel@2 780 1: subs lr, lr, #4
nengel@2 781 vmov q11, q8
nengel@2 782 vmla.f32 d22, d0, d4
nengel@2 783 vmov q10, q8
nengel@2 784 vmla.f32 d23, d1, d5
nengel@2 785 vrev64.32 q3, q3
nengel@2 786 vmla.f32 d20, d0, d7
nengel@2 787 vrev64.32 q1, q1
nengel@2 788 vmla.f32 d21, d1, d6
nengel@2 789 beq 2f
nengel@2 790 vmla.f32 d22, d3, d7
nengel@2 791 vld1.64 {d0,d1}, [r1,:128]!
nengel@2 792 vmla.f32 d23, d2, d6
nengel@2 793 vld1.64 {d18,d19},[r2,:128], r5
nengel@2 794 vmls.f32 d20, d3, d4
nengel@2 795 vld1.64 {d24,d25},[r3,:128]!
nengel@2 796 vmls.f32 d21, d2, d5
nengel@2 797 vld1.64 {d6,d7}, [r4,:128], r5
nengel@2 798 vmov q1, q9
nengel@2 799 vrev64.32 q11, q11
nengel@2 800 vmov q2, q12
nengel@2 801 vswp d22, d23
nengel@2 802 vst1.64 {d20,d21},[r0,:128]!
nengel@2 803 vst1.64 {d22,d23},[ip,:128], r5
nengel@2 804 b 1b
nengel@2 805 2: vmla.f32 d22, d3, d7
nengel@2 806 vmla.f32 d23, d2, d6
nengel@2 807 vmls.f32 d20, d3, d4
nengel@2 808 vmls.f32 d21, d2, d5
nengel@2 809 vrev64.32 q11, q11
nengel@2 810 vswp d22, d23
nengel@2 811 vst1.64 {d20,d21},[r0,:128]!
nengel@2 812 vst1.64 {d22,d23},[ip,:128], r5
nengel@2 813 pop {r4,r5,pc}
nengel@2 814 endfunc
nengel@2 815
nengel@2 816 #if CONFIG_VORBIS_DECODER
nengel@2 817 function ff_vorbis_inverse_coupling_neon, export=1
nengel@2 818 vmov.i32 q10, #1<<31
nengel@2 819 subs r2, r2, #4
nengel@2 820 mov r3, r0
nengel@2 821 mov r12, r1
nengel@2 822 beq 3f
nengel@2 823
nengel@2 824 vld1.32 {d24-d25},[r1,:128]!
nengel@2 825 vld1.32 {d22-d23},[r0,:128]!
nengel@2 826 vcle.s32 q8, q12, #0
nengel@2 827 vand q9, q11, q10
nengel@2 828 veor q12, q12, q9
nengel@2 829 vand q2, q12, q8
nengel@2 830 vbic q3, q12, q8
nengel@2 831 vadd.f32 q12, q11, q2
nengel@2 832 vsub.f32 q11, q11, q3
nengel@2 833 1: vld1.32 {d2-d3}, [r1,:128]!
nengel@2 834 vld1.32 {d0-d1}, [r0,:128]!
nengel@2 835 vcle.s32 q8, q1, #0
nengel@2 836 vand q9, q0, q10
nengel@2 837 veor q1, q1, q9
nengel@2 838 vst1.32 {d24-d25},[r3, :128]!
nengel@2 839 vst1.32 {d22-d23},[r12,:128]!
nengel@2 840 vand q2, q1, q8
nengel@2 841 vbic q3, q1, q8
nengel@2 842 vadd.f32 q1, q0, q2
nengel@2 843 vsub.f32 q0, q0, q3
nengel@2 844 subs r2, r2, #8
nengel@2 845 ble 2f
nengel@2 846 vld1.32 {d24-d25},[r1,:128]!
nengel@2 847 vld1.32 {d22-d23},[r0,:128]!
nengel@2 848 vcle.s32 q8, q12, #0
nengel@2 849 vand q9, q11, q10
nengel@2 850 veor q12, q12, q9
nengel@2 851 vst1.32 {d2-d3}, [r3, :128]!
nengel@2 852 vst1.32 {d0-d1}, [r12,:128]!
nengel@2 853 vand q2, q12, q8
nengel@2 854 vbic q3, q12, q8
nengel@2 855 vadd.f32 q12, q11, q2
nengel@2 856 vsub.f32 q11, q11, q3
nengel@2 857 b 1b
nengel@2 858
nengel@2 859 2: vst1.32 {d2-d3}, [r3, :128]!
nengel@2 860 vst1.32 {d0-d1}, [r12,:128]!
nengel@2 861 bxlt lr
nengel@2 862
nengel@2 863 3: vld1.32 {d2-d3}, [r1,:128]
nengel@2 864 vld1.32 {d0-d1}, [r0,:128]
nengel@2 865 vcle.s32 q8, q1, #0
nengel@2 866 vand q9, q0, q10
nengel@2 867 veor q1, q1, q9
nengel@2 868 vand q2, q1, q8
nengel@2 869 vbic q3, q1, q8
nengel@2 870 vadd.f32 q1, q0, q2
nengel@2 871 vsub.f32 q0, q0, q3
nengel@2 872 vst1.32 {d2-d3}, [r0,:128]!
nengel@2 873 vst1.32 {d0-d1}, [r1,:128]!
nengel@2 874 bx lr
nengel@2 875 endfunc
nengel@2 876 #endif
nengel@2 877
nengel@2 878 function ff_vector_fmul_scalar_neon, export=1
nengel@2 879 VFP len .req r2
nengel@2 880 NOVFP len .req r3
nengel@2 881 VFP vdup.32 q8, d0[0]
nengel@2 882 NOVFP vdup.32 q8, r2
nengel@2 883 bics r12, len, #15
nengel@2 884 beq 3f
nengel@2 885 vld1.32 {q0},[r1,:128]!
nengel@2 886 vld1.32 {q1},[r1,:128]!
nengel@2 887 1: vmul.f32 q0, q0, q8
nengel@2 888 vld1.32 {q2},[r1,:128]!
nengel@2 889 vmul.f32 q1, q1, q8
nengel@2 890 vld1.32 {q3},[r1,:128]!
nengel@2 891 vmul.f32 q2, q2, q8
nengel@2 892 vst1.32 {q0},[r0,:128]!
nengel@2 893 vmul.f32 q3, q3, q8
nengel@2 894 vst1.32 {q1},[r0,:128]!
nengel@2 895 subs r12, r12, #16
nengel@2 896 beq 2f
nengel@2 897 vld1.32 {q0},[r1,:128]!
nengel@2 898 vst1.32 {q2},[r0,:128]!
nengel@2 899 vld1.32 {q1},[r1,:128]!
nengel@2 900 vst1.32 {q3},[r0,:128]!
nengel@2 901 b 1b
nengel@2 902 2: vst1.32 {q2},[r0,:128]!
nengel@2 903 vst1.32 {q3},[r0,:128]!
nengel@2 904 ands len, len, #15
nengel@2 905 bxeq lr
nengel@2 906 3: vld1.32 {q0},[r1,:128]!
nengel@2 907 vmul.f32 q0, q0, q8
nengel@2 908 vst1.32 {q0},[r0,:128]!
nengel@2 909 subs len, len, #4
nengel@2 910 bgt 3b
nengel@2 911 bx lr
nengel@2 912 .unreq len
nengel@2 913 endfunc
nengel@2 914
nengel@2 915 function ff_vector_fmul_sv_scalar_2_neon, export=1
nengel@2 916 VFP vdup.32 d16, d0[0]
nengel@2 917 NOVFP vdup.32 d16, r3
nengel@2 918 NOVFP ldr r3, [sp]
nengel@2 919 vld1.32 {d0},[r1,:64]!
nengel@2 920 vld1.32 {d1},[r1,:64]!
nengel@2 921 1: subs r3, r3, #4
nengel@2 922 vmul.f32 d4, d0, d16
nengel@2 923 vmul.f32 d5, d1, d16
nengel@2 924 ldr r12, [r2], #4
nengel@2 925 vld1.32 {d2},[r12,:64]
nengel@2 926 ldr r12, [r2], #4
nengel@2 927 vld1.32 {d3},[r12,:64]
nengel@2 928 vmul.f32 d4, d4, d2
nengel@2 929 vmul.f32 d5, d5, d3
nengel@2 930 beq 2f
nengel@2 931 vld1.32 {d0},[r1,:64]!
nengel@2 932 vld1.32 {d1},[r1,:64]!
nengel@2 933 vst1.32 {d4},[r0,:64]!
nengel@2 934 vst1.32 {d5},[r0,:64]!
nengel@2 935 b 1b
nengel@2 936 2: vst1.32 {d4},[r0,:64]!
nengel@2 937 vst1.32 {d5},[r0,:64]!
nengel@2 938 bx lr
nengel@2 939 endfunc
nengel@2 940
nengel@2 941 function ff_vector_fmul_sv_scalar_4_neon, export=1
nengel@2 942 VFP vdup.32 q10, d0[0]
nengel@2 943 NOVFP vdup.32 q10, r3
nengel@2 944 NOVFP ldr r3, [sp]
nengel@2 945 push {lr}
nengel@2 946 bics lr, r3, #7
nengel@2 947 beq 3f
nengel@2 948 vld1.32 {q0},[r1,:128]!
nengel@2 949 vld1.32 {q2},[r1,:128]!
nengel@2 950 1: ldr r12, [r2], #4
nengel@2 951 vld1.32 {q1},[r12,:128]
nengel@2 952 ldr r12, [r2], #4
nengel@2 953 vld1.32 {q3},[r12,:128]
nengel@2 954 vmul.f32 q8, q0, q10
nengel@2 955 vmul.f32 q8, q8, q1
nengel@2 956 vmul.f32 q9, q2, q10
nengel@2 957 vmul.f32 q9, q9, q3
nengel@2 958 subs lr, lr, #8
nengel@2 959 beq 2f
nengel@2 960 vld1.32 {q0},[r1,:128]!
nengel@2 961 vld1.32 {q2},[r1,:128]!
nengel@2 962 vst1.32 {q8},[r0,:128]!
nengel@2 963 vst1.32 {q9},[r0,:128]!
nengel@2 964 b 1b
nengel@2 965 2: vst1.32 {q8},[r0,:128]!
nengel@2 966 vst1.32 {q9},[r0,:128]!
nengel@2 967 ands r3, r3, #7
nengel@2 968 popeq {pc}
nengel@2 969 3: vld1.32 {q0},[r1,:128]!
nengel@2 970 ldr r12, [r2], #4
nengel@2 971 vld1.32 {q1},[r12,:128]
nengel@2 972 vmul.f32 q0, q0, q10
nengel@2 973 vmul.f32 q0, q0, q1
nengel@2 974 vst1.32 {q0},[r0,:128]!
nengel@2 975 subs r3, r3, #4
nengel@2 976 bgt 3b
nengel@2 977 pop {pc}
nengel@2 978 endfunc
nengel@2 979
nengel@2 980 function ff_sv_fmul_scalar_2_neon, export=1
nengel@2 981 VFP len .req r2
nengel@2 982 NOVFP len .req r3
nengel@2 983 VFP vdup.32 q8, d0[0]
nengel@2 984 NOVFP vdup.32 q8, r2
nengel@2 985 ldr r12, [r1], #4
nengel@2 986 vld1.32 {d0},[r12,:64]
nengel@2 987 ldr r12, [r1], #4
nengel@2 988 vld1.32 {d1},[r12,:64]
nengel@2 989 1: vmul.f32 q1, q0, q8
nengel@2 990 subs len, len, #4
nengel@2 991 beq 2f
nengel@2 992 ldr r12, [r1], #4
nengel@2 993 vld1.32 {d0},[r12,:64]
nengel@2 994 ldr r12, [r1], #4
nengel@2 995 vld1.32 {d1},[r12,:64]
nengel@2 996 vst1.32 {q1},[r0,:128]!
nengel@2 997 b 1b
nengel@2 998 2: vst1.32 {q1},[r0,:128]!
nengel@2 999 bx lr
nengel@2 1000 .unreq len
nengel@2 1001 endfunc
nengel@2 1002
nengel@2 1003 function ff_sv_fmul_scalar_4_neon, export=1
nengel@2 1004 VFP len .req r2
nengel@2 1005 NOVFP len .req r3
nengel@2 1006 VFP vdup.32 q8, d0[0]
nengel@2 1007 NOVFP vdup.32 q8, r2
nengel@2 1008 1: ldr r12, [r1], #4
nengel@2 1009 vld1.32 {q0},[r12,:128]
nengel@2 1010 vmul.f32 q0, q0, q8
nengel@2 1011 vst1.32 {q0},[r0,:128]!
nengel@2 1012 subs len, len, #4
nengel@2 1013 bgt 1b
nengel@2 1014 bx lr
nengel@2 1015 .unreq len
nengel@2 1016 endfunc
nengel@2 1017
nengel@2 1018 function ff_butterflies_float_neon, export=1
nengel@2 1019 1: vld1.32 {q0},[r0,:128]
nengel@2 1020 vld1.32 {q1},[r1,:128]
nengel@2 1021 vsub.f32 q2, q0, q1
nengel@2 1022 vadd.f32 q1, q0, q1
nengel@2 1023 vst1.32 {q2},[r1,:128]!
nengel@2 1024 vst1.32 {q1},[r0,:128]!
nengel@2 1025 subs r2, r2, #4
nengel@2 1026 bgt 1b
nengel@2 1027 bx lr
nengel@2 1028 endfunc
nengel@2 1029
nengel@2 1030 function ff_scalarproduct_float_neon, export=1
nengel@2 1031 vmov.f32 q2, #0.0
nengel@2 1032 1: vld1.32 {q0},[r0,:128]!
nengel@2 1033 vld1.32 {q1},[r1,:128]!
nengel@2 1034 vmla.f32 q2, q0, q1
nengel@2 1035 subs r2, r2, #4
nengel@2 1036 bgt 1b
nengel@2 1037 vadd.f32 d0, d4, d5
nengel@2 1038 vpadd.f32 d0, d0, d0
nengel@2 1039 NOVFP vmov.32 r0, d0[0]
nengel@2 1040 bx lr
nengel@2 1041 endfunc
nengel@2 1042
nengel@2 1043 function ff_int32_to_float_fmul_scalar_neon, export=1
nengel@2 1044 VFP vdup.32 q0, d0[0]
nengel@2 1045 VFP len .req r2
nengel@2 1046 NOVFP vdup.32 q0, r2
nengel@2 1047 NOVFP len .req r3
nengel@2 1048
nengel@2 1049 vld1.32 {q1},[r1,:128]!
nengel@2 1050 vcvt.f32.s32 q3, q1
nengel@2 1051 vld1.32 {q2},[r1,:128]!
nengel@2 1052 vcvt.f32.s32 q8, q2
nengel@2 1053 1: subs len, len, #8
nengel@2 1054 pld [r1, #16]
nengel@2 1055 vmul.f32 q9, q3, q0
nengel@2 1056 vmul.f32 q10, q8, q0
nengel@2 1057 beq 2f
nengel@2 1058 vld1.32 {q1},[r1,:128]!
nengel@2 1059 vcvt.f32.s32 q3, q1
nengel@2 1060 vld1.32 {q2},[r1,:128]!
nengel@2 1061 vcvt.f32.s32 q8, q2
nengel@2 1062 vst1.32 {q9}, [r0,:128]!
nengel@2 1063 vst1.32 {q10},[r0,:128]!
nengel@2 1064 b 1b
nengel@2 1065 2: vst1.32 {q9}, [r0,:128]!
nengel@2 1066 vst1.32 {q10},[r0,:128]!
nengel@2 1067 bx lr
nengel@2 1068 .unreq len
nengel@2 1069 endfunc
nengel@2 1070
nengel@2 1071 function ff_vector_fmul_reverse_neon, export=1
nengel@2 1072 add r2, r2, r3, lsl #2
nengel@2 1073 sub r2, r2, #32
nengel@2 1074 mov r12, #-32
nengel@2 1075 vld1.32 {q0-q1}, [r1,:128]!
nengel@2 1076 vld1.32 {q2-q3}, [r2,:128], r12
nengel@2 1077 1: pld [r1, #32]
nengel@2 1078 vrev64.32 q3, q3
nengel@2 1079 vmul.f32 d16, d0, d7
nengel@2 1080 vmul.f32 d17, d1, d6
nengel@2 1081 pld [r2, #-32]
nengel@2 1082 vrev64.32 q2, q2
nengel@2 1083 vmul.f32 d18, d2, d5
nengel@2 1084 vmul.f32 d19, d3, d4
nengel@2 1085 subs r3, r3, #8
nengel@2 1086 beq 2f
nengel@2 1087 vld1.32 {q0-q1}, [r1,:128]!
nengel@2 1088 vld1.32 {q2-q3}, [r2,:128], r12
nengel@2 1089 vst1.32 {q8-q9}, [r0,:128]!
nengel@2 1090 b 1b
nengel@2 1091 2: vst1.32 {q8-q9}, [r0,:128]!
nengel@2 1092 bx lr
nengel@2 1093 endfunc
nengel@2 1094
nengel@2 1095 function ff_vector_fmul_add_neon, export=1
nengel@2 1096 ldr r12, [sp]
nengel@2 1097 vld1.32 {q0-q1}, [r1,:128]!
nengel@2 1098 vld1.32 {q8-q9}, [r2,:128]!
nengel@2 1099 vld1.32 {q2-q3}, [r3,:128]!
nengel@2 1100 vmul.f32 q10, q0, q8
nengel@2 1101 vmul.f32 q11, q1, q9
nengel@2 1102 1: vadd.f32 q12, q2, q10
nengel@2 1103 vadd.f32 q13, q3, q11
nengel@2 1104 pld [r1, #16]
nengel@2 1105 pld [r2, #16]
nengel@2 1106 pld [r3, #16]
nengel@2 1107 subs r12, r12, #8
nengel@2 1108 beq 2f
nengel@2 1109 vld1.32 {q0}, [r1,:128]!
nengel@2 1110 vld1.32 {q8}, [r2,:128]!
nengel@2 1111 vmul.f32 q10, q0, q8
nengel@2 1112 vld1.32 {q1}, [r1,:128]!
nengel@2 1113 vld1.32 {q9}, [r2,:128]!
nengel@2 1114 vmul.f32 q11, q1, q9
nengel@2 1115 vld1.32 {q2-q3}, [r3,:128]!
nengel@2 1116 vst1.32 {q12-q13},[r0,:128]!
nengel@2 1117 b 1b
nengel@2 1118 2: vst1.32 {q12-q13},[r0,:128]!
nengel@2 1119 bx lr
nengel@2 1120 endfunc
nengel@2 1121
nengel@2 1122 function ff_vector_clipf_neon, export=1
nengel@2 1123 VFP vdup.32 q1, d0[1]
nengel@2 1124 VFP vdup.32 q0, d0[0]
nengel@2 1125 NOVFP vdup.32 q0, r2
nengel@2 1126 NOVFP vdup.32 q1, r3
nengel@2 1127 NOVFP ldr r2, [sp]
nengel@2 1128 vld1.f32 {q2},[r1,:128]!
nengel@2 1129 vmin.f32 q10, q2, q1
nengel@2 1130 vld1.f32 {q3},[r1,:128]!
nengel@2 1131 vmin.f32 q11, q3, q1
nengel@2 1132 1: vmax.f32 q8, q10, q0
nengel@2 1133 vmax.f32 q9, q11, q0
nengel@2 1134 subs r2, r2, #8
nengel@2 1135 beq 2f
nengel@2 1136 vld1.f32 {q2},[r1,:128]!
nengel@2 1137 vmin.f32 q10, q2, q1
nengel@2 1138 vld1.f32 {q3},[r1,:128]!
nengel@2 1139 vmin.f32 q11, q3, q1
nengel@2 1140 vst1.f32 {q8},[r0,:128]!
nengel@2 1141 vst1.f32 {q9},[r0,:128]!
nengel@2 1142 b 1b
nengel@2 1143 2: vst1.f32 {q8},[r0,:128]!
nengel@2 1144 vst1.f32 {q9},[r0,:128]!
nengel@2 1145 bx lr
nengel@2 1146 endfunc