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