|
@@ -1,6 +1,9 @@
|
|
|
#ifndef INTRIN_HPP
|
|
|
#define INTRIN_HPP
|
|
|
#include <cstdint>
|
|
|
+#ifdef __clang__
|
|
|
+#undef _MSC_VER
|
|
|
+#endif
|
|
|
#ifdef _DEF_INT128
|
|
|
#error _DEF_INT128 cannot be directly set
|
|
|
#elif defined(__SIZEOF_INT128__)
|
|
@@ -14,6 +17,9 @@
|
|
|
#endif
|
|
|
#endif
|
|
|
#endif
|
|
|
+#ifdef __clang__
|
|
|
+#define _DEF_INT128
|
|
|
+#endif
|
|
|
#ifndef _DEF_INT128
|
|
|
#include "uint128_t.h"
|
|
|
using uint_128bit = uint128_t;
|
|
@@ -33,13 +39,14 @@ bool _adc_u64(unsigned long long a,unsigned long long b,unsigned long long* c){
|
|
|
bool _sbc_u64(unsigned long long a,unsigned long long b,unsigned long long* c){
|
|
|
return __builtin_usubll_overflow(a, b, c);
|
|
|
}
|
|
|
-inline unsigned long long _mulx_u64(unsigned long long a, unsigned long long b, unsigned long long* hi){
|
|
|
+inline unsigned long long mulx_u64(unsigned long long a, unsigned long long b, unsigned long long* hi){
|
|
|
__uint128_t r = ((__uint128_t)a) * b;
|
|
|
*hi = (unsigned long long)(r >> 64);
|
|
|
return r;
|
|
|
}
|
|
|
#endif
|
|
|
#ifdef _MSC_VER
|
|
|
+#error Hallo
|
|
|
#include <intrin.h>
|
|
|
inline int _leading_zeros(unsigned long long x){
|
|
|
int index = 0;
|
|
@@ -58,5 +65,8 @@ bool _sbc_u64(unsigned long long a,unsigned long long b,unsigned long long* c){
|
|
|
*c = a - b;
|
|
|
return b > a;
|
|
|
}
|
|
|
+inline unsigned long long mulx_u64(unsigned long long a, unsigned long long b, unsigned long long* hi){
|
|
|
+ return _mulx_u64(a,b,hi);
|
|
|
+}
|
|
|
#endif
|
|
|
#endif //INTRIN_HPP
|