diff options
Diffstat (limited to 'lib/ffts/src/neon.s')
-rw-r--r-- | lib/ffts/src/neon.s | 738 |
1 files changed, 738 insertions, 0 deletions
diff --git a/lib/ffts/src/neon.s b/lib/ffts/src/neon.s new file mode 100644 index 0000000..6995066 --- /dev/null +++ b/lib/ffts/src/neon.s @@ -0,0 +1,738 @@ +/* + + This file is part of FFTS -- The Fastest Fourier Transform in the South + + Copyright (c) 2012, Anthony M. Blake <amb@anthonix.com> + Copyright (c) 2012, The University of Waikato + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the organization nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL ANTHONY M. BLAKE BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + .align 4 +#ifdef __APPLE__ + .globl _neon_x4 +_neon_x4: +#else + .globl neon_x4 +neon_x4: +#endif +@ add r3, r0, #0 + + vld1.32 {q8,q9}, [r0, :128] + add r4, r0, r1, lsl #1 + vld1.32 {q10,q11}, [r4, :128] + add r5, r0, r1, lsl #2 + vld1.32 {q12,q13}, [r5, :128] + add r6, r4, r1, lsl #2 + vld1.32 {q14,q15}, [r6, :128] + vld1.32 {q2,q3}, [r2, :128] + + vmul.f32 q0, q13, q3 + vmul.f32 q5, q12, q2 + vmul.f32 q1, q14, q2 + vmul.f32 q4, q14, q3 + vmul.f32 q14, q12, q3 + vmul.f32 q13, q13, q2 + vmul.f32 q12, q15, q3 + vmul.f32 q2, q15, q2 + vsub.f32 q0, q5, q0 + vadd.f32 q13, q13, q14 + vadd.f32 q12, q12, q1 + vsub.f32 q1, q2, q4 + vadd.f32 q15, q0, q12 + vsub.f32 q12, q0, q12 + vadd.f32 q14, q13, q1 + vsub.f32 q13, q13, q1 + vadd.f32 q0, q8, q15 + vadd.f32 q1, q9, q14 + vsub.f32 q2, q10, q13 @ + vsub.f32 q4, q8, q15 + vadd.f32 q3, q11, q12 @ + vst1.32 {q0,q1}, [r0, :128] + vsub.f32 q5, q9, q14 + vadd.f32 q6, q10, q13 @ + vsub.f32 q7, q11, q12 @ + vst1.32 {q2,q3}, [r4, :128] + vst1.32 {q4,q5}, [r5, :128] + vst1.32 {q6,q7}, [r6, :128] + bx lr + + .align 4 +#ifdef __APPLE__ + .globl _neon_x8 +_neon_x8: +#else + .globl neon_x8 +neon_x8: +#endif + mov r11, #0 + add r3, r0, #0 @ data0 + add r5, r0, r1, lsl #1 @ data2 + add r4, r0, r1 @ data1 + add r7, r5, r1, lsl #1 @ data4 + add r6, r5, r1 @ data3 + add r9, r7, r1, lsl #1 @ data6 + add r8, r7, r1 @ data5 + add r10, r9, r1 @ data7 + add r12, r2, #0 @ LUT + + sub r11, r11, r1, lsr #5 +neon_x8_loop: + vld1.32 {q2,q3}, [r12, :128]! + vld1.32 {q14,q15}, [r6, :128] + vld1.32 {q10,q11}, [r5, :128] + adds r11, r11, #1 + vmul.f32 q12, q15, q2 + vmul.f32 q8, q14, q3 + vmul.f32 q13, q14, q2 + vmul.f32 q9, q10, q3 + vmul.f32 q1, q10, q2 + vmul.f32 q0, q11, q2 + vmul.f32 q14, q11, q3 + vmul.f32 q15, q15, q3 + vld1.32 {q2,q3}, [r12, :128]! + vsub.f32 q10, q12, q8 + vadd.f32 q11, q0, q9 + vadd.f32 q8, q15, q13 + vld1.32 {q12,q13}, [r4, :128] + vsub.f32 q9, q1, q14 + vsub.f32 q15, q11, q10 + vsub.f32 q14, q9, q8 + vsub.f32 q4, q12, q15 @ + vadd.f32 q6, q12, q15 @ + vadd.f32 q5, q13, q14 @ + vsub.f32 q7, q13, q14 @ + vld1.32 {q14,q15}, [r9, :128] + vld1.32 {q12,q13}, [r7, :128] + vmul.f32 q1, q14, q2 + vmul.f32 q0, q14, q3 + vst1.32 {q4,q5}, [r4, :128] + vmul.f32 q14, q15, q3 + vmul.f32 q4, q15, q2 + vadd.f32 q15, q9, q8 + vst1.32 {q6,q7}, [r6, :128] + vmul.f32 q8, q12, q3 + vmul.f32 q5, q13, q3 + vmul.f32 q12, q12, q2 + vmul.f32 q9, q13, q2 + vadd.f32 q14, q14, q1 + vsub.f32 q13, q4, q0 + vadd.f32 q0, q9, q8 + vld1.32 {q8,q9}, [r3, :128] + vadd.f32 q1, q11, q10 + vsub.f32 q12, q12, q5 + vadd.f32 q11, q8, q15 + vsub.f32 q8, q8, q15 + vadd.f32 q2, q12, q14 + vsub.f32 q10, q0, q13 + vadd.f32 q15, q0, q13 + vadd.f32 q13, q9, q1 + vsub.f32 q9, q9, q1 + vsub.f32 q12, q12, q14 + vadd.f32 q0, q11, q2 + vadd.f32 q1, q13, q15 + vsub.f32 q4, q11, q2 + vsub.f32 q2, q8, q10 @ + vadd.f32 q3, q9, q12 @ + vst1.32 {q0,q1}, [r3, :128]! + vsub.f32 q5, q13, q15 + vld1.32 {q14,q15}, [r10, :128] + vsub.f32 q7, q9, q12 @ + vld1.32 {q12,q13}, [r8, :128] + vst1.32 {q2,q3}, [r5, :128]! + vld1.32 {q2,q3}, [r12, :128]! + vadd.f32 q6, q8, q10 @ + vmul.f32 q8, q14, q2 + vst1.32 {q4,q5}, [r7, :128]! + vmul.f32 q10, q15, q3 + vmul.f32 q9, q13, q3 + vmul.f32 q11, q12, q2 + vmul.f32 q14, q14, q3 + vst1.32 {q6,q7}, [r9, :128]! + vmul.f32 q15, q15, q2 + vmul.f32 q12, q12, q3 + vmul.f32 q13, q13, q2 + vadd.f32 q10, q10, q8 + vsub.f32 q11, q11, q9 + vld1.32 {q8,q9}, [r4, :128] + vsub.f32 q14, q15, q14 + vadd.f32 q15, q13, q12 + vadd.f32 q13, q11, q10 + vadd.f32 q12, q15, q14 + vsub.f32 q15, q15, q14 + vsub.f32 q14, q11, q10 + vld1.32 {q10,q11}, [r6, :128] + vadd.f32 q0, q8, q13 + vadd.f32 q1, q9, q12 + vsub.f32 q2, q10, q15 @ + vadd.f32 q3, q11, q14 @ + vsub.f32 q4, q8, q13 + vst1.32 {q0,q1}, [r4, :128]! + vsub.f32 q5, q9, q12 + vadd.f32 q6, q10, q15 @ + vst1.32 {q2,q3}, [r6, :128]! + vsub.f32 q7, q11, q14 @ + vst1.32 {q4,q5}, [r8, :128]! + vst1.32 {q6,q7}, [r10, :128]! + bne neon_x8_loop + + bx lr + + .align 4 +#ifdef __APPLE__ + .globl _neon_x8_t +_neon_x8_t: +#else + .globl neon_x8_t +neon_x8_t: +#endif + mov r11, #0 + add r3, r0, #0 @ data0 + add r5, r0, r1, lsl #1 @ data2 + add r4, r0, r1 @ data1 + add r7, r5, r1, lsl #1 @ data4 + add r6, r5, r1 @ data3 + add r9, r7, r1, lsl #1 @ data6 + add r8, r7, r1 @ data5 + add r10, r9, r1 @ data7 + add r12, r2, #0 @ LUT + + sub r11, r11, r1, lsr #5 +neon_x8_t_loop: + vld1.32 {q2,q3}, [r12, :128]! + vld1.32 {q14,q15}, [r6, :128] + vld1.32 {q10,q11}, [r5, :128] + adds r11, r11, #1 + vmul.f32 q12, q15, q2 + vmul.f32 q8, q14, q3 + vmul.f32 q13, q14, q2 + vmul.f32 q9, q10, q3 + vmul.f32 q1, q10, q2 + vmul.f32 q0, q11, q2 + vmul.f32 q14, q11, q3 + vmul.f32 q15, q15, q3 + vld1.32 {q2,q3}, [r12, :128]! + vsub.f32 q10, q12, q8 + vadd.f32 q11, q0, q9 + vadd.f32 q8, q15, q13 + vld1.32 {q12,q13}, [r4, :128] + vsub.f32 q9, q1, q14 + vsub.f32 q15, q11, q10 + vsub.f32 q14, q9, q8 + vsub.f32 q4, q12, q15 @ + vadd.f32 q6, q12, q15 @ + vadd.f32 q5, q13, q14 @ + vsub.f32 q7, q13, q14 @ + vld1.32 {q14,q15}, [r9, :128] + vld1.32 {q12,q13}, [r7, :128] + vmul.f32 q1, q14, q2 + vmul.f32 q0, q14, q3 + vst1.32 {q4,q5}, [r4, :128] + vmul.f32 q14, q15, q3 + vmul.f32 q4, q15, q2 + vadd.f32 q15, q9, q8 + vst1.32 {q6,q7}, [r6, :128] + vmul.f32 q8, q12, q3 + vmul.f32 q5, q13, q3 + vmul.f32 q12, q12, q2 + vmul.f32 q9, q13, q2 + vadd.f32 q14, q14, q1 + vsub.f32 q13, q4, q0 + vadd.f32 q0, q9, q8 + vld1.32 {q8,q9}, [r3, :128] + vadd.f32 q1, q11, q10 + vsub.f32 q12, q12, q5 + vadd.f32 q11, q8, q15 + vsub.f32 q8, q8, q15 + vadd.f32 q2, q12, q14 + vsub.f32 q10, q0, q13 + vadd.f32 q15, q0, q13 + vadd.f32 q13, q9, q1 + vsub.f32 q9, q9, q1 + vsub.f32 q12, q12, q14 + vadd.f32 q0, q11, q2 + vadd.f32 q1, q13, q15 + vsub.f32 q4, q11, q2 + vsub.f32 q2, q8, q10 @ + vadd.f32 q3, q9, q12 @ + vst2.32 {q0,q1}, [r3, :128]! + vsub.f32 q5, q13, q15 + vld1.32 {q14,q15}, [r10, :128] + vsub.f32 q7, q9, q12 @ + vld1.32 {q12,q13}, [r8, :128] + vst2.32 {q2,q3}, [r5, :128]! + vld1.32 {q2,q3}, [r12, :128]! + vadd.f32 q6, q8, q10 @ + vmul.f32 q8, q14, q2 + vst2.32 {q4,q5}, [r7, :128]! + vmul.f32 q10, q15, q3 + vmul.f32 q9, q13, q3 + vmul.f32 q11, q12, q2 + vmul.f32 q14, q14, q3 + vst2.32 {q6,q7}, [r9, :128]! + vmul.f32 q15, q15, q2 + vmul.f32 q12, q12, q3 + vmul.f32 q13, q13, q2 + vadd.f32 q10, q10, q8 + vsub.f32 q11, q11, q9 + vld1.32 {q8,q9}, [r4, :128] + vsub.f32 q14, q15, q14 + vadd.f32 q15, q13, q12 + vadd.f32 q13, q11, q10 + vadd.f32 q12, q15, q14 + vsub.f32 q15, q15, q14 + vsub.f32 q14, q11, q10 + vld1.32 {q10,q11}, [r6, :128] + vadd.f32 q0, q8, q13 + vadd.f32 q1, q9, q12 + vsub.f32 q2, q10, q15 @ + vadd.f32 q3, q11, q14 @ + vsub.f32 q4, q8, q13 + vst2.32 {q0,q1}, [r4, :128]! + vsub.f32 q5, q9, q12 + vadd.f32 q6, q10, q15 @ + vst2.32 {q2,q3}, [r6, :128]! + vsub.f32 q7, q11, q14 @ + vst2.32 {q4,q5}, [r8, :128]! + vst2.32 {q6,q7}, [r10, :128]! + bne neon_x8_t_loop + + @bx lr + +@ assumes r0 = out +@ r1 = in ? +@ +@ r12 = offsets +@ r3-r10 = data pointers +@ r11 = loop iterations +@ r2 & lr = temps + .align 4 +#ifdef __APPLE__ + .globl _neon_ee +_neon_ee: +#else + .globl neon_ee +neon_ee: +#endif + vld1.32 {d16, d17}, [r2, :128] +_neon_ee_loop: + 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]! + vsub.f32 q1, q14, q13 + vld2.32 {q0}, [r9, :128]! + subs r11, r11, #1 + 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 + vadd.f32 d29, d5, d2 @ + vadd.f32 q5, q5, q3 + vadd.f32 q10, q4, q0 + vadd.f32 q11, q12, q11 + vsub.f32 d31, d5, d2 @ + vsub.f32 d28, d4, d3 @ + vadd.f32 d30, d4, d3 @ + vadd.f32 d5, d19, d14 @- + vadd.f32 d7, d31, d26 @- + vadd.f32 q1, q14, q5 + vadd.f32 q0, q11, q10 + vsub.f32 d6, d30, d27 @- + vsub.f32 d4, d18, d15 @- + vsub.f32 d13, d19, d14 @- + vadd.f32 d12, d18, d15 @- + vsub.f32 d15, d31, d26 @- + ldr r2, [r12], #4 + vtrn.32 q1, q3 + ldr lr, [r12], #4 + vtrn.32 q0, q2 + add r2, r0, r2, lsl #2 + vsub.f32 q4, q11, q10 + add lr, r0, lr, lsl #2 + vsub.f32 q5, q14, q5 + vadd.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]! + bne _neon_ee_loop + +@ assumes r0 = out +@ +@ r12 = offsets +@ r3-r10 = data pointers +@ r11 = loop iterations +@ r2 & lr = temps + .align 4 +#ifdef __APPLE__ + .globl _neon_oo +_neon_oo: +#else + .globl neon_oo +neon_oo: +#endif +_neon_oo_loop: + 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 + subs r11, r11, #1 + vld2.32 {q10}, [r7, :128]! + vld2.32 {q13}, [r9, :128]! + vsub.f32 q2, q12, q11 + vsub.f32 d7, d19, d16 @ + vadd.f32 d3, d19, d16 @ + vadd.f32 d6, d18, d17 @ + vsub.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], #4 + vsub.f32 d15, d19, d16 @ + ldr lr, [r12], #4 + vadd.f32 d11, d19, d16 @ + vadd.f32 d14, d18, d17 @ + vsub.f32 d10, d18, d17 @ + add r2, r0, r2, lsl #2 + vtrn.32 q1, q3 + add lr, r0, lr, lsl #2 + 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]! + bne _neon_oo_loop + +@ assumes r0 = out +@ +@ r12 = offsets +@ r3-r10 = data pointers +@ r11 = addr of twiddle +@ r2 & lr = temps + .align 4 +#ifdef __APPLE__ + .globl _neon_eo +_neon_eo: +#else + .globl neon_eo +neon_eo: +#endif + 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 + vadd.f32 d9, d23, d20 @ + vsub.f32 d11, d23, d20 @ + vsub.f32 q8, q12, q8 + vsub.f32 d8, d22, d21 @ + vadd.f32 d10, d22, d21 @ + ldr r2, [r12], #4 + vld1.32 {d20, d21}, [r11, :128] + ldr lr, [r12], #4 + vtrn.32 q9, q4 + add r2, r0, r2, lsl #2 + vtrn.32 q8, q5 + add lr, r0, lr, lsl #2 + vswp d9,d10 + vst1.32 {d8,d9,d10,d11}, [lr, :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 + vadd.f32 d13, d29, d24 @ + vadd.f32 q15, q13, q11 + vsub.f32 d12, d28, d25 @ + vsub.f32 d15, d29, d24 @ + vadd.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}, [lr, :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 + vadd.f32 d3, d17, d20 @ + vsub.f32 d7, d17, d20 @ + vsub.f32 d2, d16, d21 @ + vadd.f32 d6, d16, d21 @ + vswp d1, d2 + vswp d5, d6 + vstmia r2!, {q0-q3} + + +@ assumes r0 = out +@ +@ r12 = offsets +@ r3-r10 = data pointers +@ r11 = addr of twiddle +@ r2 & lr = temps + .align 4 +#ifdef __APPLE__ + .globl _neon_oe +_neon_oe: +#else + .globl neon_oe +neon_oe: +#endif + 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 + vtrn.32 d24, d25 + ldr lr, [r12], #4 + vtrn.32 d20, d21 + add r2, r0, r2, lsl #2 + vsub.f32 q8, q10, q12 + add lr, r0, lr, lsl #2 + vadd.f32 q10, q10, q12 + vadd.f32 q0, q11, q10 + vadd.f32 d25, d19, d16 @ + vsub.f32 d27, d19, d16 @ + vsub.f32 q1, q11, q10 + vsub.f32 d24, d18, d17 @ + vadd.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 + vadd.f32 d29, d1, d30 @ + vsub.f32 d27, d1, d30 @ + vsub.f32 q3, q3, q1 + vsub.f32 d28, d0, d31 @ + vadd.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 + vadd.f32 d11, d27, d16 @ + vsub.f32 d15, d27, d16 @ + vsub.f32 d10, d26, d17 @ + vadd.f32 d14, d26, d17 @ + vswp d9, d10 + vswp d13, d14 + vstmia lr!, {q4-q7} + + + .align 4 +#ifdef __APPLE__ + .globl _neon_end +_neon_end: +#else + .globl neon_end +neon_end: +#endif + bx lr + + + .align 4 +#ifdef __APPLE__ + .globl _neon_transpose +_neon_transpose: +#else + .globl neon_transpose +neon_transpose: +#endif + push {r4-r8} + @ vpush {q8-q9} + mov r5, r3 +_neon_transpose_col: + mov r7, r1 + add r8, r1, r3, lsl #3 + mov r4, r2 + add r6, r0, r2, lsl #3 +_neon_transpose_row: + vld1.32 {q8,q9}, [r0, :128]! +@ vld1.32 {q10,q11}, [r0, :128]! + vld1.32 {q12,q13}, [r6, :128]! +@ vld1.32 {q14,q15}, [r6, :128]! + sub r4, r4, #4 + cmp r4, #0 + vswp d17,d24 + vswp d19,d26 + vswp d21,d28 + vswp d23,d30 + vst1.32 {q8}, [r7, :128] + vst1.32 {q12}, [r8, :128] + add r7, r7, r3, lsl #4 + add r8, r8, r3, lsl #4 + vst1.32 {q9}, [r7, :128] + vst1.32 {q13}, [r8, :128] + add r7, r7, r3, lsl #4 + add r8, r8, r3, lsl #4 +@@vst1.32 {q10}, [r7, :128] +@@vst1.32 {q14}, [r8, :128] +@@add r7, r7, r3, lsl #4 +@@add r8, r8, r3, lsl #4 +@@vst1.32 {q11}, [r7, :128] +@@vst1.32 {q15}, [r8, :128] +@@add r7, r7, r3, lsl #4 +@@add r8, r8, r3, lsl #4 + bne _neon_transpose_row + sub r5, r5, #2 + cmp r5, #0 + add r0, r0, r2, lsl #3 + add r1, r1, #16 + bne _neon_transpose_col + @ vpop {q8-q9} + pop {r4-r8} + bx lr + + .align 4 +#ifdef __APPLE__ + .globl _neon_transpose_to_buf +_neon_transpose_to_buf: +#else + .globl neon_transpose_to_buf +neon_transpose_to_buf: +#endif + push {r4-r10} + mov r5, #8 +_neon_transpose_to_buf_col: + mov r4, #8 + add r6, r0, r2, lsl #3 + mov r7, r1 + add r8, r1, #64 + add r9, r1, #128 + add r10, r1, #192 +_neon_transpose_to_buf_row: + vld1.32 {q8,q9}, [r0, :128]! + vld1.32 {q12,q13}, [r6, :128]! + sub r4, r4, #4 + cmp r4, #0 + vswp d17,d24 + vswp d19,d26 + vst1.32 {q8}, [r7, :128] + vst1.32 {q12}, [r8, :128] + vst1.32 {q9}, [r9, :128] + vst1.32 {q13}, [r10, :128] + add r7, r7, #256 + add r8, r8, #256 + add r9, r9, #256 + add r10, r10, #256 + bne _neon_transpose_to_buf_row + sub r5, r5, #2 + cmp r5, #0 + sub r0, r0, #64 + add r0, r0, r2, lsl #4 + add r1, r1, #16 + bne _neon_transpose_to_buf_col + pop {r4-r10} + bx lr |