rsimd

Make SIMD instruction sets easier to use
git clone git://git.meso-star.fr/rsimd.git
Log | Files | Refs | README | LICENSE

commit 9c2c56ddb927b4abbc9ed2f8da0b903aa0eff5f2
parent 6bae6e6f731b286e23125001a398af196ce30418
Author: vaplv <vaplv@free.fr>
Date:   Mon, 27 Oct 2014 18:10:31 +0100

Add and test the soa4f<2|3|4>_selv functions

Diffstat:
Msrc/soa4fX.h | 12++++++++++++
Msrc/test_soa4f2.c | 6+++++-
Msrc/test_soa4f3.c | 4++++
Msrc/test_soa4f4.c | 12++++++++++++
4 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/soa4fX.h b/src/soa4fX.h @@ -325,6 +325,18 @@ SOA4FX_FUNC__(sel) return SOA4FX_FUNC__(set__)(dst, tmp); } +static FINLINE v4f_T* +SOA4FX_FUNC__(selv) + (v4f_T* dst, const v4f_T* vfalse, const v4f_T* vtrue, const v4f_T* vcond) +{ + v4f_T tmp[SOA4FX_DIMENSION__]; + int i; + ASSERT(dst && vfalse && vtrue); + FOR_EACH(i, 0, SOA4FX_DIMENSION__) + tmp[i] = v4f_sel(vfalse[i], vtrue[i], vcond[i]); + return SOA4FX_FUNC__(set__)(dst, tmp); +} + #undef SIZEOF_SOA4FX__ #undef SOA4FX_DIMENSION__ #undef SOA4FX_FUNC__ diff --git a/src/test_soa4f2.c b/src/test_soa4f2.c @@ -106,9 +106,13 @@ main(int argc, char** argv) CHECK(soa4f2_max(dst, a, b), dst); CHECK_F2(dst, 3.f, 2.f, 3.f, -1.f, 1.f, 0.f, 0.5f, 2.f); - soa4f2_sel(dst, b, a, v4f_mask(~0, ~0, 1, ~0)); + soa4f2_sel(dst, b, a, v4f_mask(~0, ~0, 0, ~0)); CHECK_F2(dst, 1.f, 2.f, 1.f, -1.f, -2.f, 0.f, 0.5f, 0.f); + soa4f2(c, v4f_mask(~0, ~0, 1, ~0), v4f_mask(~0, 0, 0, 0)); + soa4f2_selv(dst, b, a, c); + CHECK_F2(dst, 1.f, 2.f, 1.f, -1.f, -2.f, -6.f, 0.5f, 2.f); + return 0; } diff --git a/src/test_soa4f3.c b/src/test_soa4f3.c @@ -139,6 +139,10 @@ main(int argc, char** argv) soa4f3_sel(dst, b, a, v4f_mask(~0, ~0, 1, ~0)); CHECK_F3(dst, 1.f, 2.f, 1.f, -1.f, -2.f, 0.f, 0.5f, 0.f, -1.f, 4.f, 0.f, 2.f); + soa4f3(c, v4f_mask(~0,~0, 0,~0), v4f_mask(~0, 0, 0, 0), v4f_mask(0,~0,~0, 0)); + soa4f3_selv(dst, b, a, c); + CHECK_F3(dst, 1.f, 2.f, 1.f,-1.f,-2.f,-6.f, 0.5f, 2.f, 0.f, 4.f, 3.f, 3.f); + return 0; } diff --git a/src/test_soa4f4.c b/src/test_soa4f4.c @@ -202,5 +202,17 @@ main(int argc, char** argv) -1.f, 4.f, 0.f, 2.f, -5.f, 7.f, 0.f, -1.f); + soa4f4(c, + v4f_mask(~0,~0, 0,~0), + v4f_mask(~0, 0, 0, 0), + v4f_mask( 0,~0,~0, 0), + v4f_mask(~0,~0, 0, 0)); + soa4f4_selv(dst, b, a, c); + CHECK_F4(dst, + 1.f, 2.f, 1.f, -1.f, + -2.f, -6.f, 0.5f, 2.f, + 0.f, 4.f, 3.f, 3.f, + -5.f, 7.f, 0.f, 0.f); + return 0; }