@@ -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
0 commit comments