summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Blake <anthonix@me.com>2012-12-03 14:45:20 +1300
committerAnthony Blake <anthonix@me.com>2012-12-03 14:45:20 +1300
commitec477d4f3e4f23a2221cbf0614f3fec26de3d9f2 (patch)
tree5cafd0e455d1fec11a6ca674377a91ae328cf4b8
parentd1cbc1f7e86fc6d93922b4daa825b8f1b2696679 (diff)
downloadffts-ec477d4f3e4f23a2221cbf0614f3fec26de3d9f2.zip
ffts-ec477d4f3e4f23a2221cbf0614f3fec26de3d9f2.tar.gz
Added static mode
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure28
-rw-r--r--configure.ac5
-rw-r--r--src/Makefile.am16
-rw-r--r--src/Makefile.in31
-rw-r--r--src/ffts.c18
-rw-r--r--src/ffts.h4
-rw-r--r--src/ffts_static.c101
-rw-r--r--src/ffts_static.h46
-rw-r--r--src/neon.h15
-rw-r--r--src/neon.s3
-rw-r--r--src/neon_static_f.s956
-rw-r--r--src/neon_static_i.s955
-rw-r--r--tests/Makefile.in4
14 files changed, 2166 insertions, 19 deletions
diff --git a/config.h.in b/config.h.in
index d5cb250..0c9963a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,5 +1,8 @@
/* config.h.in. Generated from configure.ac by autoheader. */
+/* Define to disable dynamic code generation. */
+#undef DYNAMIC_DISABLED
+
/* Define to FFT in single precision. */
#undef FFTS_PREC_SINGLE
diff --git a/configure b/configure
index 2708754..f7b68e2 100755
--- a/configure
+++ b/configure
@@ -639,6 +639,8 @@ HAVE_NEON_FALSE
HAVE_NEON_TRUE
HAVE_SSE_FALSE
HAVE_SSE_TRUE
+DYNAMIC_DISABLED_FALSE
+DYNAMIC_DISABLED_TRUE
am__fastdepCCAS_FALSE
am__fastdepCCAS_TRUE
CCASDEPMODE
@@ -770,6 +772,7 @@ enable_fast_install
with_gnu_ld
with_sysroot
enable_libtool_lock
+enable_dynamic_code
enable_single
enable_sse
enable_neon
@@ -1416,6 +1419,7 @@ Optional Features:
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-dynamic-code dynamically generate code
--enable-single compile single-precision library
--enable-sse enable SSE extensions
--enable-neon enable NEON extensions
@@ -15342,6 +15346,26 @@ fi
#SFFT_AR="/usr/bin/ar"
#SFFT_CFLAGS="$CFLAGS"
#SFFT_CC="$CC"
+# Check whether --enable-dynamic-code was given.
+if test "${enable_dynamic_code+set}" = set; then :
+ enableval=$enable_dynamic_code; sfft_dynamic=$enableval
+else
+ sfft_dynamic=yes
+fi
+
+if test "$sfft_dynamic" = "no"; then
+
+$as_echo "#define DYNAMIC_DISABLED 1" >>confdefs.h
+
+fi
+ if test "$sfft_dynamic" = "no"; then
+ DYNAMIC_DISABLED_TRUE=
+ DYNAMIC_DISABLED_FALSE='#'
+else
+ DYNAMIC_DISABLED_TRUE='#'
+ DYNAMIC_DISABLED_FALSE=
+fi
+
# Check whether --enable-single was given.
if test "${enable_single+set}" = set; then :
@@ -16159,6 +16183,10 @@ if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${DYNAMIC_DISABLED_TRUE}" && test -z "${DYNAMIC_DISABLED_FALSE}"; then
+ as_fn_error $? "conditional \"DYNAMIC_DISABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${HAVE_SSE_TRUE}" && test -z "${HAVE_SSE_FALSE}"; then
as_fn_error $? "conditional \"HAVE_SSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/configure.ac b/configure.ac
index 2b5de20..1cb731b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,6 +20,11 @@ AM_PROG_AS
#SFFT_AR="/usr/bin/ar"
#SFFT_CFLAGS="$CFLAGS"
#SFFT_CC="$CC"
+AC_ARG_ENABLE(dynamic-code, [AC_HELP_STRING([--enable-dynamic-code],[dynamically generate code])], sfft_dynamic=$enableval, sfft_dynamic=yes)
+if test "$sfft_dynamic" = "no"; then
+ AC_DEFINE(DYNAMIC_DISABLED,1,[Define to disable dynamic code generation.])
+fi
+AM_CONDITIONAL(DYNAMIC_DISABLED, test "$sfft_dynamic" = "no")
AC_ARG_ENABLE(single, [AC_HELP_STRING([--enable-single],[compile single-precision library])], sfft_single=$enableval, sfft_single=no)
if test "$sfft_single" = "yes"; then
diff --git a/src/Makefile.am b/src/Makefile.am
index d550b08..5f6db47 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,13 +2,25 @@
lib_LTLIBRARIES = libffts.la
-libffts_la_SOURCES = ffts.c ffts_nd.c ffts_real.c ffts_real_nd.c patterns.c codegen.c
+libffts_la_SOURCES = ffts.c ffts_nd.c ffts_real.c ffts_real_nd.c patterns.c
+
+if DYNAMIC_DISABLED
+libffts_la_SOURCES += ffts_static.c
+else
+libffts_la_SOURCES += codegen.c
+endif
libffts_includedir=$(includedir)/ffts
libffts_include_HEADERS = ../include/ffts.h
if HAVE_NEON
-libffts_la_SOURCES += neon.s
+
+if DYNAMIC_DISABLED
+libffts_la_SOURCES += neon_static_f.s neon_static_i.s
+else
+libffts_la_SOURCES += neon.s
+endif
+
else
if HAVE_SSE
libffts_la_SOURCES += sse.s
diff --git a/src/Makefile.in b/src/Makefile.in
index c3dff48..1de271a 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -51,8 +51,11 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-@HAVE_NEON_TRUE@am__append_1 = neon.s
-@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@am__append_2 = sse.s
+@DYNAMIC_DISABLED_TRUE@am__append_1 = ffts_static.c
+@DYNAMIC_DISABLED_FALSE@am__append_2 = codegen.c
+@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@am__append_3 = neon_static_f.s neon_static_i.s
+@DYNAMIC_DISABLED_FALSE@@HAVE_NEON_TRUE@am__append_4 = neon.s
+@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@am__append_5 = sse.s
subdir = src
DIST_COMMON = $(libffts_include_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/depcomp
@@ -96,12 +99,18 @@ am__installdirs = "$(DESTDIR)$(libdir)" \
LTLIBRARIES = $(lib_LTLIBRARIES)
libffts_la_LIBADD =
am__libffts_la_SOURCES_DIST = ffts.c ffts_nd.c ffts_real.c \
- ffts_real_nd.c patterns.c codegen.c neon.s sse.s
-@HAVE_NEON_TRUE@am__objects_1 = neon.lo
-@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@am__objects_2 = sse.lo
+ ffts_real_nd.c patterns.c ffts_static.c codegen.c \
+ neon_static_f.s neon_static_i.s neon.s sse.s
+@DYNAMIC_DISABLED_TRUE@am__objects_1 = ffts_static.lo
+@DYNAMIC_DISABLED_FALSE@am__objects_2 = codegen.lo
+@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@am__objects_3 = \
+@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@ neon_static_f.lo \
+@DYNAMIC_DISABLED_TRUE@@HAVE_NEON_TRUE@ neon_static_i.lo
+@DYNAMIC_DISABLED_FALSE@@HAVE_NEON_TRUE@am__objects_4 = neon.lo
+@HAVE_NEON_FALSE@@HAVE_SSE_TRUE@am__objects_5 = sse.lo
am_libffts_la_OBJECTS = ffts.lo ffts_nd.lo ffts_real.lo \
- ffts_real_nd.lo patterns.lo codegen.lo $(am__objects_1) \
- $(am__objects_2)
+ ffts_real_nd.lo patterns.lo $(am__objects_1) $(am__objects_2) \
+ $(am__objects_3) $(am__objects_4) $(am__objects_5)
libffts_la_OBJECTS = $(am_libffts_la_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -253,7 +262,8 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
lib_LTLIBRARIES = libffts.la
libffts_la_SOURCES = ffts.c ffts_nd.c ffts_real.c ffts_real_nd.c \
- patterns.c codegen.c $(am__append_1) $(am__append_2)
+ patterns.c $(am__append_1) $(am__append_2) $(am__append_3) \
+ $(am__append_4) $(am__append_5)
libffts_includedir = $(includedir)/ffts
libffts_include_HEADERS = ../include/ffts.h
all: all-am
@@ -269,9 +279,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu src/Makefile
+ $(AUTOMAKE) --foreign src/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -338,6 +348,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_nd.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_real.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_real_nd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffts_static.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/patterns.Plo@am__quote@
.c.o:
diff --git a/src/ffts.c b/src/ffts.c
index 298bd4d..ada4fca 100644
--- a/src/ffts.c
+++ b/src/ffts.c
@@ -34,7 +34,12 @@
#include "macros.h"
//#include "mini_macros.h"
#include "patterns.h"
-#include "codegen.h"
+
+#ifdef DYNAMIC_DISABLED
+ #include "ffts_static.h"
+#else
+ #include "codegen.h"
+#endif
#include <errno.h>
#include <sys/mman.h>
@@ -54,7 +59,6 @@ void ffts_free(ffts_plan_t *p) {
p->destroy(p);
}
-
void ffts_free_1d(ffts_plan_t *p) {
size_t i;
@@ -325,7 +329,17 @@ ffts_plan_t *ffts_init_1d(size_t N, int sign) {
p->N = N;
p->lastlut = w;
p->n_luts = n_luts;
+#ifdef DYNAMIC_DISABLED
+ if(sign < 0) {
+ if(N >= 32) p->transform = ffts_static_transform_f;
+ }else{
+ if(N >= 32) p->transform = ffts_static_transform_i;
+ }
+
+#else
if(N>=32) ffts_generate_func_code(p, N, leafN, sign);
+#endif
return p;
}
+
diff --git a/src/ffts.h b/src/ffts.h
index edf511f..93d61ca 100644
--- a/src/ffts.h
+++ b/src/ffts.h
@@ -62,8 +62,8 @@ typedef struct _ffts_plan_t ffts_plan_t;
struct _ffts_plan_t {
ptrdiff_t *offsets;
- void __attribute__ ((aligned(32))) *ws;
- void __attribute__ ((aligned(32))) *oe_ws, *eo_ws, *ee_ws;
+ void *ws;
+ void *oe_ws, *eo_ws, *ee_ws;
ptrdiff_t *is;
size_t *ws_is;
size_t i0, i1, n_luts;
diff --git a/src/ffts_static.c b/src/ffts_static.c
new file mode 100644
index 0000000..3edf2ea
--- /dev/null
+++ b/src/ffts_static.c
@@ -0,0 +1,101 @@
+/*
+
+ 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.
+
+*/
+#include "ffts_static.h"
+
+void ffts_static_rec_i(ffts_plan_t *p, float *data, size_t N) {
+ if(N > 16) {
+ size_t N1 = N >> 1;
+ size_t N2 = N >> 2;
+ size_t N3 = N >> 3;
+ float *ws = ((float *)(p->ws)) + (p->ws_is[__builtin_ctzl(N)-4] << 1);
+
+ ffts_static_rec_i(p, data, N2);
+ ffts_static_rec_i(p, data + N1, N3);
+ ffts_static_rec_i(p, data + N1 + N2, N3);
+ ffts_static_rec_i(p, data + N, N2);
+ ffts_static_rec_i(p, data + N + N1, N2);
+
+ if(N == p->N) {
+ neon_static_x8_t_i(data, N, ws);
+ }else{
+ neon_static_x8_i(data, N, ws);
+ }
+
+ }else if(N==16){
+ neon_static_x4_i(data, N, p->ws);
+ }
+
+}
+void ffts_static_rec_f(ffts_plan_t *p, float *data, size_t N) {
+ if(N > 16) {
+ size_t N1 = N >> 1;
+ size_t N2 = N >> 2;
+ size_t N3 = N >> 3;
+ float *ws = ((float *)(p->ws)) + (p->ws_is[__builtin_ctzl(N)-4] << 1);
+
+ ffts_static_rec_f(p, data, N2);
+ ffts_static_rec_f(p, data + N1, N3);
+ ffts_static_rec_f(p, data + N1 + N2, N3);
+ ffts_static_rec_f(p, data + N, N2);
+ ffts_static_rec_f(p, data + N + N1, N2);
+
+ if(N == p->N) {
+ neon_static_x8_t_f(data, N, ws);
+ }else{
+ neon_static_x8_f(data, N, ws);
+ }
+
+ }else if(N==16){
+ neon_static_x4_f(data, N, p->ws);
+ }
+
+}
+
+void ffts_static_transform_f(ffts_plan_t *p, const void *in, void *out) {
+
+ if(__builtin_ctzl(p->N) & 1)
+ neon_static_o_f(p, in, out);
+ else
+ neon_static_e_f(p, in, out);
+ ffts_static_rec_f(p, out, p->N);
+}
+
+
+void ffts_static_transform_i(ffts_plan_t *p, const void *in, void *out) {
+
+ if(__builtin_ctzl(p->N) & 1)
+ neon_static_o_i(p, in, out);
+ else
+ neon_static_e_i(p, in, out);
+ ffts_static_rec_i(p, out, p->N);
+}
diff --git a/src/ffts_static.h b/src/ffts_static.h
new file mode 100644
index 0000000..4490bde
--- /dev/null
+++ b/src/ffts_static.h
@@ -0,0 +1,46 @@
+/*
+
+ 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.
+
+*/
+
+#ifndef __FFTS_STATIC_H__
+#define __FFTS_STATIC_H__
+
+#include "ffts.h"
+#include "neon.h"
+
+void ffts_static_rec_f(ffts_plan_t *p, float *data, size_t N) ;
+void ffts_static_transform_f(ffts_plan_t *p, const void *in, void *out);
+
+void ffts_static_rec_i(ffts_plan_t *p, float *data, size_t N) ;
+void ffts_static_transform_i(ffts_plan_t *p, const void *in, void *out);
+
+#endif
diff --git a/src/neon.h b/src/neon.h
index ff922fc..f3132c2 100644
--- a/src/neon.h
+++ b/src/neon.h
@@ -34,6 +34,7 @@
#ifndef __NEON_H__
#define __NEON_H__
+#include "ffts.h"
void neon_x4(float *, size_t, float *);
void neon_x8(float *, size_t, float *);
@@ -47,4 +48,18 @@ void neon_end();
void neon_transpose(uint64_t *in, uint64_t *out, int w, int h);
void neon_transpose_to_buf(uint64_t *in, uint64_t *out, int w);
+//typedef struct _ffts_plan_t ffts_plan_t;
+
+void neon_static_e_f(ffts_plan_t * , const void * , void * );
+void neon_static_o_f(ffts_plan_t * , const void * , void * );
+void neon_static_x4_f(float *, size_t, float *);
+void neon_static_x8_f(float *, size_t, float *);
+void neon_static_x8_t_f(float *, size_t, float *);
+
+void neon_static_e_i(ffts_plan_t * , const void * , void * );
+void neon_static_o_i(ffts_plan_t * , const void * , void * );
+void neon_static_x4_i(float *, size_t, float *);
+void neon_static_x8_i(float *, size_t, float *);
+void neon_static_x8_t_i(float *, size_t, float *);
+
#endif
diff --git a/src/neon.s b/src/neon.s
index f259e9d..e30fd05 100644
--- a/src/neon.s
+++ b/src/neon.s
@@ -323,7 +323,8 @@ neon_x8_t_loop:
@bx lr
@ assumes r0 = out
-@
+@ r1 = in ?
+@
@ r12 = offsets
@ r3-r10 = data pointers
@ r11 = loop iterations
diff --git a/src/neon_static_f.s b/src/neon_static_f.s
new file mode 100644
index 0000000..920d13c
--- /dev/null
+++ b/src/neon_static_f.s
@@ -0,0 +1,956 @@
+/*
+
+ 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_static_e_f
+_neon_static_e_f:
+#else
+ .globl neon_static_e_f
+neon_static_e_f:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ ldr lr, [r0, #40] @ this is p->N
+ add r3, r1, #0
+ add r7, r1, lr
+ add r5, r7, lr
+ add r10, r5, lr
+ add r4, r10, lr
+ add r8, r4, lr
+ add r6, r8, lr
+ add r9, r6, lr
+ ldr r12, [r0]
+ add r1, r0, #0
+ add r0, r2, #0
+ ldr r2, [r1, #16] @ this is p->ee_ws
+ ldr r11, [r1, #28] @ this is p->i0
+
+ 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
+ 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 @
+ 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
+ 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]!
+ bne _neon_ee_loop
+
+ ldr r11, [r1, #12]
+ 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], #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
+ 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}, [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
+ 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 r2!, {q0-q3}
+
+ add r2, r7, #0
+ add r7, r9, #0
+ add r9, r2, #0
+ add r2, r8, #0
+ add r8, r10, #0
+ add r10, r2, #0
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_oo_loop_exit
+_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
+ 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], #4
+ vadd.f32 d15, d19, d16 @
+ ldr lr, [r12], #4
+ vsub.f32 d11, d19, d16 @
+ vsub.f32 d14, d18, d17 @
+ vadd.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
+_neon_oo_loop_exit:
+
+
+ add r2, r3, #0
+ add r3, r7, #0
+ add r7, r2, #0
+ add r2, r4, #0
+ add r4, r8, #0
+ add r8, r2, #0
+ add r2, r5, #0
+ add r5, r9, #0
+ add r9, r2, #0
+ add r2, r6, #0
+ add r6, r10, #0
+ add r10, r2, #0
+ add r2, r9, #0
+ add r9, r10, #0
+ add r10, r2, #0
+ ldr r2, [r1, #16]
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_ee_loop2_exit
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_loop2:
+ 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
+ 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 @
+ 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
+ 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]!
+ bne _neon_ee_loop2
+_neon_ee_loop2_exit:
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+
+
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_o_f
+_neon_static_o_f:
+#else
+ .globl neon_static_o_f
+neon_static_o_f:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ ldr lr, [r0, #40] @ this is p->N
+ add r3, r1, #0
+ add r7, r1, lr
+ add r5, r7, lr
+ add r10, r5, lr
+ add r4, r10, lr
+ add r8, r4, lr
+ add r6, r8, lr
+ add r9, r6, lr
+ ldr r12, [r0]
+ add r1, r0, #0
+ add r0, r2, #0
+ ldr r2, [r1, #16] @ this is p->ee_ws
+ ldr r11, [r1, #28] @ this is p->i0
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_o_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
+ 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 @
+ 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
+ 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]!
+ bne _neon_ee_o_loop
+
+ add r2, r7, #0
+ add r7, r9, #0
+ add r9, r2, #0
+ add r2, r8, #0
+ add r8, r10, #0
+ add r10, r2, #0
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_oo_o_loop_exit
+_neon_oo_o_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
+ 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], #4
+ vadd.f32 d15, d19, d16 @
+ ldr lr, [r12], #4
+ vsub.f32 d11, d19, d16 @
+ vsub.f32 d14, d18, d17 @
+ vadd.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_o_loop
+_neon_oo_o_loop_exit:
+
+ ldr r11, [r1, #8]
+ 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
+ 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}
+
+
+ add r2, r3, #0
+ add r3, r7, #0
+ add r7, r2, #0
+ add r2, r4, #0
+ add r4, r8, #0
+ add r8, r2, #0
+ add r2, r5, #0
+ add r5, r9, #0
+ add r9, r2, #0
+ add r2, r6, #0
+ add r6, r10, #0
+ add r10, r2, #0
+ add r2, r9, #0
+ add r9, r10, #0
+ add r10, r2, #0
+ ldr r2, [r1, #16]
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_ee_o_loop2_exit
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_o_loop2:
+ 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
+ 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 @
+ 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
+ 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]!
+ bne _neon_ee_o_loop2
+_neon_ee_o_loop2_exit:
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x4_f
+_neon_static_x4_f:
+#else
+ .globl neon_static_x4_f
+neon_static_x4_f:
+#endif
+@ add r3, r0, #0
+ push {r4, r5, r6, lr}
+ vstmdb sp!, {d8-d15}
+
+ 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
+ vadd.f32 q2, q10, q13 @
+ vsub.f32 q4, q8, q15
+ vsub.f32 q3, q11, q12 @
+ vst1.32 {q0,q1}, [r0, :128]
+ vsub.f32 q5, q9, q14
+ vsub.f32 q6, q10, q13 @
+ vadd.f32 q7, q11, q12 @
+ vst1.32 {q2,q3}, [r4, :128]
+ vst1.32 {q4,q5}, [r5, :128]
+ vst1.32 {q6,q7}, [r6, :128]
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, pc}
+
+
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x8_f
+_neon_static_x8_f:
+#else
+ .globl neon_static_x8_f
+neon_static_x8_f:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ 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
+ vadd.f32 q4, q12, q15 @
+ vsub.f32 q6, q12, q15 @
+ vsub.f32 q5, q13, q14 @
+ vadd.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
+ vadd.f32 q2, q8, q10 @
+ vsub.f32 q3, q9, q12 @
+ vst1.32 {q0,q1}, [r3, :128]!
+ vsub.f32 q5, q13, q15
+ vld1.32 {q14,q15}, [r10, :128]
+ vadd.f32 q7, q9, q12 @
+ vld1.32 {q12,q13}, [r8, :128]
+ vst1.32 {q2,q3}, [r5, :128]!
+ vld1.32 {q2,q3}, [r12, :128]!
+ vsub.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
+ vadd.f32 q2, q10, q15 @
+ vsub.f32 q3, q11, q14 @
+ vsub.f32 q4, q8, q13
+ vst1.32 {q0,q1}, [r4, :128]!
+ vsub.f32 q5, q9, q12
+ vsub.f32 q6, q10, q15 @
+ vst1.32 {q2,q3}, [r6, :128]!
+ vadd.f32 q7, q11, q14 @
+ vst1.32 {q4,q5}, [r8, :128]!
+ vst1.32 {q6,q7}, [r10, :128]!
+ bne neon_x8_loop
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x8_t_f
+_neon_static_x8_t_f:
+#else
+ .globl neon_static_x8_t_f
+neon_static_x8_t_f:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ 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
+ vadd.f32 q4, q12, q15 @
+ vsub.f32 q6, q12, q15 @
+ vsub.f32 q5, q13, q14 @
+ vadd.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
+ vadd.f32 q2, q8, q10 @
+ vsub.f32 q3, q9, q12 @
+ vst2.32 {q0,q1}, [r3, :128]!
+ vsub.f32 q5, q13, q15
+ vld1.32 {q14,q15}, [r10, :128]
+ vadd.f32 q7, q9, q12 @
+ vld1.32 {q12,q13}, [r8, :128]
+ vst2.32 {q2,q3}, [r5, :128]!
+ vld1.32 {q2,q3}, [r12, :128]!
+ vsub.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
+ vadd.f32 q2, q10, q15 @
+ vsub.f32 q3, q11, q14 @
+ vsub.f32 q4, q8, q13
+ vst2.32 {q0,q1}, [r4, :128]!
+ vsub.f32 q5, q9, q12
+ vsub.f32 q6, q10, q15 @
+ vst2.32 {q2,q3}, [r6, :128]!
+ vadd.f32 q7, q11, q14 @
+ vst2.32 {q4,q5}, [r8, :128]!
+ vst2.32 {q6,q7}, [r10, :128]!
+ bne neon_x8_t_loop
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+
diff --git a/src/neon_static_i.s b/src/neon_static_i.s
new file mode 100644
index 0000000..cfa766c
--- /dev/null
+++ b/src/neon_static_i.s
@@ -0,0 +1,955 @@
+/*
+
+ 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_static_e_i
+_neon_static_e_i:
+#else
+ .globl neon_static_e_i
+neon_static_e_i:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ ldr lr, [r0, #40] @ this is p->N
+ add r3, r1, #0
+ add r7, r1, lr
+ add r5, r7, lr
+ add r10, r5, lr
+ add r4, r10, lr
+ add r8, r4, lr
+ add r6, r8, lr
+ add r9, r6, lr
+ ldr r12, [r0]
+ add r1, r0, #0
+ add r0, r2, #0
+ ldr r2, [r1, #16] @ this is p->ee_ws
+ ldr r11, [r1, #28] @ this is p->i0
+
+ 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
+
+ ldr r11, [r1, #12]
+ 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}
+
+ add r2, r7, #0
+ add r7, r9, #0
+ add r9, r2, #0
+ add r2, r8, #0
+ add r8, r10, #0
+ add r10, r2, #0
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_oo_loop_exit
+_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
+_neon_oo_loop_exit:
+
+ add r2, r3, #0
+ add r3, r7, #0
+ add r7, r2, #0
+ add r2, r4, #0
+ add r4, r8, #0
+ add r8, r2, #0
+ add r2, r5, #0
+ add r5, r9, #0
+ add r9, r2, #0
+ add r2, r6, #0
+ add r6, r10, #0
+ add r10, r2, #0
+ add r2, r9, #0
+ add r9, r10, #0
+ add r10, r2, #0
+ ldr r2, [r1, #16]
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_ee_loop2_exit
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_loop2:
+ 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_loop2
+_neon_ee_loop2_exit:
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+
+
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_o_i
+_neon_static_o_i:
+#else
+ .globl neon_static_o_i
+neon_static_o_i:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ ldr lr, [r0, #40] @ this is p->N
+ add r3, r1, #0
+ add r7, r1, lr
+ add r5, r7, lr
+ add r10, r5, lr
+ add r4, r10, lr
+ add r8, r4, lr
+ add r6, r8, lr
+ add r9, r6, lr
+ ldr r12, [r0]
+ add r1, r0, #0
+ add r0, r2, #0
+ ldr r2, [r1, #16] @ this is p->ee_ws
+ ldr r11, [r1, #28] @ this is p->i0
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_o_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_o_loop
+
+ add r2, r7, #0
+ add r7, r9, #0
+ add r9, r2, #0
+ add r2, r8, #0
+ add r8, r10, #0
+ add r10, r2, #0
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_oo_o_loop_exit
+_neon_oo_o_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_o_loop
+_neon_oo_o_loop_exit:
+
+ ldr r11, [r1, #8]
+ 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}
+
+
+ add r2, r3, #0
+ add r3, r7, #0
+ add r7, r2, #0
+ add r2, r4, #0
+ add r4, r8, #0
+ add r8, r2, #0
+ add r2, r5, #0
+ add r5, r9, #0
+ add r9, r2, #0
+ add r2, r6, #0
+ add r6, r10, #0
+ add r10, r2, #0
+ add r2, r9, #0
+ add r9, r10, #0
+ add r10, r2, #0
+ ldr r2, [r1, #16]
+ ldr r11, [r1, #32] @ this is p->i1
+ cmp r11, #0
+ beq _neon_ee_o_loop2_exit
+
+ vld1.32 {d16, d17}, [r2, :128]
+_neon_ee_o_loop2:
+ 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_o_loop2
+_neon_ee_o_loop2_exit:
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x4_i
+_neon_static_x4_i:
+#else
+ .globl neon_static_x4_i
+neon_static_x4_i:
+#endif
+@ add r3, r0, #0
+ push {r4, r5, r6, lr}
+ vstmdb sp!, {d8-d15}
+
+ 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]
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, pc}
+
+
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x8_i
+_neon_static_x8_i:
+#else
+ .globl neon_static_x8_i
+neon_static_x8_i:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ 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
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+ .align 4
+#ifdef __APPLE__
+ .globl _neon_static_x8_t_i
+_neon_static_x8_t_i:
+#else
+ .globl neon_static_x8_t_i
+neon_static_x8_t_i:
+#endif
+ push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ vstmdb sp!, {d8-d15}
+ 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
+
+ vldmia sp!, {d8-d15}
+ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+
+
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 13f2e07..21de282 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -200,9 +200,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/Makefile
+ $(AUTOMAKE) --foreign tests/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
OpenPOWER on IntegriCloud