// File: DiplIngFrankGerlach[P]MST/./aes/aes.c
// Function: AddRoundKey
void AddRoundKey(BYTE state[][4], const WORD w[])
{
	BYTE subkey[4];

	// memcpy(subkey,&w[idx],4); // Not accurate for big endian machines
	// Subkey 1
	subkey[0] = w[0] >> 24;
	subkey[1] = w[0] >> 16;
	subkey[2] = w[0] >> 8;
	subkey[3] = w[0];
	state[0][0] ^= subkey[0];
	state[1][0] ^= subkey[1];
	state[2][0] ^= subkey[2];
	state[3][0] ^= subkey[3];
	// Subkey 2
	subkey[0] = w[1] >> 24;
	subkey[1] = w[1] >> 16;
	subkey[2] = w[1] >> 8;
	subkey[3] = w[1];
	state[0][1] ^= subkey[0];
	state[1][1] ^= subkey[1];
	state[2][1] ^= subkey[2];
	state[3][1] ^= subkey[3];
	// Subkey 3
	subkey[0] = w[2] >> 24;
	subkey[1] = w[2] >> 16;
	subkey[2] = w[2] >> 8;
	subkey[3] = w[2];
	state[0][2] ^= subkey[0];
	state[1][2] ^= subkey[1];
	state[2][2] ^= subkey[2];
	state[3][2] ^= subkey[3];
	// Subkey 4
	subkey[0] = w[3] >> 24;
	subkey[1] = w[3] >> 16;
	subkey[2] = w[3] >> 8;
	subkey[3] = w[3];
	state[0][3] ^= subkey[0];
	state[1][3] ^= subkey[1];
	state[2][3] ^= subkey[2];
	state[3][3] ^= subkey[3];
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
shrl $0x18, %eax
movb %al, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
shrl $0x10, %eax
movb %al, -0x13(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
shrl $0x8, %eax
movb %al, -0x12(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
movb %al, -0x11(%rbp)
movzbl -0x14(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl (%rax), %ecx
xorl %edx, %ecx
movb %cl, (%rax)
movzbl -0x13(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x4(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x4(%rax)
movzbl -0x12(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x8(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x8(%rax)
movzbl -0x11(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xc(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xc(%rax)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
shrl $0x18, %eax
movb %al, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
shrl $0x10, %eax
movb %al, -0x13(%rbp)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
shrl $0x8, %eax
movb %al, -0x12(%rbp)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movb %al, -0x11(%rbp)
movzbl -0x14(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x1(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x1(%rax)
movzbl -0x13(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x5(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x5(%rax)
movzbl -0x12(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x9(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x9(%rax)
movzbl -0x11(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xd(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xd(%rax)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
shrl $0x18, %eax
movb %al, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
shrl $0x10, %eax
movb %al, -0x13(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
shrl $0x8, %eax
movb %al, -0x12(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movb %al, -0x11(%rbp)
movzbl -0x14(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x2(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x2(%rax)
movzbl -0x13(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x6(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x6(%rax)
movzbl -0x12(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xa(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xa(%rax)
movzbl -0x11(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xe(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xe(%rax)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
shrl $0x18, %eax
movb %al, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
shrl $0x10, %eax
movb %al, -0x13(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
shrl $0x8, %eax
movb %al, -0x12(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movb %al, -0x11(%rbp)
movzbl -0x14(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x3(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x3(%rax)
movzbl -0x13(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0x7(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0x7(%rax)
movzbl -0x12(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xb(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xb(%rax)
movzbl -0x11(%rbp), %edx
movq -0x8(%rbp), %rax
movzbl 0xf(%rax), %ecx
xorl %edx, %ecx
movb %cl, 0xf(%rax)
popq %rbp
retq
nopl (%rax)