rsimd

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

commit 7314405a6a01eb4625749e3457450d50f937a41e
parent 3077263f58469011d02bf585cb66b1f48c6ffd89
Author: vaplv <vaplv@free.fr>
Date:   Fri, 17 Oct 2014 23:49:14 +0200

Add and test the v4f_loadu[3] functions

Diffstat:
Msrc/sse/ssef.h | 20+++++++++++++++++---
Msrc/test_v4f.c | 13++++++++++++-
2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/sse/ssef.h b/src/sse/ssef.h @@ -49,10 +49,24 @@ v4f_store(float dst[4], v4f_T v) } static FINLINE v4f_T -v4f_load(const float dst[4]) +v4f_load(const float src[4]) { - ASSERT(dst && IS_ALIGNED(dst, 16)); - return _mm_load_ps(dst); + ASSERT(src && IS_ALIGNED(src, 16)); + return _mm_load_ps(src); +} + +static FINLINE v4f_T +v4f_loadu(const float src[4]) +{ + ASSERT(src); + return _mm_set_ps(src[3], src[2], src[1], src[0]); +} + +static FINLINE v4f_T +v4f_loadu3(const float src[3]) +{ + ASSERT(src); + return _mm_set_ps(0.f, src[2], src[1], src[0]); } static FINLINE v4f_T diff --git a/src/test_v4f.c b/src/test_v4f.c @@ -21,10 +21,21 @@ main(int argc, char** argv) union { int32_t i; float f; } cast; v4f_T i, j, k; v4i_T l; - ALIGN(16) float tmp[4] = { 0.f, 1.f, 2.f, 3.f }; + ALIGN(16) float tmp[5] = { 0.f, 1.f, 2.f, 3.f, 4.f }; float* ptr; (void)argc, (void)argv; + i = v4f_loadu(tmp+1); + CHECK(v4f_x(i), 1.f); + CHECK(v4f_y(i), 2.f); + CHECK(v4f_z(i), 3.f); + CHECK(v4f_w(i), 4.f); + + i = v4f_loadu3(tmp); + CHECK(v4f_x(i), 0.f); + CHECK(v4f_y(i), 1.f); + CHECK(v4f_z(i), 2.f); + i = v4f_load(tmp); CHECK(v4f_x(i), 0.f); CHECK(v4f_y(i), 1.f);