rsimd

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

commit b5149f48094d0168ad8ae4def058e10d1f24485a
parent 9c2c56ddb927b4abbc9ed2f8da0b903aa0eff5f2
Author: vaplv <vaplv@free.fr>
Date:   Tue, 28 Oct 2014 15:42:55 +0100

Add and test the v4i_<l|r>shift function

Diffstat:
Msrc/sse/ssei.h | 12++++++++++++
Msrc/test_v4i.c | 20++++++++++++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/src/sse/ssei.h b/src/sse/ssei.h @@ -114,6 +114,18 @@ v4i_not(const v4i_T v) return _mm_xor_si128(v, _mm_set1_epi32(-1)); } +static FINLINE v4i_T +v4i_rshift(const v4i_T v, const int32_t rshift) +{ + return _mm_srli_epi32(v, rshift); +} + +static FINLINE v4i_T +v4i_lshift(const v4i_T v, const int32_t lshift) +{ + return _mm_slli_epi32(v, lshift); +} + /******************************************************************************* * Arithmetic operators ******************************************************************************/ diff --git a/src/test_v4i.c b/src/test_v4i.c @@ -85,6 +85,25 @@ main(int argc, char** argv) CHECK(v4i_z(k), (int32_t)0xF7F6F5F4); CHECK(v4i_w(k), (int32_t)0xF3F2F1F0); + i = v4i_set(32, 16, 8, 4); + k = v4i_rshift(i, 4); + CHECK(v4i_x(k), 2); + CHECK(v4i_y(k), 1); + CHECK(v4i_z(k), 0); + CHECK(v4i_w(k), 0); + + k = v4i_rshift(i, 1); + CHECK(v4i_x(k), 16); + CHECK(v4i_y(k), 8); + CHECK(v4i_z(k), 4); + CHECK(v4i_w(k), 2); + + k = v4i_lshift(i, 4); + CHECK(v4i_x(k), 512); + CHECK(v4i_y(k), 256); + CHECK(v4i_z(k), 128); + CHECK(v4i_w(k), 64); + i = v4i_set(1, 2, 3, 4); j = v4i_set(-2, -4, 3, 6); k = v4i_add(i, j); @@ -164,6 +183,7 @@ main(int argc, char** argv) CHECK(v4i_y(k), 2); CHECK(v4i_z(k), 2); CHECK(v4i_w(k), 3); + return 0; }