@ -311,40 +311,10 @@ inline u32 rotl32_S (const u32 a, const u32 n)
return rotate ( a , n ) ;
}
# if CUDA_ARCH >= 350
inline u64 rotr64_S ( const u64 a , const u32 n )
{
u32 il ;
u32 ir ;
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a ) ) ;
u32 tl ;
u32 tr ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
u64 r ;
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r ) : " r " ( tl ) , " r " ( tr ) ) ;
return r ;
}
# else
inline u64 rotr64_S ( const u64 a , const u32 n )
{
return rotate ( a , ( u64 ) 64 - n ) ;
}
# endif
inline u64 rotl64_S ( const u64 a , const u32 n )
{
@ -390,335 +360,14 @@ inline u32x rotl32 (const u32x a, const u32 n)
return rotate ( a , n ) ;
}
# if CUDA_ARCH >= 350
inline u64x rotr64 ( const u64x a , const u32 n )
{
u64x r ;
u32 il ;
u32 ir ;
u32 tl ;
u32 tr ;
# if VECT_SIZE == 1
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r ) : " r " ( tl ) , " r " ( tr ) ) ;
# endif
# if VECT_SIZE >= 2
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s0 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s0 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s1 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s1 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
# endif
# if VECT_SIZE >= 4
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s2 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s2 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s3 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s3 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
# endif
# if VECT_SIZE >= 8
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s4 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s4 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s5 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s5 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s6 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s6 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s7 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s7 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
# endif
# if VECT_SIZE >= 16
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s8 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s8 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . s9 ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . s9 ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . sa ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . sa ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . sb ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . sb ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . sc ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . sc ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . sd ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . sd ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . se ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . se ) : " r " ( tl ) , " r " ( tr ) ) ;
}
{
asm ( " mov.b64 {%0, %1}, %2; " : " =r " ( il ) , " =r " ( ir ) : " l " ( a . sf ) ) ;
if ( n > = 32 )
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( ir ) , " r " ( il ) , " r " ( n - 32 ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( il ) , " r " ( ir ) , " r " ( n - 32 ) ) ;
}
else
{
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tl ) : " r " ( il ) , " r " ( ir ) , " r " ( n ) ) ;
asm ( " shf.r.wrap.b32 %0, %1, %2, %3; " : " =r " ( tr ) : " r " ( ir ) , " r " ( il ) , " r " ( n ) ) ;
}
asm ( " mov.b64 %0, {%1, %2}; " : " =l " ( r . sf ) : " r " ( tl ) , " r " ( tr ) ) ;
}
# endif
return r ;
}
# else
inline u64x rotr64 ( const u64x a , const u32 n )
{
return rotate ( a , ( u64 ) 64 - n ) ;
}
# endif
inline u64x rotl64 ( const u64x a , const u32 n )
{
return rot r64 ( a , ( u64 ) 64 - n ) ;
return rotate ( a , ( u64 ) n ) ;
}
inline u32x __byte_perm ( const u32x a , const u32x b , const u32x c )