#ifndef SALSA
#define SALSA 1
#include "globals.h"

void halfsalsa(uint16 *B){
	uint16 w = *B;
    for(uint i=0; i<4; ++i){
        w.s0123 ^= rotl(w.scdef + w.s89ab, 7U);
        w.s4567 ^= rotl(w.s0123 + w.scdef, 9U);
        w.s89ab ^= rotl(w.s4567 + w.s0123, 13U);
        w.scdef ^= rotl(w.s89ab + w.s4567, 18U);
        w.s89ab ^= rotl(w.sfcde + w.s2301, 7U);
        w.s4567 ^= rotl(w.sb89a + w.sefcd, 9U);
        w.s0123 ^= rotl(w.s7456 + w.sab89, 13U);
        w.scdef ^= rotl(w.s3012 + w.s6745, 18U);

    }
	*B += w;
}

# if (LOOKUP_GAP == 2)
void salsa(uint16 *B, bool db){
	B[0] ^= B[1];
	halfsalsa(B);
	B[1] ^= B[0];
	halfsalsa(B+1);
	if(db){
		B[0] ^= B[1];
		halfsalsa(B);
		B[1] ^= B[0];
		halfsalsa(B+1);
	}
}


# elif (LOOKUP_GAP == 3)
void salsa(uint16 *B, ushort times){
    for(uint i=0; i<times+1; i++){
        B[0] ^= B[1];
		halfsalsa(B);
        B[1] ^= B[0];
		halfsalsa(B+1);
    }
}
# elif (LOOKUP_GAP != 1)
void salsa(uint16 *B, ushort times){
	for(uint i=0; i<times+1; i++){
		B[0] ^= B[1];
		halfsalsa(B);
		B[1] ^= B[0];
		halfsalsa(B+1);
	}
}
# else
void salsa(uint16 *B){
	B[0] ^= B[1];
	halfsalsa(B);
	B[1] ^= B[0];
	halfsalsa(B+1);
}
# endif

#endif