aboutsummaryrefslogtreecommitdiff
path: root/src/util.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.h')
-rw-r--r--src/util.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/util.h b/src/util.h
index f0b2f4a71c..14853a0a2e 100644
--- a/src/util.h
+++ b/src/util.h
@@ -726,4 +726,29 @@ inline bool AffinityBugWorkaround(void(*pfn)(void*))
return false;
}
+template <class T> inline T rotlFixed(T x, unsigned int y)
+{
+ assert(y < sizeof(T)*8);
+ return T((x<<y) | (x>>(sizeof(T)*8-y)));
+}
+
+template <class T> inline T rotrFixed(T x, unsigned int y)
+{
+ assert(y < sizeof(T)*8);
+ return T((x>>y) | (x<<(sizeof(T)*8-y)));
+}
+
+inline uint32_t ByteReverse(uint32_t value)
+{
+#if defined(__MWERKS__) && TARGET_CPU_PPC
+ return (uint32_t)__lwbrx(&value,0);
+#elif _MSC_VER >= 1400 || (_MSC_VER >= 1300 && !defined(_DLL))
+ return _byteswap_ulong(value);
+#else
+ // 6 instructions with rotate instruction, 8 without
+ value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
+ return rotlFixed(value, 16U);
+#endif
+}
+
#endif