summaryrefslogtreecommitdiff
path: root/Runtime/Filters/Mesh/MeshSkinningNEON.asm
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Filters/Mesh/MeshSkinningNEON.asm
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Filters/Mesh/MeshSkinningNEON.asm')
-rw-r--r--Runtime/Filters/Mesh/MeshSkinningNEON.asm527
1 files changed, 527 insertions, 0 deletions
diff --git a/Runtime/Filters/Mesh/MeshSkinningNEON.asm b/Runtime/Filters/Mesh/MeshSkinningNEON.asm
new file mode 100644
index 0000000..494b397
--- /dev/null
+++ b/Runtime/Filters/Mesh/MeshSkinningNEON.asm
@@ -0,0 +1,527 @@
+ AREA .text, CODE
+
+ EXPORT _s_SkinVertices_NEON
+ EXPORT _s_SkinVertices_NoNormals_NEON
+ EXPORT _s_SkinVertices_Tangents_NEON
+ EXPORT _s_SkinVertices2Bones_NEON
+ EXPORT _s_SkinVertices2Bones_NoNormals_NEON
+ EXPORT _s_SkinVertices2Bones_Tangents_NEON
+ EXPORT _s_SkinVertices4Bones_NEON
+ EXPORT _s_SkinVertices4Bones_NoNormals_NEON
+ EXPORT _s_SkinVertices4Bones_Tangents_NEON
+
+|_s_SkinVertices_NEON| PROC
+ mov ip, sp
+ vpush {d8-d10}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ mov.w r8, #12
+ ldr.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+
+|_s_SkinVertices_NEON_loop|
+ vld1.32 {d24-d27}, [r7@128]!
+ vld1.32 {d28-d31}, [r7@128]
+ vld1.32 {d6-d8}, [r1@64]!
+ vmul.f32 q0, q12, d6[0]
+ vmul.f32 q1, q12, d7[1]
+ cmp r1, r2
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ vmla.f32 q1, q13, d8[0]
+ it cc
+ ldrcc.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+ vmla.f32 q0, q14, d7[0]
+ vmla.f32 q1, q14, d8[1]
+ pld [r7]
+ vadd.f32 q0, q0, q15
+ vst1.32 {d0-d1}, [r4], r8
+ vst1.32 {d2-d3}, [r4], r8
+ bcc.w |_s_SkinVertices_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d10}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices_NoNormals_NEON| PROC
+ mov ip, sp
+ vpush {d8-d10}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ mov.w r8, #12
+ ldr.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+
+|_s_SkinVertices_NoNormals_NEON_loop|
+ vld1.32 {d24-d27}, [r7@128]!
+ vld1.32 {d28-d31}, [r7@128]
+ vld1.32 {d6-d7}, [r1], r8
+ vmul.f32 q0, q12, d6[0]
+ cmp r1, r2
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ it cc
+ ldrcc.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+ vmla.f32 q0, q14, d7[0]
+ pld [r7]
+ vadd.f32 q0, q0, q15
+ vst1.32 {d0-d1}, [r4], r8
+ bcc.w |_s_SkinVertices_NoNormals_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d10}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices_Tangents_NEON| PROC
+ mov ip, sp
+ vpush {d8-d10}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ mov.w r8, #12
+ ldr.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+
+|_s_SkinVertices_Tangents_NEON_loop|
+ vld1.32 {d24-d27}, [r7@128]!
+ vld1.32 {d28-d31}, [r7@128]
+ vld1.32 {d6-d8}, [r1@64]!
+ vld1.32 {d9-d10}, [r1@64]!
+ vmul.f32 q0, q12, d6[0]
+ vmul.f32 q1, q12, d7[1]
+ vmul.f32 q2, q12, d9[0]
+ cmp r1, r2
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ vmla.f32 q1, q13, d8[0]
+ vmla.f32 q2, q13, d9[1]
+ it cc
+ ldrcc.w r5, [r3], #4
+ add.w r7, r0, r5, lsl #6
+ vmla.f32 q0, q14, d7[0]
+ vmla.f32 q1, q14, d8[1]
+ vmla.f32 q2, q14, d10[0]
+ pld [r7]
+ vadd.f32 q0, q0, q15
+ vmov.f32 s11, s21
+ vst1.32 {d0-d1}, [r4], r8
+ vst1.32 {d2-d3}, [r4], r8
+ vst1.32 {d4-d5}, [r4]!
+ bcc.w |_s_SkinVertices_Tangents_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d10}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices2Bones_NEON| PROC
+ mov ip, sp
+ vpush {d8-d11}
+ stmdb sp!, {r4, r5, r6, r7, r8, sl}
+ ldr.w r4, [ip]
+ vld1.32 {d11}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q12, q8, d11[0]
+ vmul.f32 q13, q9, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q12, q8, d11[1]
+ vmla.f32 q13, q9, d11[1]
+ ldr r5, [r3, #8]
+ mov.w r8, #12
+ sub.w sl, r2, #24
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q14, q10, d11[1]
+ nop
+
+|_s_SkinVertices2Bones_NEON_loop|
+ cmp r1, sl
+ add.w r7, r0, r5, lsl #6
+ it cc
+ ldrcc r6, [r3, #12]
+ vld1.32 {d6-d8}, [r1@64]!
+ vmla.f32 q15, q11, d11[1]
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ cmp r1, sl
+ vmul.f32 q1, q12, d7[1]
+ vld1.32 {d11}, [r3]
+ vmul.f32 q12, q8, d11[0]
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ vmla.f32 q1, q13, d8[0]
+ it cc
+ ldrcc r5, [r3, #24]
+ vmul.f32 q13, q9, d11[0]
+ vmla.f32 q0, q14, d7[0]
+ cmp r1, r2
+ vmla.f32 q1, q14, d8[1]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q14, q10, d11[0]
+ vadd.f32 q0, q0, q15
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ vst1.32 {d0-d1}, [r4], r8
+ vmla.f32 q13, q9, d11[1]
+ vst1.32 {d2-d3}, [r4], r8
+ add.w r3, r3, #16
+ vmla.f32 q14, q10, d11[1]
+ bcc.w |_s_SkinVertices2Bones_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8, sl}
+ vpop {d8-d11}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices2Bones_NoNormals_NEON| PROC
+ mov ip, sp
+ vpush {d8-d11}
+ stmdb sp!, {r4, r5, r6, r7, r8, sl}
+ ldr.w r4, [ip]
+ vld1.32 {d11}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q12, q8, d11[0]
+ vmul.f32 q13, q9, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q12, q8, d11[1]
+ vmla.f32 q13, q9, d11[1]
+ ldr r5, [r3, #8]
+ mov.w r8, #12
+ sub.w sl, r2, #12
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q14, q10, d11[1]
+ nop
+ nop.w
+
+|_s_SkinVertices2Bones_NoNormals_NEON_loop|
+ cmp r1, sl
+ add.w r7, r0, r5, lsl #6
+ it cc
+ ldrcc r6, [r3, #12]
+ vld1.32 {d6-d7}, [r1], r8
+ vmla.f32 q15, q11, d11[1]
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ cmp r1, sl
+ vld1.32 {d11}, [r3]
+ vmul.f32 q12, q8, d11[0]
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ it cc
+ ldrcc r5, [r3, #24]
+ vmul.f32 q13, q9, d11[0]
+ vmla.f32 q0, q14, d7[0]
+ cmp r1, r2
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q14, q10, d11[0]
+ vadd.f32 q0, q0, q15
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ vst1.32 {d0-d1}, [r4], r8
+ vmla.f32 q13, q9, d11[1]
+ add.w r3, r3, #16
+ vmla.f32 q14, q10, d11[1]
+ bcc.w |_s_SkinVertices2Bones_NoNormals_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8, sl}
+ vpop {d8-d11}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices2Bones_Tangents_NEON| PROC
+ mov ip, sp
+ vpush {d8-d11}
+ stmdb sp!, {r4, r5, r6, r7, r8, sl}
+ ldr.w r4, [ip]
+ vld1.32 {d11}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q12, q8, d11[0]
+ vmul.f32 q13, q9, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q12, q8, d11[1]
+ vmla.f32 q13, q9, d11[1]
+ ldr r5, [r3, #8]
+ mov.w r8, #12
+ sub.w sl, r2, #40 ; 0x28
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q14, q10, d11[1]
+ nop
+ nop.w
+
+|_s_SkinVertices2Bones_Tangents_NEON_loop|
+ cmp r1, sl
+ add.w r7, r0, r5, lsl #6
+ it cc
+ ldrcc r6, [r3, #12]
+ vld1.32 {d6-d8}, [r1@64]!
+ vmla.f32 q15, q11, d11[1]
+ vld1.32 {d9-d10}, [r1@64]!
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ cmp r1, sl
+ vmul.f32 q1, q12, d7[1]
+ vmul.f32 q2, q12, d9[0]
+ vld1.32 {d11}, [r3]
+ vmul.f32 q12, q8, d11[0]
+ pld [r1, #256] ; 0x100
+ vmla.f32 q0, q13, d6[1]
+ vld1.32 {d20-d23}, [r7@128]
+ add.w r7, r0, r6, lsl #6
+ vmla.f32 q1, q13, d8[0]
+ vmla.f32 q2, q13, d9[1]
+ it cc
+ ldrcc r5, [r3, #24]
+ vmul.f32 q13, q9, d11[0]
+ vmla.f32 q0, q14, d7[0]
+ cmp r1, r2
+ vmla.f32 q1, q14, d8[1]
+ vmla.f32 q2, q14, d10[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q14, q10, d11[0]
+ vadd.f32 q0, q0, q15
+ vmov.f32 s11, s21
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ vst1.32 {d0-d1}, [r4], r8
+ vmla.f32 q13, q9, d11[1]
+ vst1.32 {d2-d3}, [r4], r8
+ add.w r3, r3, #16
+ vmla.f32 q14, q10, d11[1]
+ vst1.32 {d4-d5}, [r4]!
+ bcc.w |_s_SkinVertices2Bones_Tangents_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8, sl}
+ vpop {d8-d11}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices4Bones_NEON| PROC
+ mov ip, sp
+ vpush {d8-d12}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ vld1.32 {d11-d12}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vld1.32 {d20-d23}, [r7@128]
+ mov.w r8, #12
+ nop.w
+ nop.w
+ nop.w
+
+|_s_SkinVertices4Bones_NEON_loop|
+ vmul.f32 q12, q8, d11[0]
+ vld1.32 {d6-d8}, [r1@64]!
+ vmul.f32 q13, q9, d11[0]
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ ldmia r3!, {r5, r6}
+ vmla.f32 q13, q9, d11[1]
+ add.w r7, r0, r5, lsl #6
+ cmp r1, r2
+ vmla.f32 q14, q10, d11[1]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d11[1]
+ pld [r3, #256] ; 0x100
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[0]
+ add.w r7, r0, r6, lsl #6
+ vmla.f32 q13, q9, d12[0]
+ vmla.f32 q14, q10, d12[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d12[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[1]
+ vmla.f32 q13, q9, d12[1]
+ vmla.f32 q14, q10, d12[1]
+ vmla.f32 q15, q11, d12[1]
+ pld [r1, #256] ; 0x100
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d11-d12}, [r3]!
+ vmul.f32 q1, q12, d7[1]
+ it cc
+ ldmiacc r3!, {r5, r6}
+ vmla.f32 q0, q13, d6[1]
+ add.w r7, r0, r5, lsl #6
+ vmla.f32 q1, q13, d8[0]
+ vldmia r7, {d16-d23}
+ vmla.f32 q0, q14, d7[0]
+ vmla.f32 q1, q14, d8[1]
+ vadd.f32 q0, q0, q15
+ vst1.32 {d0-d1}, [r4], r8
+ vst1.32 {d2-d3}, [r4], r8
+ bcc.w |_s_SkinVertices4Bones_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d12}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices4Bones_NoNormals_NEON| PROC
+ mov ip, sp
+ vpush {d8-d12}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ vld1.32 {d11-d12}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vld1.32 {d20-d23}, [r7@128]
+ mov.w r8, #12
+ nop
+ nop.w
+
+|_s_SkinVertices4Bones_NoNormals_NEON_loop|
+ vmul.f32 q12, q8, d11[0]
+ vld1.32 {d6-d7}, [r1], r8
+ vmul.f32 q13, q9, d11[0]
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ ldmia r3!, {r5, r6}
+ vmla.f32 q13, q9, d11[1]
+ add.w r7, r0, r5, lsl #6
+ cmp r1, r2
+ vmla.f32 q14, q10, d11[1]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d11[1]
+ pld [r3, #256] ; 0x100
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[0]
+ add.w r7, r0, r6, lsl #6
+ vmla.f32 q13, q9, d12[0]
+ vmla.f32 q14, q10, d12[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d12[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[1]
+ vmla.f32 q13, q9, d12[1]
+ vmla.f32 q14, q10, d12[1]
+ vmla.f32 q15, q11, d12[1]
+ pld [r1, #256] ; 0x100
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d11-d12}, [r3]!
+ it cc
+ ldmiacc r3!, {r5, r6}
+ vmla.f32 q0, q13, d6[1]
+ add.w r7, r0, r5, lsl #6
+ vldmia r7, {d16-d23}
+ vmla.f32 q0, q14, d7[0]
+ vadd.f32 q0, q0, q15
+ vst1.32 {d0-d1}, [r4], r8
+ bcc.w |_s_SkinVertices4Bones_NoNormals_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d12}
+ bx lr
+ ENDP
+
+
+|_s_SkinVertices4Bones_Tangents_NEON| PROC
+ mov ip, sp
+ vpush {d8-d12}
+ stmdb sp!, {r4, r5, r6, r7, r8}
+ ldr.w r4, [ip]
+ vld1.32 {d11-d12}, [r3]!
+ ldmia r3!, {r5, r6}
+ add.w r7, r0, r5, lsl #6
+ vld1.32 {d16-d19}, [r7@128]!
+ vld1.32 {d20-d23}, [r7@128]
+ mov.w r8, #12
+ nop
+ nop.w
+
+|_s_SkinVertices4Bones_Tangents_NEON_loop|
+ vmul.f32 q12, q8, d11[0]
+ vld1.32 {d6-d8}, [r1@64]!
+ vmul.f32 q13, q9, d11[0]
+ vld1.32 {d9-d10}, [r1@64]!
+ add.w r7, r0, r6, lsl #6
+ vmul.f32 q14, q10, d11[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmul.f32 q15, q11, d11[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d11[1]
+ ldmia r3!, {r5, r6}
+ vmla.f32 q13, q9, d11[1]
+ add.w r7, r0, r5, lsl #6
+ cmp r1, r2
+ vmla.f32 q14, q10, d11[1]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d11[1]
+ pld [r3, #256] ; 0x100
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[0]
+ add.w r7, r0, r6, lsl #6
+ vmla.f32 q13, q9, d12[0]
+ vmla.f32 q14, q10, d12[0]
+ vld1.32 {d16-d19}, [r7@128]!
+ vmla.f32 q15, q11, d12[0]
+ vld1.32 {d20-d23}, [r7@128]
+ vmla.f32 q12, q8, d12[1]
+ vmla.f32 q13, q9, d12[1]
+ vmla.f32 q14, q10, d12[1]
+ vmla.f32 q15, q11, d12[1]
+ pld [r1, #256] ; 0x100
+ vmul.f32 q0, q12, d6[0]
+ vld1.32 {d11-d12}, [r3]!
+ vmul.f32 q1, q12, d7[1]
+ vmul.f32 q2, q12, d9[0]
+ it cc
+ ldmiacc r3!, {r5, r6}
+ vmla.f32 q0, q13, d6[1]
+ add.w r7, r0, r5, lsl #6
+ vmla.f32 q1, q13, d8[0]
+ vmla.f32 q2, q13, d9[1]
+ vldmia r7, {d16-d23}
+ vmla.f32 q0, q14, d7[0]
+ vmla.f32 q1, q14, d8[1]
+ vmla.f32 q2, q14, d10[0]
+ vadd.f32 q0, q0, q15
+ vmov.f32 s11, s21
+ vst1.32 {d0-d1}, [r4], r8
+ vst1.32 {d2-d3}, [r4], r8
+ vst1.32 {d4-d5}, [r4]!
+ bcc.w |_s_SkinVertices4Bones_Tangents_NEON_loop|
+ ldmia.w sp!, {r4, r5, r6, r7, r8}
+ vpop {d8-d12}
+ bx lr
+ nop
+ ENDP
+
+
+ END