// File: /workspace/github_cpp_makefile_star2_O1/DiplIngFrankGerlach[P]MST/./aes/aes.c
// Function: aes_decrypt
void aes_decrypt(const BYTE in[], BYTE out[], const WORD key[], int keysize)
{
	BYTE state[4][4];

	// Copy the input to the state.
	state[0][0] = in[0];
	state[1][0] = in[1];
	state[2][0] = in[2];
	state[3][0] = in[3];
	state[0][1] = in[4];
	state[1][1] = in[5];
	state[2][1] = in[6];
	state[3][1] = in[7];
	state[0][2] = in[8];
	state[1][2] = in[9];
	state[2][2] = in[10];
	state[3][2] = in[11];
	state[0][3] = in[12];
	state[1][3] = in[13];
	state[2][3] = in[14];
	state[3][3] = in[15];

	// Perform the necessary number of rounds. The round key is added first.
	// The last round does not perform the MixColumns step.
	if (keysize > 128) {
		if (keysize > 192) {
			AddRoundKey(state,&key[56]);
			InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[52]);InvMixColumns(state);
			InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[48]);InvMixColumns(state);
		}
		else {
			AddRoundKey(state,&key[48]);
		}
		InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[44]);InvMixColumns(state);
		InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[40]);InvMixColumns(state);
	}
	else {
		AddRoundKey(state,&key[40]);
	}
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[36]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[32]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[28]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[24]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[20]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[16]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[12]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[8]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[4]);InvMixColumns(state);
	InvShiftRows(state);InvSubBytes(state);AddRoundKey(state,&key[0]);

	// Copy the state to the output array.
	out[0] = state[0][0];
	out[1] = state[1][0];
	out[2] = state[2][0];
	out[3] = state[3][0];
	out[4] = state[0][1];
	out[5] = state[1][1];
	out[6] = state[2][1];
	out[7] = state[3][1];
	out[8] = state[0][2];
	out[9] = state[1][2];
	out[10] = state[2][2];
	out[11] = state[3][2];
	out[12] = state[0][3];
	out[13] = state[1][3];
	out[14] = state[2][3];
	out[15] = state[3][3];
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rdx, %r14
movq %rsi, %rbx
movb (%rdi), %al
movb %al, (%rsp)
movb 0x1(%rdi), %al
movb %al, 0x4(%rsp)
movb 0x2(%rdi), %al
movb %al, 0x8(%rsp)
movb 0x3(%rdi), %al
movb %al, 0xc(%rsp)
movb 0x4(%rdi), %al
movb %al, 0x1(%rsp)
movb 0x5(%rdi), %al
movb %al, 0x5(%rsp)
movb 0x6(%rdi), %al
movb %al, 0x9(%rsp)
movb 0x7(%rdi), %al
movb %al, 0xd(%rsp)
movb 0x8(%rdi), %al
movb %al, 0x2(%rsp)
movb 0x9(%rdi), %al
movb %al, 0x6(%rsp)
movb 0xa(%rdi), %al
movb %al, 0xa(%rsp)
movb 0xb(%rdi), %al
movb %al, 0xe(%rsp)
movb 0xc(%rdi), %al
movb %al, 0x3(%rsp)
movb 0xd(%rdi), %al
movb %al, 0x7(%rsp)
movb 0xe(%rdi), %al
movb %al, 0xb(%rsp)
movb 0xf(%rdi), %al
movb %al, 0xf(%rsp)
cmpl $0x81, %ecx
jl 0x1cd1
cmpl $0xc1, %ecx
jl 0x1ce5
leaq 0xe0(%r14), %rsi
movq %rsp, %r15
movq %r15, %rdi
callq 0x2ada
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0xd0(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0xc0(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
jmp 0x1cf4
leaq 0xa0(%r14), %rsi
movq %rsp, %rdi
callq 0x2ada
jmp 0x1da7
leaq 0xc0(%r14), %rsi
movq %rsp, %rdi
callq 0x2ada
movq %rsp, %r15
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xf(%r15), %al
movb 0xc(%r15), %cl
movb %cl, 0xf(%r15)
movzwl 0xd(%r15), %ecx
movw %cx, 0xc(%r15)
movb %al, 0xe(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0xb0(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0xa0(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movq %rsp, %r15
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xf(%r15), %al
movb 0xc(%r15), %cl
movb %cl, 0xf(%r15)
movzwl 0xd(%r15), %ecx
movw %cx, 0xc(%r15)
movb %al, 0xe(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x90(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x80(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x70(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x60(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x50(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x40(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x30(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x20(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
leaq 0x10(%r14), %rsi
movq %r15, %rdi
callq 0x2ada
movq %r15, %rdi
callq 0x303b
movb 0x7(%r15), %al
movb 0x6(%r15), %cl
movb %cl, 0x7(%r15)
movzwl 0x4(%r15), %ecx
movw %cx, 0x5(%r15)
movb %al, 0x4(%r15)
roll $0x10, 0x8(%r15)
movb 0xc(%r15), %al
movzwl 0xe(%r15), %ecx
movb %al, 0xf(%r15)
movb 0xd(%r15), %al
movb %al, 0xc(%r15)
movw %cx, 0xd(%r15)
movq %r15, %rdi
callq 0x2ca7
movq %r15, %rdi
movq %r14, %rsi
callq 0x2ada
movb (%r15), %al
movb %al, (%rbx)
movb 0x4(%r15), %al
movb %al, 0x1(%rbx)
movb 0x8(%r15), %al
movb %al, 0x2(%rbx)
movb 0xc(%r15), %al
movb %al, 0x3(%rbx)
movb 0x1(%r15), %al
movb %al, 0x4(%rbx)
movb 0x5(%r15), %al
movb %al, 0x5(%rbx)
movb 0x9(%r15), %al
movb %al, 0x6(%rbx)
movb 0xd(%r15), %al
movb %al, 0x7(%rbx)
movb 0x2(%r15), %al
movb %al, 0x8(%rbx)
movb 0x6(%r15), %al
movb %al, 0x9(%rbx)
movb 0xa(%r15), %al
movb %al, 0xa(%rbx)
movb 0xe(%r15), %al
movb %al, 0xb(%rbx)
movb 0x3(%r15), %al
movb %al, 0xc(%rbx)
movb 0x7(%r15), %al
movb %al, 0xd(%rbx)
movb 0xb(%r15), %al
movb %al, 0xe(%rbx)
movb 0xf(%r15), %al
movb %al, 0xf(%rbx)
addq $0x10, %rsp
popq %rbx
popq %r14
popq %r15
retq