Skip to content

Commit

Permalink
Raised precision of correlation computation
Browse files Browse the repository at this point in the history
  • Loading branch information
sadko4u committed Dec 11, 2024
1 parent a1e629d commit 5fda461
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 41 deletions.
20 changes: 10 additions & 10 deletions include/private/dsp/arch/aarch64/asimd/correlation.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ namespace lsp

static const float corr_const[] __lsp_aligned16 =
{
LSP_DSP_VEC8(1e-10f)
LSP_DSP_VEC8(1e-18f)
};

void corr_incr(dsp::correlation_t *corr, float *dst,
Expand Down Expand Up @@ -213,9 +213,9 @@ namespace lsp
__ASM_EMIT("dup v0.4s, v9.s[3]") /* v0 = xv' = T[7] */
__ASM_EMIT("dup v1.4s, v5.s[3]") /* v1 = xa' = BA[7] */
__ASM_EMIT("dup v2.4s, v7.s[3]") /* v2 = xb' = BB[7] */
__ASM_EMIT("ldp q14, q15, [%[CORR_CC]]") /* v14 = 1e-10, v15 = 1e-10 */
__ASM_EMIT("ldp q14, q15, [%[CORR_CC]]") /* v14 = threshold, v15 = threshold */

__ASM_EMIT("fcmge v14.4s, v8.4s, v14.4s") /* v14 = T >= 1e-10 */
__ASM_EMIT("fcmge v14.4s, v8.4s, v14.4s") /* v14 = T >= threshold */
__ASM_EMIT("fcmge v15.4s, v9.4s, v15.4s")
__ASM_EMIT("frsqrte v4.4s, v10.4s") /* v4 = x0 */
__ASM_EMIT("frsqrte v5.4s, v11.4s")
Expand All @@ -233,7 +233,7 @@ namespace lsp
__ASM_EMIT("fmul v11.4s, v5.4s, v13.4s")
__ASM_EMIT("fmul v10.4s, v8.4s, v10.4s") /* v10 = T/svrtf(B) */
__ASM_EMIT("fmul v11.4s, v9.4s, v11.4s")
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= 1e-10) ? T/svrt(B) : 0 */
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= threshold) ? T/svrt(B) : 0 */
__ASM_EMIT("and v11.16b, v11.16b, v15.16b")
__ASM_EMIT("add %[a_head], %[a_head], #0x20")
__ASM_EMIT("add %[b_head], %[b_head], #0x20")
Expand Down Expand Up @@ -278,9 +278,9 @@ namespace lsp
__ASM_EMIT("dup v1.4s, v4.s[3]") /* v1 = xa' = BA[7] */
__ASM_EMIT("dup v2.4s, v6.s[3]") /* v2 = xb' = BB[7] */
__ASM_EMIT("dup v0.4s, v8.s[3]") /* v0 = xv' = T[7] */
__ASM_EMIT("ldr q14, [%[CORR_CC]]") /* v14 = 1e-10 */
__ASM_EMIT("ldr q14, [%[CORR_CC]]") /* v14 = threshold */

