summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/neon_static.s1169
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}
OpenPOWER on IntegriCloud