1/* 2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com> 3 * 4 * This file is part of libswresample. 5 * 6 * libswresample is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * libswresample is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with libswresample; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include "config.h" 22#include "libavutil/arm/asm.S" 23 24function swri_oldapi_conv_flt_to_s16_neon, export=1 25.L_swri_oldapi_conv_flt_to_s16_neon: 26 subs r2, r2, #8 27 vld1.32 {q0}, [r1,:128]! 28 vcvt.s32.f32 q8, q0, #31 29 vld1.32 {q1}, [r1,:128]! 30 vcvt.s32.f32 q9, q1, #31 31 beq 3f 32 bics r12, r2, #15 33 beq 2f 341: subs r12, r12, #16 35 vqrshrn.s32 d4, q8, #16 36 vld1.32 {q0}, [r1,:128]! 37 vcvt.s32.f32 q0, q0, #31 38 vqrshrn.s32 d5, q9, #16 39 vld1.32 {q1}, [r1,:128]! 40 vcvt.s32.f32 q1, q1, #31 41 vqrshrn.s32 d6, q0, #16 42 vst1.16 {q2}, [r0,:128]! 43 vqrshrn.s32 d7, q1, #16 44 vld1.32 {q8}, [r1,:128]! 45 vcvt.s32.f32 q8, q8, #31 46 vld1.32 {q9}, [r1,:128]! 47 vcvt.s32.f32 q9, q9, #31 48 vst1.16 {q3}, [r0,:128]! 49 bne 1b 50 ands r2, r2, #15 51 beq 3f 522: vld1.32 {q0}, [r1,:128]! 53 vqrshrn.s32 d4, q8, #16 54 vcvt.s32.f32 q0, q0, #31 55 vld1.32 {q1}, [r1,:128]! 56 vqrshrn.s32 d5, q9, #16 57 vcvt.s32.f32 q1, q1, #31 58 vqrshrn.s32 d6, q0, #16 59 vst1.16 {q2}, [r0,:128]! 60 vqrshrn.s32 d7, q1, #16 61 vst1.16 {q3}, [r0,:128]! 62 bx lr 633: vqrshrn.s32 d4, q8, #16 64 vqrshrn.s32 d5, q9, #16 65 vst1.16 {q2}, [r0,:128]! 66 bx lr 67endfunc 68 69function swri_oldapi_conv_fltp_to_s16_2ch_neon, export=1 70.L_swri_oldapi_conv_fltp_to_s16_2ch_neon: 71 ldm r1, {r1, r3} 72 subs r2, r2, #8 73 vld1.32 {q0}, [r1,:128]! 74 vcvt.s32.f32 q8, q0, #31 75 vld1.32 {q1}, [r1,:128]! 76 vcvt.s32.f32 q9, q1, #31 77 vld1.32 {q10}, [r3,:128]! 78 vcvt.s32.f32 q10, q10, #31 79 vld1.32 {q11}, [r3,:128]! 80 vcvt.s32.f32 q11, q11, #31 81 beq 3f 82 bics r12, r2, #15 83 beq 2f 841: subs r12, r12, #16 85 vld1.32 {q0}, [r1,:128]! 86 vcvt.s32.f32 q0, q0, #31 87 vsri.32 q10, q8, #16 88 vld1.32 {q1}, [r1,:128]! 89 vcvt.s32.f32 q1, q1, #31 90 vld1.32 {q12}, [r3,:128]! 91 vcvt.s32.f32 q12, q12, #31 92 vld1.32 {q13}, [r3,:128]! 93 vsri.32 q11, q9, #16 94 vst1.16 {q10}, [r0,:128]! 95 vcvt.s32.f32 q13, q13, #31 96 vst1.16 {q11}, [r0,:128]! 97 vsri.32 q12, q0, #16 98 vld1.32 {q8}, [r1,:128]! 99 vsri.32 q13, q1, #16 100 vst1.16 {q12}, [r0,:128]! 101 vcvt.s32.f32 q8, q8, #31 102 vld1.32 {q9}, [r1,:128]! 103 vcvt.s32.f32 q9, q9, #31 104 vld1.32 {q10}, [r3,:128]! 105 vcvt.s32.f32 q10, q10, #31 106 vld1.32 {q11}, [r3,:128]! 107 vcvt.s32.f32 q11, q11, #31 108 vst1.16 {q13}, [r0,:128]! 109 bne 1b 110 ands r2, r2, #15 111 beq 3f 1122: vsri.32 q10, q8, #16 113 vld1.32 {q0}, [r1,:128]! 114 vcvt.s32.f32 q0, q0, #31 115 vld1.32 {q1}, [r1,:128]! 116 vcvt.s32.f32 q1, q1, #31 117 vld1.32 {q12}, [r3,:128]! 118 vcvt.s32.f32 q12, q12, #31 119 vsri.32 q11, q9, #16 120 vld1.32 {q13}, [r3,:128]! 121 vcvt.s32.f32 q13, q13, #31 122 vst1.16 {q10}, [r0,:128]! 123 vsri.32 q12, q0, #16 124 vst1.16 {q11}, [r0,:128]! 125 vsri.32 q13, q1, #16 126 vst1.16 {q12-q13},[r0,:128]! 127 bx lr 1283: vsri.32 q10, q8, #16 129 vsri.32 q11, q9, #16 130 vst1.16 {q10-q11},[r0,:128]! 131 bx lr 132endfunc 133 134function swri_oldapi_conv_fltp_to_s16_nch_neon, export=1 135 cmp r3, #2 136 itt lt 137 ldrlt r1, [r1] 138 blt .L_swri_oldapi_conv_flt_to_s16_neon 139 beq .L_swri_oldapi_conv_fltp_to_s16_2ch_neon 140 141 push {r4-r8, lr} 142 cmp r3, #4 143 lsl r12, r3, #1 144 blt 4f 145 146 @ 4 channels 1475: ldm r1!, {r4-r7} 148 mov lr, r2 149 mov r8, r0 150 vld1.32 {q8}, [r4,:128]! 151 vcvt.s32.f32 q8, q8, #31 152 vld1.32 {q9}, [r5,:128]! 153 vcvt.s32.f32 q9, q9, #31 154 vld1.32 {q10}, [r6,:128]! 155 vcvt.s32.f32 q10, q10, #31 156 vld1.32 {q11}, [r7,:128]! 157 vcvt.s32.f32 q11, q11, #31 1586: subs lr, lr, #8 159 vld1.32 {q0}, [r4,:128]! 160 vcvt.s32.f32 q0, q0, #31 161 vsri.32 q9, q8, #16 162 vld1.32 {q1}, [r5,:128]! 163 vcvt.s32.f32 q1, q1, #31 164 vsri.32 q11, q10, #16 165 vld1.32 {q2}, [r6,:128]! 166 vcvt.s32.f32 q2, q2, #31 167 vzip.32 d18, d22 168 vld1.32 {q3}, [r7,:128]! 169 vcvt.s32.f32 q3, q3, #31 170 vzip.32 d19, d23 171 vst1.16 {d18}, [r8], r12 172 vsri.32 q1, q0, #16 173 vst1.16 {d22}, [r8], r12 174 vsri.32 q3, q2, #16 175 vst1.16 {d19}, [r8], r12 176 vzip.32 d2, d6 177 vst1.16 {d23}, [r8], r12 178 vzip.32 d3, d7 179 beq 7f 180 vld1.32 {q8}, [r4,:128]! 181 vcvt.s32.f32 q8, q8, #31 182 vst1.16 {d2}, [r8], r12 183 vld1.32 {q9}, [r5,:128]! 184 vcvt.s32.f32 q9, q9, #31 185 vst1.16 {d6}, [r8], r12 186 vld1.32 {q10}, [r6,:128]! 187 vcvt.s32.f32 q10, q10, #31 188 vst1.16 {d3}, [r8], r12 189 vld1.32 {q11}, [r7,:128]! 190 vcvt.s32.f32 q11, q11, #31 191 vst1.16 {d7}, [r8], r12 192 b 6b 1937: vst1.16 {d2}, [r8], r12 194 vst1.16 {d6}, [r8], r12 195 vst1.16 {d3}, [r8], r12 196 vst1.16 {d7}, [r8], r12 197 subs r3, r3, #4 198 it eq 199 popeq {r4-r8, pc} 200 cmp r3, #4 201 add r0, r0, #8 202 bge 5b 203 204 @ 2 channels 2054: cmp r3, #2 206 blt 4f 207 ldm r1!, {r4-r5} 208 mov lr, r2 209 mov r8, r0 210 tst lr, #8 211 vld1.32 {q8}, [r4,:128]! 212 vcvt.s32.f32 q8, q8, #31 213 vld1.32 {q9}, [r5,:128]! 214 vcvt.s32.f32 q9, q9, #31 215 vld1.32 {q10}, [r4,:128]! 216 vcvt.s32.f32 q10, q10, #31 217 vld1.32 {q11}, [r5,:128]! 218 vcvt.s32.f32 q11, q11, #31 219 beq 6f 220 subs lr, lr, #8 221 beq 7f 222 vsri.32 d18, d16, #16 223 vsri.32 d19, d17, #16 224 vld1.32 {q8}, [r4,:128]! 225 vcvt.s32.f32 q8, q8, #31 226 vst1.32 {d18[0]}, [r8], r12 227 vsri.32 d22, d20, #16 228 vst1.32 {d18[1]}, [r8], r12 229 vsri.32 d23, d21, #16 230 vst1.32 {d19[0]}, [r8], r12 231 vst1.32 {d19[1]}, [r8], r12 232 vld1.32 {q9}, [r5,:128]! 233 vcvt.s32.f32 q9, q9, #31 234 vst1.32 {d22[0]}, [r8], r12 235 vst1.32 {d22[1]}, [r8], r12 236 vld1.32 {q10}, [r4,:128]! 237 vcvt.s32.f32 q10, q10, #31 238 vst1.32 {d23[0]}, [r8], r12 239 vst1.32 {d23[1]}, [r8], r12 240 vld1.32 {q11}, [r5,:128]! 241 vcvt.s32.f32 q11, q11, #31 2426: subs lr, lr, #16 243 vld1.32 {q0}, [r4,:128]! 244 vcvt.s32.f32 q0, q0, #31 245 vsri.32 d18, d16, #16 246 vld1.32 {q1}, [r5,:128]! 247 vcvt.s32.f32 q1, q1, #31 248 vsri.32 d19, d17, #16 249 vld1.32 {q2}, [r4,:128]! 250 vcvt.s32.f32 q2, q2, #31 251 vld1.32 {q3}, [r5,:128]! 252 vcvt.s32.f32 q3, q3, #31 253 vst1.32 {d18[0]}, [r8], r12 254 vsri.32 d22, d20, #16 255 vst1.32 {d18[1]}, [r8], r12 256 vsri.32 d23, d21, #16 257 vst1.32 {d19[0]}, [r8], r12 258 vsri.32 d2, d0, #16 259 vst1.32 {d19[1]}, [r8], r12 260 vsri.32 d3, d1, #16 261 vst1.32 {d22[0]}, [r8], r12 262 vsri.32 d6, d4, #16 263 vst1.32 {d22[1]}, [r8], r12 264 vsri.32 d7, d5, #16 265 vst1.32 {d23[0]}, [r8], r12 266 vst1.32 {d23[1]}, [r8], r12 267 beq 6f 268 vld1.32 {q8}, [r4,:128]! 269 vcvt.s32.f32 q8, q8, #31 270 vst1.32 {d2[0]}, [r8], r12 271 vst1.32 {d2[1]}, [r8], r12 272 vld1.32 {q9}, [r5,:128]! 273 vcvt.s32.f32 q9, q9, #31 274 vst1.32 {d3[0]}, [r8], r12 275 vst1.32 {d3[1]}, [r8], r12 276 vld1.32 {q10}, [r4,:128]! 277 vcvt.s32.f32 q10, q10, #31 278 vst1.32 {d6[0]}, [r8], r12 279 vst1.32 {d6[1]}, [r8], r12 280 vld1.32 {q11}, [r5,:128]! 281 vcvt.s32.f32 q11, q11, #31 282 vst1.32 {d7[0]}, [r8], r12 283 vst1.32 {d7[1]}, [r8], r12 284 bgt 6b 2856: vst1.32 {d2[0]}, [r8], r12 286 vst1.32 {d2[1]}, [r8], r12 287 vst1.32 {d3[0]}, [r8], r12 288 vst1.32 {d3[1]}, [r8], r12 289 vst1.32 {d6[0]}, [r8], r12 290 vst1.32 {d6[1]}, [r8], r12 291 vst1.32 {d7[0]}, [r8], r12 292 vst1.32 {d7[1]}, [r8], r12 293 b 8f 2947: vsri.32 d18, d16, #16 295 vsri.32 d19, d17, #16 296 vst1.32 {d18[0]}, [r8], r12 297 vsri.32 d22, d20, #16 298 vst1.32 {d18[1]}, [r8], r12 299 vsri.32 d23, d21, #16 300 vst1.32 {d19[0]}, [r8], r12 301 vst1.32 {d19[1]}, [r8], r12 302 vst1.32 {d22[0]}, [r8], r12 303 vst1.32 {d22[1]}, [r8], r12 304 vst1.32 {d23[0]}, [r8], r12 305 vst1.32 {d23[1]}, [r8], r12 3068: subs r3, r3, #2 307 add r0, r0, #4 308 it eq 309 popeq {r4-r8, pc} 310 311 @ 1 channel 3124: ldr r4, [r1] 313 tst r2, #8 314 mov lr, r2 315 mov r5, r0 316 vld1.32 {q0}, [r4,:128]! 317 vcvt.s32.f32 q0, q0, #31 318 vld1.32 {q1}, [r4,:128]! 319 vcvt.s32.f32 q1, q1, #31 320 bne 8f 3216: subs lr, lr, #16 322 vld1.32 {q2}, [r4,:128]! 323 vcvt.s32.f32 q2, q2, #31 324 vld1.32 {q3}, [r4,:128]! 325 vcvt.s32.f32 q3, q3, #31 326 vst1.16 {d0[1]}, [r5,:16], r12 327 vst1.16 {d0[3]}, [r5,:16], r12 328 vst1.16 {d1[1]}, [r5,:16], r12 329 vst1.16 {d1[3]}, [r5,:16], r12 330 vst1.16 {d2[1]}, [r5,:16], r12 331 vst1.16 {d2[3]}, [r5,:16], r12 332 vst1.16 {d3[1]}, [r5,:16], r12 333 vst1.16 {d3[3]}, [r5,:16], r12 334 beq 7f 335 vld1.32 {q0}, [r4,:128]! 336 vcvt.s32.f32 q0, q0, #31 337 vld1.32 {q1}, [r4,:128]! 338 vcvt.s32.f32 q1, q1, #31 3397: vst1.16 {d4[1]}, [r5,:16], r12 340 vst1.16 {d4[3]}, [r5,:16], r12 341 vst1.16 {d5[1]}, [r5,:16], r12 342 vst1.16 {d5[3]}, [r5,:16], r12 343 vst1.16 {d6[1]}, [r5,:16], r12 344 vst1.16 {d6[3]}, [r5,:16], r12 345 vst1.16 {d7[1]}, [r5,:16], r12 346 vst1.16 {d7[3]}, [r5,:16], r12 347 bgt 6b 348 pop {r4-r8, pc} 3498: subs lr, lr, #8 350 vst1.16 {d0[1]}, [r5,:16], r12 351 vst1.16 {d0[3]}, [r5,:16], r12 352 vst1.16 {d1[1]}, [r5,:16], r12 353 vst1.16 {d1[3]}, [r5,:16], r12 354 vst1.16 {d2[1]}, [r5,:16], r12 355 vst1.16 {d2[3]}, [r5,:16], r12 356 vst1.16 {d3[1]}, [r5,:16], r12 357 vst1.16 {d3[3]}, [r5,:16], r12 358 it eq 359 popeq {r4-r8, pc} 360 vld1.32 {q0}, [r4,:128]! 361 vcvt.s32.f32 q0, q0, #31 362 vld1.32 {q1}, [r4,:128]! 363 vcvt.s32.f32 q1, q1, #31 364 b 6b 365endfunc 366