diff libavcodec/arm/rdft_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
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/libavcodec/arm/rdft_neon.S	Tue Sep 25 15:55:33 2012 +0200
     1.3 @@ -0,0 +1,151 @@
     1.4 +/*
     1.5 + * ARM NEON optimised RDFT
     1.6 + * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
     1.7 + *
     1.8 + * This file is part of FFmpeg.
     1.9 + *
    1.10 + * FFmpeg is free software; you can redistribute it and/or
    1.11 + * modify it under the terms of the GNU Lesser General Public
    1.12 + * License as published by the Free Software Foundation; either
    1.13 + * version 2.1 of the License, or (at your option) any later version.
    1.14 + *
    1.15 + * FFmpeg is distributed in the hope that it will be useful,
    1.16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    1.18 + * Lesser General Public License for more details.
    1.19 + *
    1.20 + * You should have received a copy of the GNU Lesser General Public
    1.21 + * License along with FFmpeg; if not, write to the Free Software
    1.22 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    1.23 + */
    1.24 +
    1.25 +#include "asm.S"
    1.26 +
    1.27 +        preserve8
    1.28 +
    1.29 +function ff_rdft_calc_neon, export=1
    1.30 +        push            {r4-r8,lr}
    1.31 +
    1.32 +        ldr             r6,  [r0, #4]           @ inverse
    1.33 +        mov             r4,  r0
    1.34 +        mov             r5,  r1
    1.35 +
    1.36 +        lsls            r6,  r6,  #31
    1.37 +        bne             1f
    1.38 +        add             r0,  r4,  #20
    1.39 +        bl              X(ff_fft_permute_neon)
    1.40 +        add             r0,  r4,  #20
    1.41 +        mov             r1,  r5
    1.42 +        bl              X(ff_fft_calc_neon)
    1.43 +1:
    1.44 +        ldr             r12, [r4, #0]           @ nbits
    1.45 +        mov             r2,  #1
    1.46 +        lsl             r12, r2,  r12
    1.47 +        add             r0,  r5,  #8
    1.48 +        add             r1,  r5,  r12, lsl #2
    1.49 +        lsr             r12, r12, #2
    1.50 +        ldr             r2,  [r4, #12]          @ tcos
    1.51 +        sub             r12, r12, #2
    1.52 +        ldr             r3,  [r4, #16]          @ tsin
    1.53 +        mov             r7,  r0
    1.54 +        sub             r1,  r1,  #8
    1.55 +        mov             lr,  r1
    1.56 +        mov             r8,  #-8
    1.57 +        vld1.32         {d0},     [r0,:64]!     @ d1[0,1]
    1.58 +        vld1.32         {d1},     [r1,:64], r8  @ d2[0,1]
    1.59 +        vld1.32         {d4},     [r2,:64]!     @ tcos[i]
    1.60 +        vld1.32         {d5},     [r3,:64]!     @ tsin[i]
    1.61 +        vmov.f32        d18, #0.5               @ k1
    1.62 +        vdup.32         d19, r6
    1.63 +        pld             [r0, #32]
    1.64 +        veor            d19, d18, d19           @ k2
    1.65 +        vmov.i32        d16, #0
    1.66 +        vmov.i32        d17, #1<<31
    1.67 +        pld             [r1, #-32]
    1.68 +        vtrn.32         d16, d17
    1.69 +        pld             [r2, #32]
    1.70 +        vrev64.32       d16, d16                @ d16=1,0 d17=0,1
    1.71 +        pld             [r3, #32]
    1.72 +2:
    1.73 +        veor            q1,  q0,  q8            @ -d1[0],d1[1], d2[0],-d2[1]
    1.74 +        vld1.32         {d24},    [r0,:64]!     @  d1[0,1]
    1.75 +        vadd.f32        d0,  d0,  d3            @  d1[0]+d2[0], d1[1]-d2[1]
    1.76 +        vld1.32         {d25},    [r1,:64], r8  @  d2[0,1]
    1.77 +        vadd.f32        d1,  d2,  d1            @ -d1[0]+d2[0], d1[1]+d2[1]
    1.78 +        veor            q3,  q12, q8            @ -d1[0],d1[1], d2[0],-d2[1]
    1.79 +        pld             [r0, #32]
    1.80 +        vmul.f32        q10, q0,  q9            @  ev.re, ev.im, od.im, od.re
    1.81 +        pld             [r1, #-32]
    1.82 +        vadd.f32        d0,  d24, d7            @  d1[0]+d2[0], d1[1]-d2[1]
    1.83 +        vadd.f32        d1,  d6,  d25           @ -d1[0]+d2[0], d1[1]+d2[1]
    1.84 +        vmul.f32        q11, q0,  q9            @  ev.re, ev.im, od.im, od.re
    1.85 +        veor            d7,  d21, d16           @ -od.im, od.re
    1.86 +        vrev64.32       d3,  d21                @  od.re, od.im
    1.87 +        veor            d6,  d20, d17           @  ev.re,-ev.im
    1.88 +        veor            d2,  d3,  d16           @ -od.re, od.im
    1.89 +        vmla.f32        d20, d3,  d4[1]
    1.90 +        vmla.f32        d20, d7,  d5[1]
    1.91 +        vmla.f32        d6,  d2,  d4[1]
    1.92 +        vmla.f32        d6,  d21, d5[1]
    1.93 +        vld1.32         {d4},     [r2,:64]!     @  tcos[i]
    1.94 +        veor            d7,  d23, d16           @ -od.im, od.re
    1.95 +        vld1.32         {d5},     [r3,:64]!     @  tsin[i]
    1.96 +        veor            d24, d22, d17           @  ev.re,-ev.im
    1.97 +        vrev64.32       d3,  d23                @  od.re, od.im
    1.98 +        pld             [r2, #32]
    1.99 +        veor            d2,  d3,  d16           @ -od.re, od.im
   1.100 +        pld             [r3, #32]
   1.101 +        vmla.f32        d22, d3,  d4[0]
   1.102 +        vmla.f32        d22, d7,  d5[0]
   1.103 +        vmla.f32        d24, d2,  d4[0]
   1.104 +        vmla.f32        d24, d23, d5[0]
   1.105 +        vld1.32         {d0},     [r0,:64]!     @  d1[0,1]
   1.106 +        vld1.32         {d1},     [r1,:64], r8  @  d2[0,1]
   1.107 +        vst1.32         {d20},    [r7,:64]!
   1.108 +        vst1.32         {d6},     [lr,:64], r8
   1.109 +        vst1.32         {d22},    [r7,:64]!
   1.110 +        vst1.32         {d24},    [lr,:64], r8
   1.111 +        subs            r12, r12, #2
   1.112 +        bgt             2b
   1.113 +
   1.114 +        veor            q1,  q0,  q8            @ -d1[0],d1[1], d2[0],-d2[1]
   1.115 +        vadd.f32        d0,  d0,  d3            @  d1[0]+d2[0], d1[1]-d2[1]
   1.116 +        vadd.f32        d1,  d2,  d1            @ -d1[0]+d2[0], d1[1]+d2[1]
   1.117 +        ldr             r2,  [r4, #8]           @  sign_convention
   1.118 +        vmul.f32        q10, q0,  q9            @  ev.re, ev.im, od.im, od.re
   1.119 +        add             r0,  r0,  #4
   1.120 +        bfc             r2,  #0,  #31
   1.121 +        vld1.32         {d0[0]},  [r0,:32]
   1.122 +        veor            d7,  d21, d16           @ -od.im, od.re
   1.123 +        vrev64.32       d3,  d21                @  od.re, od.im
   1.124 +        veor            d6,  d20, d17           @  ev.re,-ev.im
   1.125 +        vld1.32         {d22},    [r5,:64]
   1.126 +        vdup.32         d1,  r2
   1.127 +        vmov            d23, d22
   1.128 +        veor            d2,  d3,  d16           @ -od.re, od.im
   1.129 +        vtrn.32         d22, d23
   1.130 +        veor            d0,  d0,  d1
   1.131 +        veor            d23, d23, d17
   1.132 +        vmla.f32        d20, d3,  d4[1]
   1.133 +        vmla.f32        d20, d7,  d5[1]
   1.134 +        vmla.f32        d6,  d2,  d4[1]
   1.135 +        vmla.f32        d6,  d21, d5[1]
   1.136 +        vadd.f32        d22, d22, d23
   1.137 +        vst1.32         {d20},    [r7,:64]
   1.138 +        vst1.32         {d6},     [lr,:64]
   1.139 +        vst1.32         {d0[0]},  [r0,:32]
   1.140 +        vst1.32         {d22},    [r5,:64]
   1.141 +
   1.142 +        cmp             r6,  #0
   1.143 +        popeq           {r4-r8,pc}
   1.144 +
   1.145 +        vmul.f32        d22, d22, d18
   1.146 +        vst1.32         {d22},    [r5,:64]
   1.147 +        add             r0,  r4,  #20
   1.148 +        mov             r1,  r5
   1.149 +        bl              X(ff_fft_permute_neon)
   1.150 +        add             r0,  r4,  #20
   1.151 +        mov             r1,  r5
   1.152 +        pop             {r4-r8,lr}
   1.153 +        b               X(ff_fft_calc_neon)
   1.154 +endfunc