mat proc kernel std tamplate is ok, merging old decl

This commit is contained in:
Nitload
2026-03-02 00:24:15 +08:00
parent e198f22712
commit 67fbbde449
8 changed files with 279 additions and 290 deletions
+5 -52
View File
@@ -3,59 +3,12 @@
#if SN_IS_ARCH(SN_ARCH_X86_64)
#include "sn_intrinsic.h"
#include "sn_intrincontext.x86.h"
#include "sn_intrinsic.context.x86.h"
#include "sn_intrinsic.std.h"
STD_MK_PROC_DECL(float, sse, , clear)
{
register __m128 zero = _mm_setzero_ps();
for (size_t i = 0; i < 4; i++) {
PANEL_COL_VEC((*ans), i, 0) = zero;
}
}
STD_MK_PROC_DECL(float, avx, , clear)
{
register __m256 zero = _mm256_setzero_ps();
for (size_t i = 0; i < 8; i++) {
PANEL_COL_VEC((*ans), i, 0) = zero;
}
}
STD_MK_PROC_DECL(float, 512, , clear)
{
register __m512 zero = _mm512_setzero_ps();
for (size_t i = 0; i < 16; i++) {
PANEL_COL_VEC((*ans), i, 0) = zero;
}
}
STD_MK_PROC_DECL(double, sse, , clear)
{
register __m128 zero = _mm_setzero_ps();
PANEL_COL_VEC((*ans), 0, 0) = zero;
PANEL_COL_VEC((*ans), 1, 0) = zero;
PANEL_COL_VEC((*ans), 2, 0) = zero;
PANEL_COL_VEC((*ans), 3, 0) = zero;
}
STD_MK_PROC_DECL(double, avx, , clear)
{
register __m256 zero = _mm256_setzero_ps();
for (size_t i = 0; i < 8; i++) {
PANEL_COL_VEC((*ans), i, 0) = zero;
}
}
STD_MK_PROC_DECL(double, 512, , clear)
{
register __m512 zero = _mm512_setzero_ps();
for (size_t i = 0; i < 16; i++) {
PANEL_COL_VEC((*ans), i, 0) = zero;
}
}
// Matrix transpose implementations
STD_MK_PROC_DECL(float, sse, , transpose)
SN_MK_PROC_DECL_STD(float, sse, , transpose)
{
register __m128 col0 = right->f32_x[0];
register __m128 col1 = right->f32_x[1];
@@ -72,7 +25,7 @@ STD_MK_PROC_DECL(float, sse, , transpose)
ans->f32_x[3] = _mm_movehl_ps(tmp3, tmp1);
}
STD_MK_PROC_DECL(float, avx, , transpose)
SN_MK_PROC_DECL_STD(float, avx, , transpose)
{
register __m256 col_low = right->f32_y[0];
register __m256 col_high = right->f32_y[1];
@@ -87,7 +40,7 @@ STD_MK_PROC_DECL(float, avx, , transpose)
ans->f32_y[1] = _mm256_shuffle_ps(col_high, col_low, _MM_SHUFFLE(3, 1, 3, 1));
}
STD_MK_PROC_DECL(float, 512, , transpose)
SN_MK_PROC_DECL_STD(float, 512, , transpose)
{
register __m512 matrix = right->f32_z[0];
+26 -25
View File
@@ -6,8 +6,9 @@
#include "sn_intrinsic.std.h"
#include "sn_intrinsic.context.x86.h"
STD_MK_RPOC_DECL(float, sse, , fill)
SN_MK_PROC_DECL_STD(float, sse, , fill)
{
__mk_param_std(BUFFER, ANS_SCALAR, float);
register __m128 vec = _mm_set_ps1(((float *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
ans[i].f32_x[0] = vec;
@@ -17,7 +18,7 @@ STD_MK_RPOC_DECL(float, sse, , fill)
}
}
DECLARE_BUF_PROC_ANS_SCALAR(float, avx, , fill)
SN_MK_PROC_DECL_STD(float, avx, , fill)
{
register __m256 vec = _mm256_broadcast_ss(((float *)(scalar->data)));
for (size_t i = 0; i < count; i++) {
@@ -26,7 +27,7 @@ DECLARE_BUF_PROC_ANS_SCALAR(float, avx, , fill)
}
}
DECLARE_BUF_PROC_ANS_SCALAR(float, 512, , fill)
SN_MK_PROC_DECL_STD(float, 512, , fill)
{
register __m512 vec = _mm512_broadcastss_ps(((__m128 *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
@@ -34,7 +35,7 @@ DECLARE_BUF_PROC_ANS_SCALAR(float, 512, , fill)
}
}
DECLARE_BUF_PROC_ANS_SCALAR(double, sse, , fill)
SN_MK_PROC_DECL_STD(double, sse, , fill)
{
register __m128d vec = _mm_set1_pd(((double *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
@@ -49,7 +50,7 @@ DECLARE_BUF_PROC_ANS_SCALAR(double, sse, , fill)
}
}
DECLARE_BUF_PROC_ANS_SCALAR(double, avx, , fill)
SN_MK_PROC_DECL_STD(double, avx, , fill)
{
register __m256d vec = _mm256_broadcast_sd(((double *)(scalar->data)));
for (size_t i = 0; i < count; i++) {
@@ -60,7 +61,7 @@ DECLARE_BUF_PROC_ANS_SCALAR(double, avx, , fill)
}
}
DECLARE_BUF_PROC_ANS_SCALAR(double, 512, , fill)
SN_MK_PROC_DECL_STD(double, 512, , fill)
{
register __m512d vec = _mm512_broadcastsd_pd(_mm_loadu_pd(scalar));
for (size_t i = 0; i < count; i++) {
@@ -69,9 +70,9 @@ DECLARE_BUF_PROC_ANS_SCALAR(double, 512, , fill)
}
}
STD_MK_PROC_DECL(float, sse, , add)
SN_MK_PROC_DECL_STD(float, sse, , add)
{
__mk_param(BUFFER, LEFT_RIGHT_ANS, float);
__mk_param_std(BUFFER, LEFT_RIGHT_ANS, float);
for (size_t i = 0; i < count; i++) {
register __m128 c0 = _mm_add_ps(left[i].f32_x[0], right[i].f32_x[0]);
@@ -86,7 +87,7 @@ STD_MK_PROC_DECL(float, sse, , add)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, avx, , add)
SN_MK_PROC_DECL_STD(float, avx, , add)
{
for (size_t i = 0; i < count; i++) {
size_t s = sizeof(MAT_KERNEL(float));
@@ -97,14 +98,14 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, avx, , add)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, 512, , add)
SN_MK_PROC_DECL_STD(float, 512, , add)
{
for (size_t i = 0; i < count; i++) {
register __m512 c0 = _mm512_add_ps(left[i].f32_z[0], right[i].f32_z[0]);
ans[i].f32_z[0] = c0;
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, sse, , add)
SN_MK_PROC_DECL_STD(double, sse, , add)
{
for (size_t i = 0; i < count; i++) {
register __m128d c0 = _mm_add_pd(_mm_castps_pd(left[i].f32_x[0]),
@@ -135,7 +136,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, sse, , add)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, avx, , add)
SN_MK_PROC_DECL_STD(double, avx, , add)
{
for (size_t i = 0; i < count; i++) {
size_t s = sizeof(MAT_KERNEL(float));
@@ -150,7 +151,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, avx, , add)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, 512, , add)
SN_MK_PROC_DECL_STD(double, 512, , add)
{
for (size_t i = 0; i < count; i++) {
register __m512d c0 = _mm512_add_pd(left[i].f64_z[0], right[i].f64_z[0]);
@@ -160,7 +161,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, 512, , add)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, sse, , sub)
SN_MK_PROC_DECL_STD(float, sse, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m128 c0 = _mm_sub_ps(left[i].f32_x[0], right[i].f32_x[0]);
@@ -175,7 +176,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, sse, , sub)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, avx, , sub)
SN_MK_PROC_DECL_STD(float, avx, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m256 c0 = _mm256_sub_ps(left[i].f32_y[0], right[i].f32_y[0]);
@@ -185,7 +186,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, avx, , sub)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, 512, , sub)
SN_MK_PROC_DECL_STD(float, 512, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m512 c0 = _mm512_sub_ps(left[i].f32_z[0], right[i].f32_z[0]);
@@ -193,7 +194,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(float, 512, , sub)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, sse, , sub)
SN_MK_PROC_DECL_STD(double, sse, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m128d c0 = _mm_sub_pd(left[i].f64_x[0], right[i].f64_x[0]);
@@ -216,7 +217,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, sse, , sub)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, avx, , sub)
SN_MK_PROC_DECL_STD(double, avx, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m256 c0 = _mm256_sub_ps(left[i].f32_y[0], right[i].f32_y[0]);
@@ -226,7 +227,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, avx, , sub)
}
}
DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, 512, , sub)
SN_MK_PROC_DECL_STD(double, 512, , sub)
{
for (size_t i = 0; i < count; i++) {
register __m512 c0 = _mm512_sub_ps(left[i].f32_z[0], right[i].f32_z[0]);
@@ -234,7 +235,7 @@ DECLARE_BUF_PROC_LEFT_RIGHT_ANS(double, 512, , sub)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, sse, , scalar_mul)
SN_MK_PROC_DECL_STD(float, sse, , scalar_mul)
{
register __m128 vec = _mm_set_ps1(((float *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
@@ -250,7 +251,7 @@ DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, sse, , scalar_mul)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, avx, , scalar_mul)
SN_MK_PROC_DECL_STD(float, avx, , scalar_mul)
{
register __m256 vec = _mm256_broadcast_ss(((float *)(scalar->data)));
for (size_t i = 0; i < count; i++) {
@@ -262,7 +263,7 @@ DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, avx, , scalar_mul)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, 512, , scalar_mul)
SN_MK_PROC_DECL_STD(float, 512, , scalar_mul)
{
register __m512 vec = _mm512_broadcastss_ps(((__m128 *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
@@ -272,7 +273,7 @@ DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(float, 512, , scalar_mul)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(double, sse, , scalar_mul)
SN_MK_PROC_DECL_STD(double, sse, , scalar_mul)
{
register __m128d vec = _mm_set1_pd(((double *)(scalar->data))[0]);
for (size_t i = 0; i < count; i++) {
@@ -296,7 +297,7 @@ DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(double, sse, , scalar_mul)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(double, avx, , scalar_mul)
SN_MK_PROC_DECL_STD(double, avx, , scalar_mul)
{
register __m256d vec = _mm256_broadcast_sd(((double *)(scalar->data)));
for (size_t i = 0; i < count; i++) {
@@ -312,7 +313,7 @@ DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(double, avx, , scalar_mul)
}
}
DECLARE_BUF_PROC_RIGHT_ANS_SCALAR(double, 512, , scalar_mul)
SN_MK_PROC_DECL_STD(double, 512, , scalar_mul)
{
register __m512d vec = _mm512_broadcastsd_pd(_mm_load_pd(scalar));
for (size_t i = 0; i < count; i++) {
+26 -9
View File
@@ -3,14 +3,17 @@
#if SN_IS_ARCH(SN_ARCH_X86_64)
#include "sn_intrinsic.h"
#include "sn_intrincontext.x86.h"
#include "sn_intrinsic.context.x86.h"
#include "sn_intrinsic.std.h"
#define _FMA_SELECT(i) _MM_SHUFFLE(i, i, i, i)
// float
DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, sse, , fma)
SN_MK_PROC_DECL_STD(float, sse, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
const __m128 a0 = _mm_load_ps((float *)&left->f32_x[0]);
const __m128 a1 = _mm_load_ps((float *)&left->f32_x[1]);
const __m128 a2 = _mm_load_ps((float *)&left->f32_x[2]);
@@ -57,8 +60,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, sse, , fma)
_mm_store_ps((float *)&ans->f32_x[3], c3);
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, avx, , fma)
SN_MK_PROC_DECL_STD(float, avx, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
static const __m256i b01_shift = { .m256i_i32 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m256i b23_shift = { .m256i_i32 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
@@ -103,8 +108,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, avx, , fma)
ans->f32_y[1] = c23;
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, avx, _fma, fma)
SN_MK_PROC_DECL_STD(float, avx, _fma, fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
static const __m256i b01_shift = { .m256i_i32 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m256i b23_shift = { .m256i_i32 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
@@ -149,8 +156,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, avx, _fma, fma)
ans->f32_y[1] = c23;
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, 512, , fma)
SN_MK_PROC_DECL_STD(float, 512, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
static const __m512i b_shift = { .m512i_i32 = {
// shuff order
0, 1, 2, 3, // col0
@@ -185,8 +194,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(float, 512, , fma)
// double
DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, sse, , fma)
SN_MK_PROC_DECL_STD(double, sse, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
for (int col = 0; col < 4; ++col) {
/* current answer column (two chunks: rows 0-1 and 2-3) */
register __m128d c_lo = _mm_load_pd(ans->f64_x + (col * 2 + 0));
@@ -229,8 +240,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, sse, , fma)
}
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, avx, , fma)
SN_MK_PROC_DECL_STD(double, avx, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
const __m256d a0 = _mm256_load_pd((double *)&left->f64_y[0]);
const __m256d a1 = _mm256_load_pd((double *)&left->f64_y[1]);
const __m256d a2 = _mm256_load_pd((double *)&left->f64_y[2]);
@@ -273,8 +286,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, avx, , fma)
_mm256_store_pd((double *)&ans->f64_y[3], ccol);
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, avx, _fma, fma)
SN_MK_PROC_DECL_STD(double, avx, _fma, fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
const __m256d a0 = _mm256_load_pd((double *)&left->f64_y[0]);
const __m256d a1 = _mm256_load_pd((double *)&left->f64_y[1]);
const __m256d a2 = _mm256_load_pd((double *)&left->f64_y[2]);
@@ -317,8 +332,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, avx, _fma, fma)
_mm256_store_pd((double *)&ans->f64_y[3], ccol);
}
DECLARE_KER_PROC_LEFT_RIGHT_ANS(double, 512, , fma)
SN_MK_PROC_DECL_STD(double, 512, , fma)
{
__mk_param_std(KERNEL, LEFT_RIGHT_ANS, float);
static const __m512i b01_shift = { .m512i_i64 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m512i b23_shift = { .m512i_i64 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
+8 -8
View File
@@ -11,7 +11,7 @@
// float
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, sse, , fma)
SN_MK_PROC_DECL_STD(float, sse, , fma)
{
int i = enumeration->m128_i32[0];
int j = enumeration->m128_i32[1];
@@ -73,7 +73,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, sse, , fma)
_mm_store_ps((float *)&ans_cur->f32_x[3], c3);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, , fma)
SN_MK_PROC_DECL_STD(float, avx, , fma)
{
static const __m256i b01_shift_source = { .m256i_i32 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m256i b23_shift_source = { .m256i_i32 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
@@ -136,7 +136,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, , fma)
_mm256_store_ps((float *)&ans_cur->f32_y[1], c23);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, _fma, fma)
SN_MK_PROC_DECL_STD(float, avx, _fma, fma)
{
static const __m256i b01_shift_source = { .m256i_i32 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m256i b23_shift_source = { .m256i_i32 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
@@ -199,7 +199,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, _fma, fma)
_mm256_store_ps((float *)&ans_cur->f32_y[1], c23);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, 512, , fma)
SN_MK_PROC_DECL_STD(float, 512, , fma)
{
static const __m512i b_shift_source = { .m512i_i32 = {
// shuff order
@@ -279,7 +279,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, 512, , fma)
c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); \
} while (0)
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, sse, , fma)
SN_MK_PROC_DECL_STD(double, sse, , fma)
{
int i = enumeration->m128_i32[0];
int j = enumeration->m128_i32[1];
@@ -319,7 +319,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, sse, , fma)
_mm_store_pd(ans->f64_x + (3 * 2 + 1), c3_hi);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, , fma)
SN_MK_PROC_DECL_STD(double, avx, , fma)
{
int i = enumeration->m128_i32[0];
int j = enumeration->m128_i32[1];
@@ -397,7 +397,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, , fma)
_mm256_store_pd((double *)&ans_cur->f64_y[3], c3);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, _fma, fma)
SN_MK_PROC_DECL_STD(double, avx, _fma, fma)
{
int i = enumeration->m128_i32[0];
int j = enumeration->m128_i32[1];
@@ -459,7 +459,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, _fma, fma)
_mm256_store_pd((double *)&ans_cur->f64_y[3], c3);
}
DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, 512, , fma)
SN_MK_PROC_DECL_STD(double, 512, , fma)
{
static const __m512i b01_shift_source = { .m512i_i64 = { 0, 1, 2, 3, 5, 6, 7, 4 } };
static const __m512i b23_shift_source = { .m512i_i64 = { 2, 3, 0, 1, 7, 4, 5, 6 } };
+7 -4
View File
@@ -1,13 +1,14 @@
#include "sn_target.h"
#include "sn_target.h"
#if SN_IS_ARCH(SN_ARCH_X86_64)
#include "sn_intrinsic.h"
#include "sn_intrinsic.std.h"
#include <math.h>
static const float quality_threshold = 1e-6f;
DECLARE_KER_PROC_LEFT_RIGHT_ANS_SCALAR(float, sse, , try_plu)
SN_MK_PROC_DECL_STD(float, sse, , try_plu)
{
/* Aliases */
MAT_KERNEL(float) *upper = left; /* U */
@@ -96,7 +97,7 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS_SCALAR(float, sse, , try_plu)
__m128 _t = _mm_shuffle_ps(_p, _p, _MM_SHUFFLE(2, 3, 0, 1)); \
_p = _mm_add_ps(_p, _t); \
_t = _mm_movehl_ps(_t, _p); \
ans = _mm_cvtss_f32(_mm_add_ss(_p, _t)); \
ans = _mm_cvtss_f32(_mm_add_ss(_p, _t)); \
} while (0)
#define FIND_MAX_F32_SSE(a, b) \
@@ -111,8 +112,10 @@ DECLARE_KER_PROC_LEFT_RIGHT_ANS_SCALAR(float, sse, , try_plu)
* layout of scalarpack:
*
*/
DECLARE_KER_PROC_RIGHT_ANS(float, sse, , quality)
SN_MK_PROC_DECL_STD(float, sse, , quality)
{
__mk_param_std(KERNEL, RIGHT_ANS, float);
static const __m128 tiny_source = { .m128_f32 = { 1e-6f, 1e-6f, 1e-6f, 1e-6f } };
register __m128 tiny = _mm_load_ps(tiny_source.m128_f32);