r223316 - Implement __umulh with __int128 arithmetic

Reid Kleckner reid at kleckner.net
Wed Dec 3 15:36:14 PST 2014


Author: rnk
Date: Wed Dec  3 17:36:14 2014
New Revision: 223316

URL: http://llvm.org/viewvc/llvm-project?rev=223316&view=rev
Log:
Implement __umulh with __int128 arithmetic

Use the same approach as _umul128, but just return the high half.

Modified:
    cfe/trunk/lib/Headers/Intrin.h

Modified: cfe/trunk/lib/Headers/Intrin.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=223316&r1=223315&r2=223316&view=diff
==============================================================================
--- cfe/trunk/lib/Headers/Intrin.h (original)
+++ cfe/trunk/lib/Headers/Intrin.h Wed Dec  3 17:36:14 2014
@@ -330,7 +330,6 @@ unsigned __int64 __shiftright128(unsigne
                                  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, u
   *_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);





More information about the cfe-commits mailing list