diff options
-rw-r--r-- | include/ffts.h | 4 | ||||
-rw-r--r-- | src/codegen.c | 21 | ||||
-rw-r--r-- | src/codegen.h | 8 | ||||
-rw-r--r-- | src/cp_sse.c | 25 | ||||
-rw-r--r-- | src/cp_sse.h | 2 | ||||
-rw-r--r-- | src/macros.h | 18 | ||||
-rw-r--r-- | src/neon.s | 547 | ||||
-rw-r--r-- | src/neon_float.h | 10 |
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; @@ -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) : ); |