|  | @@ -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
 |