Skip to content

Commit c53e45e

Browse files
committed
up
1 parent 2e18d5f commit c53e45e

4 files changed

Lines changed: 93 additions & 17 deletions

File tree

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,82 @@ namespace lsp
392392
);
393393
}
394394

395+
void lerp_kvk(float *dst, float a, const float *b, float k, size_t count)
396+
{
397+
ARCH_ARM_ASM
398+
(
399+
// x16 blocks
400+
__ASM_EMIT("subs %[count], #16")
401+
__ASM_EMIT("vld1.32 {d16[], d17[]}, [%[a]]") // q8 = a
402+
__ASM_EMIT("vld1.32 {d18[], d19[]}, [%[k]]") // q9 = k
403+
__ASM_EMIT("blo 2f")
404+
__ASM_EMIT("1:")
405+
__ASM_EMIT("vldm %[b]!, {q12-q15}") // q12 = b
406+
__ASM_EMIT("vmov q0, q8") // q0 = a
407+
__ASM_EMIT("vmov q1, q8")
408+
__ASM_EMIT("vmov q2, q8")
409+
__ASM_EMIT("vmov q3, q8")
410+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
411+
__ASM_EMIT("vsub.f32 q13, q13, q1")
412+
__ASM_EMIT("vsub.f32 q14, q14, q2")
413+
__ASM_EMIT("vsub.f32 q15, q15, q3")
414+
__ASM_EMIT("vmla.f32 q0, q12, q9") // q0 = a + (b-a)*k
415+
__ASM_EMIT("vmla.f32 q1, q13, q9")
416+
__ASM_EMIT("vmla.f32 q2, q14, q9")
417+
__ASM_EMIT("vmla.f32 q3, q15, q9")
418+
__ASM_EMIT("subs %[count], #16")
419+
__ASM_EMIT("vstm %[dst]!, {q0-q3}")
420+
__ASM_EMIT("bhs 1b")
421+
// x8 block
422+
__ASM_EMIT("2:")
423+
__ASM_EMIT("adds %[count], #8")
424+
__ASM_EMIT("blt 4f")
425+
__ASM_EMIT("vldm %[b]!, {q12-q13}") // q12 = b
426+
__ASM_EMIT("vmov q0, q8") // q0 = a
427+
__ASM_EMIT("vmov q1, q8")
428+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
429+
__ASM_EMIT("vsub.f32 q13, q13, q1")
430+
__ASM_EMIT("vmla.f32 q0, q12, q9") // q0 = a + (b-a)*k
431+
__ASM_EMIT("vmla.f32 q1, q13, q9")
432+
__ASM_EMIT("sub %[count], #8")
433+
__ASM_EMIT("vstm %[dst]!, {q0-q1}")
434+
// x4 blocks
435+
__ASM_EMIT("4:")
436+
__ASM_EMIT("adds %[count], #4")
437+
__ASM_EMIT("blt 6f")
438+
__ASM_EMIT("vldm %[b]!, {q12}") // q12 = b
439+
__ASM_EMIT("vmov q0, q8") // q0 = a
440+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
441+
__ASM_EMIT("vmla.f32 q0, q12, q9") // q0 = a + (b-a)*k
442+
__ASM_EMIT("sub %[count], #4")
443+
__ASM_EMIT("vstm %[dst]!, {q0}")
444+
// x1 blocks
445+
__ASM_EMIT("6:")
446+
__ASM_EMIT("adds %[count], #3")
447+
__ASM_EMIT("blt 8f")
448+
__ASM_EMIT("7:")
449+
__ASM_EMIT("vld1.32 {d24[], d25[]}, [%[b]]!") // q12 = b
450+
__ASM_EMIT("vmov q0, q8") // q0 = a
451+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
452+
__ASM_EMIT("vmla.f32 q0, q12, q9") // q0 = a + (b-a)*k
453+
__ASM_EMIT("subs %[count], #1")
454+
__ASM_EMIT("vst1.32 {d0[0]}, [%[dst]]!")
455+
__ASM_EMIT("bge 7b")
456+
// end
457+
__ASM_EMIT("8:")
458+
459+
: [dst] "+r" (dst), [b] "+r" (b),
460+
[count] "+r" (count)
461+
: [a] "r" (&a),
462+
[k] "r" (&k)
463+
: "cc", "memory",
464+
"q0", "q1", "q2", "q3",
465+
"q4", "q5", "q6", "q7",
466+
"q8",
467+
"q12", "q13", "q14", "q15"
468+
);
469+
}
470+
395471
} /* namespace neon_d32 */
396472
} /* namespace lsp */
397473

src/main/arm/neon-d32.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@
478478
EXPORT1(lerp_vkv);
479479
EXPORT1(lerp_vkk);
480480
EXPORT1(lerp_kvv);
481-
// EXPORT1(lerp_kvk);
481+
EXPORT1(lerp_kvk);
482482
// EXPORT1(lerp_kkv);
483483
}
484484
} /* namespace neon_d32 */

src/test/ptest/pmath/lerp_kvk.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_kvk(float *dst, float a, const float *b, float k, size_t count);
60-
// }
61-
// )
62-
//
56+
IF_ARCH_ARM(
57+
namespace neon_d32
58+
{
59+
void lerp_kvk(float *dst, float a, const float *b, 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_kvk, 5, 1000)
111111
IF_ARCH_X86(CALL(avx::lerp_kvk));
112112
IF_ARCH_X86(CALL(avx::lerp_kvk_fma3));
113113
IF_ARCH_X86(CALL(avx512::lerp_kvk));
114-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kvk));
114+
IF_ARCH_ARM(CALL(neon_d32::lerp_kvk));
115115
// IF_ARCH_AARCH64(CALL(asimd::lerp_kvk));
116116
PTEST_SEPARATOR;
117117
}

src/test/utest/pmath/lerp_kvk.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_kvk(float *dst, float a, const float *b, float k, size_t count);
56-
// }
57-
// )
58-
//
52+
IF_ARCH_ARM(
53+
namespace neon_d32
54+
{
55+
void lerp_kvk(float *dst, float a, const float *b, 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_kvk)
117117
IF_ARCH_X86(CALL(avx::lerp_kvk, 32));
118118
IF_ARCH_X86(CALL(avx::lerp_kvk_fma3, 32));
119119
IF_ARCH_X86(CALL(avx512::lerp_kvk, 64));
120-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kvk, 16));
120+
IF_ARCH_ARM(CALL(neon_d32::lerp_kvk, 16));
121121
// IF_ARCH_ARM(CALL(asimd::lerp_kvk, 16));
122122
}
123123
UTEST_END

0 commit comments

Comments
 (0)