commit 5d4def688be05e193d9f192b753f1e70610778b8
parent 72a6b734cfb49dab51ad80ca1b73562c0b5f22a0
Author: vaplv <vaplv@free.fr>
Date: Tue, 27 Jan 2015 13:53:23 +0100
Add and test the v4f_reduce_<min|max> functions
Diffstat:
2 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/src/sse/ssef.h b/src/sse/ssef.h
@@ -551,6 +551,20 @@ v4f_max(const v4f_T v0, const v4f_T v1)
return _mm_max_ps(v0, v1);
}
+static FINLINE v4f_T
+v4f_reduce_min(const v4f_T v)
+{
+ const v4f_T tmp = v4f_min(v4f_yxwz(v), v);
+ return v4f_min(v4f_zwxy(tmp), tmp);
+}
+
+static FINLINE v4f_T
+v4f_reduce_max(const v4f_T v)
+{
+ const v4f_T tmp = v4f_max(v4f_yxwz(v), v);
+ return v4f_max(v4f_zwxy(tmp), tmp);
+}
+
/*******************************************************************************
* Miscellaneous
******************************************************************************/
diff --git a/src/test_v4f.c b/src/test_v4f.c
@@ -487,6 +487,30 @@ main(int argc, char** argv)
CHECK(v4f_z(k), 3.f);
CHECK(v4f_w(k), 6.f);
+ k = v4f_reduce_min(i);
+ CHECK(v4f_x(k), 1.f);
+ CHECK(v4f_y(k), 1.f);
+ CHECK(v4f_z(k), 1.f);
+ CHECK(v4f_w(k), 1.f);
+
+ k = v4f_reduce_min(j);
+ CHECK(v4f_x(k), -4.f);
+ CHECK(v4f_y(k), -4.f);
+ CHECK(v4f_z(k), -4.f);
+ CHECK(v4f_w(k), -4.f);
+
+ k = v4f_reduce_max(i);
+ CHECK(v4f_x(k), 4.f);
+ CHECK(v4f_y(k), 4.f);
+ CHECK(v4f_z(k), 4.f);
+ CHECK(v4f_w(k), 4.f);
+
+ k = v4f_reduce_max(j);
+ CHECK(v4f_x(k), 6.f);
+ CHECK(v4f_y(k), 6.f);
+ CHECK(v4f_z(k), 6.f);
+ CHECK(v4f_w(k), 6.f);
+
l = v4f_to_v4i(j);
CHECK(v4i_x(l), -2);
CHECK(v4i_y(l), -4);