summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/ffts.h4
-rw-r--r--src/codegen.c21
-rw-r--r--src/codegen.h8
-rw-r--r--src/cp_sse.c25
-rw-r--r--src/cp_sse.h2
-rw-r--r--src/macros.h18
-rw-r--r--src/neon.s547
-rw-r--r--src/neon_float.h10
8 files changed, 392 insertions, 243 deletions
diff --git a/include/ffts.h b/include/ffts.h
index ba3d858..7fb81f7 100644
--- a/include/ffts.h
+++ b/include/ffts.h
@@ -41,14 +41,12 @@
typedef size_t transform_index_t;
-
struct _ffts_plan_t {
ptrdiff_t *offsets;
void __attribute__ ((aligned(32))) *ws;
- void __attribute__ ((aligned(32))) *other_ws;
+ void __attribute__ ((aligned(32))) *oe_ws, *eo_ws, *ee_ws;
ptrdiff_t *is;
size_t *ws_is;
- void (*firstpass)(const float * restrict, float * restrict, struct _ffts_plan_t * restrict);
size_t i0, i1, n_luts;
size_t N;
void *lastlut;
diff --git a/src/codegen.c b/src/codegen.c
index d1cce37..681414f 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1,7 +1,9 @@
#include "codegen.h"
#include "macros.h"
#include "neon_float.h"
+//#include "mini_macros.h"
#include "neon.h"
+#include "cp_sse.h"
#include <libkern/OSCacheControl.h>
int tree_count(int N, int leafN, int offset) {
@@ -33,10 +35,11 @@ void elaborate_tree(size_t **p, int N, int leafN, int offset) {
}
-void neon_X_8(data_t * restrict data0, size_t N, data_t * restrict LUT) {
- X_8_SPLIT(data0, N, LUT);
+void neon_x4_x(data_t * restrict data, const data_t * restrict LUT) {
+ X_8_SPLIT(data, 64, LUT);
}
+
uint32_t BL(void *pos, void *target) {
return 0xeb000000 | (((target - pos) / 4) & 0xffffff);
}
@@ -152,15 +155,6 @@ transform_func_t ffts_generate_func_code(ffts_plan_t *p, size_t N, size_t leafN)
exit(1);
}
- if(N < 32) {
-
-
-
-
-
- }
-
-
uint32_t *x_8_addr = fp;
memcpy(fp, neon_x8, neon_x8_t - neon_x8);
fp += (neon_x8_t - neon_x8) / 4;
@@ -194,14 +188,11 @@ transform_func_t ffts_generate_func_code(ffts_plan_t *p, size_t N, size_t leafN)
p->ee_ws = ee_w_data;
p->eo_ws = eo_w_data;
- fprintf(stderr, "p = %08x i0 = %d i1 = %d\n", p, p->i0, p->i1);
- fprintf(stderr, "start of ee %08x\n", fp);
*fp++ = LDRI(2, 1, ((uint32_t)&p->ee_ws) - ((uint32_t)p));
MOVI(&fp, 11, p->i0);
- fprintf(stderr, "p->i0 insn = %d - %08x %08x\n", p->i0, fp[-2], fp[-1]);
//fp++;
memcpy(fp, neon_ee, neon_oo - neon_ee);
fp += (neon_oo - neon_ee) / 4;
@@ -342,7 +333,7 @@ transform_func_t ffts_generate_func_code(ffts_plan_t *p, size_t N, size_t leafN)
sys_icache_invalidate(func, p->transform_size);
- fprintf(stderr, "size of transform = %d\n", (fp-func)*4);
+ fprintf(stderr, "size of transform %zu = %d\n", N, (fp-func)*4);
return (transform_func_t)start;
}
diff --git a/src/codegen.h b/src/codegen.h
index 72cb080..f887ca0 100644
--- a/src/codegen.h
+++ b/src/codegen.h
@@ -15,4 +15,12 @@ typedef void (*transform_func_t)(float *data, size_t N, float *LUT);
transform_func_t ffts_generate_func_code(ffts_plan_t *, size_t N, size_t leafN);
+//static const __attribute__ ((aligned(16))) float ee_w_data[4] =
+//{0.70710678118654757273731092936941,
+// 0.70710678118654746171500846685376,
+// -0.70710678118654757273731092936941,
+// -0.70710678118654746171500846685376};
+
+//static const __attribute__ ((aligned(16))) float eo_w_data[4] = {1.0f,0.70710678118654757273731092936941f, 0.0f,-0.70710678118654746171500846685376};
+//static const __attribute__ ((aligned(16))) float oe_w_data[4] = {1.0f,0.70710678118654757273731092936941f, 0.0f,-0.70710678118654746171500846685376};
#endif
diff --git a/src/cp_sse.c b/src/cp_sse.c
index d32155f..088798b 100644
--- a/src/cp_sse.c
+++ b/src/cp_sse.c
@@ -1,6 +1,12 @@
#include "cp_sse.h"
#include "macros.h"
+//#include "mini_macros.h"
#include "patterns.h"
+ #include <libkern/OSCacheControl.h>
+ #include <errno.h>
+ #include <sys/mman.h>
+ #include <string.h>
+ #include <limits.h> /* for PAGESIZE */
void ffts_execute(ffts_plan_t *p, const void * restrict in, void * restrict out) {
@@ -20,6 +26,7 @@ void ffts_free(ffts_plan_t *p) {
if(p->is) free(p->is);
if(p->offsets) free(p->offsets);
//free(p->transforms);
+ if(p->transforms) free(p->transforms);
if(p->transform_base) {
if (mprotect(p->transform_base, p->transform_size, PROT_READ | PROT_WRITE)) {
@@ -44,6 +51,11 @@ ffts_plan_t *ffts_init(size_t N, int sign) {
p->transform = NULL;
p->transform_base = NULL;
+ p->transforms = NULL;
+ p->is = NULL;
+ p->ws = NULL;
+ p->offsets = NULL;
+
if(N >= 32) {
ffts_init_offsets(p, N, leafN);
@@ -87,12 +99,12 @@ ffts_plan_t *ffts_init(size_t N, int sign) {
p->transforms = malloc(2 * sizeof(transform_index_t));
p->transforms[0] = 0;
p->transforms[1] = 1;
-// if(N == 2) p->firstpass = &firstpass_2;
-// else if(N == 4 && sign == -1) p->firstpass = &firstpass_4_f;
-// else if(N == 4 && sign == 1) p->firstpass = &firstpass_4_b;
-// else if(N == 8) p->firstpass = &firstpass_8;
-// else if(N == 16) p->firstpass = &firstpass_16;
-// else if(N == 32) p->firstpass = &firstpass_32;
+ if(N == 2) p->transform = &firstpass_2;
+ else if(N == 4 && sign == -1) p->transform = &firstpass_4_f;
+ else if(N == 4 && sign == 1) p->transform = &firstpass_4_b;
+ else if(N == 8) p->transform = &firstpass_8;
+ else if(N == 16) p->transform = &firstpass_16;
+ else if(N == 32) p->transform = &firstpass_32;
p->is = NULL;
p->offsets = NULL;
@@ -293,7 +305,6 @@ ffts_plan_t *ffts_init(size_t N, int sign) {
// tmp += 8;
//}
- fprintf(stderr, "p0 %d p1 %d\n", p->i0, p->i1);
p->N = N;
p->lastlut = w;
p->n_luts = n_luts;
diff --git a/src/cp_sse.h b/src/cp_sse.h
index 0136173..d8d7cac 100644
--- a/src/cp_sse.h
+++ b/src/cp_sse.h
@@ -9,7 +9,7 @@
#include <stdint.h>
#include <stdalign.h>
-#include "codegen.h"
+//#include "codegen.h"
typedef complex float cdata_t;
typedef alignas(16) float data_t;
diff --git a/src/macros.h b/src/macros.h
index fcb2258..52fefa7 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -439,22 +439,22 @@ firstpass_32(const data_t * restrict in, data_t * restrict out, ffts_plan_t * re
}
__INLINE void
-firstpass_16(const data_t * restrict in, data_t * restrict out, ffts_plan_t * restrict p) {
+firstpass_16(ffts_plan_t * restrict p, const data_t * restrict in, data_t * restrict out) {
V r0_1,r2_3,r4_5,r6_7,r8_9,r10_11,r12_13,r14_15;
- float *LUT8 = p->ws + p->ws_is[0];
- float *LUT16 = ((float *)p->ws) + 8;//(p->ws_is[1]*4);
+ float *LUT8 = p->ws ;//+ p->ws_is[0];
+// float *LUT16 = ((float *)p->ws) + 8;//(p->ws_is[1]*4);
L_4_4(in+0,in+16,in+8,in+24,&r0_1,&r2_3,&r8_9,&r10_11);
L_2_4(in+4,in+20,in+28,in+12,&r4_5,&r6_7,&r14_15,&r12_13);
K_N(VLD(LUT8),VLD(LUT8+4),&r0_1,&r2_3,&r4_5,&r6_7);
- K_N(VLD(LUT16),VLD(LUT16+4),&r0_1,&r4_5,&r8_9,&r12_13);
+ K_N(VLD(LUT8+8),VLD(LUT8+12),&r0_1,&r4_5,&r8_9,&r12_13);
S_4(r0_1,r4_5,r8_9,r12_13,out+0,out+8,out+16,out+24);
- K_N(VLD(LUT16+8),VLD(LUT16+12),&r2_3,&r6_7,&r10_11,&r14_15);
+ K_N(VLD(LUT8+16),VLD(LUT8+20),&r2_3,&r6_7,&r10_11,&r14_15);
S_4(r2_3,r6_7,r10_11,r14_15,out+4,out+12,out+20,out+28);
}
__INLINE void
-firstpass_8(const data_t * restrict in, data_t * restrict out, ffts_plan_t * restrict p) {
+firstpass_8(ffts_plan_t * restrict p, const data_t * restrict in, data_t * restrict out) {
V r0_1,r2_3,r4_5,r6_7;
float *LUT8 = p->ws + p->ws_is[0];
L_4_2(in+0,in+8,in+4,in+12,&r0_1,&r2_3,&r4_5,&r6_7);
@@ -462,7 +462,7 @@ firstpass_8(const data_t * restrict in, data_t * restrict out, ffts_plan_t * res
S_4(r0_1,r2_3,r4_5,r6_7,out+0,out+4,out+8,out+12);
}
__INLINE void
-firstpass_4_f(const data_t * restrict in, data_t * restrict out, ffts_plan_t * restrict p) {
+firstpass_4_f(ffts_plan_t * restrict p, const data_t * restrict in, data_t * restrict out) {
cdata_t *i = (cdata_t *)in, *o = (cdata_t *)out;
cdata_t t0, t1, t2, t3, t4, t5, t6, t7;
t0 = i[0]; t1 = i[2]; t2 = i[1]; t3 = i[3];
@@ -477,7 +477,7 @@ firstpass_4_f(const data_t * restrict in, data_t * restrict out, ffts_plan_t * r
o[3] = t5 + t7;
}
__INLINE void
-firstpass_4_b(const data_t * restrict in, data_t * restrict out, ffts_plan_t * restrict p) {
+firstpass_4_b(ffts_plan_t * restrict p, const data_t * restrict in, data_t * restrict out) {
cdata_t *i = (cdata_t *)in, *o = (cdata_t *)out;
cdata_t t0, t1, t2, t3, t4, t5, t6, t7;
t0 = i[0]; t1 = i[2]; t2 = i[1]; t3 = i[3];
@@ -492,7 +492,7 @@ firstpass_4_b(const data_t * restrict in, data_t * restrict out, ffts_plan_t * r
o[3] = t5 + t7;
}
__INLINE void
-firstpass_2(const data_t * restrict in, data_t * restrict out, ffts_plan_t * restrict p) {
+firstpass_2(ffts_plan_t * restrict p, const data_t * restrict in, data_t * restrict out) {
cdata_t t0, t1, r0,r1;
t0 = ((cdata_t *)in)[0]; t1 = ((cdata_t *)in)[1];
r0 = t0 + t1; r1 = t0 - t1;
diff --git a/src/neon.s b/src/neon.s
index e9e300f..2ee1a4d 100644
--- a/src/neon.s
+++ b/src/neon.s
@@ -2,37 +2,39 @@
.globl _neon_x4
.align 4
_neon_x4:
- add r3, r0, #0
- add r4, r3, r1, lsl #1
- add r5, r3, r1, lsl #2
- add r6, r4, r1, lsl #2
-
+@ add r3, r0, #0
- vld1.32 {q2,q3}, [r2, :128]
- vld1.32 {q8,q9}, [r3, :128]
+ 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 q1, q12, q2
- vmul.f32 q0, q14, q2
- vmul.f32 q4, q15, q2
- vmul.f32 q12, q12, q3
- vmls.f32 q1,q13,q3
- vmla.f32 q0,q15,q3
- vmls.f32 q4,q14,q3
- vadd.f32 q15, q1, q0
- vmla.f32 q12,q13,q2
- vsub.f32 q13, q12, q4
- vadd.f32 q14, q12, q4
- vsub.f32 q12, q1, q0
+ 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}, [r3, :128]
+ vst1.32 {q0,q1}, [r0, :128]
vsub.f32 q5, q9, q14
vsub.f32 q6, q10, q13
vadd.f32 q7, q11, q12
@@ -41,6 +43,39 @@ _neon_x4:
vst1.32 {q6,q7}, [r6, :128]
bx lr
+@@vld1.32 {q2,q3}, [r2, :128]
+@@vld1.32 {q8,q9}, [r3, :128]
+@@vld1.32 {q10,q11}, [r4, :128]
+@@vld1.32 {q12,q13}, [r5, :128]
+@@vld1.32 {q14,q15}, [r6, :128]
+@@
+@@vmul.f32 q1, q12, q2
+@@vmul.f32 q0, q14, q2
+@@vmul.f32 q4, q15, q2
+@@vmul.f32 q12, q12, q3
+@@vmls.f32 q1,q13,q3
+@@vmla.f32 q0,q15,q3
+@@vmls.f32 q4,q14,q3
+@@vadd.f32 q15, q1, q0
+@@vmla.f32 q12,q13,q2
+@@vsub.f32 q13, q12, q4
+@@vadd.f32 q14, q12, q4
+@@vsub.f32 q12, q1, q0
+@@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}, [r3, :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]
+@@bx lr
+
.globl _neon_x8
.align 4
_neon_x8:
@@ -56,94 +91,191 @@ _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]
- vld1.32 {q14,q15}, [r6, :128]
- adds r11, r11, #1
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q1, q10, q3
- vmul.f32 q9, q15, q2
- vmul.f32 q0, q14, q2
- vmul.f32 q10, q10, q2
- vmla.f32 q1,q11,q2
- vmls.f32 q9,q14,q3
- vmla.f32 q0,q15,q3
- vsub.f32 q14, q1, q9
- vmls.f32 q10,q11,q3
- vsub.f32 q11, q10, q0
- vadd.f32 q10, q10, q0
- vadd.f32 q4, q12, q14
- vsub.f32 q5, q13, q11
- vsub.f32 q6, q12, q14
- vadd.f32 q7, q13, q11
- vst1.32 {q4,q5}, [r4, :128]
- vadd.f32 q9, q1, q9
- vld1.32 {q2,q3}, [r3, :128]
- vst1.32 {q6,q7}, [r6, :128]
- vld1.32 {q12,q13}, [r7, :128]
- vld1.32 {q14,q15}, [r9, :128]
- vmov q1, q3
- vmov q8, q2
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q0, q12, q2
- vmul.f32 q11, q14, q2
- vmul.f32 q4, q15, q2
- vmul.f32 q12, q12, q3
- vmls.f32 q0,q13,q3
- vmla.f32 q11,q15,q3
- vadd.f32 q15, q8, q10
- vmls.f32 q4,q14,q3
- vmla.f32 q12,q13,q2
- vadd.f32 q14, q0, q11
- vsub.f32 q8, q8, q10
- vsub.f32 q10, q12, q4
- vadd.f32 q13, q12, q4
- vadd.f32 q12, q1, q9
- vsub.f32 q9, q1, q9
- vsub.f32 q11, q0, q11
- vadd.f32 q0, q15, q14
- vadd.f32 q1, q12, q13
- vsub.f32 q4, q15, q14
- vadd.f32 q2, q8, q10
- vsub.f32 q5, q12, q13
- vst1.32 {q0,q1}, [r3, :128]!
- vsub.f32 q3, q9, q11
- vsub.f32 q6, q8, q10
- vadd.f32 q7, q9, q11
- vst1.32 {q2,q3}, [r5, :128]!
- vst1.32 {q4,q5}, [r7, :128]!
- vst1.32 {q6,q7}, [r9, :128]!
- vld1.32 {q8,q9}, [r4, :128]
- vld1.32 {q10,q11}, [r6, :128]
- vld1.32 {q12,q13}, [r8, :128]
- vld1.32 {q14,q15}, [r10, :128]
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q4, q14, q2
- vmul.f32 q5, q12, q2
- vmul.f32 q6, q15, q2
- vmul.f32 q7, q12, q3
- vmla.f32 q4,q15,q3
- vmls.f32 q5,q13,q3
- vmls.f32 q6,q14,q3
- vadd.f32 q12, q5, q4
- vmla.f32 q7,q13,q2
- vsub.f32 q14, q5, q4
- vadd.f32 q13, q7, q6
- vsub.f32 q15, q7, q6
- vadd.f32 q0, q8, q12
- vadd.f32 q1, q9, q13
- vadd.f32 q2, q10, q15
- vsub.f32 q3, q11, q14
- vsub.f32 q4, q8, q12
- vst1.32 {q0,q1}, [r4, :128]!
- vsub.f32 q5, q9, q13
- 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]!
+ 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]!
+
+
+
+
+@@vld1.32 {q2, q3}, [r12, :128]!
+@@vld1.32 {q14,q15}, [r6, :128]
+@@vld1.32 {q10,q11}, [r5, :128]
+@@vld1.32 {q12,q13}, [r4, :128]
+@@adds r11, r11, #1
+@@vmul.f32 q0, q10, q3
+@@vmul.f32 q1, q15, q2
+@@vmul.f32 q8, q14, q2
+@@vmul.f32 q9, q10, q2
+@@vmla.f32 q0,q11,q2
+@@vmls.f32 q1,q14,q3
+@@vmla.f32 q8,q15,q3
+@@vsub.f32 q10, q1, q0
+@@vld1.32 {q14,q15}, [r9, :128]
+@@vmls.f32 q9,q11,q3
+@@vld1.32 {q2, q3}, [r12, :128]!
+@@vsub.f32 q11, q9, q8
+@@vadd.f32 q0, q0, q1
+@@vsub.f32 q4, q12, q10
+@@vsub.f32 q5, q13, q11
+@@vadd.f32 q6, q12, q10
+@@vadd.f32 q7, q13, q11
+@@vld1.32 {q12,q13}, [r7, :128]
+@@vst1.32 {q4,q5}, [r4, :128]
+@@vmul.f32 q4, q12, q2
+@@vmul.f32 q11, q14, q2
+@@vmul.f32 q12, q12, q3
+@@vmul.f32 q5, q15, q2
+@@vadd.f32 q10, q9, q8
+@@vld1.32 {q8,q9}, [r3, :128]
+@@vst1.32 {q6,q7}, [r6, :128]
+@@vmls.f32 q4,q13,q3
+@@vmla.f32 q11,q15,q3
+@@vmla.f32 q12,q13,q2
+@@vmls.f32 q5,q14,q3
+@@vadd.f32 q15, q8, q10
+@@vadd.f32 q14, q4, q11
+@@vsub.f32 q8, q8, q10
+@@vsub.f32 q10, q5, q12
+@@vadd.f32 q13, q12, q5
+@@vadd.f32 q12, q9, q0
+@@vsub.f32 q9, q9, q0
+@@vsub.f32 q11, q4, q11
+@@vadd.f32 q0, q15, q14
+@@vadd.f32 q1, q12, q13
+@@vsub.f32 q2, q8, q10
+@@vsub.f32 q3, q9, q11
+@@vsub.f32 q4, q15, q14
+@@vst1.32 {q0,q1}, [r3, :128]!
+@@vld1.32 {q14,q15}, [r10, :128]
+@@vsub.f32 q5, q12, q13
+@@vld1.32 {q12,q13}, [r8, :128]
+@@vst1.32 {q2,q3}, [r5, :128]!
+@@vld1.32 {q2, q3}, [r12, :128]!
+@@vadd.f32 q6, q8, q10
+@@vadd.f32 q7, q9, q11
+@@vld1.32 {q8,q9}, [r4, :128]
+@@vst1.32 {q4,q5}, [r7, :128]!
+@@vmul.f32 q10, q14, q2
+@@vmul.f32 q11, q12, q2
+@@vmul.f32 q4, q15, q2
+@@vmul.f32 q5, q12, q3
+@@vst1.32 {q6,q7}, [r9, :128]!
+@@vmla.f32 q10,q15,q3
+@@vmls.f32 q11,q13,q3
+@@vmls.f32 q4,q14,q3
+@@vadd.f32 q12, q11, q10
+@@vmla.f32 q5,q13,q2
+@@vsub.f32 q14, q11, q10
+@@vld1.32 {q10,q11}, [r6, :128]
+@@vsub.f32 q15, q4, q5
+@@vadd.f32 q13, q5, q4
+@@vadd.f32 q0, q8, q12
+@@vsub.f32 q2, q10, q15
+@@vadd.f32 q1, q9, q13
+@@vsub.f32 q3, q11, q14
+@@vsub.f32 q4, q8, q12
+@@vsub.f32 q5, q9, q13
+@@vst1.32 {q0,q1}, [r4, :128]!
+@@vadd.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
bx lr
@@ -163,94 +295,103 @@ _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]
- adds r11, r11, #1
- vld1.32 {q14,q15}, [r6, :128]
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q1, q10, q3
- vmul.f32 q9, q15, q2
- vmul.f32 q0, q14, q2
- vmul.f32 q10, q10, q2
- vmla.f32 q1,q11,q2
- vmls.f32 q9,q14,q3
- vmla.f32 q0,q15,q3
- vsub.f32 q14, q1, q9
- vmls.f32 q10,q11,q3
- vsub.f32 q11, q10, q0
- vadd.f32 q10, q10, q0
- vadd.f32 q4, q12, q14
- vsub.f32 q5, q13, q11
- vsub.f32 q6, q12, q14
- vadd.f32 q7, q13, q11
- vst1.32 {q4,q5}, [r4, :128]
- vadd.f32 q9, q1, q9
- vld1.32 {q2,q3}, [r3, :128]
- vst1.32 {q6,q7}, [r6, :128]
- vld1.32 {q12,q13}, [r7, :128]
- vld1.32 {q14,q15}, [r9, :128]
- vmov q1, q3
- vmov q8, q2
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q0, q12, q2
- vmul.f32 q11, q14, q2
- vmul.f32 q4, q15, q2
- vmul.f32 q12, q12, q3
- vmls.f32 q0,q13,q3
- vmla.f32 q11,q15,q3
- vadd.f32 q15, q8, q10
- vmls.f32 q4,q14,q3
- vmla.f32 q12,q13,q2
- vadd.f32 q14, q0, q11
- vsub.f32 q8, q8, q10
- vsub.f32 q10, q12, q4
- vadd.f32 q13, q12, q4
- vadd.f32 q12, q1, q9
- vsub.f32 q9, q1, q9
- vsub.f32 q11, q0, q11
- vadd.f32 q0, q15, q14
- vadd.f32 q1, q12, q13
- vsub.f32 q4, q15, q14
- vadd.f32 q2, q8, q10
- vsub.f32 q5, q12, q13
- vst2.32 {q0,q1}, [r3, :128]!
- vsub.f32 q3, q9, q11
- vsub.f32 q6, q8, q10
- vadd.f32 q7, q9, q11
- vst2.32 {q2,q3}, [r5, :128]!
- vst2.32 {q4,q5}, [r7, :128]!
- vst2.32 {q6,q7}, [r9, :128]!
- vld1.32 {q8,q9}, [r4, :128]
- vld1.32 {q10,q11}, [r6, :128]
- vld1.32 {q12,q13}, [r8, :128]
- vld1.32 {q14,q15}, [r10, :128]
- vld1.32 {q2,q3}, [r12, :128]!
- vmul.f32 q4, q14, q2
- vmul.f32 q5, q12, q2
- vmul.f32 q6, q15, q2
- vmul.f32 q7, q12, q3
- vmla.f32 q4,q15,q3
- vmls.f32 q5,q13,q3
- vmls.f32 q6,q14,q3
- vadd.f32 q12, q5, q4
- vmla.f32 q7,q13,q2
- vsub.f32 q14, q5, q4
- vadd.f32 q13, q7, q6
- vsub.f32 q15, q7, q6
- vadd.f32 q0, q8, q12
- vadd.f32 q1, q9, q13
- vadd.f32 q2, q10, q15
- vsub.f32 q3, q11, q14
- vsub.f32 q4, q8, q12
- vst2.32 {q0,q1}, [r4, :128]!
- vsub.f32 q5, q9, q13
- 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]!
+ 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
@bx lr
@@ -315,12 +456,12 @@ _neon_ee_loop:
vsub.f32 d12, d18, d15
vadd.f32 d15, d31, d26
ldr r2, [r12], #4
- ldr lr, [r12], #4
vtrn.32 q1, q3
+ ldr lr, [r12], #4
vtrn.32 q0, q2
add r2, r0, r2, lsl #2
- add lr, r0, lr, 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]!
@@ -369,14 +510,14 @@ _neon_oo_loop:
vadd.f32 q4, q12, q11
vtrn.32 q0, q2
ldr r2, [r12], #4
- ldr lr, [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
- add lr, r0, lr, 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
@@ -410,12 +551,12 @@ _neon_eo:
vadd.f32 d8, d22, d21
vsub.f32 d10, d22, d21
ldr r2, [r12], #4
- ldr lr, [r12], #4
vld1.32 {d20, d21}, [r11, :128]
+ ldr lr, [r12], #4
vtrn.32 q9, q4
add r2, r0, r2, lsl #2
- add lr, r0, lr, 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
@@ -482,12 +623,12 @@ _neon_oe:
vsub.f32 q9, q13, q11
vadd.f32 q11, q13, q11
ldr r2, [r12], #4
- ldr lr, [r12], #4
vtrn.32 d24, d25
+ ldr lr, [r12], #4
vtrn.32 d20, d21
add r2, r0, r2, lsl #2
- add lr, r0, lr, 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
diff --git a/src/neon_float.h b/src/neon_float.h
index d793691..6e9a45e 100644
--- a/src/neon_float.h
+++ b/src/neon_float.h
@@ -488,7 +488,7 @@ __INLINE VS LOADSPR0(data_t *addr) {
VS r;
register V p0 __asm__ ("q8") ;
register V p1 __asm__ ("q9") ;
- __asm__ __volatile__ ("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
+ __asm__ __volatile__("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
: "=&w" (p0), "=&w" (p1)
: "r" (addr)
);
@@ -499,7 +499,7 @@ __INLINE VS LOADSPR1(data_t *addr) {
VS r;
register V p0 __asm__ ("q10") ;
register V p1 __asm__ ("q11") ;
- __asm__ __volatile__ ("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
+ __asm__ __volatile__("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
: "=&w" (p0), "=&w" (p1)
: "r" (addr)
);
@@ -510,7 +510,7 @@ __INLINE VS LOADSPR2(data_t *addr) {
VS r;
register V p0 __asm__ ("q12") ;
register V p1 __asm__ ("q13") ;
- __asm__ __volatile__ ("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
+ __asm__ __volatile__("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
: "=&w" (p0), "=&w" (p1)
: "r" (addr)
);
@@ -521,7 +521,7 @@ __INLINE VS LOADSPR3(data_t *addr) {
VS r;
register V p0 __asm__ ("q14") ;
register V p1 __asm__ ("q15") ;
- __asm__ __volatile__ ("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
+ __asm__ __volatile__("vld1.32 {%q0,%q1}, [%2, :128]\n\t"
: "=&w" (p0), "=&w" (p1)
: "r" (addr)
);
@@ -532,7 +532,7 @@ __INLINE VS LOADSPRI(data_t * restrict * addr) {
VS r;
register V p0 __asm__ ("q2") ;
register V p1 __asm__ ("q3") ;
- __asm__ __volatile__ ("vld1.32 {%q0,%q1}, [%2, :128]!\n\t"
+ __asm__ __volatile__("vld1.32 {%q0,%q1}, [%2, :128]!\n\t"
: "=&w" (p0), "=&w" (p1), "+r" (*addr)
:
);
OpenPOWER on IntegriCloud