__ASM_EMIT("fcmge v14.4s, v8.4s, v14.4s") /* v14 = T >= 1e-10 */
__ASM_EMIT("fcmge v14.4s, v8.4s, v14.4s") /* v14 = T >= threshold */
__ASM_EMIT("frsqrte v4.4s, v10.4s") /* v4 = x0 */
__ASM_EMIT("fmul v6.4s, v4.4s, v10.4s") /* v6 = R * x0 */
__ASM_EMIT("frsqrts v12.4s, v6.4s, v4.4s") /* v12 = (3 - R * x0 * x0) / 2 */
Expand All @@ -289,7 +289,7 @@ namespace lsp
__ASM_EMIT("frsqrts v12.4s, v6.4s, v4.4s") /* v12 = (3 - R * x1 * x1) / 2 */
__ASM_EMIT("fmul v10.4s, v4.4s, v12.4s") /* v10 = 1/svrtf(B) = x2 = x1 * (3 - R * x1 * x1) / 2 */
__ASM_EMIT("fmul v10.4s, v8.4s, v10.4s") /* v10 = T/svrtf(B) */
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= 1e-10) ? T/svrt(B) : 0 */
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= threshold) ? T/svrt(B) : 0 */
__ASM_EMIT("add %[a_head], %[a_head], #0x10")
__ASM_EMIT("add %[b_head], %[b_head], #0x10")
__ASM_EMIT("sub %[count], %[count], #4")
Expand All @@ -301,7 +301,7 @@ namespace lsp
/* 1x blocks */
__ASM_EMIT("adds %[count], %[count], #3")
__ASM_EMIT("blt 6f")
__ASM_EMIT("ldr q3, [%[CORR_CC]]") /* v3 = 1e-10 */
__ASM_EMIT("ldr q3, [%[CORR_CC]]") /* v3 = threshold */
__ASM_EMIT("5:")
__ASM_EMIT("ld1r {v4.4s}, [%[a_head]]") /* v4 = ah0 */
__ASM_EMIT("ld1r {v6.4s}, [%[b_head]]") /* v6 = bh0 */
Expand All @@ -319,7 +319,7 @@ namespace lsp
__ASM_EMIT("fadd v0.4s, v12.4s, v0.4s") /* v0 = T = xv + DV */
__ASM_EMIT("fmul v10.4s, v1.4s, v2.4s") /* v10 = B = BA * BB */

__ASM_EMIT("fcmge v14.4s, v0.4s, v3.4s") /* v14 = T >= 1e-10 */
__ASM_EMIT("fcmge v14.4s, v0.4s, v3.4s") /* v14 = T >= threshold */
__ASM_EMIT("frsqrte v4.4s, v10.4s") /* v4 = x0 */
__ASM_EMIT("fmul v6.4s, v4.4s, v10.4s") /* v6 = R * x0 */
__ASM_EMIT("frsqrts v12.4s, v6.4s, v4.4s") /* v12 = (3 - R * x0 * x0) / 2 */
Expand All @@ -328,7 +328,7 @@ namespace lsp
__ASM_EMIT("frsqrts v12.4s, v6.4s, v4.4s") /* v12 = (3 - R * x1 * x1) / 2 */
__ASM_EMIT("fmul v10.4s, v4.4s, v12.4s") /* v10 = 1/svrtf(B) = x2 = x1 * (3 - R * x1 * x1) / 2 */
__ASM_EMIT("fmul v10.4s, v0.4s, v10.4s") /* v10 = T/svrtf(B) */
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= 1e-10) ? T/svrt(B) : 0 */
__ASM_EMIT("and v10.16b, v10.16b, v14.16b") /* v10 = (T >= threshold) ? T/svrt(B) : 0 */
__ASM_EMIT("add %[a_head], %[a_head], #0x04")
__ASM_EMIT("add %[b_head], %[b_head], #0x04")
__ASM_EMIT("subs %[count], %[count], #1")
Expand Down
20 changes: 10 additions & 10 deletions include/private/dsp/arch/arm/neon-d32/correlation.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ namespace lsp

static const float corr_const[] __lsp_aligned16 =
{
LSP_DSP_VEC8(1e-10f)
LSP_DSP_VEC8(1e-18f)
};

