summaryrefslogtreecommitdiffstats
path: root/src/neon.s
diff options
context:
space:
mode:
authorAnthony Blake <anthonix@me.com>2012-08-20 15:26:47 +1200
committerAnthony Blake <anthonix@me.com>2012-08-20 15:26:47 +1200
commit7877c36f6fc90bb88c8b81a05e66c0f48bf3ca02 (patch)
tree1d36e795f6fce05e40fa00b380c6f7688b8cc5ba /src/neon.s
parent81023395c68710f8732a22ac46b511bce64e012b (diff)
downloadffts-7877c36f6fc90bb88c8b81a05e66c0f48bf3ca02.zip
ffts-7877c36f6fc90bb88c8b81a05e66c0f48bf3ca02.tar.gz
Full custom FFT32 works
Diffstat (limited to 'src/neon.s')
-rw-r--r--src/neon.s304
1 files changed, 291 insertions, 13 deletions
diff --git a/src/neon.s b/src/neon.s
index bbcd0c7..b998c38 100644
--- a/src/neon.s
+++ b/src/neon.s
@@ -1,8 +1,7 @@
.globl _neon_x4
- .align 2
+ .align 4
_neon_x4:
- push {r4,r5,r6}
add r3, r0, #0
add r4, r3, r1, lsl #1
add r5, r3, r1, lsl #2
@@ -40,13 +39,11 @@ _neon_x4:
vst1.32 {q2,q3}, [r4, :128]
vst1.32 {q4,q5}, [r5, :128]
vst1.32 {q6,q7}, [r6, :128]
- pop {r4,r5,r6}
bx lr
.globl _neon_x8
- .align 2
+ .align 4
_neon_x8:
- push {r4,r5,r6,r7,r8,r9,r10,r11}
mov r11, #0
add r3, r0, #0 @ data0
add r5, r0, r1, lsl #1 @ data2
@@ -59,7 +56,7 @@ _neon_x8:
add r12, r2, #0 @ LUT
sub r11, r11, r1, lsr #5
-
+ nop
neon_x8_loop:
vld1.32 {q10,q11}, [r5, :128]
vld1.32 {q12,q13}, [r4, :128]
@@ -149,14 +146,11 @@ neon_x8_loop:
vst1.32 {q6,q7}, [r10, :128]!
bne neon_x8_loop
- pop {r4,r5,r6,r7,r8,r9,r10,r11}
bx lr
.globl _neon_x8_t
- .align 2
+ .align 4
_neon_x8_t:
- push {r4,r5,r6,r7,r8,r9,r10,r11}
-
mov r11, #0
add r3, r0, #0 @ data0
add r5, r0, r1, lsl #1 @ data2
@@ -169,6 +163,7 @@ _neon_x8_t:
add r12, r2, #0 @ LUT
sub r11, r11, r1, lsr #5
+ nop
neon_x8_t_loop:
vld1.32 {q10,q11}, [r5, :128]
vld1.32 {q12,q13}, [r4, :128]
@@ -258,10 +253,293 @@ neon_x8_t_loop:
vst2.32 {q6,q7}, [r10, :128]!
bne neon_x8_t_loop
- pop {r4,r5,r6,r7,r8,r9,r10,r11}
- bx lr
+ @bx lr
+
+@ assumes r0 = out
+@
+@ r12 = offsets
+@ r3-r10 = data pointers
+@ r11 = loop iterations
+@ r2 & lr = temps
+ .globl _neon_ee
+ .align 4
+_neon_ee:
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_loop:
+ ldr r2, [r12], #4
+ ldr lr, [r12], #4
+ add r2, r0, r2, lsl #2
+ add lr, r0, lr, lsl #2
+ vld2.32 {q15}, [r10, :128]!
+ vld2.32 {q13}, [r8, :128]!
+ vld2.32 {q14}, [r7, :128]!
+ vld2.32 {q9}, [r4, :128]!
+ vld2.32 {q10}, [r3, :128]!
+ vld2.32 {q11}, [r6, :128]!
+ vld2.32 {q12}, [r5, :128]!
+ subs r11, r11, #1
+ vsub.f32 q1, q14, q13
+ vld2.32 {q0}, [r9, :128]!
+ vsub.f32 q2, q0, q15
+ vadd.f32 q0, q0, q15
+ vmul.f32 d10, d2, d17
+ vmul.f32 d11, d3, d16
+ vmul.f32 d12, d3, d17
+ vmul.f32 d6, d4, d17
+ vmul.f32 d7, d5, d16
+ vmul.f32 d8, d4, d16
+ vmul.f32 d9, d5, d17
+ vmul.f32 d13, d2, d16
+ vsub.f32 d7, d7, d6
+ vadd.f32 d11, d11, d10
+ vsub.f32 q1, q12, q11
+ vsub.f32 q2, q10, q9
+ vadd.f32 d6, d9, d8
+ vadd.f32 q4, q14, q13
+ vadd.f32 q11, q12, q11
+ vadd.f32 q12, q10, q9
+ vsub.f32 d10, d13, d12
+ vsub.f32 q7, q4, q0
+ vsub.f32 q9, q12, q11
+ vsub.f32 q13, q5, q3
+ vsub.f32 d29, d5, d2
+ vadd.f32 q5, q5, q3
+ vadd.f32 q10, q4, q0
+ vadd.f32 q11, q12, q11
+ vadd.f32 d31, d5, d2
+ vadd.f32 d28, d4, d3
+ vsub.f32 d30, d4, d3
+ vsub.f32 d5, d19, d14
+ vsub.f32 d7, d31, d26
+ vadd.f32 q1, q14, q5
+ vadd.f32 q0, q11, q10
+ vadd.f32 d6, d30, d27
+ vadd.f32 d4, d18, d15
+ vadd.f32 d13, d19, d14
+ vsub.f32 d12, d18, d15
+ vadd.f32 d15, d31, d26
+ vtrn.32 q1, q3
+ vtrn.32 q0, q2
+ vsub.f32 q4, q11, q10
+ vsub.f32 q5, q14, q5
+ vsub.f32 d14, d30, d27
+ vst2.32 {q0,q1}, [r2, :128]!
+ vst2.32 {q2,q3}, [lr, :128]!
+ vtrn.32 q4, q6
+ vtrn.32 q5, q7
+ vst2.32 {q4,q5}, [r2, :128]!
+ vst2.32 {q6,q7}, [lr, :128]!
+
+@ assumes r0 = out
+@
+@ r12 = offsets
+@ r3-r10 = data pointers
+@ r11 = loop iterations
+@ r2 & lr = temps
+ .globl _neon_oo
+ .align 4
+_neon_oo:
+ vld2.32 {q8}, [r6, :128]!
+ vld2.32 {q9}, [r5, :128]!
+ vld2.32 {q10}, [r4, :128]!
+ vld2.32 {q13}, [r3, :128]!
+ vadd.f32 q11, q9, q8
+ vsub.f32 q8, q9, q8
+ vsub.f32 q9, q13, q10
+ vadd.f32 q12, q13, q10
+ vld2.32 {q10}, [r7, :128]!
+ vld2.32 {q13}, [r9, :128]!
+ vsub.f32 q2, q12, q11
+ vadd.f32 d7, d19, d16
+ vsub.f32 d3, d19, d16
+ vsub.f32 d6, d18, d17
+ vadd.f32 d2, d18, d17
+ vld2.32 {q9}, [r8, :128]!
+ vld2.32 {q8}, [r10, :128]!
+ vadd.f32 q0, q12, q11
+ vadd.f32 q11, q13, q8
+ vadd.f32 q12, q10, q9
+ vsub.f32 q8, q13, q8
+ vsub.f32 q9, q10, q9
+ vsub.f32 q6, q12, q11
+ vadd.f32 q4, q12, q11
+ vtrn.32 q0, q2
+ ldr r2, [r12]!
+ ldr lr, [r12]!
+ vadd.f32 d15, d19, d16
+ vsub.f32 d11, d19, d16
+ vsub.f32 d14, d18, d17
+ vadd.f32 d10, d18, d17
+ add r2, r0, r2, lsl #2
+ add lr, r0, lr, lsl #2
+ vtrn.32 q1, q3
+ vst2.32 {q0,q1}, [r2, :128]!
+ vst2.32 {q2,q3}, [lr, :128]!
+ vtrn.32 q4, q6
+ vtrn.32 q5, q7
+ vst2.32 {q4,q5}, [r2, :128]!
+ vst2.32 {q6,q7}, [lr, :128]!
+
+@ assumes r0 = out
+@
+@ r12 = offsets
+@ r3-r10 = data pointers
+@ r11 = addr of twiddle
+@ r2 & lr = temps
+ .globl _neon_eo
+ .align 4
+_neon_eo:
+ vld2.32 {q9}, [r5, :128]! @tag2
+ vld2.32 {q13}, [r3, :128]! @tag0
+ vld2.32 {q12}, [r4, :128]! @tag1
+ vld2.32 {q0}, [r7, :128]! @tag4
+ vsub.f32 q11, q13, q12
+ vld2.32 {q8}, [r6, :128]! @tag3
+ vadd.f32 q12, q13, q12
+ vsub.f32 q10, q9, q8
+ vadd.f32 q8, q9, q8
+ vadd.f32 q9, q12, q8
+ vsub.f32 d9, d23, d20
+ vadd.f32 d11, d23, d20
+ vsub.f32 q8, q12, q8
+ vadd.f32 d8, d22, d21
+ vsub.f32 d10, d22, d21
+ ldr r2, [r12]!
+ ldr lr, [r12]!
+ vld1.32 {d20, d21}, [r11, :128]
+ vtrn.32 q9, q4
+ vtrn.32 q8, q5
+ vswp d9,d10
+ add r2, r0, r2, lsl #2
+ add lr, r0, lr, lsl #2
+ vst1.32 {d8,d9,d10,d11}, [r2, :128]!
+ vld2.32 {q13}, [r10, :128]! @tag7
+ vld2.32 {q15}, [r9, :128]! @tag6
+ vld2.32 {q11}, [r8, :128]! @tag5
+ vsub.f32 q14, q15, q13
+ vsub.f32 q12, q0, q11
+ vadd.f32 q11, q0, q11
+ vadd.f32 q13, q15, q13
+ vsub.f32 d13, d29, d24
+ vadd.f32 q15, q13, q11
+ vadd.f32 d12, d28, d25
+ vadd.f32 d15, d29, d24
+ vsub.f32 d14, d28, d25
+ vtrn.32 q15, q6
+ vsub.f32 q15, q13, q11
+ vtrn.32 q15, q7
+ vswp d13, d14
+ vst1.32 {d12,d13,d14,d15}, [r2, :128]!
+ vtrn.32 q13, q14
+ vtrn.32 q11, q12
+ vmul.f32 d24, d26, d21
+ vmul.f32 d28, d27, d20
+ vmul.f32 d25, d26, d20
+ vmul.f32 d26, d27, d21
+ vmul.f32 d27, d22, d21
+ vmul.f32 d30, d23, d20
+ vmul.f32 d29, d23, d21
+ vmul.f32 d22, d22, d20
+ vsub.f32 d21, d28, d24
+ vadd.f32 d20, d26, d25
+ vadd.f32 d25, d30, d27
+ vsub.f32 d24, d22, d29
+ vadd.f32 q11, q12, q10
+ vsub.f32 q10, q12, q10
+ vadd.f32 q0, q9, q11
+ vsub.f32 q2, q9, q11
+ vsub.f32 d3, d17, d20
+ vadd.f32 d7, d17, d20
+ vadd.f32 d2, d16, d21
+ vsub.f32 d6, d16, d21
+ vswp d1, d2
+ vswp d5, d6
+ vstmia lr!, {q0-q3}
+
+
+@ assumes r0 = out
+@
+@ r12 = offsets
+@ r3-r10 = data pointers
+@ r11 = addr of twiddle
+@ r2 & lr = temps
+ .globl _neon_oe
+ .align 4
+_neon_oe:
+ vld1.32 {q8}, [r5, :128]!
+ vld1.32 {q10}, [r6, :128]!
+ vld2.32 {q11}, [r4, :128]!
+ vld2.32 {q13}, [r3, :128]!
+ vld2.32 {q15}, [r10, :128]!
+ vorr d25, d17, d17
+ vorr d24, d20, d20
+ vorr d20, d16, d16
+ vsub.f32 q9, q13, q11
+ vadd.f32 q11, q13, q11
+ ldr r2, [r12], #4
+ ldr lr, [r12], #4
+ vtrn.32 d24, d25
+ vtrn.32 d20, d21
+ add r2, r0, r2, lsl #2
+ add lr, r0, lr, lsl #2
+ vsub.f32 q8, q10, q12
+ vadd.f32 q10, q10, q12
+ vadd.f32 q0, q11, q10
+ vsub.f32 d25, d19, d16
+ vadd.f32 d27, d19, d16
+ vsub.f32 q1, q11, q10
+ vadd.f32 d24, d18, d17
+ vsub.f32 d26, d18, d17
+ vtrn.32 q0, q12
+ vtrn.32 q1, q13
+ vld1.32 {d24, d25}, [r11, :128]
+ vswp d1, d2
+ vst1.32 {q0, q1}, [r2, :128]!
+ vld2.32 {q0}, [r9, :128]!
+ vadd.f32 q1, q0, q15
+ vld2.32 {q13}, [r8, :128]!
+ vld2.32 {q14}, [r7, :128]!
+ vsub.f32 q15, q0, q15
+ vsub.f32 q0, q14, q13
+ vadd.f32 q3, q14, q13
+ vadd.f32 q2, q3, q1
+ vsub.f32 d29, d1, d30
+ vadd.f32 d27, d1, d30
+ vsub.f32 q3, q3, q1
+ vadd.f32 d28, d0, d31
+ vsub.f32 d26, d0, d31
+ vtrn.32 q2, q14
+ vtrn.32 q3, q13
+ vswp d5, d6
+ vst1.32 {q2, q3}, [r2, :128]!
+ vtrn.32 q11, q9
+ vtrn.32 q10, q8
+ vmul.f32 d20, d18, d25
+ vmul.f32 d22, d19, d24
+ vmul.f32 d21, d19, d25
+ vmul.f32 d18, d18, d24
+ vmul.f32 d19, d16, d25
+ vmul.f32 d30, d17, d24
+ vmul.f32 d23, d16, d24
+ vmul.f32 d24, d17, d25
+ vadd.f32 d17, d22, d20
+ vsub.f32 d16, d18, d21
+ vsub.f32 d21, d30, d19
+ vadd.f32 d20, d24, d23
+ vadd.f32 q9, q8, q10
+ vsub.f32 q8, q8, q10
+ vadd.f32 q4, q14, q9
+ vsub.f32 q6, q14, q9
+ vsub.f32 d11, d27, d16
+ vadd.f32 d15, d27, d16
+ vadd.f32 d10, d26, d17
+ vsub.f32 d14, d26, d17
+ vswp d9, d10
+ vswp d13, d14
+ vstmia lr!, {q4-q7}
+
.globl _neon_end
- .align 2
+ .align 4
_neon_end:
bx lr
OpenPOWER on IntegriCloud