summaryrefslogtreecommitdiff
path: root/include/linux/math64.h
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2014-01-12 20:56:29 +0400
committerIngo Molnar <mingo@kernel.org>2014-01-12 20:56:29 +0400
commitda4540757d35a98a350d6e8d882a64b2d04f8581 (patch)
treead77d8752f5db40497c819f051cbae12effb8163 /include/linux/math64.h
parentcc131eef1cec905b9bdb0be6d7ab3af86f23de98 (diff)
parent7e22e91102c6b9df7c4ae2168910e19d2bb14cd6 (diff)
downloadlinux-da4540757d35a98a350d6e8d882a64b2d04f8581.tar.xz
Merge tag 'v3.13-rc8' into x86/ras, to pick up fixes.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/math64.h')
-rw-r--r--include/linux/math64.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/include/linux/math64.h b/include/linux/math64.h
index 69ed5f5e9f6e..c45c089bfdac 100644
--- a/include/linux/math64.h
+++ b/include/linux/math64.h
@@ -133,4 +133,34 @@ __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
return ret;
}
+#if defined(CONFIG_ARCH_SUPPORTS_INT128) && defined(__SIZEOF_INT128__)
+
+#ifndef mul_u64_u32_shr
+static inline u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift)
+{
+ return (u64)(((unsigned __int128)a * mul) >> shift);
+}
+#endif /* mul_u64_u32_shr */
+
+#else
+
+#ifndef mul_u64_u32_shr
+static inline u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift)
+{
+ u32 ah, al;
+ u64 ret;
+
+ al = a;
+ ah = a >> 32;
+
+ ret = ((u64)al * mul) >> shift;
+ if (ah)
+ ret += ((u64)ah * mul) << (32 - shift);
+
+ return ret;
+}
+#endif /* mul_u64_u32_shr */
+
+#endif
+
#endif /* _LINUX_MATH64_H */