user: What is the c source code of the assembly code below?

```asm
<mult_cpx_matrix_h>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,-0x1c(%rbp)
  mov    %r8d,%edx
  mov    %r9d,%eax
  mov    %dx,-0x20(%rbp)
  mov    %ax,-0x24(%rbp)
  cmpw   $0x0,-0x24(%rbp)
  je     L15
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    0x8(%rax),%rsi
  mov    -0x10(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rsi
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rsi
  mov    -0x10(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    0x8(%rax),%rsi
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rdx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rsi
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rdx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rsi
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  jmp    L18
L15:
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  mov    0x8(%rax),%rsi
  mov    -0x8(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rsi
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rsi
  mov    -0x8(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  mov    0x8(%rax),%rsi
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rsi
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
  movzwl -0x20(%rbp),%edi
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rdx
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rsi
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    0x8(%rax),%rax
  mov    -0x1c(%rbp),%ecx
  mov    $0x1,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <mult_cpx_vector_h@plt>
L18:
  nop
  leave
  ret
```

assistant: ```c
int mult_cpx_matrix_h(short *x1[2][2], short *x2[2][2], short *y[2][2], unsigned int N, unsigned short output_shift, short hermitian) {
  if (hermitian) {
    mult_cpx_vector_h(x2[0][0], x1[0][0], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][1], x1[0][1], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][0], x1[1][0], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[0][1], x1[1][1], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][0], x1[0][0], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][1], x1[0][1], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][0], x1[1][0], y[1][1], N, output_shift, 1);
    mult_cpx_vector_h(x2[1][1], x1[1][1], y[1][1], N, output_shift, 1);
  } else {
    mult_cpx_vector_h(x1[0][0], x2[0][0], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][1], x2[0][1], y[0][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][0], x2[1][0], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[0][1], x2[1][1], y[0][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][0], x2[0][0], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][1], x2[0][1], y[1][0], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][0], x2[1][0], y[1][1], N, output_shift, 1);
    mult_cpx_vector_h(x1[1][1], x2[1][1], y[1][1], N, output_shift, 1);
  }
}
```