void corr_incr(dsp::correlation_t *corr, float *dst,
Expand Down Expand Up @@ -204,9 +204,9 @@ namespace lsp
__ASM_EMIT("vdup.32 q0, d19[1]") /* q4 = xv' = T[7] */
__ASM_EMIT("vdup.32 q1, d11[1]") /* q5 = xa' = BA[7] */
__ASM_EMIT("vdup.32 q2, d15[1]") /* q6 = xb' = BB[7] */
__ASM_EMIT("vldm %[CORR_CC], {q14-q15}") /* q14 = 1e-10, q15 = 1e-10 */
__ASM_EMIT("vldm %[CORR_CC], {q14-q15}") /* q14 = threshold, q15 = threshold */

__ASM_EMIT("vcge.f32 q14, q8, q14") /* q14 = T >= 1e-10 */
__ASM_EMIT("vcge.f32 q14, q8, q14") /* q14 = T >= threshold */
__ASM_EMIT("vcge.f32 q15, q9, q15")
__ASM_EMIT("vrsqrte.f32 q4, q10") /* q4 = x0 */
__ASM_EMIT("vrsqrte.f32 q5, q11")
Expand All @@ -224,7 +224,7 @@ namespace lsp
__ASM_EMIT("vmul.f32 q11, q5, q13")
__ASM_EMIT("vmul.f32 q10, q8, q10") /* q10 = T/sqrtf(B) */
__ASM_EMIT("vmul.f32 q11, q9, q11")
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= 1e-10) ? T/sqrt(B) : 0 */
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= threshold) ? T/sqrt(B) : 0 */
__ASM_EMIT("vand q11, q11, q15")
__ASM_EMIT("subs %[count], #8")
__ASM_EMIT("vstm %[dst]!, {q10-q11}")
Expand Down Expand Up @@ -264,9 +264,9 @@ namespace lsp
__ASM_EMIT("vdup.32 q1, d9[1]") /* q1 = xa' = BA[3] */
__ASM_EMIT("vdup.32 q2, d13[1]") /* q2 = xb' = BB[3] */
__ASM_EMIT("vdup.32 q0, d17[1]") /* q0 = xv' = T[3] */
__ASM_EMIT("vldm %[CORR_CC], {q14}") /* q14 = 1e-10 */
__ASM_EMIT("vldm %[CORR_CC], {q14}") /* q14 = threshold */

__ASM_EMIT("vcge.f32 q14, q8, q14") /* q14 = T >= 1e-10 */
__ASM_EMIT("vcge.f32 q14, q8, q14") /* q14 = T >= threshold */
__ASM_EMIT("vrsqrte.f32 q4, q10") /* q4 = x0 */
__ASM_EMIT("vmul.f32 q6, q4, q10") /* q6 = R * x0 */
__ASM_EMIT("vrsqrts.f32 q12, q6, q4") /* q12 = (3 - R * x0 * x0) / 2 */
Expand All @@ -275,14 +275,14 @@ namespace lsp
__ASM_EMIT("vrsqrts.f32 q12, q6, q4") /* q12 = (3 - R * x1 * x1) / 2 */
__ASM_EMIT("vmul.f32 q10, q4, q12") /* q10 = 1/sqrtf(B) = x2 = x1 * (3 - R * x1 * x1) / 2 */
__ASM_EMIT("vmul.f32 q10, q8, q10") /* q10 = T/sqrtf(B) */
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= 1e-10) ? T/sqrt(B) : 0 */
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= threshold) ? T/sqrt(B) : 0 */
__ASM_EMIT("sub %[count], #4")
__ASM_EMIT("vstm %[dst]!, {q10}")
__ASM_EMIT("4:")
/* 1x blocks */
__ASM_EMIT("adds %[count], #3")
__ASM_EMIT("blt 6f")
__ASM_EMIT("vldm %[CORR_CC], {q3}") /* q3 = 1e-10 */
__ASM_EMIT("vldm %[CORR_CC], {q3}") /* q3 = threshold */
__ASM_EMIT("5:")
__ASM_EMIT("vld1.32 {d8[], d9[]}, [%[a_head]]!") /* q4 = ah0 */
__ASM_EMIT("vld1.32 {d12[], d13[]}, [%[b_head]]!") /* q6 = bh0 */
Expand All @@ -300,7 +300,7 @@ namespace lsp
__ASM_EMIT("vadd.f32 q0, q12, q0") /* q0 = T = xv + DV */
__ASM_EMIT("vmul.f32 q10, q1, q2") /* q10 = B = BA * BB */

