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:
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);