aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <maratek@gmail.com>2017-04-14 01:20:18 +0000
committerMarat Dukhan <maratek@gmail.com>2017-04-14 01:20:18 +0000
commit6d9ce9d5a08737a424baecc7587e487396b9729a (patch)
tree26479fa1f568088a86a3444cec6c1fc3cc2d4991
parent0be0b6efaa2c3860f7a20e405a267f05829cac11 (diff)
downloadpsimd-6d9ce9d5a08737a424baecc7587e487396b9729a.tar.gz
Vector reversal functions
-rw-r--r--include/psimd.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/include/psimd.h b/include/psimd.h
index 99def70..29f3459 100644
--- a/include/psimd.h
+++ b/include/psimd.h
@@ -743,6 +743,65 @@
#endif
}
+ /* Reversal of vector elements */
+ #if defined(__clang__)
+ PSIMD_INTRINSIC psimd_s8 psimd_reverse_s8(psimd_s8 v) {
+ return __builtin_shufflevector(v, v, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_u8 psimd_reverse_u8(psimd_u8 v) {
+ return __builtin_shufflevector(v, v, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_s16 psimd_reverse_s16(psimd_s16 v) {
+ return __builtin_shufflevector(v, v, 7, 6, 5, 4, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_u16 psimd_reverse_u16(psimd_u16 v) {
+ return __builtin_shufflevector(v, v, 7, 6, 5, 4, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_s32 psimd_reverse_s32(psimd_s32 v) {
+ return __builtin_shufflevector(v, v, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_u32 psimd_reverse_u32(psimd_u32 v) {
+ return __builtin_shufflevector(v, v, 3, 2, 1, 0);
+ }
+
+ PSIMD_INTRINSIC psimd_f32 psimd_reverse_f32(psimd_f32 v) {
+ return __builtin_shufflevector(v, v, 3, 2, 1, 0);
+ }
+ #else
+ PSIMD_INTRINSIC psimd_s8 psimd_reverse_s8(psimd_s8 v) {
+ return __builtin_shuffle(v, (psimd_s8) { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_u8 psimd_reverse_u8(psimd_u8 v) {
+ return __builtin_shuffle(v, (psimd_s8) { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_s16 psimd_reverse_s16(psimd_s16 v) {
+ return __builtin_shuffle(v, (psimd_s16) { 7, 6, 5, 4, 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_u16 psimd_reverse_u16(psimd_u16 v) {
+ return __builtin_shuffle(v, (psimd_s16) { 7, 6, 5, 4, 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_s32 psimd_reverse_s32(psimd_s32 v) {
+ return __builtin_shuffle(v, (psimd_s32) { 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_u32 psimd_reverse_u32(psimd_u32 v) {
+ return __builtin_shuffle(v, (psimd_s32) { 3, 2, 1, 0 });
+ }
+
+ PSIMD_INTRINSIC psimd_f32 psimd_reverse_f32(psimd_f32 v) {
+ return __builtin_shuffle(v, (psimd_s32) { 3, 2, 1, 0 });
+ }
+ #endif
+
/* Interleaving of vector elements */
#if defined(__clang__)
PSIMD_INTRINSIC psimd_s16 psimd_interleave_lo_s16(psimd_s16 a, psimd_s16 b) {