__ASM_EMIT("vcge.f32 q14, q0, q3") /* q14 = T >= 1e-10 */
__ASM_EMIT("vcge.f32 q14, q0, q3") /* q14 = T >= threshold */
__ASM_EMIT("vrsqrte.f32 q4, q10") /* q4 = x0 */
__ASM_EMIT("vmul.f32 q6, q4, q10") /* q6 = R * x0 */
__ASM_EMIT("vrsqrts.f32 q12, q6, q4") /* q12 = (3 - R * x0 * x0) / 2 */
Expand All @@ -309,7 +309,7 @@ namespace lsp
__ASM_EMIT("vrsqrts.f32 q12, q6, q4") /* q12 = (3 - R * x1 * x1) / 2 */
__ASM_EMIT("vmul.f32 q10, q4, q12") /* q10 = 1/sqrtf(B) = x2 = x1 * (3 - R * x1 * x1) / 2 */
__ASM_EMIT("vmul.f32 q10, q0, q10") /* q10 = T/sqrtf(B) */
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= 1e-10) ? T/sqrt(B) : 0 */
__ASM_EMIT("vand q10, q10, q14") /* q10 = (T >= threshold) ? T/sqrt(B) : 0 */
__ASM_EMIT("subs %[count], #1")
__ASM_EMIT("vst1.32 {d20[0]}, [%[dst]]!")
__ASM_EMIT("bge 5b")
Expand Down
14 changes: 7 additions & 7 deletions include/private/dsp/arch/x86/avx/correlation.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ namespace lsp

static const float corr_const[] __lsp_aligned32 =
{
LSP_DSP_VEC8(1e-10f)
LSP_DSP_VEC8(1e-18f)
};

void corr_incr(dsp::correlation_t *corr, float *dst,
Expand Down Expand Up @@ -335,10 +335,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm5, 0x08(%[corr])")

__ASM_EMIT("vsqrtps %%ymm7, %%ymm6") /* ymm6 = sqrtf(B) */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%ymm7, %%ymm1")/* ymm1 = B >= 1e-10f */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%ymm7, %%ymm1")/* ymm1 = B >= threshold */
__ASM_EMIT("vdivps %%ymm6, %%ymm0, %%ymm0") /* ymm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%ymm1, %%ymm0, %%ymm0") /* ymm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%ymm1, %%ymm0, %%ymm0") /* ymm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x20, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x20, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovups %%ymm0, 0x00(%[ptr])")
Expand Down Expand Up @@ -408,10 +408,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm5, 0x08(%[corr])")

__ASM_EMIT("vsqrtps %%xmm7, %%xmm6") /* xmm6 = sqrtf(B) */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%xmm7, %%xmm1")/* xmm1 = B >= 1e-10f */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%xmm7, %%xmm1")/* xmm1 = B >= threshold */
__ASM_EMIT("vdivps %%xmm6, %%xmm0, %%xmm0") /* xmm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x10, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x10, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovups %%xmm0, 0x00(%[ptr])")
Expand Down Expand Up @@ -465,10 +465,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm2, 0x08(%[corr])")

__ASM_EMIT("vsqrtss %%xmm7, %%xmm7, %%xmm6") /* xmm6 = sqrtf(B) */
__ASM_EMIT("vcmpss $5, %[CORR_CC], %%xmm7, %%xmm1")/* xmm1 = B >= 1e-10f */
__ASM_EMIT("vcmpss $5, %[CORR_CC], %%xmm7, %%xmm1")/* xmm1 = B >= threshold */
__ASM_EMIT("vdivss %%xmm6, %%xmm0, %%xmm0") /* xmm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x04, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x04, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovss %%xmm0, 0x00(%[ptr])")
Expand Down
18 changes: 9 additions & 9 deletions include/private/dsp/arch/x86/avx512/correlation.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ namespace lsp

static const float corr_const[] __lsp_aligned64 =
{
LSP_DSP_VEC16(1e-10f)
LSP_DSP_VEC16(1e-18f)
};

static const uint32_t corr_idx[] __lsp_aligned64 =
Expand Down Expand Up @@ -251,10 +251,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm5, 0x08(%[corr])")

__ASM_EMIT("vsqrtps %%zmm7, %%zmm6") /* zmm6 = sqrtf(B) */
__ASM_EMIT("vcmpps $1, %[CORR_CC], %%zmm7, %%k3") /* k3 = B < 1e-10f */
__ASM_EMIT("vcmpps $1, %[CORR_CC], %%zmm7, %%k3") /* k3 = B < threshold */
__ASM_EMIT("vdivps %%zmm6, %%zmm0, %%zmm0") /* zmm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vxorps %%zmm0, %%zmm0, %%zmm0 %{%%k3%}") /* zmm0 = (B < 1e-10f) ? 0 : T/sqrtf(B) */
__ASM_EMIT("vxorps %%zmm0, %%zmm0, %%zmm0 %{%%k3%}") /* zmm0 = (B < threshold) ? 0 : T/sqrtf(B) */
__ASM_EMIT("add $0x40, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x40, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovups %%zmm0, 0x00(%[ptr])")
Expand Down Expand Up @@ -336,10 +336,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm5, 0x08(%[corr])")

