#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>



struct __uint4{
	uint32_t x;
	uint32_t y;
	uint32_t z;
	uint32_t w;
};

typedef __uint4 uint4;

typedef uint32_t uint;


void halfsalsa(uint4 *w){
	uint i;
	//w[16]

	for(i=0; i<4; ++i){
		w[0] ^= rotl(w[3].x     +w[2].x     , 7U);
		w[1] ^= rotl(w[3].y     +w[2].y     , 7U);
		w[2] ^= rotl(w[3].z     +w[2].z     , 7U);
		w[3] ^= rotl(w[3].w     +w[2].w     , 7U);



}


void halfsalsa(uint4 *w){
    for(uint i=0; i<4; ++i){
        w[0] ^= rotl(w[3]     +w[2]     , 7U);
        w[1] ^= rotl(w[0]     +w[3]     , 9U);
        w[2] ^= rotl(w[1]     +w[0]     ,13U);
        w[3] ^= rotl(w[2]     +w[1]     ,18U);
        w[2] ^= rotl( w[3].wxyz  +  w[0].zwxy, 7U);
        w[1] ^= rotl(w[2].wxyz+w[3].zwxy, 9U);
        w[0] ^= rotl(w[1].wxyz+w[2].zwxy,13U);
        w[3] ^= rotl(w[0].wxyz+w[1].zwxy,18U);
    }
}

#if (LOOKUP_GAP == 2)
void salsa(uint4 *B, bool db){
#else
void salsa(uint4 *B){
#endif
	//B[32]
    uint4 w[4];

    for(uint i=0; i<4; ++i)
        w[i] = (B[i]^=B[i+4]);
    halfsalsa(w);
    for(uint i=0; i<4; ++i)
        w[i] = (B[i+4]^=(B[i]+=w[i]));
    halfsalsa(w);
#if (LOOKUP_GAP == 2)
    if(db){
        for(uint i=0; i<4; ++i)
            w[i] = (B[i]^=(B[i+4]+=w[i]));
        halfsalsa(w);
        for(uint i=0; i<4; ++i)
            w[i] = (B[i+4]^=(B[i]+=w[i]));
        halfsalsa(w);
    }
#endif
    for(uint i=0; i<4; ++i)
        B[i+4] += w[i];
}





int main(int argc, char **argv){







	return 0;
}
