From: David Majnemer Date: Tue, 2 Dec 2014 23:30:24 +0000 (+0000) Subject: Intrin: Add _umul128 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f89684e0154fef893aa6bf1616c423177f9393ee;p=clang Intrin: Add _umul128 Implement _umul128; it provides the high and low halves of a 128-bit multiply. We can simply use our __int128 arithmetic to implement this, we generate great code for it: movq %rdx, %rax mulq %rcx movq %rdx, (%r8) retq Differential Revision: http://reviews.llvm.org/D6486 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223175 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Headers/Intrin.h b/lib/Headers/Intrin.h index 016c480adf..89e0d0c82d 100644 --- a/lib/Headers/Intrin.h +++ b/lib/Headers/Intrin.h @@ -417,9 +417,18 @@ int __cdecl _setjmpex(jmp_buf); #endif unsigned __int64 _shlx_u64(unsigned __int64, unsigned int); unsigned __int64 shrx_u64(unsigned __int64, unsigned int); -unsigned __int64 _umul128(unsigned __int64 _Multiplier, - unsigned __int64 _Multiplicand, - unsigned __int64 *_HighProduct); +/* + * Multiply two 64-bit integers and obtain a 64-bit result. + * The low-half is returned directly and the high half is in an out parameter. + */ +static __inline__ unsigned __int64 __attribute__((__always_inline__, __nodebug__)) +_umul128(unsigned __int64 _Multiplier, unsigned __int64 _Multiplicand, + unsigned __int64 *_HighProduct) { + unsigned __int128 _FullProduct = + (unsigned __int128)_Multiplier * (unsigned __int128)_Multiplicand; + *_HighProduct = FullProduct >> 64; + return FullProduct; +} void __cdecl _xrstor64(void const *, unsigned __int64); void __cdecl _xsave64(void *, unsigned __int64); void __cdecl _xsaveopt64(void *, unsigned __int64);