Skip to content

Commit dfecbee

Browse files
committed
up
1 parent c53e45e commit dfecbee

4 files changed

Lines changed: 85 additions & 17 deletions

File tree

include/private/dsp/arch/arm/neon-d32/pmath/lerp.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,74 @@ namespace lsp
468468
);
469469
}
470470

471+
void lerp_kkv(float *dst, float a, float b, const float *k, size_t count)
472+
{
473+
ARCH_ARM_ASM
474+
(
475+
// x16 blocks
476+
__ASM_EMIT("vld1.32 {d16[], d17[]}, [%[a]]") // q8 = a
477+
__ASM_EMIT("vld1.32 {d18[], d19[]}, [%[b]]") // q9 = b
478+
__ASM_EMIT("subs %[count], #16")
479+
__ASM_EMIT("vsub.f32 q9, q9, q8") // q9 = b-a
480+
__ASM_EMIT("blo 2f")
481+
__ASM_EMIT("1:")
482+
__ASM_EMIT("vldm %[k]!, {q4-q7}") // q4 = k
483+
__ASM_EMIT("vmov q0, q8") // q0 = a
484+
__ASM_EMIT("vmov q1, q8")
485+
__ASM_EMIT("vmov q2, q8")
486+
__ASM_EMIT("vmov q3, q8")
487+
__ASM_EMIT("vmla.f32 q0, q4, q9") // q0 = a + (b-a)*k
488+
__ASM_EMIT("vmla.f32 q1, q5, q9")
489+
__ASM_EMIT("vmla.f32 q2, q6, q9")
490+
__ASM_EMIT("vmla.f32 q3, q7, q9")
491+
__ASM_EMIT("subs %[count], #16")
492+
__ASM_EMIT("vstm %[dst]!, {q0-q3}")
493+
__ASM_EMIT("bhs 1b")
494+
// x8 block
495+
__ASM_EMIT("2:")
496+
__ASM_EMIT("adds %[count], #8")
497+
__ASM_EMIT("blt 4f")
498+
__ASM_EMIT("vldm %[k]!, {q4-q5}") // q4 = k
499+
__ASM_EMIT("vmov q0, q8") // q0 = a
500+
__ASM_EMIT("vmov q1, q8")
501+
__ASM_EMIT("vmla.f32 q0, q4, q9") // q0 = a + (b-a)*k
502+
__ASM_EMIT("vmla.f32 q1, q5, q9")
503+
__ASM_EMIT("sub %[count], #8")
504+
__ASM_EMIT("vstm %[dst]!, {q0-q1}")
505+
// x4 blocks
506+
__ASM_EMIT("4:")
507+
__ASM_EMIT("adds %[count], #4")
508+
__ASM_EMIT("blt 6f")
509+
__ASM_EMIT("vldm %[k]!, {q4}") // q4 = k
510+
__ASM_EMIT("vmov q0, q8") // q0 = a
511+
__ASM_EMIT("vmla.f32 q0, q4, q9") // q0 = a + (b-a)*k
512+
__ASM_EMIT("sub %[count], #4")
513+
__ASM_EMIT("vstm %[dst]!, {q0}")
514+
// x1 blocks
515+
__ASM_EMIT("6:")
516+
__ASM_EMIT("adds %[count], #3")
517+
__ASM_EMIT("blt 8f")
518+
__ASM_EMIT("7:")
519+
__ASM_EMIT("vld1.32 {d8[], d9[]}, [%[k]]!") // q4 = k
520+
__ASM_EMIT("vmov q0, q8") // q0 = a
521+
__ASM_EMIT("vmla.f32 q0, q4, q9") // q0 = a + (b-a)*k
522+
__ASM_EMIT("subs %[count], #1")
523+
__ASM_EMIT("vst1.32 {d0[0]}, [%[dst]]!")
524+
__ASM_EMIT("bge 7b")
525+
// end
526+
__ASM_EMIT("8:")
527+
528+
: [dst] "+r" (dst), [k] "+r" (k),
529+
[count] "+r" (count)
530+
: [a] "r" (&a),
531+
[b] "r" (&b)
532+
: "cc", "memory",
533+
"q0", "q1", "q2", "q3",
534+
"q4", "q5", "q6", "q7",
535+
"q8", "q9"
536+
);
537+
}
538+
471539
} /* namespace neon_d32 */
472540
} /* namespace lsp */
473541

src/main/arm/neon-d32.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@
479479
EXPORT1(lerp_vkk);
480480
EXPORT1(lerp_kvv);
481481
EXPORT1(lerp_kvk);
482-
// EXPORT1(lerp_kkv);
482+
EXPORT1(lerp_kkv);
483483
}
484484
} /* namespace neon_d32 */
485485
} /* namespace lsp */

src/test/ptest/pmath/lerp_kkv.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ namespace lsp
5353
}
5454
)
5555

56-
// IF_ARCH_ARM(
57-
// namespace neon_d32
58-
// {
59-
// void lerp_kkv(float *dst, float a, float b, const float *k, size_t count);
60-
// }
61-
// )
62-
//
56+
IF_ARCH_ARM(
57+
namespace neon_d32
58+
{
59+
void lerp_kkv(float *dst, float a, float b, const float *k, size_t count);
60+
}
61+
)
62+
6363
// IF_ARCH_AARCH64(
6464
// namespace asimd
6565
// {
@@ -111,7 +111,7 @@ PTEST_BEGIN("dsp.pmath", lerp_kkv, 5, 1000)
111111
IF_ARCH_X86(CALL(avx::lerp_kkv));
112112
IF_ARCH_X86(CALL(avx::lerp_kkv_fma3));
113113
IF_ARCH_X86(CALL(avx512::lerp_kkv));
114-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kkv));
114+
IF_ARCH_ARM(CALL(neon_d32::lerp_kkv));
115115
// IF_ARCH_AARCH64(CALL(asimd::lerp_kkv));
116116
PTEST_SEPARATOR;
117117
}

src/test/utest/pmath/lerp_kkv.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ namespace lsp
4949
}
5050
)
5151

52-
// IF_ARCH_ARM(
53-
// namespace neon_d32
54-
// {
55-
// void lerp_kkv(float *dst, float a, float b, const float *k, size_t count);
56-
// }
57-
// )
58-
//
52+
IF_ARCH_ARM(
53+
namespace neon_d32
54+
{
55+
void lerp_kkv(float *dst, float a, float b, const float *k, size_t count);
56+
}
57+
)
58+
5959
// IF_ARCH_AARCH64(
6060
// namespace asimd
6161
// {
@@ -117,7 +117,7 @@ UTEST_BEGIN("dsp.pmath", lerp_kkv)
117117
IF_ARCH_X86(CALL(avx::lerp_kkv, 32));
118118
IF_ARCH_X86(CALL(avx::lerp_kkv_fma3, 32));
119119
IF_ARCH_X86(CALL(avx512::lerp_kkv, 64));
120-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kkv, 16));
120+
IF_ARCH_ARM(CALL(neon_d32::lerp_kkv, 16));
121121
// IF_ARCH_ARM(CALL(asimd::lerp_kkv, 16));
122122
}
123123
UTEST_END

0 commit comments

Comments
 (0)