From: Reid Kleckner Date: Wed, 3 Dec 2014 23:36:14 +0000 (+0000) Subject: Implement __umulh with __int128 arithmetic X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=253c097d5941f006da966a0a84eb8e2694e088df;p=clang Implement __umulh with __int128 arithmetic Use the same approach as _umul128, but just return the high half. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223316 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Headers/Intrin.h b/lib/Headers/Intrin.h index 8cd4a0dbf0..84bc4303a1 100644 --- a/lib/Headers/Intrin.h +++ b/lib/Headers/Intrin.h @@ -330,7 +330,6 @@ unsigned __int64 __shiftright128(unsigned __int64 _LowPart, unsigned char _Shift); static __inline__ void __stosq(unsigned __int64 *, unsigned __int64, size_t); -unsigned __int64 __umulh(unsigned __int64, unsigned __int64); unsigned char __vmx_on(unsigned __int64 *); unsigned char __vmx_vmclear(unsigned __int64 *); unsigned char __vmx_vmlaunch(void); @@ -429,6 +428,12 @@ _umul128(unsigned __int64 _Multiplier, unsigned __int64 _Multiplicand, *_HighProduct = _FullProduct >> 64; return _FullProduct; } +static __inline__ unsigned __int64 __attribute__((__always_inline__, __nodebug__)) +__umulh(unsigned __int64 _Multiplier, unsigned __int64 _Multiplicand) { + unsigned __int128 _FullProduct = + (unsigned __int128)_Multiplier * (unsigned __int128)_Multiplicand; + return _FullProduct >> 64; +} void __cdecl _xrstor64(void const *, unsigned __int64); void __cdecl _xsave64(void *, unsigned __int64); void __cdecl _xsaveopt64(void *, unsigned __int64);