__ASM_EMIT("vsqrtps %%ymm7, %%ymm6") /* ymm6 = sqrtf(B) */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%ymm7, %%ymm1") /* ymm1 = B >= 1e-10f */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%ymm7, %%ymm1") /* ymm1 = B >= threshold */
__ASM_EMIT("vdivps %%ymm6, %%ymm0, %%ymm0") /* ymm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%ymm1, %%ymm0, %%ymm0") /* ymm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%ymm1, %%ymm0, %%ymm0") /* ymm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x20, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x20, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovups %%ymm0, 0x00(%[ptr])")
Expand Down Expand Up @@ -405,10 +405,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm5, 0x08(%[corr])")

__ASM_EMIT("vsqrtps %%xmm7, %%xmm6") /* xmm6 = sqrtf(B) */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%xmm7, %%xmm1") /* xmm1 = B >= 1e-10f */
__ASM_EMIT("vcmpps $5, %[CORR_CC], %%xmm7, %%xmm1") /* xmm1 = B >= threshold */
__ASM_EMIT("vdivps %%xmm6, %%xmm0, %%xmm0") /* xmm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x10, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x10, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovups %%xmm0, 0x00(%[ptr])")
Expand Down Expand Up @@ -459,10 +459,10 @@ namespace lsp
__ASM_EMIT64("vmovss %%xmm1, 0x08(%[corr])")

__ASM_EMIT("vsqrtss %%xmm7, %%xmm7, %%xmm6") /* xmm6 = sqrtf(B) */
__ASM_EMIT("vcmpss $5, %[CORR_CC], %%xmm7, %%xmm1") /* xmm1 = B >= 1e-10f */
__ASM_EMIT("vcmpss $5, %[CORR_CC], %%xmm7, %%xmm1") /* xmm1 = B >= threshold */
__ASM_EMIT("vdivss %%xmm6, %%xmm2, %%xmm0") /* xmm0 = T/sqrtf(B) */
__ASM_EMIT32("mov %[dst], %[ptr]")
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= 1e-10f) ? T/sqrtf(B) : 0 */
__ASM_EMIT("vandps %%xmm1, %%xmm0, %%xmm0") /* xmm0 = (B >= threshold) ? T/sqrtf(B) : 0 */
__ASM_EMIT("add $0x04, %[a_head]") /* ++a_head */
__ASM_EMIT("add $0x04, %[b_head]") /* ++b_head */
__ASM_EMIT32("vmovss %%xmm0, 0x00(%[ptr])")
Expand Down
Loading

0 comments on commit 5fda461

Please sign in to comment.