// File: /workspace/github_c_makefile_star2_O2/mjosaarinen[P]brutus/crypto_aead/twine80n6t4clocv2/ref/twine.c
// Function: Keyschedule128
void Keyschedule128(const uint8 sk[128/4])
{
	int	i;
	uint8	tmp[128/4];
	uint8	wk[5];

	//Copy the key 
#if 1
	for(i=0; i<(128/4); i+=2)
	{
		tmp[i] = sk[i/2] >> 4;
		tmp[i+1] = sk[i/2] & 0x0f;
	}
#else
	tmp[0] = sk[0] >> 4;
	tmp[1] = sk[0] & 0x0f;
	tmp[2] = sk[1] >> 4;
	tmp[3] = sk[1] & 0x0f;
	tmp[4] = sk[2] >> 4;
	tmp[5] = sk[2] & 0x0f;
	tmp[6] = sk[3] >> 4;
	tmp[7] = sk[3] & 0x0f;
	tmp[8] = sk[4] >> 4;
	tmp[9] = sk[4] & 0x0f;
	tmp[10] = sk[5] >> 4;
	tmp[11] = sk[5] & 0x0f;
	tmp[12] = sk[6] >> 4;
	tmp[13] = sk[6] & 0x0f;
	tmp[14] = sk[7] >> 4;
	tmp[15] = sk[7] & 0x0f;
	tmp[16] = sk[8] >> 4;
	tmp[17] = sk[8] & 0x0f;
	tmp[18] = sk[9] >> 4;
	tmp[19] = sk[9] & 0x0f;
	tmp[20] = sk[10] >> 4;
	tmp[21] = sk[10] & 0x0f;
	tmp[22] = sk[11] >> 4;
	tmp[23] = sk[11] & 0x0f;
	tmp[24] = sk[12] >> 4;
	tmp[25] = sk[12] & 0x0f;
	tmp[26] = sk[13] >> 4;
	tmp[27] = sk[13] & 0x0f;
	tmp[28] = sk[14] >> 4;
	tmp[29] = sk[14] & 0x0f;
	tmp[30] = sk[15] >> 4;
	tmp[31] = sk[15] & 0x0f;
#endif
        
	//Extended key (ek) generation
	for(i=0; ; i+=2)
	{
		//ek for two rounds
		ek[i][0] = tmp[2];
		ek[i][1] = tmp[3];
		ek[i][2] = tmp[12];
		ek[i][3] = tmp[15];
		ek[i][4] = tmp[17];
		ek[i][5] = tmp[18];
		ek[i][6] = tmp[28];
		ek[i][7] = tmp[31];

		ek[i+1][0] = tmp[6];
		ek[i+1][1] = tmp[7] ^ CON_H[i];
		ek[i+1][2] = tmp[16];
		ek[i+1][3] = tmp[19] ^ CON_L[i];
		ek[i+1][4] = tmp[21];
		ek[i+1][5] = tmp[22];
		ek[i+1][6] = tmp[1] ^ S[tmp[0]];
		ek[i+1][7] = tmp[0];
	
		//to the last two rounds
		if(i == (ROUND-2))
			break;

		//rotations for two rounds 
		wk[3] = tmp[4] ^ S[tmp[16]];
		wk[0] = tmp[5] ^ S[wk[3]];
		wk[1] = tmp[6];
		wk[2] = tmp[7] ^ CON_H[i];

		tmp[4] = tmp[12];
		tmp[5] = tmp[13];
		tmp[6] = tmp[14];
		tmp[7] = tmp[15];

		tmp[12] = tmp[20];
		tmp[13] = tmp[21];
		tmp[14] = tmp[22];
		tmp[15] = tmp[23] ^ S[tmp[30]] ^ CON_L[i+1];

		wk[4] = tmp[20];
		tmp[20] = tmp[28];
		tmp[21] = tmp[29];
		tmp[22] = tmp[30];
		tmp[23] = tmp[31];

		tmp[28] = wk[0];
		tmp[29] = wk[1];
		tmp[30] = wk[2];
		tmp[31] = wk[3];


		wk[3] = tmp[0];
		wk[0] = ek[i+1][6];
		wk[1] = tmp[2];
		wk[2] = tmp[3];

		tmp[0] = tmp[8] ^ S[wk[4]];
		tmp[1] = tmp[9];
		tmp[2] = tmp[10];
		tmp[3] = tmp[11] ^ CON_H[i+1];

		tmp[8] = tmp[16];
		tmp[9] = tmp[17];
		tmp[10] = tmp[18];
		tmp[11] = tmp[19] ^ CON_L[i];

		tmp[16] = tmp[24];
		tmp[17] = tmp[25];
		tmp[18] = tmp[26];
		tmp[19] = tmp[27] ^ S[wk[2]];

		tmp[24] = wk[0];
		tmp[25] = wk[1];
		tmp[26] = wk[2];
		tmp[27] = wk[3];
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
xorl %eax, %eax
cmpq $0x20, %rax
jae 0x20f8
movb (%rdi), %cl
movl %ecx, %edx
shrb $0x4, %dl
movb %dl, -0x28(%rsp,%rax)
andb $0xf, %cl
movb %cl, -0x27(%rsp,%rax)
addq $0x2, %rax
incq %rdi
jmp 0x20d7
movb -0x26(%rsp), %cl
movb -0x25(%rsp), %al
movb %al, -0x41(%rsp)
movb -0x1c(%rsp), %al
movb %al, -0x45(%rsp)
movb -0x19(%rsp), %dl
movb -0x17(%rsp), %al
movb %al, -0x46(%rsp)
movb -0x16(%rsp), %r9b
movb -0xc(%rsp), %sil
movb %sil, -0x42(%rsp)
movb -0x9(%rsp), %sil
movb %sil, -0x43(%rsp)
movb -0x22(%rsp), %r15b
movb -0x21(%rsp), %sil
movb %sil, -0x35(%rsp)
movb -0x18(%rsp), %r10b
movb -0x15(%rsp), %r11b
movb -0x13(%rsp), %r8b
movb -0x12(%rsp), %r12b
movb -0x28(%rsp), %sil
movb %sil, -0x44(%rsp)
movb -0x27(%rsp), %bpl
movb -0x24(%rsp), %sil
movb %sil, -0x48(%rsp)
movabsq $0x1, %rbx
movb -0x23(%rsp), %sil
movb %sil, -0x40(%rsp)
movb -0x1b(%rsp), %al
movb %al, -0x3b(%rsp)
movb -0x1a(%rsp), %sil
movb %sil, -0x47(%rsp)
movb -0x14(%rsp), %sil
movb %sil, -0x36(%rsp)
movb -0x11(%rsp), %sil
movb %sil, -0x3e(%rsp)
movb -0xa(%rsp), %sil
movb -0xb(%rsp), %al
movb %al, -0x3a(%rsp)
movb -0x20(%rsp), %dil
movb %dil, -0x3f(%rsp)
movb -0x1f(%rsp), %dil
movb %dil, -0x39(%rsp)
movb -0x1e(%rsp), %dil
movb %dil, -0x37(%rsp)
movb -0x1d(%rsp), %dil
movb %dil, -0x3c(%rsp)
movb -0x10(%rsp), %dil
movb -0xf(%rsp), %r14b
movb %r14b, -0x38(%rsp)
movb -0xe(%rsp), %r14b
movb %r14b, -0x34(%rsp)
movb -0xd(%rsp), %r14b
movb %r14b, -0x3d(%rsp)
movb %dil, -0x2d(%rsp)
movl %ebp, %edi
movl %esi, %eax
movb %cl, -0x2a(%rsp)
movq 0x2dbd(%rip), %r14      # 0x4fd0
movb %cl, -0x8(%r14,%rbx,8)
movb -0x41(%rsp), %cl
movb %cl, -0x7(%r14,%rbx,8)
movb -0x45(%rsp), %cl
movb %cl, -0x6(%r14,%rbx,8)
movb %dl, -0x2b(%rsp)
movb %dl, -0x5(%r14,%rbx,8)
movb -0x46(%rsp), %cl
movb %cl, -0x4(%r14,%rbx,8)
movb %r9b, -0x29(%rsp)
movb %r9b, -0x3(%r14,%rbx,8)
movb -0x42(%rsp), %cl
movb %cl, -0x2(%r14,%rbx,8)
movb -0x43(%rsp), %cl
movb %cl, -0x1(%r14,%rbx,8)
movb %r15b, (%r14,%rbx,8)
movb -0x35(%rsp), %sil
movq 0x2d90(%rip), %rcx      # 0x4ff8
xorb -0x1(%rcx,%rbx), %sil
movb %sil, 0x1(%r14,%rbx,8)
movl %r10d, %edx
movb %r10b, 0x2(%r14,%rbx,8)
movq 0x2d3f(%rip), %rcx      # 0x4fc0
xorb -0x1(%rcx,%rbx), %r11b
movb %r11b, 0x3(%r14,%rbx,8)
movb %r8b, 0x4(%r14,%rbx,8)
movb %r12b, 0x5(%r14,%rbx,8)
movzbl -0x44(%rsp), %ecx
movq 0x2d4f(%rip), %r9       # 0x4ff0
xorb (%r9,%rcx), %dil
movb %dil, 0x6(%r14,%rbx,8)
movb %cl, 0x7(%r14,%rbx,8)
movb -0x3b(%rsp), %r14b
movb -0x47(%rsp), %r9b
movb -0x36(%rsp), %bpl
movb -0x3a(%rsp), %cl
movb %cl, -0x2e(%rsp)
movb -0x39(%rsp), %cl
movb %cl, -0x2c(%rsp)
movb -0x37(%rsp), %cl
movb -0x38(%rsp), %r10b
movb -0x34(%rsp), %r13b
movb %r13b, -0x2f(%rsp)
cmpq $0x23, %rbx
je 0x242d
movb %al, -0x33(%rsp)
movb %cl, -0x30(%rsp)
movzbl %al, %ecx
movb %r10b, -0x31(%rsp)
movq 0x2cee(%rip), %r10      # 0x4ff0
movb %r9b, -0x32(%rsp)
movq %r10, %r9
movb (%r10,%rcx), %cl
movq 0x2cab(%rip), %r10      # 0x4fc0
xorb (%r10,%rbx), %cl
xorb -0x3e(%rsp), %cl
movb %r8b, -0x3b(%rsp)
movb -0x48(%rsp), %r8b
movb %r15b, -0x47(%rsp)
movzbl %dl, %r15d
xorb (%r9,%r15), %r8b
movb %r12b, -0x48(%rsp)
movb -0x40(%rsp), %r12b
movzbl %r8b, %r15d
xorb (%r9,%r15), %r12b
movb -0x3f(%rsp), %r15b
movzbl %bpl, %r13d
xorb (%r9,%r13), %r15b
movb -0x3d(%rsp), %r13b
movb -0x41(%rsp), %r10b
movzbl %r10b, %eax
xorb (%r9,%rax), %r13b
movb -0x44(%rsp), %al
movb %al, -0x3d(%rsp)
movb %r10b, -0x34(%rsp)
movb -0x3c(%rsp), %al
movb %r11b, -0x3c(%rsp)
movb -0x43(%rsp), %r9b
movb %r9b, -0x3e(%rsp)
movb -0x42(%rsp), %r9b
movb %r9b, -0x36(%rsp)
movl %r13d, %r11d
movb -0x2b(%rsp), %r9b
movb %r9b, -0x35(%rsp)
movq 0x2c55(%rip), %r10      # 0x4ff8
xorb (%r10,%rbx), %al
movb %al, -0x41(%rsp)
addq $0x2, %rbx
movb -0x2a(%rsp), %al
movb %al, -0x38(%rsp)
movb -0x29(%rsp), %al
movb %al, -0x37(%rsp)
movb -0x46(%rsp), %al
movb %al, -0x39(%rsp)
movb %r15b, -0x44(%rsp)
movb %dl, -0x3f(%rsp)
movb -0x47(%rsp), %al
movb %al, -0x3a(%rsp)
movb -0x48(%rsp), %al
movb %al, -0x47(%rsp)
movb %r12b, -0x42(%rsp)
movb %r14b, -0x40(%rsp)
movb %r8b, -0x43(%rsp)
movb -0x45(%rsp), %al
movb %al, -0x48(%rsp)
movb -0x33(%rsp), %r12b
movb -0x2e(%rsp), %r8b
movb -0x2d(%rsp), %r10b
movb -0x32(%rsp), %r15b
movb -0x2f(%rsp), %r9b
movb -0x31(%rsp), %al
movb %al, -0x46(%rsp)
movl %ecx, %edx
movb %bpl, -0x45(%rsp)
movb -0x30(%rsp), %cl
movb -0x2c(%rsp), %bpl
jmp 0x21ff
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq