Skip to content

Commit

Permalink
Refactoring, implemented sse::axis_apply_lin1
Browse files Browse the repository at this point in the history
  • Loading branch information
sadko4u committed Sep 23, 2023
1 parent 502df8b commit be68448
Show file tree
Hide file tree
Showing 13 changed files with 796 additions and 213 deletions.
4 changes: 2 additions & 2 deletions include/lsp-plug.in/dsp/common/graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ LSP_DSP_LIB_END_NAMESPACE
* @param x destination vector for X coordinate
* @param v delta vector to apply
* @param zero graphics zero point shift
* @param norm_x X norming factor
* @param norm X norming factor
*/
LSP_DSP_LIB_SYMBOL(void, axis_apply_lin1, float *x, const float *v, float zero, float norm_x, size_t count);
LSP_DSP_LIB_SYMBOL(void, axis_apply_lin1, float *x, const float *v, float zero, float norm, size_t count);

/** Do logarithmic vector apply for 1D-schema:
* x[i] = x[i] + norm_x * logf(absf(v[i]*zero))
Expand Down
43 changes: 3 additions & 40 deletions include/private/dsp/arch/generic/graphics.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2020 Vladimir Sadovnikov <[email protected]>
* Copyright (C) 2023 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2023 Vladimir Sadovnikov <[email protected]>
*
* This file is part of lsp-dsp-lib
* Created on: 31 мар. 2020 г.
Expand All @@ -26,50 +26,13 @@
#error "This header should not be included directly"
#endif /* PRIVATE_DSP_ARCH_GENERIC_IMPL */

#include <private/dsp/arch/generic/graphics/axis.h>
#include <private/dsp/arch/generic/graphics/pixelfmt.h>

namespace lsp
{
namespace generic
{
void axis_apply_lin1(float *x, const float *v, float zero, float norm_x, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
x[i] += norm_x * (vec + zero);
}
}

void axis_apply_log2(float *x, float *y, const float *v, float zero, float norm_x, float norm_y, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
if (vec < 0.0f)
vec = -vec;
if (vec < LSP_DSP_AMPLIFICATION_THRESH)
vec = LSP_DSP_AMPLIFICATION_THRESH;
float k = logf(vec * zero);
x[i] += norm_x * k;
y[i] += norm_y * k;
}
}

void axis_apply_log1(float *x, const float *v, float zero, float norm_x, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
if (vec < 0.0f)
vec = -vec;
if (vec < LSP_DSP_AMPLIFICATION_THRESH)
vec = LSP_DSP_AMPLIFICATION_THRESH;
float k = logf(vec * zero);
x[i] += norm_x * k;
}
}

void fill_rgba(float *dst, float r, float g, float b, float a, size_t count)
{
while (count--)
Expand Down
72 changes: 72 additions & 0 deletions include/private/dsp/arch/generic/graphics/axis.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright (C) 2023 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2023 Vladimir Sadovnikov <[email protected]>
*
* This file is part of lsp-dsp-lib
* Created on: 24 сент. 2023 г.
*
* lsp-dsp-lib is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* lsp-dsp-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with lsp-dsp-lib. If not, see <https://www.gnu.org/licenses/>.
*/

#ifndef PRIVATE_DSP_ARCH_GENERIC_GRAPHICS_AXIS_H_
#define PRIVATE_DSP_ARCH_GENERIC_GRAPHICS_AXIS_H_

namespace lsp
{
namespace generic
{
void axis_apply_lin1(float *x, const float *v, float zero, float norm, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
x[i] += norm * (vec + zero);
}
}

void axis_apply_log2(float *x, float *y, const float *v, float zero, float norm_x, float norm_y, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
if (vec < 0.0f)
vec = -vec;
if (vec < LSP_DSP_AMPLIFICATION_THRESH)
vec = LSP_DSP_AMPLIFICATION_THRESH;
float k = logf(vec * zero);
x[i] += norm_x * k;
y[i] += norm_y * k;
}
}

void axis_apply_log1(float *x, const float *v, float zero, float norm_x, size_t count)
{
for (size_t i=0; i<count; ++i)
{
float vec = v[i];
if (vec < 0.0f)
vec = -vec;
if (vec < LSP_DSP_AMPLIFICATION_THRESH)
vec = LSP_DSP_AMPLIFICATION_THRESH;
float k = logf(vec * zero);
x[i] += norm_x * k;
}
}

} /* namespace generic */
} /* namespace lsp */



