|  | @@ -663,30 +663,38 @@ if test x$enable_curve25519 != xno; then
 | 
	
		
			
				|  |  |        [AC_LANG_PROGRAM([dnl
 | 
	
		
			
				|  |  |          #include <stdint.h>
 | 
	
		
			
				|  |  |          typedef unsigned uint128_t __attribute__((mode(TI)));
 | 
	
		
			
				|  |  | +	int func(uint64_t a, uint64_t b) {
 | 
	
		
			
				|  |  | +  	     uint128_t c = ((uint128_t)a) * b;
 | 
	
		
			
				|  |  | +             int ok = ((uint64_t)(c>>96)) == 522859 &&
 | 
	
		
			
				|  |  | +	           (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
 | 
	
		
			
				|  |  | +                   (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
 | 
	
		
			
				|  |  | +                   (((uint64_t)(c))&0xffffffffL) == 0;
 | 
	
		
			
				|  |  | +             return ok;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  	], [dnl
 | 
	
		
			
				|  |  | -          uint64_t a = ((uint64_t)2000000000) * 1000000000;
 | 
	
		
			
				|  |  | -	  uint64_t b = ((uint64_t)1234567890) << 24;
 | 
	
		
			
				|  |  | -	  uint128_t c = ((uint128_t)a) * b;
 | 
	
		
			
				|  |  | -	  return ((uint64_t)(c>>96)) == 522859 &&
 | 
	
		
			
				|  |  | -	         ((uint64_t)(c>>64))&0xffffffffL == 3604448702L &&
 | 
	
		
			
				|  |  | -                 ((uint64_t)(c>>32))&0xffffffffL == 2351960064L &&
 | 
	
		
			
				|  |  | -                 ((uint64_t)(c))&0xffffffffL == 0;
 | 
	
		
			
				|  |  | +	  int ok = func( ((uint64_t)2000000000) * 1000000000,
 | 
	
		
			
				|  |  | +	  	         ((uint64_t)1234567890) << 24);
 | 
	
		
			
				|  |  | +          return !ok;
 | 
	
		
			
				|  |  |          ])],
 | 
	
		
			
				|  |  |  	[tor_cv_can_use_curve25519_donna_c64=yes],
 | 
	
		
			
				|  |  |          [tor_cv_can_use_curve25519_donna_c64=no],
 | 
	
		
			
				|  |  |  	[AC_COMPILE_IFELSE(
 | 
	
		
			
				|  |  |            [AC_LANG_PROGRAM([dnl
 | 
	
		
			
				|  |  | -            #include <stdint.h>
 | 
	
		
			
				|  |  | -            typedef unsigned uint128_t __attribute__((mode(TI)));
 | 
	
		
			
				|  |  | -            ], [dnl
 | 
	
		
			
				|  |  | -              uint64_t a = ((uint64_t)2000000000) * 1000000000;
 | 
	
		
			
				|  |  | -	      uint64_t b = ((uint64_t)1234567890) << 24;
 | 
	
		
			
				|  |  | -	      uint128_t c = ((uint128_t)a) * b;
 | 
	
		
			
				|  |  | -	      return ((uint64_t)(c>>96)) == 522859 &&
 | 
	
		
			
				|  |  | -	             ((uint64_t)(c>>64))&0xffffffffL == 3604448702L &&
 | 
	
		
			
				|  |  | -                     ((uint64_t)(c>>32))&0xffffffffL == 2351960064L &&
 | 
	
		
			
				|  |  | -                     ((uint64_t)(c))&0xffffffffL == 0;
 | 
	
		
			
				|  |  | -            ])],
 | 
	
		
			
				|  |  | +        #include <stdint.h>
 | 
	
		
			
				|  |  | +        typedef unsigned uint128_t __attribute__((mode(TI)));
 | 
	
		
			
				|  |  | +	int func(uint64_t a, uint64_t b) {
 | 
	
		
			
				|  |  | +  	     uint128_t c = ((uint128_t)a) * b;
 | 
	
		
			
				|  |  | +             int ok = ((uint64_t)(c>>96)) == 522859 &&
 | 
	
		
			
				|  |  | +	           (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
 | 
	
		
			
				|  |  | +                   (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
 | 
	
		
			
				|  |  | +                   (((uint64_t)(c))&0xffffffffL) == 0;
 | 
	
		
			
				|  |  | +             return ok;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +	], [dnl
 | 
	
		
			
				|  |  | +	  int ok = func( ((uint64_t)2000000000) * 1000000000,
 | 
	
		
			
				|  |  | +	  	         ((uint64_t)1234567890) << 24);
 | 
	
		
			
				|  |  | +          return !ok;
 | 
	
		
			
				|  |  | +        ])],
 | 
	
		
			
				|  |  |              [tor_cv_can_use_curve25519_donna_c64=cross],
 | 
	
		
			
				|  |  |  	    [tor_cv_can_use_curve25519_donna_c64=no])])])
 | 
	
		
			
				|  |  |  
 |