mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	 0780ad9c68
			
		
	
	0780ad9c68
	
	
	
		
			
			It is redundant with costable. The first half of sintable is identical with the second half of costable. The second half of sintable is negative value of the first half of sintable. The computation is changed to handle sign of sin values, in C code and ARM assembly code. Signed-off-by: Muhammad Faiz <mfcc64@gmail.com>
		
			
				
	
	
		
			156 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * ARM NEON optimised RDFT
 | |
|  * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
 | |
|  *
 | |
|  * This file is part of FFmpeg.
 | |
|  *
 | |
|  * FFmpeg is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2.1 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * FFmpeg is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with FFmpeg; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| #include "libavutil/arm/asm.S"
 | |
| 
 | |
| function ff_rdft_calc_neon, export=1
 | |
|         push            {r4-r8,lr}
 | |
| 
 | |
|         ldr             r6,  [r0, #4]           @ inverse
 | |
|         mov             r4,  r0
 | |
|         mov             r5,  r1
 | |
| 
 | |
|         lsls            r6,  r6,  #31
 | |
|         bne             1f
 | |
|         add             r0,  r4,  #24
 | |
|         bl              X(ff_fft_permute_neon)
 | |
|         add             r0,  r4,  #24
 | |
|         mov             r1,  r5
 | |
|         bl              X(ff_fft_calc_neon)
 | |
| 1:
 | |
|         ldr             r12, [r4, #0]           @ nbits
 | |
|         mov             r2,  #1
 | |
|         ldr             r8,  [r4, #20]          @ negative_sin
 | |
|         lsl             r12, r2,  r12
 | |
|         add             r0,  r5,  #8
 | |
|         lsl             r8,  r8,  #31
 | |
|         add             r1,  r5,  r12, lsl #2
 | |
|         lsr             r12, r12, #2
 | |
|         vdup.32         d26, r8
 | |
|         ldr             r2,  [r4, #12]          @ tcos
 | |
|         sub             r12, r12, #2
 | |
|         ldr             r3,  [r4, #16]          @ tsin
 | |
|         mov             r7,  r0
 | |
|         sub             r1,  r1,  #8
 | |
|         mov             lr,  r1
 | |
|         mov             r8,  #-8
 | |
|         vld1.32         {d0},     [r0,:64]!     @ d1[0,1]
 | |
|         vld1.32         {d1},     [r1,:64], r8  @ d2[0,1]
 | |
|         vld1.32         {d4},     [r2,:64]!     @ tcos[i]
 | |
|         vld1.32         {d5},     [r3,:64]!     @ tsin[i]
 | |
|         vmov.f32        d18, #0.5               @ k1
 | |
|         vdup.32         d19, r6
 | |
|         veor            d5,  d26, d5
 | |
|         pld             [r0, #32]
 | |
|         veor            d19, d18, d19           @ k2
 | |
|         vmov.i32        d16, #0
 | |
|         vmov.i32        d17, #1<<31
 | |
|         pld             [r1, #-32]
 | |
|         vtrn.32         d16, d17
 | |
|         pld             [r2, #32]
 | |
|         vrev64.32       d16, d16                @ d16=1,0 d17=0,1
 | |
|         pld             [r3, #32]
 | |
| 2:
 | |
|         veor            q1,  q0,  q8            @ -d1[0],d1[1], d2[0],-d2[1]
 | |
|         vld1.32         {d24},    [r0,:64]!     @  d1[0,1]
 | |
|         vadd.f32        d0,  d0,  d3            @  d1[0]+d2[0], d1[1]-d2[1]
 | |
|         vld1.32         {d25},    [r1,:64], r8  @  d2[0,1]
 | |
|         vadd.f32        d1,  d2,  d1            @ -d1[0]+d2[0], d1[1]+d2[1]
 | |
|         veor            q3,  q12, q8            @ -d1[0],d1[1], d2[0],-d2[1]
 | |
|         pld             [r0, #32]
 | |
|         vmul.f32        q10, q0,  q9            @  ev.re, ev.im, od.im, od.re
 | |
|         pld             [r1, #-32]
 | |
|         vadd.f32        d0,  d24, d7            @  d1[0]+d2[0], d1[1]-d2[1]
 | |
|         vadd.f32        d1,  d6,  d25           @ -d1[0]+d2[0], d1[1]+d2[1]
 | |
|         vmul.f32        q11, q0,  q9            @  ev.re, ev.im, od.im, od.re
 | |
|         veor            d7,  d21, d16           @ -od.im, od.re
 | |
|         vrev64.32       d3,  d21                @  od.re, od.im
 | |
|         veor            d6,  d20, d17           @  ev.re,-ev.im
 | |
|         veor            d2,  d3,  d16           @ -od.re, od.im
 | |
|         vmla.f32        d20, d3,  d4[1]
 | |
|         vmla.f32        d20, d7,  d5[1]
 | |
|         vmla.f32        d6,  d2,  d4[1]
 | |
|         vmla.f32        d6,  d21, d5[1]
 | |
|         vld1.32         {d4},     [r2,:64]!     @  tcos[i]
 | |
|         veor            d7,  d23, d16           @ -od.im, od.re
 | |
|         vld1.32         {d5},     [r3,:64]!     @  tsin[i]
 | |
|         veor            d24, d22, d17           @  ev.re,-ev.im
 | |
|         vrev64.32       d3,  d23                @  od.re, od.im
 | |
|         veor            d5, d26, d5
 | |
|         pld             [r2, #32]
 | |
|         veor            d2,  d3,  d16           @ -od.re, od.im
 | |
|         pld             [r3, #32]
 | |
|         vmla.f32        d22, d3,  d4[0]
 | |
|         vmla.f32        d22, d7,  d5[0]
 | |
|         vmla.f32        d24, d2,  d4[0]
 | |
|         vmla.f32        d24, d23, d5[0]
 | |
|         vld1.32         {d0},     [r0,:64]!     @  d1[0,1]
 | |
|         vld1.32         {d1},     [r1,:64], r8  @  d2[0,1]
 | |
|         vst1.32         {d20},    [r7,:64]!
 | |
|         vst1.32         {d6},     [lr,:64], r8
 | |
|         vst1.32         {d22},    [r7,:64]!
 | |
|         vst1.32         {d24},    [lr,:64], r8
 | |
|         subs            r12, r12, #2
 | |
|         bgt             2b
 | |
| 
 | |
|         veor            q1,  q0,  q8            @ -d1[0],d1[1], d2[0],-d2[1]
 | |
|         vadd.f32        d0,  d0,  d3            @  d1[0]+d2[0], d1[1]-d2[1]
 | |
|         vadd.f32        d1,  d2,  d1            @ -d1[0]+d2[0], d1[1]+d2[1]
 | |
|         ldr             r2,  [r4, #8]           @  sign_convention
 | |
|         vmul.f32        q10, q0,  q9            @  ev.re, ev.im, od.im, od.re
 | |
|         add             r0,  r0,  #4
 | |
|         bfc             r2,  #0,  #31
 | |
|         vld1.32         {d0[0]},  [r0,:32]
 | |
|         veor            d7,  d21, d16           @ -od.im, od.re
 | |
|         vrev64.32       d3,  d21                @  od.re, od.im
 | |
|         veor            d6,  d20, d17           @  ev.re,-ev.im
 | |
|         vld1.32         {d22},    [r5,:64]
 | |
|         vdup.32         d1,  r2
 | |
|         vmov            d23, d22
 | |
|         veor            d2,  d3,  d16           @ -od.re, od.im
 | |
|         vtrn.32         d22, d23
 | |
|         veor            d0,  d0,  d1
 | |
|         veor            d23, d23, d17
 | |
|         vmla.f32        d20, d3,  d4[1]
 | |
|         vmla.f32        d20, d7,  d5[1]
 | |
|         vmla.f32        d6,  d2,  d4[1]
 | |
|         vmla.f32        d6,  d21, d5[1]
 | |
|         vadd.f32        d22, d22, d23
 | |
|         vst1.32         {d20},    [r7,:64]
 | |
|         vst1.32         {d6},     [lr,:64]
 | |
|         vst1.32         {d0[0]},  [r0,:32]
 | |
|         vst1.32         {d22},    [r5,:64]
 | |
| 
 | |
|         cmp             r6,  #0
 | |
|         it              eq
 | |
|         popeq           {r4-r8,pc}
 | |
| 
 | |
|         vmul.f32        d22, d22, d18
 | |
|         vst1.32         {d22},    [r5,:64]
 | |
|         add             r0,  r4,  #24
 | |
|         mov             r1,  r5
 | |
|         bl              X(ff_fft_permute_neon)
 | |
|         add             r0,  r4,  #24
 | |
|         mov             r1,  r5
 | |
|         pop             {r4-r8,lr}
 | |
|         b               X(ff_fft_calc_neon)
 | |
| endfunc
 |