summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-12-03 23:36:14 +0000
committerReid Kleckner <reid@kleckner.net>2014-12-03 23:36:14 +0000
commitbaf770905527fc3187207231e6aa62bd2018d666 (patch)
tree9aabef4c918cee55ce1b61f13c2e203ca26c3e2c
parentde882cd1c7eee268ab4468b5419b31eab6ac562c (diff)
downloadbcm5719-llvm-baf770905527fc3187207231e6aa62bd2018d666.tar.gz
bcm5719-llvm-baf770905527fc3187207231e6aa62bd2018d666.zip
Implement __umulh with __int128 arithmetic
Use the same approach as _umul128, but just return the high half. llvm-svn: 223316
-rw-r--r--clang/lib/Headers/Intrin.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h
index 8cd4a0dbf01..84bc4303a13 100644
--- a/clang/lib/Headers/Intrin.h
+++ b/clang/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);
OpenPOWER on IntegriCloud