@@ -241,15 +241,23 @@ do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
241241
242242/* 32-bit Rotates */
243243#if defined(_MSC_VER )
244- #define LTC_ROx_ASM
244+ #define LTC_ROx_BUILTIN
245245
246246/* instrinsic rotate */
247247#include <stdlib.h>
248- #pragma intrinsic(_lrotr,_lrotl)
249- #define ROR (x ,n ) _lrotr(x,n)
250- #define ROL (x ,n ) _lrotl(x,n)
251- #define RORc (x ,n ) _lrotr(x,n)
252- #define ROLc (x ,n ) _lrotl(x,n)
248+ #pragma intrinsic(_rotr,_rotl)
249+ #define ROR (x ,n ) _rotr(x,n)
250+ #define ROL (x ,n ) _rotl(x,n)
251+ #define RORc (x ,n ) ROR(x,n)
252+ #define ROLc (x ,n ) ROL(x,n)
253+
254+ #elif defined(LTC_HAVE_ROTATE_BUILTIN )
255+ #define LTC_ROx_BUILTIN
256+
257+ #define ROR (x ,n ) __builtin_rotateright32(x,n)
258+ #define ROL (x ,n ) __builtin_rotateleft32(x,n)
259+ #define ROLc (x ,n ) ROL(x,n)
260+ #define RORc (x ,n ) ROR(x,n)
253261
254262#elif !defined(__STRICT_ANSI__ ) && defined(__GNUC__ ) && (defined(__i386__ ) || defined(__x86_64__ )) && !defined(INTEL_CC ) && !defined(LTC_NO_ASM )
255263#define LTC_ROx_ASM
@@ -353,7 +361,24 @@ static inline ulong32 RORc(ulong32 word, const int i)
353361
354362
355363/* 64-bit Rotates */
356- #if !defined(__STRICT_ANSI__ ) && defined(__GNUC__ ) && defined(__x86_64__ ) && !defined(_WIN64 ) && !defined(LTC_NO_ASM )
364+ #if defined(_MSC_VER )
365+
366+ /* instrinsic rotate */
367+ #include <stdlib.h>
368+ #pragma intrinsic(_rotr64,_rotr64)
369+ #define ROR64 (x ,n ) _rotr64(x,n)
370+ #define ROL64 (x ,n ) _rotl64(x,n)
371+ #define ROR64c (x ,n ) ROR64(x,n)
372+ #define ROL64c (x ,n ) ROL64(x,n)
373+
374+ #elif defined(LTC_HAVE_ROTATE_BUILTIN )
375+
376+ #define ROR64 (x ,n ) __builtin_rotateright64(x,n)
377+ #define ROL64 (x ,n ) __builtin_rotateleft64(x,n)
378+ #define ROR64c (x ,n ) ROR64(x,n)
379+ #define ROL64c (x ,n ) ROL64(x,n)
380+
381+ #elif !defined(__STRICT_ANSI__ ) && defined(__GNUC__ ) && (defined(__i386__ ) || defined(__x86_64__ )) && !defined(INTEL_CC ) && !defined(LTC_NO_ASM )
357382
358383static inline ulong64 ROL64 (ulong64 word , int i )
359384{
0 commit comments