#endif /* PRIVATE_DSP_ARCH_GENERIC_GRAPHICS_AXIS_H_ */
89 changes: 4 additions & 85 deletions include/private/dsp/arch/x86/sse/graphics.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2020 Vladimir Sadovnikov <[email protected]>
* Copyright (C) 2023 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2023 Vladimir Sadovnikov <[email protected]>
*
* This file is part of lsp-dsp-lib
* Created on: 31 мар. 2020 г.
Expand All @@ -26,88 +26,7 @@
#error "This header should not be included directly"
#endif /* PRIVATE_DSP_ARCH_X86_SSE_IMPL */

namespace lsp
{
namespace sse
{
#define FILL4_CORE \
__ASM_EMIT("movss %[c0], %%xmm0") /* xmm0 = c0 */ \
__ASM_EMIT("movss %[c1], %%xmm1") /* xmm1 = c1 */ \
__ASM_EMIT("movss %[c2], %%xmm2") /* xmm2 = c2 */ \
__ASM_EMIT("movss %[c3], %%xmm3") /* xmm3 = c3 */ \
__ASM_EMIT("unpcklps %%xmm1, %%xmm0") /* xmm0 = c0 c1 ? ? */ \
__ASM_EMIT("unpcklps %%xmm3, %%xmm2") /* xmm2 = c2 c3 ? ? */ \
__ASM_EMIT("movlhps %%xmm2, %%xmm0") /* xmm0 = c0 c1 c2 c3 */ \
__ASM_EMIT("movaps %%xmm0, %%xmm1") /* xmm1 = c0 c1 c2 c3 */ \
__ASM_EMIT("movaps %%xmm0, %%xmm2") \
__ASM_EMIT("movaps %%xmm1, %%xmm3") \
\
/* 8x blocks */ \
__ASM_EMIT("sub $8, %[count]") \
__ASM_EMIT("jb 2f") \
__ASM_EMIT("1:") \
__ASM_EMIT("movups %%xmm0, 0x00(%[dst])") \
__ASM_EMIT("movups %%xmm1, 0x10(%[dst])") \
__ASM_EMIT("movups %%xmm2, 0x20(%[dst])") \
__ASM_EMIT("movups %%xmm3, 0x30(%[dst])") \
__ASM_EMIT("movups %%xmm0, 0x40(%[dst])") \
__ASM_EMIT("movups %%xmm1, 0x50(%[dst])") \
__ASM_EMIT("movups %%xmm2, 0x60(%[dst])") \
__ASM_EMIT("movups %%xmm3, 0x70(%[dst])") \
__ASM_EMIT("add $0x80, %[dst]") \
__ASM_EMIT("sub $8, %[count]") \
__ASM_EMIT("jae 1b") \
/* 4x block */ \
__ASM_EMIT("2:") \
__ASM_EMIT("add $4, %[count]") \
__ASM_EMIT("jl 4f") \
__ASM_EMIT("movups %%xmm0, 0x00(%[dst])") \
__ASM_EMIT("movups %%xmm1, 0x10(%[dst])") \
__ASM_EMIT("movups %%xmm2, 0x20(%[dst])") \
__ASM_EMIT("movups %%xmm3, 0x30(%[dst])") \
__ASM_EMIT("sub $4, %[count]") \
__ASM_EMIT("add $0x40, %[dst]") \
/* 2x block */ \
__ASM_EMIT("4:") \
__ASM_EMIT("add $2, %[count]") \
__ASM_EMIT("jl 6f") \
__ASM_EMIT("movups %%xmm0, 0x00(%[dst])") \
__ASM_EMIT("movups %%xmm1, 0x10(%[dst])") \
__ASM_EMIT("sub $2, %[count]") \
__ASM_EMIT("add $0x20, %[dst]") \
/* 1x block */ \
__ASM_EMIT("6:") \
__ASM_EMIT("add $1, %[count]") \
__ASM_EMIT("jl 8f") \
__ASM_EMIT("movups %%xmm0, 0x00(%[dst])") \
__ASM_EMIT("8:")

void fill_rgba(float *dst, float r, float g, float b, float a, size_t count)
{
ARCH_X86_ASM
(
FILL4_CORE
: [dst] "+r" (dst), [count] "+r" (count)
: [c0] "m" (r), [c1] "m" (g), [c2] "m" (b), [c3] "m" (a)
: "cc", "memory",
"%xmm0", "%xmm1", "%xmm2", "%xmm3"
);
}

void fill_hsla(float *dst, float h, float s, float l, float a, size_t count)
{
ARCH_X86_ASM
(
FILL4_CORE
: [dst] "+r" (dst), [count] "+r" (count)
: [c0] "m" (h), [c1] "m" (s), [c2] "m" (l), [c3] "m" (a)
: "cc", "memory",
"%xmm0", "%xmm1", "%xmm2", "%xmm3"
);
}

#undef FILL4_CORE
}
}
#include <private/dsp/arch/x86/sse/graphics/fill.h>
#include <private/dsp/arch/x86/sse/graphics/axis.h>

