Home | History | Annotate | Download | only in ARMV7
      1 @/*
      2 @ ** Copyright 2003-2010, VisualOn, Inc.
      3 @ **
      4 @ ** Licensed under the Apache License, Version 2.0 (the "License");
      5 @ ** you may not use this file except in compliance with the License.
      6 @ ** You may obtain a copy of the License at
      7 @ **
      8 @ **     http://www.apache.org/licenses/LICENSE-2.0
      9 @ **
     10 @ ** Unless required by applicable law or agreed to in writing, software
     11 @ ** distributed under the License is distributed on an "AS IS" BASIS,
     12 @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 @ ** See the License for the specific language governing permissions and
     14 @ ** limitations under the License.
     15 @ */
     16 
     17 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     18 @	File:		Radix4FFT_v7.s
     19 @
     20 @	Content:	Radix4FFT armv7 assemble
     21 @
     22 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     23 
     24 	.section .text
     25 	.global	Radix4FFT
     26 	.fnstart
     27 
     28 Radix4FFT:
     29 	stmdb    sp!, {r4 - r11, lr}
     30 	.save	 {r4 - r11, lr}
     31 	fstmfdd  sp!, {d8 - d15}
     32 	.vsave	 {d8 - d15}
     33 
     34 	mov			r1, r1, asr #2
     35 	cmp     	r1, #0
     36 	beq     	Radix4FFT_END
     37 
     38 Radix4FFT_LOOP1:
     39 	mov     	r5, r2, lsl #1
     40 	mov     	r8, r0
     41 	mov     	r7, r1
     42 	mov     	r5, r5, lsl #2
     43 	cmp     	r1, #0
     44 	rsbeq   	r12, r5, r5, lsl #2
     45 	beq     	Radix4FFT_LOOP1_END
     46 
     47 	rsb     	r12, r5, r5, lsl #2
     48 
     49 Radix4FFT_LOOP2:
     50 	mov     	r6, r3
     51 	mov     	r4, r2
     52 	cmp     	r2, #0
     53 	beq     	Radix4FFT_LOOP2_END
     54 
     55 Radix4FFT_LOOP3:
     56 	@r0 = xptr[0]@
     57 	@r1 = xptr[1]@
     58 	VLD2.I32			{D0, D1, D2, D3}, [r8]
     59 	VLD2.I32			{D28, D29, D30, D31}, [r6]!		@ cosx = csptr[0]@ sinx = csptr[1]@
     60 
     61 	add					r8, r8, r5										@ xptr += step@
     62 	VLD2.I32			{D4, D5, D6,D7}, [r8]					@ r2 = xptr[0]@ r3 = xptr[1]@
     63 
     64 	VQDMULH.S32		Q10, Q2, Q14									@ MULHIGH(cosx, t0)
     65 	VQDMULH.S32		Q11, Q3, Q15									@ MULHIGH(sinx, t1)
     66 	VQDMULH.S32		Q12, Q3, Q14									@ MULHIGH(cosx, t1)
     67 	VQDMULH.S32		Q13, Q2, Q15									@ MULHIGH(sinx, t0)
     68 
     69 	VADD.S32			Q2, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
     70 	VSUB.S32			Q3, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
     71 
     72 	add					r8, r8, r5										@ xptr += step@
     73 	VSHR.S32			Q10, Q0, #2										@ t0 = r0 >> 2@
     74 	VSHR.S32			Q11, Q1, #2										@ t1 = r1 >> 2@
     75 
     76 	VSUB.S32			Q0,	Q10, Q2										@ r0 = t0 - r2@
     77 	VSUB.S32			Q1,	Q11, Q3										@ r1 = t1 - r3@
     78 	VADD.S32			Q2, Q10, Q2										@ r2 = t0 + r2@
     79 	VADD.S32			Q3, Q11, Q3										@ r3 = t1 + r3@
     80 
     81 	VLD2.I32			{D8, D9, D10, D11}, [r8]
     82 	VLD2.I32			{D28, D29, D30, D31}, [r6]!
     83 	add						r8, r8, r5
     84 
     85 	VQDMULH.S32		Q10, Q4, Q14									@ MULHIGH(cosx, t0)
     86 	VQDMULH.S32		Q11, Q5, Q15									@ MULHIGH(sinx, t1)
     87 	VQDMULH.S32		Q12, Q5, Q14									@ MULHIGH(cosx, t1)
     88 	VQDMULH.S32		Q13, Q4, Q15									@ MULHIGH(sinx, t0)
     89 
     90 	VADD.S32			Q8, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
     91 	VSUB.S32			Q9, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
     92 
     93 	VLD2.I32		{D12, D13, D14, D15}, [r8]
     94 	VLD2.I32		{D28, D29, D30, D31}, [r6]!
     95 
     96 	VQDMULH.S32		Q10, Q6, Q14									@ MULHIGH(cosx, t0)
     97 	VQDMULH.S32		Q11, Q7, Q15									@ MULHIGH(sinx, t1)
     98 	VQDMULH.S32		Q12, Q7, Q14									@ MULHIGH(cosx, t1)
     99 	VQDMULH.S32		Q13, Q6, Q15									@ MULHIGH(sinx, t0)
    100 
    101 	VADD.S32			Q6, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
    102 	VSUB.S32			Q7, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
    103 
    104 	VADD.S32			Q4, Q8, Q6										@ r4 = t0 + r6@
    105 	VSUB.S32			Q5, Q7, Q9										@ r5 = r7 - t1@
    106 	VSUB.S32			Q6, Q8, Q6										@ r6 = t0 - r6@
    107 	VADD.S32			Q7, Q7, Q9										@ r7 = r7 + t1@
    108 
    109 	VADD.S32			Q8, Q0, Q5										@ xptr[0] = r0 + r5@
    110 	VADD.S32			Q9, Q1, Q6										@ xptr[1] = r1 + r6@
    111 	VST2.I32			{D16, D17, D18, D19}, [r8]
    112 
    113 	VSUB.S32			Q10, Q2, Q4										@ xptr[0] = r2 - r4@
    114 	sub					r8, r8, r5										@ xptr -= step@
    115 	VSUB.S32			Q11, Q3, Q7										@ xptr[1] = r3 - r7@
    116 	VST2.I32			{D20, D21, D22, D23}, [r8]
    117 
    118 	VSUB.S32			Q8, Q0, Q5										@ xptr[0] = r0 - r5@
    119 	sub					r8, r8, r5										@ xptr -= step@
    120 	VSUB.S32			Q9, Q1, Q6										@ xptr[1] = r1 - r6@
    121 	VST2.I32			{D16, D17, D18, D19}, [r8]
    122 
    123 	VADD.S32			Q10, Q2, Q4										@ xptr[0] = r2 + r4@
    124 	sub					r8, r8, r5										@ xptr -= step@
    125 	VADD.S32			Q11, Q3, Q7										@ xptr[1] = r3 + r7@
    126 	VST2.I32			{D20, D21, D22, D23}, [r8]!
    127 
    128 	subs    			r4, r4, #4
    129 	bne     			Radix4FFT_LOOP3
    130 
    131 Radix4FFT_LOOP2_END:
    132 	add     			r8, r8, r12
    133 	sub    				r7, r7, #1
    134 	cmp					r7, #0
    135 	bhi     			Radix4FFT_LOOP2
    136 
    137 Radix4FFT_LOOP1_END:
    138 	add     			r3, r12, r3
    139 	mov     			r2, r2, lsl #2
    140 	movs    			r1, r1, asr #2
    141 	bne     			Radix4FFT_LOOP1
    142 
    143 Radix4FFT_END:
    144 	fldmfdd   			sp!, {d8 - d15}
    145 	ldmia   			sp!, {r4 - r11, pc}
    146 
    147 	@ENDP  @ |Radix4FFT|
    148 	.fnend
    149