diff options
Diffstat (limited to 'Runtime/Filters/Mesh/MeshSkinningNEON.asm')
-rw-r--r-- | Runtime/Filters/Mesh/MeshSkinningNEON.asm | 527 |
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 |