~ubuntu-branches/ubuntu/utopic/libav/utopic-proposed

« back to all changes in this revision

Viewing changes to libavcodec/arm/fft_vfp.S

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler, Reinhard Tartler, Rico Tzschichholz
  • Date: 2014-08-30 11:02:45 UTC
  • mfrom: (1.3.47 sid)
  • Revision ID: package-import@ubuntu.com-20140830110245-io3dg7q85wfr7125
Tags: 6:11~beta1-2
[ Reinhard Tartler ]
* Make libavcodec-dev depend on libavresample-dev

[ Rico Tzschichholz ]
* Some fixes and leftovers from soname bumps

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
#include "libavutil/arm/asm.S"
23
23
 
24
 
@ TODO: * FFTs wider than 16
25
 
@       * dispatch code
 
24
@ The fftx_internal_vfp versions of the functions obey a modified AAPCS:
 
25
@ VFP is in RunFast mode, vector length 4, stride 1 thoroughout, and
 
26
@ all single-precision VFP registers may be corrupted on exit. The a2
 
27
@ register may not be clobbered in these functions, as it holds the
 
28
@ stored original FPSCR.
 
29
 
 
30
function ff_fft_calc_vfp, export=1
 
31
        ldr     ip, [a1, #0]    @ nbits
 
32
        mov     a1, a2
 
33
A       ldr     pc, [pc, ip, lsl #2]
 
34
A       .word   0
 
35
A       .word   0
 
36
A       .word   0
 
37
T       movrel  a2, (fft_tab_vfp - 8)
 
38
T       ldr     pc, [a2, ip, lsl #2]
 
39
T endfunc
 
40
T const fft_tab_vfp
 
41
        .word   fft4_vfp
 
42
        .word   fft8_vfp
 
43
        .word   X(ff_fft16_vfp)     @ this one alone is exported
 
44
        .word   fft32_vfp
 
45
        .word   fft64_vfp
 
46
        .word   fft128_vfp
 
47
        .word   fft256_vfp
 
48
        .word   fft512_vfp
 
49
        .word   fft1024_vfp
 
50
        .word   fft2048_vfp
 
51
        .word   fft4096_vfp
 
52
        .word   fft8192_vfp
 
53
        .word   fft16384_vfp
 
54
        .word   fft32768_vfp
 
55
        .word   fft65536_vfp
 
56
A endfunc
26
57
 
27
58
function fft4_vfp
28
59
        vldr    d0, [a1, #0*2*4]   @ s0,s1   = z[0]
131
162
             vstr    d9, [a1, #3 * 2*4]
132
163
.endm
133
164
 
 
165
function .Lfft8_internal_vfp
 
166
        macro_fft8_head
 
167
        macro_fft8_tail
 
168
        bx      lr
 
169
endfunc
 
170
 
134
171
function fft8_vfp
135
172
        ldr     a3, =0x03030000     @ RunFast mode, vector length 4, stride 1
136
173
        fmrx    a2, FPSCR
137
174
        fmxr    FPSCR, a3
138
175
        vpush   {s16-s31}
139
 
 
140
 
        macro_fft8_head
141
 
        macro_fft8_tail
142
 
 
 
176
        mov     ip, lr
 
177
        bl      .Lfft8_internal_vfp
143
178
        vpop    {s16-s31}
144
179
        fmxr    FPSCR, a2
145
 
        bx      lr
 
180
        bx      ip
146
181
endfunc
147
182
 
148
183
.align 3
153
188
cos3pi8:    @ cos(2*pi/8) = sqrt(2-sqrt(2))/2
154
189
        .float  0.3826834261417388916015625
155
190
 
156
 
function ff_fft16_vfp, export=1
157
 
        ldr     a3, =0x03030000     @ RunFast mode, vector length 4, stride 1
158
 
        fmrx    a2, FPSCR
159
 
        fmxr    FPSCR, a3
160
 
        vpush   {s16-s31}
161
 
 
 
191
function .Lfft16_internal_vfp
162
192
        macro_fft8_head
163
193
        @ FFT4(z+8)
164
194
        vldr    d10, [a1, #8 * 2*4]
292
322
              vstr    d8, [a1, #0 * 2*4]
293
323
              vstr    d9, [a1, #4 * 2*4]
294
324
 
295
 
        vpop    {s16-s31}
296
 
        fmxr    FPSCR, a2
297
325
        bx      lr
298
326
endfunc
 
327
 
 
328
function ff_fft16_vfp, export=1
 
329
        ldr     a3, =0x03030000     @ RunFast mode, vector length 4, stride 1
 
330
        fmrx    a2, FPSCR
 
331
        fmxr    FPSCR, a3
 
332
        vpush   {s16-s31}
 
333
        mov     ip, lr
 
334
        bl      .Lfft16_internal_vfp
 
335
        vpop    {s16-s31}
 
336
        fmxr    FPSCR, a2
 
337
        bx      ip
 
338
endfunc
 
339
 
 
340
.macro pass n, z0, z1, z2, z3
 
341
        add     v6, v5, #4*2*\n
 
342
        @ TRANSFORM_ZERO(z[0],z[o1],z[o2],z[o3])
 
343
            @ TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1])
 
344
                @ TRANSFORM(z[0],z[o1],z[o2],z[o3],wre[0],wim[0])
 
345
                    @ TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1])
 
346
            vldr    d8, [\z2, #8*(o2+1)]        @ s16,s17
 
347
            vldmdb  v6!, {s2}
 
348
            vldr    d9, [\z3, #8*(o3+1)]        @ s18,s19
 
349
            vldmia  v5!, {s0,s1}                @ s0 is unused
 
350
        vldr    s7, [\z2, #8*o2]            @ t1
 
351
            vmul.f  s20, s16, s2                @ vector * scalar
 
352
        vldr    s0, [\z3, #8*o3]            @ t5
 
353
        vldr    s6, [\z2, #8*o2+4]          @ t2
 
354
        vldr    s3, [\z3, #8*o3+4]          @ t6
 
355
            vmul.f  s16, s16, s1                @ vector * scalar
 
356
        ldr     a4, =\n-1
 
357
1:      add     \z0, \z0, #8*2
 
358
 .if \n*4*2 >= 512
 
359
        add     \z1, \z1, #8*2
 
360
 .endif
 
361
 .if \n*4*2 >= 256
 
362
        add     \z2, \z2, #8*2
 
363
 .endif
 
364
 .if \n*4*2 >= 512
 
365
        add     \z3, \z3, #8*2
 
366
 .endif
 
367
        @ up to 2 stalls (VFP vector issuing / waiting for s0)
 
368
        @ depending upon whether this is the first iteration and
 
369
        @ how many add instructions are inserted above
 
370
        vadd.f  s4, s0, s7                  @ t5
 
371
        vadd.f  s5, s6, s3                  @ t6
 
372
        vsub.f  s6, s6, s3                  @ t4
 
373
        vsub.f  s7, s0, s7                  @ t3
 
374
        vldr    d6, [\z0, #8*0-8*2]         @ s12,s13
 
375
            vadd.f  s0, s16, s21                @ t1
 
376
        vldr    d7, [\z1, #8*o1-8*2]        @ s14,s15
 
377
            vsub.f  s1, s18, s23                @ t5
 
378
        vadd.f  s8, s4, s12                 @ vector + vector
 
379
        @ stall (VFP vector issuing)
 
380
        @ stall (VFP vector issuing)
 
381
        @ stall (VFP vector issuing)
 
382
        vsub.f  s4, s12, s4
 
383
        vsub.f  s5, s13, s5
 
384
        vsub.f  s6, s14, s6
 
385
        vsub.f  s7, s15, s7
 
386
            vsub.f  s2, s17, s20                @ t2
 
387
            vadd.f  s3, s19, s22                @ t6
 
388
        vstr    d4, [\z0, #8*0-8*2]         @ s8,s9
 
389
        vstr    d5, [\z1, #8*o1-8*2]        @ s10,s11
 
390
        @ stall (waiting for s5)
 
391
        vstr    d2, [\z2, #8*o2-8*2]        @ s4,s5
 
392
            vadd.f  s4, s1, s0                  @ t5
 
393
        vstr    d3, [\z3, #8*o3-8*2]        @ s6,s7
 
394
            vsub.f  s7, s1, s0                  @ t3
 
395
            vadd.f  s5, s2, s3                  @ t6
 
396
            vsub.f  s6, s2, s3                  @ t4
 
397
            vldr    d6, [\z0, #8*1-8*2]         @ s12,s13
 
398
            vldr    d7, [\z1, #8*(o1+1)-8*2]    @ s14,s15
 
399
                vldr    d4, [\z2, #8*o2]            @ s8,s9
 
400
                vldmdb  v6!, {s2,s3}
 
401
                vldr    d5, [\z3, #8*o3]            @ s10,s11
 
402
            vadd.f  s20, s4, s12                @ vector + vector
 
403
                vldmia  v5!, {s0,s1}
 
404
                    vldr    d8, [\z2, #8*(o2+1)]        @ s16,s17
 
405
            @ stall (VFP vector issuing)
 
406
            vsub.f  s4, s12, s4
 
407
            vsub.f  s5, s13, s5
 
408
            vsub.f  s6, s14, s6
 
409
            vsub.f  s7, s15, s7
 
410
                vmul.f  s12, s8, s3                 @ vector * scalar
 
411
            vstr    d10, [\z0, #8*1-8*2]        @ s20,s21
 
412
                    vldr    d9, [\z3, #8*(o3+1)]        @ s18,s19
 
413
            vstr    d11, [\z1, #8*(o1+1)-8*2]   @ s22,s23
 
414
                vmul.f  s8, s8, s0                  @ vector * scalar
 
415
            vstr    d2, [\z2, #8*(o2+1)-8*2]    @ s4,s5
 
416
            @ stall (waiting for s7)
 
417
            vstr    d3, [\z3, #8*(o3+1)-8*2]    @ s6,s7
 
418
                    vmul.f  s20, s16, s2                @ vector * scalar
 
419
                @ stall (VFP vector issuing)
 
420
                @ stall (VFP vector issuing)
 
421
                @ stall (VFP vector issuing)
 
422
                vadd.f  s7, s8, s13                 @ t1
 
423
                vsub.f  s6, s9, s12                 @ t2
 
424
                vsub.f  s0, s10, s15                @ t5
 
425
                vadd.f  s3, s11, s14                @ t6
 
426
                    vmul.f  s16, s16, s1                @ vector * scalar
 
427
        subs    a4, a4, #1
 
428
        bne     1b
 
429
        @ What remains is identical to the first two indentations of
 
430
        @ the above, but without the increment of z
 
431
        vadd.f  s4, s0, s7                  @ t5
 
432
        vadd.f  s5, s6, s3                  @ t6
 
433
        vsub.f  s6, s6, s3                  @ t4
 
434
        vsub.f  s7, s0, s7                  @ t3
 
435
        vldr    d6, [\z0, #8*0]             @ s12,s13
 
436
            vadd.f  s0, s16, s21                @ t1
 
437
        vldr    d7, [\z1, #8*o1]            @ s14,s15
 
438
            vsub.f  s1, s18, s23                @ t5
 
439
        vadd.f  s8, s4, s12                 @ vector + vector
 
440
        vsub.f  s4, s12, s4
 
441
        vsub.f  s5, s13, s5
 
442
        vsub.f  s6, s14, s6
 
443
        vsub.f  s7, s15, s7
 
444
            vsub.f  s2, s17, s20                @ t2
 
445
            vadd.f  s3, s19, s22                @ t6
 
446
        vstr    d4, [\z0, #8*0]             @ s8,s9
 
447
        vstr    d5, [\z1, #8*o1]            @ s10,s11
 
448
        vstr    d2, [\z2, #8*o2]            @ s4,s5
 
449
            vadd.f  s4, s1, s0                  @ t5
 
450
        vstr    d3, [\z3, #8*o3]            @ s6,s7
 
451
            vsub.f  s7, s1, s0                  @ t3
 
452
            vadd.f  s5, s2, s3                  @ t6
 
453
            vsub.f  s6, s2, s3                  @ t4
 
454
            vldr    d6, [\z0, #8*1]             @ s12,s13
 
455
            vldr    d7, [\z1, #8*(o1+1)]        @ s14,s15
 
456
            vadd.f  s20, s4, s12                @ vector + vector
 
457
            vsub.f  s4, s12, s4
 
458
            vsub.f  s5, s13, s5
 
459
            vsub.f  s6, s14, s6
 
460
            vsub.f  s7, s15, s7
 
461
            vstr    d10, [\z0, #8*1]            @ s20,s21
 
462
            vstr    d11, [\z1, #8*(o1+1)]       @ s22,s23
 
463
            vstr    d2, [\z2, #8*(o2+1)]        @ s4,s5
 
464
            vstr    d3, [\z3, #8*(o3+1)]        @ s6,s7
 
465
.endm
 
466
 
 
467
.macro  def_fft n, n2, n4
 
468
function .Lfft\n\()_internal_vfp
 
469
 .if \n >= 512
 
470
        push    {v1-v6,lr}
 
471
 .elseif \n >= 256
 
472
        push    {v1-v2,v5-v6,lr}
 
473
 .else
 
474
        push    {v1,v5-v6,lr}
 
475
 .endif
 
476
        mov     v1, a1
 
477
        bl      .Lfft\n2\()_internal_vfp
 
478
        add     a1, v1, #8*(\n/4)*2
 
479
        bl      .Lfft\n4\()_internal_vfp
 
480
        movrelx v5, X(ff_cos_\n), a1
 
481
        add     a1, v1, #8*(\n/4)*3
 
482
        bl      .Lfft\n4\()_internal_vfp
 
483
 .if \n >= 512
 
484
  .set o1, 0*(\n/4/2)
 
485
  .set o2, 0*(\n/4/2)
 
486
  .set o3, 0*(\n/4/2)
 
487
        add     v2, v1, #8*2*(\n/4/2)
 
488
        add     v3, v1, #8*4*(\n/4/2)
 
489
        add     v4, v1, #8*6*(\n/4/2)
 
490
        pass    (\n/4/2), v1, v2, v3, v4
 
491
        pop     {v1-v6,pc}
 
492
 .elseif \n >= 256
 
493
  .set o1, 2*(\n/4/2)
 
494
  .set o2, 0*(\n/4/2)
 
495
  .set o3, 2*(\n/4/2)
 
496
        add     v2, v1, #8*4*(\n/4/2)
 
497
        pass    (\n/4/2), v1, v1, v2, v2
 
498
        pop     {v1-v2,v5-v6,pc}
 
499
 .else
 
500
  .set o1, 2*(\n/4/2)
 
501
  .set o2, 4*(\n/4/2)
 
502
  .set o3, 6*(\n/4/2)
 
503
        pass    (\n/4/2), v1, v1, v1, v1
 
504
        pop     {v1,v5-v6,pc}
 
505
 .endif
 
506
endfunc
 
507
 
 
508
function fft\n\()_vfp
 
509
        ldr     a3, =0x03030000 /* RunFast mode, vector length 4, stride 1 */
 
510
        fmrx    a2, FPSCR
 
511
        fmxr    FPSCR, a3
 
512
        vpush   {s16-s31}
 
513
        mov     ip, lr
 
514
        bl      .Lfft\n\()_internal_vfp
 
515
        vpop    {s16-s31}
 
516
        fmxr    FPSCR, a2
 
517
        bx      ip
 
518
endfunc
 
519
 
 
520
.ltorg
 
521
.endm
 
522
 
 
523
        def_fft    32,    16,     8
 
524
        def_fft    64,    32,    16
 
525
        def_fft   128,    64,    32
 
526
        def_fft   256,   128,    64
 
527
        def_fft   512,   256,   128
 
528
        def_fft  1024,   512,   256
 
529
        def_fft  2048,  1024,   512
 
530
        def_fft  4096,  2048,  1024
 
531
        def_fft  8192,  4096,  2048
 
532
        def_fft 16384,  8192,  4096
 
533
        def_fft 32768, 16384,  8192
 
534
        def_fft 65536, 32768, 16384