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 28Radix4FFT: 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 38Radix4FFT_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 49Radix4FFT_LOOP2: 50 mov r6, r3 51 mov r4, r2 52 cmp r2, #0 53 beq Radix4FFT_LOOP2_END 54 55Radix4FFT_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 131Radix4FFT_LOOP2_END: 132 add r8, r8, r12 133 sub r7, r7, #1 134 cmp r7, #0 135 bhi Radix4FFT_LOOP2 136 137Radix4FFT_LOOP1_END: 138 add r3, r12, r3 139 mov r2, r2, lsl #2 140 movs r1, r1, asr #2 141 bne Radix4FFT_LOOP1 142 143Radix4FFT_END: 144 fldmfdd sp!, {d8 - d15} 145 ldmia sp!, {r4 - r11, pc} 146 147 @ENDP @ |Radix4FFT| 148 .fnend 149