forked from OSchip/llvm-project
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 llvm-svn: 223175
This commit is contained in:
parent
22f58dffeb
commit
5f9afc59f8
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue