|
|
@@ -0,0 +1,61 @@
|
|
|
+// Copyright 2018 yuzu emulator team
|
|
|
+// Licensed under GPLv2 or any later version
|
|
|
+// Refer to the license.txt file included.
|
|
|
+
|
|
|
+#pragma once
|
|
|
+
|
|
|
+#include <climits>
|
|
|
+#include <cstddef>
|
|
|
+
|
|
|
+#ifdef _MSC_VER
|
|
|
+#include <intrin.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+#include "common/common_types.h"
|
|
|
+
|
|
|
+namespace Common {
|
|
|
+
|
|
|
+/// Gets the size of a specified type T in bits.
|
|
|
+template <typename T>
|
|
|
+constexpr std::size_t BitSize() {
|
|
|
+ return sizeof(T) * CHAR_BIT;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef _MSC_VER
|
|
|
+inline u32 CountLeadingZeroes32(u32 value) {
|
|
|
+ unsigned long leading_zero = 0;
|
|
|
+
|
|
|
+ if (_BitScanReverse(&leading_zero, value) != 0) {
|
|
|
+ return 31 - leading_zero;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 32;
|
|
|
+}
|
|
|
+
|
|
|
+inline u64 CountLeadingZeroes64(u64 value) {
|
|
|
+ unsigned long leading_zero = 0;
|
|
|
+
|
|
|
+ if (_BitScanReverse64(&leading_zero, value) != 0) {
|
|
|
+ return 63 - leading_zero;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 64;
|
|
|
+}
|
|
|
+#else
|
|
|
+inline u32 CountLeadingZeroes32(u32 value) {
|
|
|
+ if (value == 0) {
|
|
|
+ return 32;
|
|
|
+ }
|
|
|
+
|
|
|
+ return __builtin_clz(value);
|
|
|
+}
|
|
|
+
|
|
|
+inline u64 CountLeadingZeroes64(u64 value) {
|
|
|
+ if (value == 0) {
|
|
|
+ return 64;
|
|
|
+ }
|
|
|
+
|
|
|
+ return __builtin_clzll(value);
|
|
|
+}
|
|
|
+#endif
|
|
|
+} // namespace Common
|