Skip to content

Commit 2e18d5f

Browse files
committed
up
1 parent f40b6d5 commit 2e18d5f

4 files changed

Lines changed: 95 additions & 17 deletions

File tree

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,84 @@ namespace lsp
314314
);
315315
}
316316

317+
void lerp_kvv(float *dst, float a, const float *b, const float *k, size_t count)
318+
{
319+
ARCH_ARM_ASM
320+
(
321+
// x16 blocks
322+
__ASM_EMIT("subs %[count], #16")
323+
__ASM_EMIT("vld1.32 {d16[], d17[]}, [%[a]]") // q8 = a
324+
__ASM_EMIT("blo 2f")
325+
__ASM_EMIT("1:")
326+
__ASM_EMIT("vldm %[b]!, {q12-q15}") // q12 = b
327+
__ASM_EMIT("vmov q0, q8") // q0 = a
328+
__ASM_EMIT("vmov q1, q8")
329+
__ASM_EMIT("vmov q2, q8")
330+
__ASM_EMIT("vmov q3, q8")
331+
__ASM_EMIT("vldm %[k]!, {q4-q7}") // q4 = k
332+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
333+
__ASM_EMIT("vsub.f32 q13, q13, q1")
334+
__ASM_EMIT("vsub.f32 q14, q14, q2")
335+
__ASM_EMIT("vsub.f32 q15, q15, q3")
336+
__ASM_EMIT("vmla.f32 q0, q12, q4") // q0 = a + (b-a)*k
337+
__ASM_EMIT("vmla.f32 q1, q13, q5")
338+
__ASM_EMIT("vmla.f32 q2, q14, q6")
339+
__ASM_EMIT("vmla.f32 q3, q15, q7")
340+
__ASM_EMIT("subs %[count], #16")
341+
__ASM_EMIT("vstm %[dst]!, {q0-q3}")
342+
__ASM_EMIT("bhs 1b")
343+
// x8 block
344+
__ASM_EMIT("2:")
345+
__ASM_EMIT("adds %[count], #8")
346+
__ASM_EMIT("blt 4f")
347+
__ASM_EMIT("vldm %[b]!, {q12-q13}") // q12 = b
348+
__ASM_EMIT("vmov q0, q8") // q0 = a
349+
__ASM_EMIT("vmov q1, q8")
350+
__ASM_EMIT("vldm %[k]!, {q4-q5}") // q4 = k
351+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
352+
__ASM_EMIT("vsub.f32 q13, q13, q1")
353+
__ASM_EMIT("vmla.f32 q0, q12, q4") // q0 = a + (b-a)*k
354+
__ASM_EMIT("vmla.f32 q1, q13, q5")
355+
__ASM_EMIT("sub %[count], #8")
356+
__ASM_EMIT("vstm %[dst]!, {q0-q1}")
357+
// x4 blocks
358+
__ASM_EMIT("4:")
359+
__ASM_EMIT("adds %[count], #4")
360+
__ASM_EMIT("blt 6f")
361+
__ASM_EMIT("vldm %[b]!, {q12}") // q12 = b
362+
__ASM_EMIT("vmov q0, q8") // q0 = a
363+
__ASM_EMIT("vldm %[k]!, {q4}") // q4 = k
364+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
365+
__ASM_EMIT("vmla.f32 q0, q12, q4") // q0 = a + (b-a)*k
366+
__ASM_EMIT("sub %[count], #4")
367+
__ASM_EMIT("vstm %[dst]!, {q0}")
368+
// x1 blocks
369+
__ASM_EMIT("6:")
370+
__ASM_EMIT("adds %[count], #3")
371+
__ASM_EMIT("blt 8f")
372+
__ASM_EMIT("7:")
373+
__ASM_EMIT("vld1.32 {d24[], d25[]}, [%[b]]!") // q12 = b
374+
__ASM_EMIT("vmov q0, q8") // q0 = a
375+
__ASM_EMIT("vld1.32 {d8[], d9[]}, [%[k]]!") // q4 = k
376+
__ASM_EMIT("vsub.f32 q12, q12, q0") // q12 = b-a
377+
__ASM_EMIT("vmla.f32 q0, q12, q4") // q0 = a + (b-a)*k
378+
__ASM_EMIT("subs %[count], #1")
379+
__ASM_EMIT("vst1.32 {d0[0]}, [%[dst]]!")
380+
__ASM_EMIT("bge 7b")
381+
// end
382+
__ASM_EMIT("8:")
383+
384+
: [dst] "+r" (dst), [b] "+r" (b), [k] "+r" (k),
385+
[count] "+r" (count)
386+
: [a] "r" (&a)
387+
: "cc", "memory",
388+
"q0", "q1", "q2", "q3",
389+
"q4", "q5", "q6", "q7",
390+
"q8",
391+
"q12", "q13", "q14", "q15"
392+
);
393+
}
394+
317395
} /* namespace neon_d32 */
318396
} /* namespace lsp */
319397

src/main/arm/neon-d32.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@
477477
EXPORT1(lerp_vvk);
478478
EXPORT1(lerp_vkv);
479479
EXPORT1(lerp_vkk);
480-
// EXPORT1(lerp_kvv);
480+
EXPORT1(lerp_kvv);
481481
// EXPORT1(lerp_kvk);
482482
// EXPORT1(lerp_kkv);
483483
}

src/test/ptest/pmath/lerp_kvv.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_kvv(float *dst, float a, const float *b, const float *k, size_t count);
60-
// }
61-
// )
62-
//
56+
IF_ARCH_ARM(
57+
namespace neon_d32
58+
{
59+
void lerp_kvv(float *dst, float a, const float *b, const float *k, size_t count);
60+
}
61+
)
62+
6363
// IF_ARCH_AARCH64(
6464
// namespace asimd
6565
// {
@@ -112,7 +112,7 @@ PTEST_BEGIN("dsp.pmath", lerp_kvv, 5, 1000)
112112
IF_ARCH_X86(CALL(avx::lerp_kvv));
113113
IF_ARCH_X86(CALL(avx::lerp_kvv_fma3));
114114
IF_ARCH_X86(CALL(avx512::lerp_kvv));
115-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kvv));
115+
IF_ARCH_ARM(CALL(neon_d32::lerp_kvv));
116116
// IF_ARCH_AARCH64(CALL(asimd::lerp_kvv));
117117
PTEST_SEPARATOR;
118118
}

src/test/utest/pmath/lerp_kvv.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_kvv(float *dst, float a, const float *b, const float *k, size_t count);
56-
// }
57-
// )
58-
//
52+
IF_ARCH_ARM(
53+
namespace neon_d32
54+
{
55+
void lerp_kvv(float *dst, float a, const float *b, const float *k, size_t count);
56+
}
57+
)
58+
5959
// IF_ARCH_AARCH64(
6060
// namespace asimd
6161
// {
@@ -119,7 +119,7 @@ UTEST_BEGIN("dsp.pmath", lerp_kvv)
119119
IF_ARCH_X86(CALL(avx::lerp_kvv, 32));
120120
IF_ARCH_X86(CALL(avx::lerp_kvv_fma3, 32));
121121
IF_ARCH_X86(CALL(avx512::lerp_kvv, 64));
122-
// IF_ARCH_ARM(CALL(neon_d32::lerp_kvv, 16));
122+
IF_ARCH_ARM(CALL(neon_d32::lerp_kvv, 16));
123123
// IF_ARCH_ARM(CALL(asimd::lerp_kvv, 16));
124124
}
125125
UTEST_END

0 commit comments

Comments
 (0)