diff options
-rw-r--r-- | src/neon_static.s | 1169 |
1 files changed, 331 insertions, 838 deletions
diff --git a/src/neon_static.s b/src/neon_static.s index e752c70..9121c4b 100644 --- a/src/neon_static.s +++ b/src/neon_static.s @@ -33,7 +33,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ .fpu neon +.macro neon_static_e, forward=1 .align 4 + +.if \forward #ifdef __APPLE__ .globl _neon_static_e_f _neon_static_e_f: @@ -41,280 +44,7 @@ _neon_static_e_f: .globl neon_static_e_f neon_static_e_f: #endif - push {r4-r12, lr} - vpush {q4-q7} - - ldr lr, [r0, #40] @ p->N - ldr r12, [r0 ] @ p->offsets - ldr r3, [r0, #16] @ p->ee_ws - - add r7, r1, lr - add r5, r1, lr, lsl #1 - add r4, r1, lr, lsl #2 - add r10, r7, lr, lsl #1 - add r8, r7, lr, lsl #2 - - ldr r11, [r0, #28] @ p->i0 - - add r6, r4, lr, lsl #1 - add r9, r10, lr, lsl #2 - - vld1.32 {d16, d17}, [r3, :128] -1: - vld2.32 {q15}, [r10, :128]! - vld2.32 {q13}, [r8, :128]! - vld2.32 {q14}, [r7, :128]! - vld2.32 {q9}, [r4, :128]! - vld2.32 {q10}, [r1, :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 r3, [r12], #4 - vtrn.32 q1, q3 - ldr lr, [r12], #4 - vtrn.32 q0, q2 - add r3, r2, r3, lsl #2 - vsub.f32 q4, q11, q10 - add lr, r2, lr, lsl #2 - vsub.f32 q5, q14, q5 - vsub.f32 d14, d30, d27 - vst2.32 {q0, q1}, [r3, :128]! - vst2.32 {q2, q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4, q5}, [r3, :128]! - vst2.32 {q6, q7}, [lr, :128]! - bne 1b - - ldr r11, [r0, #12] - vld2.32 {q9}, [r5, :128]! - vld2.32 {q13}, [r1, :128]! - vld2.32 {q12}, [r4, :128]! - vld2.32 {q0}, [r7, :128]! - vsub.f32 q11, q13, q12 - vld2.32 {q8}, [r6, :128]! - 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 r3, [r12], #4 - vld1.32 {d20, d21}, [r11, :128] - ldr lr, [r12], #4 - vtrn.32 q9, q4 - add r3, r2, r3, lsl #2 - vtrn.32 q8, q5 - add lr, r2, lr, lsl #2 - vswp d9, d10 - vst1.32 {d8,d9,d10,d11}, [lr, :128]! - vld2.32 {q13}, [r10, :128]! - vld2.32 {q15}, [r9, :128]! - vld2.32 {q11}, [r8, :128]! - 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 - ldr r11, [r0, #32] @ p->i1 - 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 - cmp r11, #0 - vswp d1, d2 - vswp d5, d6 - vstmia r3!, {q0-q3} - beq 4f - -2: - vld2.32 {q8}, [r6, :128]! - vld2.32 {q9}, [r5, :128]! - vld2.32 {q10}, [r4, :128]! - vld2.32 {q13}, [r1, :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}, [r9, :128]! - vld2.32 {q13}, [r7, :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}, [r10, :128]! - vld2.32 {q8}, [r8, :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 r3, [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 r3, r2, r3, lsl #2 - vtrn.32 q1, q3 - add lr, r2, lr, lsl #2 - vst2.32 {q0,q1}, [r3, :128]! - vst2.32 {q2,q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4, q5}, [r3, :128]! - vst2.32 {q6, q7}, [lr, :128]! - bne 2b - - ldr r3, [r0, #16] @ p->ee_ws - ldr r11, [r0, #32] @ p->i1 - vld1.32 {d16, d17}, [r3, :128] -3: - vld2.32 {q15}, [r5, :128]! - vld2.32 {q13}, [r4, :128]! - vld2.32 {q14}, [r1, :128]! - vld2.32 {q9}, [r10, :128]! - vld2.32 {q10}, [r9, :128]! - vld2.32 {q11}, [r8, :128]! - vld2.32 {q12}, [r7, :128]! - vsub.f32 q1, q14, q13 - vld2.32 {q0}, [r6, :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 r3, [r12], #4 - vtrn.32 q1, q3 - ldr lr, [r12], #4 - vtrn.32 q0, q2 - add r3, r2, r3, lsl #2 - vsub.f32 q4, q11, q10 - add lr, r2, lr, lsl #2 - vsub.f32 q5, q14, q5 - vsub.f32 d14, d30, d27 - vst2.32 {q0, q1}, [r3, :128]! - vst2.32 {q2, q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4, q5}, [r3, :128]! - vst2.32 {q6, q7}, [lr, :128]! - bne 3b - -4: - vpop {q4-q7} - pop {r4-r12, pc} - - .align 4 +.else #ifdef __APPLE__ .globl _neon_static_e_i _neon_static_e_i: @@ -322,6 +52,7 @@ _neon_static_e_i: .globl neon_static_e_i neon_static_e_i: #endif +.endif push {r4-r12, lr} vpush {q4-q7} @@ -374,22 +105,42 @@ neon_static_e_i: vsub.f32 q7, q4, q0 vsub.f32 q9, q12, q11 vsub.f32 q13, q5, q3 +.if \forward + vsub.f32 d29, d5, d2 +.else vadd.f32 d29, d5, d2 +.endif vadd.f32 q5, q5, q3 vadd.f32 q10, q4, q0 vadd.f32 q11, q12, q11 +.if \forward + 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 +.else 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 +.endif vadd.f32 q1, q14, q5 vadd.f32 q0, q11, q10 +.if \forward + 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 +.else 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 +.endif ldr r3, [r12], #4 vtrn.32 q1, q3 ldr lr, [r12], #4 @@ -398,7 +149,11 @@ neon_static_e_i: vsub.f32 q4, q11, q10 add lr, r2, lr, lsl #2 vsub.f32 q5, q14, q5 +.if \forward + vsub.f32 d14, d30, d27 +.else vadd.f32 d14, d30, d27 +.endif vst2.32 {q0, q1}, [r3, :128]! vst2.32 {q2, q3}, [lr, :128]! vtrn.32 q4, q6 @@ -418,11 +173,21 @@ neon_static_e_i: vsub.f32 q10, q9, q8 vadd.f32 q8, q9, q8 vadd.f32 q9, q12, q8 +.if \forward + vsub.f32 d9, d23, d20 + vadd.f32 d11, d23, d20 +.else vadd.f32 d9, d23, d20 vsub.f32 d11, d23, d20 +.endif vsub.f32 q8, q12, q8 +.if \forward + vadd.f32 d8, d22, d21 + vsub.f32 d10, d22, d21 +.else vsub.f32 d8, d22, d21 vadd.f32 d10, d22, d21 +.endif ldr r3, [r12], #4 vld1.32 {d20, d21}, [r11, :128] ldr lr, [r12], #4 @@ -439,11 +204,21 @@ neon_static_e_i: vsub.f32 q12, q0, q11 vadd.f32 q11, q0, q11 vadd.f32 q13, q15, q13 +.if \forward + vsub.f32 d13, d29, d24 +.else vadd.f32 d13, d29, d24 +.endif vadd.f32 q15, q13, q11 +.if \forward + vadd.f32 d12, d28, d25 + vadd.f32 d15, d29, d24 + vsub.f32 d14, d28, d25 +.else vsub.f32 d12, d28, d25 vsub.f32 d15, d29, d24 vadd.f32 d14, d28, d25 +.endif vtrn.32 q15, q6 vsub.f32 q15, q13, q11 vtrn.32 q15, q7 @@ -468,10 +243,17 @@ neon_static_e_i: vsub.f32 q10, q12, q10 vadd.f32 q0, q9, q11 vsub.f32 q2, q9, q11 +.if \forward + vsub.f32 d3, d17, d20 + vadd.f32 d7, d17, d20 + vadd.f32 d2, d16, d21 + vsub.f32 d6, d16, d21 +.else vadd.f32 d3, d17, d20 vsub.f32 d7, d17, d20 vsub.f32 d2, d16, d21 vadd.f32 d6, d16, d21 +.endif cmp r11, #0 vswp d1, d2 vswp d5, d6 @@ -491,10 +273,17 @@ neon_static_e_i: vld2.32 {q10}, [r9, :128]! vld2.32 {q13}, [r7, :128]! vsub.f32 q2, q12, q11 +.if \forward + vadd.f32 d7, d19, d16 + vsub.f32 d3, d19, d16 + vsub.f32 d6, d18, d17 + vadd.f32 d2, d18, d17 +.else vsub.f32 d7, d19, d16 vadd.f32 d3, d19, d16 vadd.f32 d6, d18, d17 vsub.f32 d2, d18, d17 +.endif vld2.32 {q9}, [r10, :128]! vld2.32 {q8}, [r8, :128]! vadd.f32 q0, q12, q11 @@ -506,11 +295,21 @@ neon_static_e_i: vadd.f32 q4, q12, q11 vtrn.32 q0, q2 ldr r3, [r12], #4 +.if \forward + vadd.f32 d15, d19, d16 +.else vsub.f32 d15, d19, d16 +.endif ldr lr, [r12], #4 +.if \forward + vsub.f32 d11, d19, d16 + vsub.f32 d14, d18, d17 + vadd.f32 d10, d18, d17 +.else vadd.f32 d11, d19, d16 vadd.f32 d14, d18, d17 vsub.f32 d10, d18, d17 +.endif add r3, r2, r3, lsl #2 vtrn.32 q1, q3 add lr, r2, lr, lsl #2 @@ -558,22 +357,42 @@ neon_static_e_i: vsub.f32 q7, q4, q0 vsub.f32 q9, q12, q11 vsub.f32 q13, q5, q3 +.if \forward + vsub.f32 d29, d5, d2 +.else vadd.f32 d29, d5, d2 +.endif vadd.f32 q5, q5, q3 vadd.f32 q10, q4, q0 vadd.f32 q11, q12, q11 +.if \forward + 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 +.else 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 +.endif vadd.f32 q1, q14, q5 vadd.f32 q0, q11, q10 +.if \forward + 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 +.else 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 +.endif ldr r3, [r12], #4 vtrn.32 q1, q3 ldr lr, [r12], #4 @@ -582,7 +401,11 @@ neon_static_e_i: vsub.f32 q4, q11, q10 add lr, r2, lr, lsl #2 vsub.f32 q5, q14, q5 +.if \forward + vsub.f32 d14, d30, d27 +.else vadd.f32 d14, d30, d27 +.endif vst2.32 {q0, q1}, [r3, :128]! vst2.32 {q2, q3}, [lr, :128]! vtrn.32 q4, q6 @@ -594,8 +417,12 @@ neon_static_e_i: 4: vpop {q4-q7} pop {r4-r12, pc} +.endm +.macro neon_static_o, forward=1 .align 4 + +.if \forward #ifdef __APPLE__ .globl _neon_static_o_f _neon_static_o_f: @@ -603,288 +430,7 @@ _neon_static_o_f: .globl neon_static_o_f neon_static_o_f: #endif - push {r4-r12, lr} - vpush {q4-q7} - - ldr lr, [r0, #40] @ p->N - ldr r12, [r0 ] @ p->offsets - ldr r3, [r0, #16] @ p->ee_ws - - add r7, r1, lr - add r5, r1, lr, lsl #1 - add r4, r1, lr, lsl #2 - add r10, r7, lr, lsl #1 - add r8, r7, lr, lsl #2 - - ldr r11, [r0, #28] @ p->i0 - - add r6, r4, lr, lsl #1 - add r9, r10, lr, lsl #2 - - vld1.32 {d16, d17}, [r3, :128] -1: - vld2.32 {q15}, [r10, :128]! - vld2.32 {q13}, [r8, :128]! - vld2.32 {q14}, [r7, :128]! - vld2.32 {q9}, [r4, :128]! - vld2.32 {q10}, [r1, :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 r3, [r12], #4 - vtrn.32 q1, q3 - ldr lr, [r12], #4 - vtrn.32 q0, q2 - add r3, r2, r3, lsl #2 - vsub.f32 q4, q11, q10 - add lr, r2, lr, lsl #2 - vsub.f32 q5, q14, q5 - vsub.f32 d14, d30, d27 - vst2.32 {q0, q1}, [r3, :128]! - vst2.32 {q2, q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4, q5}, [r3, :128]! - vst2.32 {q6, q7}, [lr, :128]! - bne 1b - - ldr r11, [r0, #32] @ p->i1 - cmp r11, #0 - beq 3f -2: - vld2.32 {q8}, [r6, :128]! - vld2.32 {q9}, [r5, :128]! - vld2.32 {q10}, [r4, :128]! - vld2.32 {q13}, [r1, :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}, [r9, :128]! - vld2.32 {q13}, [r7, :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}, [r10, :128]! - vld2.32 {q8}, [r8, :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 r3, [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 r3, r2, r3, lsl #2 - vtrn.32 q1, q3 - add lr, r2, lr, lsl #2 - vst2.32 {q0,q1}, [r3, :128]! - vst2.32 {q2,q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4,q5}, [r3, :128]! - vst2.32 {q6,q7}, [lr, :128]! - bne 2b - -3: - ldr r11, [r0, #8] - vld1.32 {q8}, [r5, :128]! - vld1.32 {q10}, [r6, :128]! - vld2.32 {q11}, [r4, :128]! - vld2.32 {q13}, [r1, :128]! - vld2.32 {q15}, [r8, :128]! - vorr d25, d17, d17 - vorr d24, d20, d20 - vorr d20, d16, d16 - vsub.f32 q9, q13, q11 - vadd.f32 q11, q13, q11 - ldr r3, [r12], #4 - vtrn.32 d24, d25 - ldr lr, [r12], #4 - vtrn.32 d20, d21 - add r3, r2, r3, lsl #2 - vsub.f32 q8, q10, q12 - add lr, r2, 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}, [r3, :128]! - vld2.32 {q0}, [r7, :128]! - vadd.f32 q1, q0, q15 - vld2.32 {q13}, [r10, :128]! - vld2.32 {q14}, [r9, :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}, [r3, :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 - ldr r3, [r0, #16] @ p->ee_ws - vsub.f32 d21, d30, d19 - ldr r11, [r0, #32] @ p->i1 - 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 - cmp r11, #0 - vswp d9, d10 - vswp d13, d14 - vstmia lr!, {q4-q7} - beq 5f - - vld1.32 {d16, d17}, [r3, :128] -4: - vld2.32 {q15}, [r5, :128]! - vld2.32 {q13}, [r4, :128]! - vld2.32 {q14}, [r1, :128]! - vld2.32 {q9}, [r10, :128]! - vld2.32 {q10}, [r9, :128]! - vld2.32 {q11}, [r8, :128]! - vld2.32 {q12}, [r7, :128]! - vsub.f32 q1, q14, q13 - vld2.32 {q0}, [r6, :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 r3, [r12], #4 - vtrn.32 q1, q3 - ldr lr, [r12], #4 - vtrn.32 q0, q2 - add r3, r2, r3, lsl #2 - vsub.f32 q4, q11, q10 - add lr, r2, lr, lsl #2 - vsub.f32 q5, q14, q5 - vsub.f32 d14, d30, d27 - vst2.32 {q0, q1}, [r3, :128]! - vst2.32 {q2, q3}, [lr, :128]! - vtrn.32 q4, q6 - vtrn.32 q5, q7 - vst2.32 {q4, q5}, [r3, :128]! - vst2.32 {q6, q7}, [lr, :128]! - bne 4b - -5: - vpop {q4-q7} - pop {r4-r12, pc} - - .align 4 +.else #ifdef __APPLE__ .globl _neon_static_o_i _neon_static_o_i: @@ -892,6 +438,7 @@ _neon_static_o_i: .globl neon_static_o_i neon_static_o_i: #endif +.endif push {r4-r12, lr} vpush {q4-q7} @@ -944,22 +491,42 @@ neon_static_o_i: vsub.f32 q7, q4, q0 vsub.f32 q9, q12, q11 vsub.f32 q13, q5, q3 +.if \forward + vsub.f32 d29, d5, d2 +.else vadd.f32 d29, d5, d2 +.endif vadd.f32 q5, q5, q3 vadd.f32 q10, q4, q0 vadd.f32 q11, q12, q11 +.if \forward + 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 +.else 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 +.endif vadd.f32 q1, q14, q5 vadd.f32 q0, q11, q10 +.if \forward + 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 +.else 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 +.endif ldr r3, [r12], #4 vtrn.32 q1, q3 ldr lr, [r12], #4 @@ -968,7 +535,11 @@ neon_static_o_i: vsub.f32 q4, q11, q10 add lr, r2, lr, lsl #2 vsub.f32 q5, q14, q5 +.if \forward + vsub.f32 d14, d30, d27 +.else vadd.f32 d14, d30, d27 +.endif vst2.32 {q0, q1}, [r3, :128]! vst2.32 {q2, q3}, [lr, :128]! vtrn.32 q4, q6 @@ -993,10 +564,17 @@ neon_static_o_i: vld2.32 {q10}, [r9, :128]! vld2.32 {q13}, [r7, :128]! vsub.f32 q2, q12, q11 +.if \forward + vadd.f32 d7, d19, d16 + vsub.f32 d3, d19, d16 + vsub.f32 d6, d18, d17 + vadd.f32 d2, d18, d17 +.else vsub.f32 d7, d19, d16 vadd.f32 d3, d19, d16 vadd.f32 d6, d18, d17 vsub.f32 d2, d18, d17 +.endif vld2.32 {q9}, [r10, :128]! vld2.32 {q8}, [r8, :128]! vadd.f32 q0, q12, q11 @@ -1006,13 +584,24 @@ neon_static_o_i: vsub.f32 q9, q10, q9 vsub.f32 q6, q12, q11 vadd.f32 q4, q12, q11 + vtrn.32 q0, q2 ldr r3, [r12], #4 +.if \forward + vadd.f32 d15, d19, d16 +.else vsub.f32 d15, d19, d16 +.endif ldr lr, [r12], #4 +.if \forward + vsub.f32 d11, d19, d16 + vsub.f32 d14, d18, d17 + vadd.f32 d10, d18, d17 +.else vadd.f32 d11, d19, d16 vadd.f32 d14, d18, d17 vsub.f32 d10, d18, d17 +.endif add r3, r2, r3, lsl #2 vtrn.32 q1, q3 add lr, r2, lr, lsl #2 @@ -1045,11 +634,21 @@ neon_static_o_i: add lr, r2, lr, lsl #2 vadd.f32 q10, q10, q12 vadd.f32 q0, q11, q10 +.if \forward + vsub.f32 d25, d19, d16 + vadd.f32 d27, d19, d16 +.else vadd.f32 d25, d19, d16 vsub.f32 d27, d19, d16 +.endif vsub.f32 q1, q11, q10 +.if \forward + vadd.f32 d24, d18, d17 + vsub.f32 d26, d18, d17 +.else vsub.f32 d24, d18, d17 vadd.f32 d26, d18, d17 +.endif vtrn.32 q0, q12 vtrn.32 q1, q13 vld1.32 {d24, d25}, [r11, :128] @@ -1063,11 +662,21 @@ neon_static_o_i: vsub.f32 q0, q14, q13 vadd.f32 q3, q14, q13 vadd.f32 q2, q3, q1 +.if \forward + vsub.f32 d29, d1, d30 + vadd.f32 d27, d1, d30 +.else vadd.f32 d29, d1, d30 vsub.f32 d27, d1, d30 +.endif vsub.f32 q3, q3, q1 +.if \forward + vadd.f32 d28, d0, d31 + vsub.f32 d26, d0, d31 +.else vsub.f32 d28, d0, d31 vadd.f32 d26, d0, d31 +.endif vtrn.32 q2, q14 vtrn.32 q3, q13 vswp d5, d6 @@ -1092,10 +701,17 @@ neon_static_o_i: vsub.f32 q8, q8, q10 vadd.f32 q4, q14, q9 vsub.f32 q6, q14, q9 +.if \forward + vsub.f32 d11, d27, d16 + vadd.f32 d15, d27, d16 + vadd.f32 d10, d26, d17 + vsub.f32 d14, d26, d17 +.else vadd.f32 d11, d27, d16 vsub.f32 d15, d27, d16 vsub.f32 d10, d26, d17 vadd.f32 d14, d26, d17 +.endif cmp r11, #0 vswp d9, d10 vswp d13, d14 @@ -1136,22 +752,42 @@ neon_static_o_i: vsub.f32 q7, q4, q0 vsub.f32 q9, q12, q11 vsub.f32 q13, q5, q3 +.if \forward + vsub.f32 d29, d5, d2 +.else vadd.f32 d29, d5, d2 +.endif vadd.f32 q5, q5, q3 vadd.f32 q10, q4, q0 vadd.f32 q11, q12, q11 +.if \forward + 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 +.else 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 +.endif vadd.f32 q1, q14, q5 vadd.f32 q0, q11, q10 +.if \forward + 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 +.else 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 +.endif ldr r3, [r12], #4 vtrn.32 q1, q3 ldr lr, [r12], #4 @@ -1160,7 +796,11 @@ neon_static_o_i: vsub.f32 q4, q11, q10 add lr, r2, lr, lsl #2 vsub.f32 q5, q14, q5 +.if \forward + vsub.f32 d14, d30, d27 +.else vadd.f32 d14, d30, d27 +.endif vst2.32 {q0, q1}, [r3, :128]! vst2.32 {q2, q3}, [lr, :128]! vtrn.32 q4, q6 @@ -1172,8 +812,12 @@ neon_static_o_i: 5: vpop {q4-q7} pop {r4-r12, pc} +.endm + +.macro neon_static_x4, forward=1 + .align 4 - .align 4 +.if \forward #ifdef __APPLE__ .globl _neon_static_x4_f _neon_static_x4_f: @@ -1181,51 +825,7 @@ _neon_static_x4_f: .globl neon_static_x4_f neon_static_x4_f: #endif - add r3, r0, #64 - vpush {q4-q7} - - vld1.32 {q2, q3}, [r1, :128] - vld1.32 {q12, q13}, [r3, :128]! - mov r2, r0 - vmul.f32 q0, q13, q3 - vld1.32 {q14, q15}, [r3, :128] - vmul.f32 q5, q12, q2 - vld1.32 {q8, q9}, [r0, :128]! - vmul.f32 q1, q14, q2 - vld1.32 {q10, q11}, [r0, :128] - 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}, [r2, :128]! - - vsub.f32 q5, q9, q14 - vsub.f32 q6, q10, q13 - vadd.f32 q7, q11, q12 - - vst1.32 {q2, q3}, [r2, :128]! - vst1.32 {q4, q5}, [r2, :128]! - vst1.32 {q6, q7}, [r2, :128] - - vpop {q4-q7} - bx lr - - .align 4 +.else #ifdef __APPLE__ .globl _neon_static_x4_i _neon_static_x4_i: @@ -1233,6 +833,7 @@ _neon_static_x4_i: .globl neon_static_x4_i neon_static_x4_i: #endif +.endif add r3, r0, #64 vpush {q4-q7} @@ -1260,24 +861,38 @@ neon_static_x4_i: vsub.f32 q13, q13, q1 vadd.f32 q0, q8, q15 vadd.f32 q1, q9, q14 +.if \forward + vadd.f32 q2, q10, q13 +.else vsub.f32 q2, q10, q13 +.endif vsub.f32 q4, q8, q15 +.if \forward + vsub.f32 q3, q11, q12 +.else vadd.f32 q3, q11, q12 - +.endif vst1.32 {q0, q1}, [r2, :128]! - vsub.f32 q5, q9, q14 +.if \forward + vsub.f32 q6, q10, q13 + vadd.f32 q7, q11, q12 +.else vadd.f32 q6, q10, q13 vsub.f32 q7, q11, q12 - +.endif vst1.32 {q2, q3}, [r2, :128]! vst1.32 {q4, q5}, [r2, :128]! vst1.32 {q6, q7}, [r2, :128] vpop {q4-q7} bx lr +.endm - .align 4 +.macro neon_static_x8, forward=1 + .align 4 + +.if \forward #ifdef __APPLE__ .globl _neon_static_x8_f _neon_static_x8_f: @@ -1285,120 +900,7 @@ _neon_static_x8_f: .globl neon_static_x8_f neon_static_x8_f: #endif - push {r4-r8, lr} - vpush {q4-q7} - - add r4, r0, r1, lsl #1 @ data2 - add r3, r0, r1 @ data1 - add r6, r4, r1, lsl #1 @ data4 - add r5, r4, r1 @ data3 - add r8, r6, r1, lsl #1 @ data6 - add r7, r6, r1 @ data5 - add r12, r8, r1 @ data7 - -1: - vld1.32 {q2, q3}, [r2, :128]! - subs r1, r1, #32 - vld1.32 {q14, q15}, [r5, :128] - vmul.f32 q12, q15, q2 - vld1.32 {q10, q11}, [r4, :128] - 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 - vsub.f32 q10, q12, q8 - vld1.32 {q2, q3}, [r2, :128]! - vadd.f32 q11, q0, q9 - vadd.f32 q8, q15, q13 - vsub.f32 q9, q1, q14 - vld1.32 {q12, q13}, [r3, :128] - 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}, [r8, :128] - vld1.32 {q12, q13}, [r6, :128] - vmul.f32 q1, q14, q2 - vmul.f32 q0, q14, q3 - vst1.32 {q4, q5}, [r3, :128] - vmul.f32 q14, q15, q3 - vmul.f32 q4, q15, q2 - vadd.f32 q15, q9, q8 - vst1.32 {q6, q7}, [r5, :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}, [r0, :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}, [r0, :128]! - vsub.f32 q5, q13, q15 - vld1.32 {q14, q15}, [r12, :128] - vadd.f32 q7, q9, q12 - vld1.32 {q12, q13}, [r7, :128] - vst1.32 {q2, q3}, [r4, :128]! - vld1.32 {q2, q3}, [r2, :128]! - vsub.f32 q6, q8, q10 - vmul.f32 q8, q14, q2 - vst1.32 {q4, q5}, [r6, :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}, [r8, :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}, [r3, :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}, [r5, :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}, [r3, :128]! - vsub.f32 q5, q9, q12 - vsub.f32 q6, q10, q15 - vst1.32 {q2, q3}, [r5, :128]! - vadd.f32 q7, q11, q14 - vst1.32 {q4, q5}, [r7, :128]! - vst1.32 {q6, q7}, [r12, :128]! - bne 1b - - vpop {q4-q7} - pop {r4-r8, pc} - - .align 4 +.else #ifdef __APPLE__ .globl _neon_static_x8_i _neon_static_x8_i: @@ -1406,6 +908,7 @@ _neon_static_x8_i: .globl neon_static_x8_i neon_static_x8_i: #endif +.endif push {r4-r8, lr} vpush {q4-q7} @@ -1438,10 +941,17 @@ neon_static_x8_i: vld1.32 {q12, q13}, [r3, :128] vsub.f32 q15, q11, q10 vsub.f32 q14, q9, q8 +.if \forward + vadd.f32 q4, q12, q15 + vsub.f32 q6, q12, q15 + vsub.f32 q5, q13, q14 + vadd.f32 q7, q13, q14 +.else vsub.f32 q4, q12, q15 vadd.f32 q6, q12, q15 vadd.f32 q5, q13, q14 vsub.f32 q7, q13, q14 +.endif vld1.32 {q14, q15}, [r8, :128] vld1.32 {q12, q13}, [r6, :128] vmul.f32 q1, q14, q2 @@ -1472,16 +982,29 @@ neon_static_x8_i: vadd.f32 q0, q11, q2 vadd.f32 q1, q13, q15 vsub.f32 q4, q11, q2 +.if \forward + vadd.f32 q2, q8, q10 + vsub.f32 q3, q9, q12 +.else vsub.f32 q2, q8, q10 vadd.f32 q3, q9, q12 +.endif vst1.32 {q0, q1}, [r0, :128]! vsub.f32 q5, q13, q15 vld1.32 {q14, q15}, [r12, :128] +.if \forward + vadd.f32 q7, q9, q12 +.else vsub.f32 q7, q9, q12 +.endif vld1.32 {q12, q13}, [r7, :128] vst1.32 {q2, q3}, [r4, :128]! vld1.32 {q2, q3}, [r2, :128]! +.if \forward + vsub.f32 q6, q8, q10 +.else vadd.f32 q6, q8, q10 +.endif vmul.f32 q8, q14, q2 vst1.32 {q4, q5}, [r6, :128]! vmul.f32 q10, q15, q3 @@ -1504,22 +1027,39 @@ neon_static_x8_i: vld1.32 {q10, q11}, [r5, :128] vadd.f32 q0, q8, q13 vadd.f32 q1, q9, q12 +.if \forward + vadd.f32 q2, q10, q15 + vsub.f32 q3, q11, q14 +.else vsub.f32 q2, q10, q15 vadd.f32 q3, q11, q14 +.endif vsub.f32 q4, q8, q13 vst1.32 {q0, q1}, [r3, :128]! vsub.f32 q5, q9, q12 +.if \forward + vsub.f32 q6, q10, q15 +.else vadd.f32 q6, q10, q15 +.endif vst1.32 {q2, q3}, [r5, :128]! +.if \forward + vadd.f32 q7, q11, q14 +.else vsub.f32 q7, q11, q14 +.endif vst1.32 {q4, q5}, [r7, :128]! vst1.32 {q6, q7}, [r12, :128]! bne 1b vpop {q4-q7} pop {r4-r8, pc} +.endm - .align 4 +.macro neon_static_x8_t, forward=1 + .align 4 + +.if \forward #ifdef __APPLE__ .globl _neon_static_x8_t_f _neon_static_x8_t_f: @@ -1527,6 +1067,15 @@ _neon_static_x8_t_f: .globl neon_static_x8_t_f neon_static_x8_t_f: #endif +.else +#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 +.endif push {r4-r8, lr} vpush {q4-q7} @@ -1559,10 +1108,17 @@ neon_static_x8_t_f: vld1.32 {q12, q13}, [r3, :128] vsub.f32 q15, q11, q10 vsub.f32 q14, q9, q8 +.if \forward vadd.f32 q4, q12, q15 vsub.f32 q6, q12, q15 vsub.f32 q5, q13, q14 vadd.f32 q7, q13, q14 +.else + vsub.f32 q4, q12, q15 + vadd.f32 q6, q12, q15 + vadd.f32 q5, q13, q14 + vsub.f32 q7, q13, q14 +.endif vld1.32 {q14, q15}, [r8, :128] vld1.32 {q12, q13}, [r6, :128] vmul.f32 q1, q14, q2 @@ -1593,16 +1149,29 @@ neon_static_x8_t_f: vadd.f32 q0, q11, q2 vadd.f32 q1, q13, q15 vsub.f32 q4, q11, q2 +.if \forward vadd.f32 q2, q8, q10 vsub.f32 q3, q9, q12 +.else + vsub.f32 q2, q8, q10 + vadd.f32 q3, q9, q12 +.endif vst2.32 {q0, q1}, [r0, :128]! vsub.f32 q5, q13, q15 vld1.32 {q14, q15}, [r12, :128] +.if \forward vadd.f32 q7, q9, q12 +.else + vsub.f32 q7, q9, q12 +.endif vld1.32 {q12, q13}, [r7, :128] vst2.32 {q2, q3}, [r4, :128]! vld1.32 {q2, q3}, [r2, :128]! +.if \forward vsub.f32 q6, q8, q10 +.else + vadd.f32 q6, q8, q10 +.endif vmul.f32 q8, q14, q2 vst2.32 {q4, q5}, [r6, :128]! vmul.f32 q10, q15, q3 @@ -1625,138 +1194,62 @@ neon_static_x8_t_f: vld1.32 {q10, q11}, [r5, :128] vadd.f32 q0, q8, q13 vadd.f32 q1, q9, q12 +.if \forward vadd.f32 q2, q10, q15 vsub.f32 q3, q11, q14 +.else + vsub.f32 q2, q10, q15 + vadd.f32 q3, q11, q14 +.endif vsub.f32 q4, q8, q13 vst2.32 {q0, q1}, [r3, :128]! vsub.f32 q5, q9, q12 +.if \forward vsub.f32 q6, q10, q15 +.else + vadd.f32 q6, q10, q15 +.endif vst2.32 {q2, q3}, [r5, :128]! +.if \forward vadd.f32 q7, q11, q14 +.else + vsub.f32 q7, q11, q14 +.endif vst2.32 {q4, q5}, [r7, :128]! vst2.32 {q6, q7}, [r12, :128]! bne 1b vpop {q4-q7} pop {r4-r8, pc} +.endm - .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-r8, lr} - vpush {q4-q7} +# neon_static_e_f +neon_static_e, forward=1 - add r4, r0, r1, lsl #1 @ data2 - add r3, r0, r1 @ data1 - add r6, r4, r1, lsl #1 @ data4 - add r5, r4, r1 @ data3 - add r8, r6, r1, lsl #1 @ data6 - add r7, r6, r1 @ data5 - add r12, r8, r1 @ data7 +# neon_static_e_i +neon_static_e, forward=0 -1: - vld1.32 {q2, q3}, [r2, :128]! - subs r1, r1, #32 - vld1.32 {q14, q15}, [r5, :128] - vmul.f32 q12, q15, q2 - vld1.32 {q10, q11}, [r4, :128] - 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 - vsub.f32 q10, q12, q8 - vld1.32 {q2, q3}, [r2, :128]! - vadd.f32 q11, q0, q9 - vadd.f32 q8, q15, q13 - vsub.f32 q9, q1, q14 - vld1.32 {q12, q13}, [r3, :128] - 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}, [r8, :128] - vld1.32 {q12, q13}, [r6, :128] - vmul.f32 q1, q14, q2 - vmul.f32 q0, q14, q3 - vst1.32 {q4, q5}, [r3, :128] - vmul.f32 q14, q15, q3 - vmul.f32 q4, q15, q2 - vadd.f32 q15, q9, q8 - vst1.32 {q6, q7}, [r5, :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}, [r0, :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}, [r0, :128]! - vsub.f32 q5, q13, q15 - vld1.32 {q14, q15}, [r12,:128] - vsub.f32 q7, q9, q12 - vld1.32 {q12, q13}, [r7, :128] - vst2.32 {q2, q3}, [r4, :128]! - vld1.32 {q2, q3}, [r2, :128]! - vadd.f32 q6, q8, q10 - vmul.f32 q8, q14, q2 - vst2.32 {q4, q5}, [r6, :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}, [r8, :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}, [r3, :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}, [r5, :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}, [r3, :128]! - vsub.f32 q5, q9, q12 - vadd.f32 q6, q10, q15 - vst2.32 {q2, q3}, [r5, :128]! - vsub.f32 q7, q11, q14 - vst2.32 {q4, q5}, [r7, :128]! - vst2.32 {q6, q7}, [r12,:128]! - bne 1b +# neon_static_o_f +neon_static_o, forward=1 + +# neon_static_o_i +neon_static_o, forward=0 + +# neon_static_x4_f +neon_static_x4, forward=1 + +# neon_static_x4_i +neon_static_x4, forward=0 + +# neon_static_x8_f +neon_static_x8, forward=1 + +# neon_static_x8_i +neon_static_x8, forward=0 + +# neon_static_x8_t_f +neon_static_x8_t, forward=1 + +# neon_static_x8_t_i +neon_static_x8_t, forward=0 - vpop {q4-q7} - pop {r4-r8, pc} |