user: Please show me the C implementation that matches the assembly code listed below:

```asm
<sha3_keccakf>:
  endbr64
  push   %r15
  mov    %rdi,%rax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x198,%rsp
  movdqa D2(%rip),%xmm0
  mov    %fs:0x28,%rdx
  mov    %rdx,0x188(%rsp)
  xor    %edx,%edx
  lea    0x60(%rsp),%r14
  lea    0xc0(%rsp),%rdx
  movaps %xmm0,0x60(%rsp)
  movdqa D22(%rip),%xmm0
  movaps %xmm0,0x70(%rsp)
  movdqa D113(%rip),%xmm0
  movaps %xmm0,0x80(%rsp)
  movdqa D48(%rip),%xmm0
  movaps %xmm0,0x90(%rsp)
  movdqa D171(%rip),%xmm0
  movaps %xmm0,0xa0(%rsp)
  movdqa D39(%rip),%xmm0
  movaps %xmm0,0xb0(%rsp)
  movdqa D77(%rip),%xmm0
  movaps %xmm0,0xc0(%rsp)
  movdqa D52(%rip),%xmm0
  movaps %xmm0,0xd0(%rsp)
  movdqa D4(%rip),%xmm0
  movaps %xmm0,0xe0(%rsp)
  movdqa D152(%rip),%xmm0
  movaps %xmm0,0xf0(%rsp)
  movdqa D101(%rip),%xmm0
  movaps %xmm0,0x100(%rsp)
  movdqa D89(%rip),%xmm0
  movaps %xmm0,0x110(%rsp)
  mov    0x14(%rdi),%esi
  mov    0x3c(%rdi),%ebp
  movdqa D74(%rip),%xmm0
  mov    (%rdi),%r9d
  mov    %esi,0x10(%rsp)
  mov    0x28(%rdi),%esi
  movaps %xmm0,0x120(%rsp)
  movdqa D85(%rip),%xmm0
  mov    0x50(%rdi),%r8d
  mov    %esi,0x24(%rsp)
  mov    0x4(%rdi),%esi
  movaps %xmm0,0x130(%rsp)
  movdqa D150(%rip),%xmm0
  mov    %esi,(%rsp)
  mov    0x18(%rdi),%esi
  movaps %xmm0,0x140(%rsp)
  movdqa D9(%rip),%xmm0
  mov    %esi,0x14(%rsp)
  mov    0x2c(%rdi),%esi
  movaps %xmm0,0x150(%rsp)
  movdqa D72(%rip),%xmm0
  mov    %esi,0x28(%rsp)
  mov    0x40(%rdi),%esi
  movaps %xmm0,0x160(%rsp)
  movdqa D130(%rip),%xmm0
  mov    %esi,0x38(%rsp)
  mov    0x54(%rdi),%esi
  movaps %xmm0,0x170(%rsp)
  mov    %esi,0x4c(%rsp)
  mov    0x8(%rdi),%esi
  mov    %esi,0x4(%rsp)
  mov    0x1c(%rdi),%esi
  mov    %esi,0x18(%rsp)
  mov    0x30(%rdi),%esi
  mov    0x58(%rdi),%r15d
  mov    0x60(%rdi),%ecx
  mov    %ebp,0x44(%rsp)
  mov    %esi,0x2c(%rsp)
  mov    0x44(%rdi),%esi
  mov    %esi,0x3c(%rsp)
  mov    0xc(%rdi),%esi
  mov    %esi,0x8(%rsp)
  mov    0x20(%rdi),%esi
  mov    %esi,0x1c(%rsp)
  mov    0x34(%rdi),%esi
  mov    %esi,0x30(%rsp)
  mov    0x48(%rdi),%esi
  mov    %esi,0x40(%rsp)
  mov    0x5c(%rdi),%esi
  mov    %esi,0x58(%rsp)
  mov    0x10(%rdi),%esi
  mov    %esi,0xc(%rsp)
  mov    0x24(%rdi),%esi
  mov    %esi,0x20(%rsp)
  mov    0x38(%rdi),%esi
  mov    %esi,0x34(%rsp)
  mov    0x4c(%rdi),%esi
  lea    0x120(%rsp),%rdi
  mov    %rdi,0x50(%rsp)
  mov    %esi,0x48(%rsp)
  mov    $0x40,%esi
  nopl   0x0(%rax)
L18:
  mov    (%rsp),%r13d
  mov    0xc(%rsp),%r11d
  mov    %ecx,0x5c(%rsp)
  xor    0x14(%rsp),%r13d
  xor    0x20(%rsp),%r11d
  xor    0x28(%rsp),%r13d
  xor    0x34(%rsp),%r11d
  xor    0x38(%rsp),%r13d
  xor    0x48(%rsp),%r11d
  xor    0x4c(%rsp),%r13d
  xor    %ecx,%r11d
  mov    $0x3f,%ecx
  mov    0x10(%rsp),%r10d
  mov    %r13d,%edi
  lea    0x0(%r13,%r13,1),%ebx
  mov    0x4(%rsp),%r12d
  mov    0x8(%rsp),%ebp
  sar    %cl,%edi
  xor    %r9d,%r10d
  xor    0x18(%rsp),%r12d
  xor    0x2c(%rsp),%r12d
  or     %edi,%ebx
  xor    0x3c(%rsp),%r12d
  xor    0x24(%rsp),%r10d
  xor    %r11d,%ebx
  xor    %r15d,%r12d
  xor    0x44(%rsp),%r10d
  xor    0x1c(%rsp),%ebp
  xor    %ebx,%r9d
  mov    %r12d,%edi
  xor    %r8d,%r10d
  xor    0x30(%rsp),%ebp
  mov    %r9d,(%rax)
  mov    0x10(%rsp),%r9d
  sar    %cl,%edi
  xor    0x40(%rsp),%ebp
  xor    0x58(%rsp),%ebp
  xor    %ebx,%r9d
  mov    %r9d,0x14(%rax)
  mov    0x24(%rsp),%r9d
  xor    %ebx,%r9d
  mov    %r9d,0x28(%rax)
  mov    0x44(%rsp),%r9d
  xor    %ebx,%r9d
  xor    %r8d,%ebx
  mov    (%rsp),%r8d
  mov    %r9d,0x3c(%rax)
  lea    (%r12,%r12,1),%r9d
  or     %edi,%r9d
  mov    %ebx,0x50(%rax)
  mov    %ebp,%edi
  xor    %r10d,%r9d
  xor    %r9d,%r8d
  mov    %r8d,0x4(%rax)
  mov    0x14(%rsp),%ebx
  xor    %r9d,%ebx
  sar    %cl,%edi
  mov    %ebx,0x18(%rax)
  mov    0x28(%rsp),%ebx
  xor    %r9d,%ebx
  mov    %ebx,0x2c(%rax)
  mov    0x38(%rsp),%ebx
  xor    %r9d,%ebx
  xor    0x4c(%rsp),%r9d
  mov    %r9d,0x54(%rax)
  lea    0x0(%rbp,%rbp,1),%r9d
  mov    %ebx,0x40(%rax)
  or     %edi,%r9d
  mov    0x4(%rsp),%ebx
  xor    %r13d,%r9d
  xor    %r9d,%ebx
  mov    %ebx,0x8(%rax)
  mov    0x18(%rsp),%ebx
  xor    %r9d,%ebx
  mov    %ebx,0x1c(%rax)
  mov    0x2c(%rsp),%ebx
  xor    %r9d,%ebx
  mov    %ebx,0x30(%rax)
  mov    0x3c(%rsp),%ebx
  xor    %r9d,%ebx
  xor    %r15d,%r9d
  mov    %r9d,0x58(%rax)
  lea    (%r11,%r11,1),%r9d
  sar    %cl,%r11d
  mov    %ebx,0x44(%rax)
  or     %r11d,%r9d
  mov    0x1c(%rsp),%ebx
  xor    %r12d,%r9d
  mov    0x8(%rsp),%r11d
  xor    %r9d,%ebx
  mov    %ebx,0x20(%rax)
  mov    0x30(%rsp),%ebx
  xor    %r9d,%r11d
  mov    %r11d,0xc(%rax)
  xor    %r9d,%ebx
  mov    %ebx,0x34(%rax)
  mov    0x40(%rsp),%ebx
  xor    %r9d,%ebx
  xor    0x58(%rsp),%r9d
  mov    %r9d,0x5c(%rax)
  lea    (%r10,%r10,1),%r9d
  sar    %cl,%r10d
  or     %r9d,%r10d
  mov    0xc(%rsp),%r9d
  mov    %ebx,0x48(%rax)
  xor    %ebp,%r10d
  xor    %r10d,%r9d
  mov    %r9d,0x10(%rax)
  mov    0x20(%rsp),%r9d
  xor    %r10d,%r9d
  mov    %r9d,0x24(%rax)
  mov    0x34(%rsp),%r9d
  xor    %r10d,%r9d
  mov    %r9d,0x38(%rax)
  mov    0x48(%rsp),%r9d
  mov    0x5c(%rsp),%ecx
  mov    0x50(%rsp),%rdi
  xor    %r10d,%r9d
  xor    %ecx,%r10d
  mov    %r9d,0x4c(%rax)
  xor    %r9d,%r9d
  mov    %r10d,0x60(%rax)
  xchg   %ax,%ax
L9:
  movslq (%rdi,%r9,1),%rcx
  mov    (%rdx,%r9,1),%ebp
  mov    %r8d,%r10d
  add    $0x4,%r9
  mov    %r10d,%r11d
  lea    (%rax,%rcx,4),%rbx
  mov    %esi,%ecx
  sub    %ebp,%ecx
  mov    (%rbx),%r8d
  sar    %cl,%r11d
  mov    %ebp,%ecx
  shl    %cl,%r10d
  or     %r10d,%r11d
  mov    %r11d,(%rbx)
  cmp    $0x60,%r9
  jne    L9
  mov    0x8(%rax),%r13d
  mov    0xc(%rax),%r8d
  mov    %rdi,0x50(%rsp)
  mov    0x4(%rax),%r12d
  mov    0x10(%rax),%ecx
  mov    %r13d,%r9d
  mov    %r8d,%ebx
  mov    0x1c(%rax),%r11d
  mov    0x20(%rax),%r10d
  not    %r9d
  not    %ebx
  mov    %ecx,%r15d
  and    %r8d,%r9d
  not    %r15d
  mov    %r11d,%ebp
  xor    %r12d,%r9d
  not    %ebp
  mov    %r9d,(%rsp)
  mov    %ebx,%r9d
  and    %ecx,%r9d
  mov    %r9d,%ebx
  mov    (%rax),%r9d
  xor    %r13d,%ebx
  and    %r15d,%r9d
  mov    %ebx,0x4(%rsp)
  mov    %r9d,%r15d
  mov    0x18(%rax),%r9d
  xor    %r8d,%r15d
  mov    (%rax),%r8d
  mov    %r9d,%ebx
  mov    %r15d,0x8(%rsp)
  not    %r8d
  not    %ebx
  and    %r12d,%r8d
  and    %r11d,%ebx
  not    %r12d
  xor    %ecx,%r8d
  mov    0x14(%rax),%ecx
  mov    %r8d,0xc(%rsp)
  mov    0x24(%rax),%r8d
  xor    %ecx,%ebx
  mov    %ebx,0x10(%rsp)
  mov    %ebp,%ebx
  and    %r10d,%ebx
  mov    %ebx,%ebp
  mov    %r10d,%ebx
  not    %ebx
  xor    %r9d,%ebp
  and    %r8d,%ebx
  mov    %ebp,0x14(%rsp)
  xor    %r11d,%ebx
  mov    %r8d,%r11d
  not    %r11d
  mov    %ebx,0x18(%rsp)
  and    %ecx,%r11d
  not    %ecx
  and    %r9d,%ecx
  mov    0x2c(%rax),%r9d
  xor    %r10d,%r11d
  mov    0x34(%rax),%r10d
  mov    %r11d,0x1c(%rsp)
  mov    0x30(%rax),%r11d
  xor    %r8d,%ecx
  mov    %r9d,%r15d
  mov    0x38(%rax),%r8d
  mov    %ecx,0x20(%rsp)
  not    %r15d
  mov    %r11d,%ebp
  mov    0x28(%rax),%ecx
  mov    %r15d,%ebx
  not    %ebp
  and    %r11d,%ebx
  mov    %ebx,%r15d
  mov    %ebp,%ebx
  and    %r10d,%ebx
  xor    %ecx,%r15d
  mov    %ebx,%ebp
  mov    %r10d,%ebx
  mov    %r15d,0x24(%rsp)
  not    %ebx
  xor    %r9d,%ebp
  and    %r8d,%ebx
  mov    %ebp,0x28(%rsp)
  xor    %r11d,%ebx
  mov    %r8d,%r11d
  not    %r11d
  mov    %ebx,0x2c(%rsp)
  and    %ecx,%r11d
  not    %ecx
  and    %r9d,%ecx
  xor    %r10d,%r11d
  xor    %r8d,%ecx
  mov    %r11d,0x30(%rsp)
  mov    %ecx,0x34(%rsp)
  mov    0x3c(%rax),%ecx
  mov    0x40(%rax),%r9d
  mov    0x44(%rax),%r11d
  mov    0x48(%rax),%r10d
  mov    0x4c(%rax),%r8d
  mov    %r9d,%r15d
  mov    %r11d,%ebp
  movd   (%rsp),%xmm3
  movd   0x8(%rsp),%xmm2
  not    %r15d
  not    %ebp
  movd   0x4(%rsp),%xmm1
  movd   0x18(%rsp),%xmm4
  mov    %r15d,%ebx
  movd   0x10(%rsp),%xmm5
  movd   0x28(%rsp),%xmm6
  and    %r11d,%ebx
  punpckldq %xmm2,%xmm1
  movd   0x20(%rsp),%xmm7
  mov    %ebx,%r15d
  mov    %ebp,%ebx
  and    %r10d,%ebx
  xor    %ecx,%r15d
  mov    %ebx,%ebp
  mov    %r10d,%ebx
  mov    %r15d,0x44(%rsp)
  not    %ebx
  xor    %r9d,%ebp
  and    %r8d,%ebx
  and    %r13d,%r12d
  xor    (%rax),%r12d
  xor    (%r14),%r12d
  xor    %r11d,%ebx
  mov    %r8d,%r11d
  movd   %r12d,%xmm0
  mov    %ebp,0x38(%rsp)
  not    %r11d
  punpckldq %xmm3,%xmm0
  mov    %ebx,0x3c(%rsp)
  mov    0x58(%rax),%ebx
  and    %ecx,%r11d
  not    %ecx
  punpcklqdq %xmm1,%xmm0
  movd   0x14(%rsp),%xmm1
  and    %r9d,%ecx
  xor    %r10d,%r11d
  mov    0x60(%rax),%r9d
  movups %xmm0,(%rax)
  mov    %ecx,%r10d
  mov    %r11d,0x40(%rsp)
  mov    0x5c(%rax),%r11d
  punpckldq %xmm4,%xmm1
  xor    %r8d,%r10d
  movd   0xc(%rsp),%xmm0
  mov    0x50(%rax),%ecx
  mov    %ebx,%ebp
  mov    %r10d,0x48(%rsp)
  mov    %r10d,%edi
  mov    0x54(%rax),%r10d
  mov    %r11d,%r15d
  not    %r15d
  punpckldq %xmm5,%xmm0
  not    %ebp
  add    $0x4,%r14
  mov    %r10d,%r8d
  and    %r9d,%r15d
  punpcklqdq %xmm1,%xmm0
  movd   0x24(%rsp),%xmm1
  not    %r8d
  xor    %ebx,%r15d
  movups %xmm0,0x10(%rax)
  movd   0x1c(%rsp),%xmm0
  and    %ebx,%r8d
  mov    %r9d,%ebx
  punpckldq %xmm6,%xmm1
  and    %r11d,%ebp
  not    %ebx
  xor    %ecx,%r8d
  punpckldq %xmm7,%xmm0
  xor    %r10d,%ebp
  and    %ecx,%ebx
  not    %ecx
  punpcklqdq %xmm1,%xmm0
  mov    %ebp,0x4c(%rsp)
  and    %r10d,%ecx
  movd   %edi,%xmm4
  movd   %ebp,%xmm7
  xor    %r11d,%ebx
  xor    %r9d,%ecx
  mov    %ebx,0x58(%rsp)
  movd   %ebx,%xmm6
  mov    %r12d,%r9d
  mov    %ecx,0x60(%rax)
  movups %xmm0,0x20(%rax)
  movd   0x34(%rsp),%xmm1
  movd   0x44(%rsp),%xmm2
  movd   0x2c(%rsp),%xmm0
  movd   0x30(%rsp),%xmm3
  punpckldq %xmm2,%xmm1
  movd   0x3c(%rsp),%xmm5
  punpckldq %xmm3,%xmm0
  punpcklqdq %xmm1,%xmm0
  movd   0x40(%rsp),%xmm1
  movups %xmm0,0x30(%rax)
  movd   0x38(%rsp),%xmm0
  punpckldq %xmm4,%xmm1
  punpckldq %xmm5,%xmm0
  punpcklqdq %xmm1,%xmm0
  movd   %r15d,%xmm1
  movups %xmm0,0x40(%rax)
  movd   %r8d,%xmm0
  punpckldq %xmm6,%xmm1
  punpckldq %xmm7,%xmm0
  punpcklqdq %xmm1,%xmm0
  movups %xmm0,0x50(%rax)
  cmp    %r14,%rdx
  jne    L18
  mov    0x188(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x198,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D2
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D22
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D113
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D48
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D171
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D39
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D77
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D52
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D4
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D152
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D101
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D89
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D74
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D85
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D150
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D9
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D72
type_infered: byte[16]
name: disassemble_data
arguments: data_tag: D130
type_infered: byte[16]

tool: {"D2": [0x01,0x00,0x00,0x00,0x82,0x80,0x00,0x00,0x8a,0x80,0x00,0x00,0x00,0x80,0x00,0x80]}

tool: {"D22": [0x8b,0x80,0x00,0x00,0x01,0x00,0x00,0x80,0x81,0x80,0x00,0x80,0x09,0x80,0x00,0x00]}

tool: {"D113": [0x8a,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x09,0x80,0x00,0x80,0x0a,0x00,0x00,0x80]}

tool: {"D48": [0x8b,0x80,0x00,0x80,0x8b,0x00,0x00,0x00,0x89,0x80,0x00,0x00,0x03,0x80,0x00,0x00]}

tool: {"D171": [0x02,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x0a,0x80,0x00,0x00,0x0a,0x00,0x00,0x80]}

tool: {"D39": [0x81,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x01,0x00,0x00,0x80,0x08,0x80,0x00,0x80]}

tool: {"D77": [0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00]}

tool: {"D52": [0x0f,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x24,0x00,0x00,0x00]}

tool: {"D4": [0x2d,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0e,0x00,0x00,0x00]}

tool: {"D152": [0x1b,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x08,0x00,0x00,0x00]}

tool: {"D101": [0x19,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x12,0x00,0x00,0x00]}

tool: {"D89": [0x27,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x2c,0x00,0x00,0x00]}

tool: {"D74": [0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00]}

tool: {"D85": [0x12,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x10,0x00,0x00,0x00]}

tool: {"D150": [0x08,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

tool: {"D9": [0x0f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00]}

tool: {"D72": [0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0e,0x00,0x00,0x00]}

tool: {"D130": [0x16,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

assistant: ```c
void sha3_keccakf(uint64_t st[25]) {
  const uint64_t keccakf_rndc[24] = {0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008};
  const int keccakf_rotc[24] = {1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44};
  const int keccakf_piln[24] = {10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1};
  int i, j, r;
  uint64_t t, bc[5];
  for (r = 0; r < 24; r++) {
    for (i = 0; i < 5; i++)
      bc[i] = st[i] ^ st[i + 5] ^ st[i + 10] ^ st[i + 15] ^ st[i + 20];
    for (i = 0; i < 5; i++) {
      t = bc[(i + 4) % 5] ^ (((bc[(i + 1) % 5]) << (1)) | ((bc[(i + 1) % 5]) >> (64 - (1))));
      for (j = 0; j < 25; j += 5)
        st[j + i] ^= t;
    }
    t = st[1];
    for (i = 0; i < 24; i++) {
      j = keccakf_piln[i];
      bc[0] = st[j];
      st[j] = (((t) << (keccakf_rotc[i])) | ((t) >> (64 - (keccakf_rotc[i]))));
      t = bc[0];
    }
    for (j = 0; j < 25; j += 5) {
      for (i = 0; i < 5; i++)
        bc[i] = st[j + i];
      for (i = 0; i < 5; i++)
        st[j + i] ^= (~bc[(i + 1) % 5]) & bc[(i + 2) % 5];
    }
    st[0] ^= keccakf_rndc[r];
  }
}
```