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

```asm
<round_f_inverse>:
  endbr64
  push   %r14
  lea    0x1c(%rdi),%r14
  push   %r13
  lea    0x18(%rdi),%r13
  push   %r12
  lea    0x10(%rdi),%r12
  push   %rbp
  mov    %rsi,%rbp
  mov    %r14,%rsi
  push   %rbx
  movdqu 0x10(%rdi),%xmm1
  mov    %rdi,%rbx
  movdqu (%rdi),%xmm3
  movdqa %xmm1,%xmm0
  pshufd $0xc6,%xmm1,%xmm2
  movups %xmm1,(%rdi)
  punpckhdq %xmm1,%xmm0
  pxor   %xmm3,%xmm2
  movd   %xmm0,%eax
  pshufd $0xff,%xmm1,%xmm0
  movd   %xmm0,%edx
  pshufd $0x55,%xmm1,%xmm0
  xor    %edx,%eax
  movd   %xmm0,%edx
  xor    %edx,%eax
  movd   %xmm1,%edx
  xor    %edx,%eax
  mov    %eax,%edx
  sar    $0x8,%eax
  shl    $0x8,%edx
  or     %eax,%edx
  movd   %edx,%xmm4
  pshufd $0x0,%xmm4,%xmm0
  pxor   %xmm2,%xmm0
  movups %xmm0,0x10(%rdi)
  mov    %r13,%rdi
  call   <speckey_inverse@plt>
  mov    0x7c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x1c(%rbx)
  mov    0x78(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x18(%rbx)
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <speckey_inverse@plt>
  mov    0x74(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x1c(%rbx)
  mov    0x70(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x18(%rbx)
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <speckey_inverse@plt>
  mov    0x6c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x1c(%rbx)
  mov    0x68(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x18(%rbx)
  mov    %r14,%rsi
  mov    %r13,%rdi
  lea    0x14(%rbx),%r13
  call   <speckey_inverse@plt>
  mov    0x64(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x1c(%rbx)
  mov    0x60(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x18(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x5c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x14(%rbx)
  mov    0x58(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x10(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x54(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x14(%rbx)
  mov    0x50(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x10(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x4c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x14(%rbx)
  mov    0x48(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x10(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  lea    0xc(%rbx),%r13
  lea    0x8(%rbx),%r12
  call   <speckey_inverse@plt>
  mov    0x44(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x14(%rbx)
  mov    0x40(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x10(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x3c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0xc(%rbx)
  mov    0x38(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x8(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x34(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0xc(%rbx)
  mov    0x30(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x8(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <speckey_inverse@plt>
  mov    0x2c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0xc(%rbx)
  mov    0x28(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x8(%rbx)
  mov    %r13,%rsi
  mov    %r12,%rdi
  lea    0x4(%rbx),%r12
  call   <speckey_inverse@plt>
  mov    0x24(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0xc(%rbx)
  mov    0x20(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x8(%rbx)
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <speckey_inverse@plt>
  mov    0x1c(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x4(%rbx)
  mov    0x18(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,(%rbx)
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <speckey_inverse@plt>
  mov    0x14(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x4(%rbx)
  mov    0x10(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,(%rbx)
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <speckey_inverse@plt>
  mov    0xc(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x4(%rbx)
  mov    0x8(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,(%rbx)
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <speckey_inverse@plt>
  mov    0x4(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,0x4(%rbx)
  mov    0x0(%rbp),%edi
  call   <READ_ROUND_KEY_WORD@plt>
  xor    %eax,(%rbx)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
void round_f_inverse(uint16_t *block, uint16_t *roundKeys) {
  uint16_t temp;
  temp = block[0];
  block[0] = block[4];
  block[4] = temp;
  temp = block[1];
  block[1] = block[5];
  block[5] = temp;
  temp = block[2];
  block[2] = block[6];
  block[6] = temp;
  temp = block[3];
  block[3] = block[7];
  block[7] = temp;
  temp = block[0] ^ block[1] ^ block[2] ^ block[3];
  temp = (((temp) << (8)) | ((temp) >> (16 - 8)));
  block[4] ^= block[2] ^ temp;
  block[5] ^= block[1] ^ temp;
  block[6] ^= block[0] ^ temp;
  block[7] ^= block[3] ^ temp;
  speckey_inverse(&block[6], &block[7]);
  block[7] ^= READ_ROUND_KEY_WORD(roundKeys[31]);
  block[6] ^= READ_ROUND_KEY_WORD(roundKeys[30]);
  speckey_inverse(&block[6], &block[7]);
  block[7] ^= READ_ROUND_KEY_WORD(roundKeys[29]);
  block[6] ^= READ_ROUND_KEY_WORD(roundKeys[28]);
  speckey_inverse(&block[6], &block[7]);
  block[7] ^= READ_ROUND_KEY_WORD(roundKeys[27]);
  block[6] ^= READ_ROUND_KEY_WORD(roundKeys[26]);
  speckey_inverse(&block[6], &block[7]);
  block[7] ^= READ_ROUND_KEY_WORD(roundKeys[25]);
  block[6] ^= READ_ROUND_KEY_WORD(roundKeys[24]);
  speckey_inverse(&block[4], &block[5]);
  block[5] ^= READ_ROUND_KEY_WORD(roundKeys[23]);
  block[4] ^= READ_ROUND_KEY_WORD(roundKeys[22]);
  speckey_inverse(&block[4], &block[5]);
  block[5] ^= READ_ROUND_KEY_WORD(roundKeys[21]);
  block[4] ^= READ_ROUND_KEY_WORD(roundKeys[20]);
  speckey_inverse(&block[4], &block[5]);
  block[5] ^= READ_ROUND_KEY_WORD(roundKeys[19]);
  block[4] ^= READ_ROUND_KEY_WORD(roundKeys[18]);
  speckey_inverse(&block[4], &block[5]);
  block[5] ^= READ_ROUND_KEY_WORD(roundKeys[17]);
  block[4] ^= READ_ROUND_KEY_WORD(roundKeys[16]);
  speckey_inverse(&block[2], &block[3]);
  block[3] ^= READ_ROUND_KEY_WORD(roundKeys[15]);
  block[2] ^= READ_ROUND_KEY_WORD(roundKeys[14]);
  speckey_inverse(&block[2], &block[3]);
  block[3] ^= READ_ROUND_KEY_WORD(roundKeys[13]);
  block[2] ^= READ_ROUND_KEY_WORD(roundKeys[12]);
  speckey_inverse(&block[2], &block[3]);
  block[3] ^= READ_ROUND_KEY_WORD(roundKeys[11]);
  block[2] ^= READ_ROUND_KEY_WORD(roundKeys[10]);
  speckey_inverse(&block[2], &block[3]);
  block[3] ^= READ_ROUND_KEY_WORD(roundKeys[9]);
  block[2] ^= READ_ROUND_KEY_WORD(roundKeys[8]);
  speckey_inverse(&block[0], &block[1]);
  block[1] ^= READ_ROUND_KEY_WORD(roundKeys[7]);
  block[0] ^= READ_ROUND_KEY_WORD(roundKeys[6]);
  speckey_inverse(&block[0], &block[1]);
  block[1] ^= READ_ROUND_KEY_WORD(roundKeys[5]);
  block[0] ^= READ_ROUND_KEY_WORD(roundKeys[4]);
  speckey_inverse(&block[0], &block[1]);
  block[1] ^= READ_ROUND_KEY_WORD(roundKeys[3]);
  block[0] ^= READ_ROUND_KEY_WORD(roundKeys[2]);
  speckey_inverse(&block[0], &block[1]);
  block[1] ^= READ_ROUND_KEY_WORD(roundKeys[1]);
  block[0] ^= READ_ROUND_KEY_WORD(roundKeys[0]);
}
```