#endif /* PRIVATE_DSP_ARCH_X86_SSE_GRAPHICS_H_ */
128 changes: 128 additions & 0 deletions include/private/dsp/arch/x86/sse/graphics/axis.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*
* Copyright (C) 2023 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2023 Vladimir Sadovnikov <[email protected]>
*
* This file is part of lsp-dsp-lib
* Created on: 23 сент. 2023 г.
*
* lsp-dsp-lib is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* lsp-dsp-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with lsp-dsp-lib. If not, see <https://www.gnu.org/licenses/>.
*/

#ifndef PRIVATE_DSP_ARCH_X86_SSE_GRAPHICS_AXIS_H_
#define PRIVATE_DSP_ARCH_X86_SSE_GRAPHICS_AXIS_H_

#ifndef PRIVATE_DSP_ARCH_X86_SSE_IMPL
#error "This header should not be included directly"
#endif /* PRIVATE_DSP_ARCH_X86_SSE_IMPL */

namespace lsp
{
namespace sse
{

void axis_apply_lin1(float *x, const float *v, float zero, float norm, size_t count)
{
IF_ARCH_X86(size_t off);
ARCH_X86_ASM
(
__ASM_EMIT("movss %[zero], %%xmm1")
__ASM_EMIT("xor %[off], %[off]")
__ASM_EMIT("shufps $0x00, %%xmm0, %%xmm0")
__ASM_EMIT("shufps $0x00, %%xmm1, %%xmm1")
__ASM_EMIT("sub $12, %[count]")
__ASM_EMIT("jb 2f")
/* 12x blocks */
__ASM_EMIT("1:")
__ASM_EMIT("movups 0x00(%[v], %[off]), %%xmm5")
__ASM_EMIT("movups 0x10(%[v], %[off]), %%xmm6")
__ASM_EMIT("movups 0x20(%[v], %[off]), %%xmm7")
__ASM_EMIT("movups 0x00(%[x], %[off]), %%xmm2")
__ASM_EMIT("movups 0x10(%[x], %[off]), %%xmm3")
__ASM_EMIT("movups 0x20(%[x], %[off]), %%xmm4")
__ASM_EMIT("addps %%xmm1, %%xmm5")
__ASM_EMIT("addps %%xmm1, %%xmm6")
__ASM_EMIT("addps %%xmm1, %%xmm7")
__ASM_EMIT("mulps %%xmm0, %%xmm5")
__ASM_EMIT("mulps %%xmm0, %%xmm6")
__ASM_EMIT("mulps %%xmm0, %%xmm7")
__ASM_EMIT("addps %%xmm5, %%xmm2")
__ASM_EMIT("addps %%xmm6, %%xmm3")
__ASM_EMIT("addps %%xmm7, %%xmm4")
__ASM_EMIT("movups %%xmm2, 0x00(%[x], %[off])")
__ASM_EMIT("movups %%xmm3, 0x10(%[x], %[off])")
__ASM_EMIT("movups %%xmm4, 0x20(%[x], %[off])")
__ASM_EMIT("add $0x30, %[off]")
__ASM_EMIT("sub $12, %[count]")
__ASM_EMIT("jae 1b")
__ASM_EMIT("2:")
/* 8x block */
__ASM_EMIT("add $4, %[count]")
__ASM_EMIT("jl 4f")
__ASM_EMIT("movups 0x00(%[v], %[off]), %%xmm5")
__ASM_EMIT("movups 0x10(%[v], %[off]), %%xmm6")
__ASM_EMIT("movups 0x00(%[x], %[off]), %%xmm2")
__ASM_EMIT("movups 0x10(%[x], %[off]), %%xmm3")
__ASM_EMIT("addps %%xmm1, %%xmm5")
__ASM_EMIT("addps %%xmm1, %%xmm6")
__ASM_EMIT("mulps %%xmm0, %%xmm5")
__ASM_EMIT("mulps %%xmm0, %%xmm6")
__ASM_EMIT("addps %%xmm5, %%xmm2")
__ASM_EMIT("addps %%xmm6, %%xmm3")
__ASM_EMIT("movups %%xmm2, 0x00(%[x], %[off])")
__ASM_EMIT("movups %%xmm3, 0x10(%[x], %[off])")
__ASM_EMIT("add $0x20, %[off]")
__ASM_EMIT("sub $8, %[count]")
__ASM_EMIT("4:")
/* 4x block */
__ASM_EMIT("add $4, %[count]")
__ASM_EMIT("jl 6f")
__ASM_EMIT("movups 0x00(%[v], %[off]), %%xmm5")
__ASM_EMIT("movups 0x00(%[x], %[off]), %%xmm2")
__ASM_EMIT("addps %%xmm1, %%xmm5")
__ASM_EMIT("mulps %%xmm0, %%xmm5")
__ASM_EMIT("addps %%xmm5, %%xmm2")
__ASM_EMIT("movups %%xmm2, 0x00(%[x], %[off])")
__ASM_EMIT("add $0x10, %[off]")
__ASM_EMIT("sub $4, %[count]")
__ASM_EMIT("6:")
/* 1x blocks */
__ASM_EMIT("add $3, %[count]")
__ASM_EMIT("jl 8f")
__ASM_EMIT("7:")
__ASM_EMIT("movss 0x00(%[v], %[off]), %%xmm5")
__ASM_EMIT("movss 0x00(%[x], %[off]), %%xmm2")
__ASM_EMIT("addss %%xmm1, %%xmm5")
__ASM_EMIT("mulss %%xmm0, %%xmm5")
__ASM_EMIT("addss %%xmm5, %%xmm2")
__ASM_EMIT("movss %%xmm2, 0x00(%[x], %[off])")
__ASM_EMIT("add $0x04, %[off]")
__ASM_EMIT("dec %[count]")
__ASM_EMIT("jge 7b")
__ASM_EMIT("8:")

: [off] "=&r" (off), [count] "+r" (count),
[norm] "+Yz"(norm)
: [x] "r" (x), [v] "r" (v),
[zero] "m" (zero)
: "cc", "memory",
"%xmm1", "%xmm2", "%xmm3",
"%xmm4", "%xmm5", "%xmm6", "%xmm7"
);
}

} /* namespace sse */
} /* namespace lsp */


#endif /* PRIVATE_DSP_ARCH_X86_SSE_GRAPHICS_AXIS_H_ */
Loading

0 comments on commit be68448

Please sign in to comment.