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


uint16 halfsalsa(uint16 w){
	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);

	}
	return w;
}

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

	if(db){
		B[0] ^= B[1];
		B[0] += halfsalsa(B[0]);
		B[1] ^= B[0];
		B[1] += 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];
        B[0] += halfsalsa(B[0]);
        B[1] ^= B[0];
        B[1] += 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];
		B[0] += halfsalsa(B[0]);
		B[1] ^= B[0];
		B[1] += halfsalsa(B[1]);
	}
}
# else
void salsa(uint16 *B){
	B[0] ^= B[1];
	B[0] += halfsalsa(B[0]);
	B[1] ^= B[0];
	B[1] += halfsalsa(B[1]);
}
# endif

#endif