// File: /workspace/github_c_makefile_star2_O0/mjosaarinen[P]brutus/crypto_aead/twine80n6t4clocv2/ref/twine.c
// Function: Encode
void Encode(uint8 text[8], uint8 cipher[8])
{
#ifdef _PRINT
	printf("Twine  input: ");
	pstate(text, 8);
#endif
	uint8	i;
	uint8	data1[16], tmp, t_data[16];

	//Set plaintext
	data1[0] = text[0]>>4;
	data1[1] = text[0]&0xf;
	data1[2] = text[1]>>4;
	data1[3] = text[1]&0xf;
	data1[4] = text[2]>>4;
	data1[5] = text[2]&0xf;
	data1[6] = text[3]>>4;
	data1[7] = text[3]&0xf;
	data1[8] = text[4]>>4;
	data1[9] = text[4]&0xf;
	data1[10] = text[5]>>4;
	data1[11] = text[5]&0xf;
	data1[12] = text[6]>>4;
	data1[13] = text[6]&0xf;
	data1[14] = text[7]>>4;
	data1[15] = text[7]&0xf;

	//Round functions
	for(i=0; ; i++)
	{
 		data1[1] ^= S[data1[0] ^ ek[i][0]];
		data1[3] ^= S[data1[2] ^ ek[i][1]];
		data1[5] ^= S[data1[4] ^ ek[i][2]];
		data1[7] ^= S[data1[6] ^ ek[i][3]];
		data1[9] ^= S[data1[8] ^ ek[i][4]];
		data1[11] ^= S[data1[10] ^ ek[i][5]];
		data1[13] ^= S[data1[12] ^ ek[i][6]];
		data1[15] ^= S[data1[14] ^ ek[i][7]];

        if(pswitch){
            t_data[0] = data1[1];
            t_data[1] = data1[2];
            t_data[2] = data1[11];
            t_data[3] = data1[6];
            t_data[4] = data1[3];
            t_data[5] = data1[0];
            t_data[6] = data1[9];
            t_data[7] = data1[4];
            t_data[8] = data1[7];
            t_data[9] = data1[10];
            t_data[10] = data1[13];
            t_data[11] = data1[14];
            t_data[12] = data1[5];
            t_data[13] = data1[8];
            t_data[14] = data1[15];
            t_data[15] = data1[12];
            printf("ROUND %02d: ", i);
            pstate3(t_data, 16);
        }
		i++;
 		data1[2] ^= S[data1[1] ^ ek[i][0]];
		data1[6] ^= S[data1[11] ^ ek[i][1]];
		data1[0] ^= S[data1[3] ^ ek[i][2]];
		data1[4] ^= S[data1[9] ^ ek[i][3]];
		data1[10] ^= S[data1[7] ^ ek[i][4]];
		data1[14] ^= S[data1[13] ^ ek[i][5]];
		data1[8] ^= S[data1[5] ^ ek[i][6]];
		data1[12] ^= S[data1[15] ^ ek[i][7]];

		if(i == (ROUND-1))
			break;

		tmp = data1[0];
		data1[0] = data1[2];
		data1[2] = data1[14];
		data1[14] = data1[12];
		data1[12] = tmp;

		tmp = data1[1];
		data1[1] = data1[11];
		data1[11] = data1[15];
		data1[15] = data1[5];
		data1[5] = tmp;

		tmp = data1[3];
		data1[3] = data1[9];
		data1[9] = data1[13];
		data1[13] = data1[7];
		data1[7] = tmp;

		tmp = data1[4];
		data1[4] = data1[6];
		data1[6] = data1[10];
		data1[10] = data1[8];
		data1[8] = tmp;
        if(pswitch){
            printf("ROUND %02d: ", i);
            pstate3(data1, 16);
        }
	}

	//Set ciphertext
	cipher[0] = (data1[1]<<4) ^ data1[2];
	cipher[1] = (data1[11]<<4) ^ data1[6];
	cipher[2] = (data1[3]<<4) ^ data1[0];
	cipher[3] = (data1[9]<<4) ^ data1[4];
	cipher[4] = (data1[7]<<4) ^ data1[10];
	cipher[5] = (data1[13]<<4) ^ data1[14];
	cipher[6] = (data1[5]<<4) ^ data1[8];
	cipher[7] = (data1[15]<<4) ^ data1[12];
#ifdef _PRINT
	printf("Twine output: ");
	pstate(cipher, 8);
#endif
}

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x40(%rsp)
movq %rsi, 0x38(%rsp)
movq 0x40(%rsp), %rax
movzbl (%rax), %eax
sarl $0x4, %eax
movb %al, 0x20(%rsp)
movq 0x40(%rsp), %rax
movzbl (%rax), %eax
andl $0xf, %eax
movb %al, 0x21(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x1(%rax), %eax
sarl $0x4, %eax
movb %al, 0x22(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x1(%rax), %eax
andl $0xf, %eax
movb %al, 0x23(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x2(%rax), %eax
sarl $0x4, %eax
movb %al, 0x24(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x2(%rax), %eax
andl $0xf, %eax
movb %al, 0x25(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x3(%rax), %eax
sarl $0x4, %eax
movb %al, 0x26(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x3(%rax), %eax
andl $0xf, %eax
movb %al, 0x27(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x4(%rax), %eax
sarl $0x4, %eax
movb %al, 0x28(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x4(%rax), %eax
andl $0xf, %eax
movb %al, 0x29(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x5(%rax), %eax
sarl $0x4, %eax
movb %al, 0x2a(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x5(%rax), %eax
andl $0xf, %eax
movb %al, 0x2b(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x6(%rax), %eax
sarl $0x4, %eax
movb %al, 0x2c(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x6(%rax), %eax
andl $0xf, %eax
movb %al, 0x2d(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x7(%rax), %eax
sarl $0x4, %eax
movb %al, 0x2e(%rsp)
movq 0x40(%rsp), %rax
movzbl 0x7(%rax), %eax
andl $0xf, %eax
movb %al, 0x2f(%rsp)
movb $0x0, 0x37(%rsp)
movzbl 0x20(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x40dc(%rip), %rcx      # 0x5fd0
movzbl (%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x40ec(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x21(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x21(%rsp)
movzbl 0x22(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x40aa(%rip), %rcx      # 0x5fd0
movzbl 0x1(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x40b9(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x23(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x23(%rsp)
movzbl 0x24(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x4077(%rip), %rcx      # 0x5fd0
movzbl 0x2(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x4086(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x25(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x25(%rsp)
movzbl 0x26(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x4044(%rip), %rcx      # 0x5fd0
movzbl 0x3(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x4053(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x27(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x27(%rsp)
movzbl 0x28(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x4011(%rip), %rcx      # 0x5fd0
movzbl 0x4(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x4020(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x29(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x29(%rsp)
movzbl 0x2a(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3fde(%rip), %rcx      # 0x5fd0
movzbl 0x5(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3fed(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2b(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2b(%rsp)
movzbl 0x2c(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3fab(%rip), %rcx      # 0x5fd0
movzbl 0x6(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3fba(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2d(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2d(%rsp)
movzbl 0x2e(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3f78(%rip), %rcx      # 0x5fd0
movzbl 0x7(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3f87(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2f(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2f(%rsp)
movq 0x3f59(%rip), %rax      # 0x5fd8
cmpl $0x0, (%rax)
je 0x2127
movb 0x21(%rsp), %al
movb %al, (%rsp)
movb 0x22(%rsp), %al
movb %al, 0x1(%rsp)
movb 0x2b(%rsp), %al
movb %al, 0x2(%rsp)
movb 0x26(%rsp), %al
movb %al, 0x3(%rsp)
movb 0x23(%rsp), %al
movb %al, 0x4(%rsp)
movb 0x20(%rsp), %al
movb %al, 0x5(%rsp)
movb 0x29(%rsp), %al
movb %al, 0x6(%rsp)
movb 0x24(%rsp), %al
movb %al, 0x7(%rsp)
movb 0x27(%rsp), %al
movb %al, 0x8(%rsp)
movb 0x2a(%rsp), %al
movb %al, 0x9(%rsp)
movb 0x2d(%rsp), %al
movb %al, 0xa(%rsp)
movb 0x2e(%rsp), %al
movb %al, 0xb(%rsp)
movb 0x25(%rsp), %al
movb %al, 0xc(%rsp)
movb 0x28(%rsp), %al
movb %al, 0xd(%rsp)
movb 0x2f(%rsp), %al
movb %al, 0xe(%rsp)
movb 0x2c(%rsp), %al
movb %al, 0xf(%rsp)
movzbl 0x37(%rsp), %esi
leaq 0x1f55(%rip), %rdi      # 0x4068
movb $0x0, %al
callq 0x1030
movq %rsp, %rdi
movl $0x10, %esi
callq 0x10c0
movb 0x37(%rsp), %al
addb $0x1, %al
movb %al, 0x37(%rsp)
movzbl 0x21(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3e8c(%rip), %rcx      # 0x5fd0
movzbl (%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3e9c(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x22(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x22(%rsp)
movzbl 0x2b(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3e5a(%rip), %rcx      # 0x5fd0
movzbl 0x1(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3e69(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x26(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x26(%rsp)
movzbl 0x23(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3e27(%rip), %rcx      # 0x5fd0
movzbl 0x2(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3e36(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x20(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x20(%rsp)
movzbl 0x29(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3df4(%rip), %rcx      # 0x5fd0
movzbl 0x3(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3e03(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x24(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x24(%rsp)
movzbl 0x27(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3dc1(%rip), %rcx      # 0x5fd0
movzbl 0x4(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3dd0(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2a(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2a(%rsp)
movzbl 0x2d(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3d8e(%rip), %rcx      # 0x5fd0
movzbl 0x5(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3d9d(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2e(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2e(%rsp)
movzbl 0x25(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3d5b(%rip), %rcx      # 0x5fd0
movzbl 0x6(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3d6a(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x28(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x28(%rsp)
movzbl 0x2f(%rsp), %eax
movzbl 0x37(%rsp), %ecx
movl %ecx, %edx
movq 0x3d28(%rip), %rcx      # 0x5fd0
movzbl 0x7(%rcx,%rdx,8), %ecx
xorl %ecx, %eax
movslq %eax, %rcx
movq 0x3d37(%rip), %rax      # 0x5ff0
movzbl (%rax,%rcx), %ecx
movzbl 0x2c(%rsp), %eax
xorl %ecx, %eax
movb %al, 0x2c(%rsp)
movzbl 0x37(%rsp), %eax
cmpl $0x23, %eax
jne 0x22d7
jmp 0x23b6
movb 0x20(%rsp), %al
movb %al, 0x1f(%rsp)
movb 0x22(%rsp), %al
movb %al, 0x20(%rsp)
movb 0x2e(%rsp), %al
movb %al, 0x22(%rsp)
movb 0x2c(%rsp), %al
movb %al, 0x2e(%rsp)
movb 0x1f(%rsp), %al
movb %al, 0x2c(%rsp)
movb 0x21(%rsp), %al
movb %al, 0x1f(%rsp)
movb 0x2b(%rsp), %al
movb %al, 0x21(%rsp)
movb 0x2f(%rsp), %al
movb %al, 0x2b(%rsp)
movb 0x25(%rsp), %al
movb %al, 0x2f(%rsp)
movb 0x1f(%rsp), %al
movb %al, 0x25(%rsp)
movb 0x23(%rsp), %al
movb %al, 0x1f(%rsp)
movb 0x29(%rsp), %al
movb %al, 0x23(%rsp)
movb 0x2d(%rsp), %al
movb %al, 0x29(%rsp)
movb 0x27(%rsp), %al
movb %al, 0x2d(%rsp)
movb 0x1f(%rsp), %al
movb %al, 0x27(%rsp)
movb 0x24(%rsp), %al
movb %al, 0x1f(%rsp)
movb 0x26(%rsp), %al
movb %al, 0x24(%rsp)
movb 0x2a(%rsp), %al
movb %al, 0x26(%rsp)
movb 0x28(%rsp), %al
movb %al, 0x2a(%rsp)
movb 0x1f(%rsp), %al
movb %al, 0x28(%rsp)
movq 0x3c5a(%rip), %rax      # 0x5fd8
cmpl $0x0, (%rax)
je 0x23a5
movzbl 0x37(%rsp), %esi
leaq 0x1cd9(%rip), %rdi      # 0x4068
movb $0x0, %al
callq 0x1030
leaq 0x20(%rsp), %rdi
movl $0x10, %esi
callq 0x10c0
jmp 0x23a7
movb 0x37(%rsp), %al
addb $0x1, %al
movb %al, 0x37(%rsp)
jmp 0x1ee1
movzbl 0x21(%rsp), %eax
shll $0x4, %eax
movzbl 0x22(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, (%rax)
movzbl 0x2b(%rsp), %eax
shll $0x4, %eax
movzbl 0x26(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x1(%rax)
movzbl 0x23(%rsp), %eax
shll $0x4, %eax
movzbl 0x20(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x2(%rax)
movzbl 0x29(%rsp), %eax
shll $0x4, %eax
movzbl 0x24(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x3(%rax)
movzbl 0x27(%rsp), %eax
shll $0x4, %eax
movzbl 0x2a(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x4(%rax)
movzbl 0x2d(%rsp), %eax
shll $0x4, %eax
movzbl 0x2e(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x5(%rax)
movzbl 0x25(%rsp), %eax
shll $0x4, %eax
movzbl 0x28(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x6(%rax)
movzbl 0x2f(%rsp), %eax
shll $0x4, %eax
movzbl 0x2c(%rsp), %ecx
xorl %ecx, %eax
movb %al, %cl
movq 0x38(%rsp), %rax
movb %cl, 0x7(%rax)
addq $0x48, %rsp
retq
nopw %cs:(%rax,%rax)