rsimd

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

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:
Msrc/sse/ssef.h | 14++++++++++++++
Msrc/test_v4f.c | 24++++++++++++++++++++++++
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);