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

```asm
<mpeg4_cpu>:
  endbr64
  push   %r15
  lea    0x400(%rdx),%rax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x30,%rsp
  mov    %rdx,0x10(%rsp)
  mov    %rdi,0x20(%rsp)
  mov    %rsi,0x28(%rsp)
  movq   $0x0,0x8(%rsp)
  mov    %rax,-0x50(%rsp)
L28:
  mov    0x28(%rsp),%rax
  mov    0x20(%rsp),%rcx
  movq   $0xf,-0x58(%rsp)
  mov    $0x1,%esi
  movq   $0xe,-0x78(%rsp)
  add    $0x4,%rax
  movq   $0xd,-0x70(%rsp)
  movq   $0xc,-0x68(%rsp)
  movq   $0xb,-0x60(%rsp)
  movq   $0xa,-0x40(%rsp)
  movq   $0x9,-0x38(%rsp)
  movq   $0x8,-0x30(%rsp)
  movq   $0x7,-0x28(%rsp)
  movq   $0x6,-0x20(%rsp)
  movq   $0x5,-0x18(%rsp)
  movq   $0x4,-0x10(%rsp)
  movq   $0x3,-0x8(%rsp)
  movq   $0x2,(%rsp)
  movq   $0x0,-0x48(%rsp)
  mov    %rax,0x18(%rsp)
L20:
  mov    -0x48(%rsp),%rbx
  mov    0x18(%rsp),%rdx
  mov    (%rsp),%r14
  mov    -0x8(%rsp),%r13
  lea    (%rdx,%rbx,4),%rdx
  sub    %rsi,%rbx
  mov    -0x10(%rsp),%r12
  mov    -0x18(%rsp),%rbp
  mov    -0x28(%rsp),%r11
  mov    -0x30(%rsp),%r10
  mov    %rbx,%r15
  sub    %rsi,%r14
  mov    -0x20(%rsp),%rbx
  mov    -0x38(%rsp),%r9
  sub    %rsi,%r13
  sub    %rsi,%r12
  mov    -0x40(%rsp),%r8
  movss  (%rcx),%xmm0
  sub    %rsi,%rbp
  sub    %rsi,%r11
  mov    0x10(%rsp),%rax
  sub    %rsi,%rbx
  sub    %rsi,%r10
  sub    %rsi,%r9
  sub    %rsi,%r8
  nopl   0x0(%rax,%rax,1)
L10:
  movss  (%rdx,%r15,4),%xmm1
  mulss  (%rax),%xmm1
  add    $0x40,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx),%xmm1
  mulss  -0x3c(%rax),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%r14,4),%xmm1
  mulss  -0x38(%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%r13,4),%xmm0
  mulss  -0x34(%rax),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%r12,4),%xmm1
  mulss  -0x30(%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%rbp,4),%xmm0
  mulss  -0x2c(%rax),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%rbx,4),%xmm1
  mulss  -0x28(%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%r11,4),%xmm0
  mulss  -0x24(%rax),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%r10,4),%xmm1
  mulss  -0x20(%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%r9,4),%xmm0
  mulss  -0x1c(%rax),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%r8,4),%xmm1
  mulss  -0x18(%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  mov    -0x60(%rsp),%rdi
  sub    %rsi,%rdi
  movss  (%rdx,%rdi,4),%xmm0
  mulss  -0x14(%rax),%xmm0
  mov    -0x68(%rsp),%rdi
  sub    %rsi,%rdi
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%rdi,4),%xmm1
  mulss  -0x10(%rax),%xmm1
  mov    -0x70(%rsp),%rdi
  sub    %rsi,%rdi
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%rdi,4),%xmm0
  mulss  -0xc(%rax),%xmm0
  mov    -0x78(%rsp),%rdi
  sub    %rsi,%rdi
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  movss  (%rdx,%rdi,4),%xmm1
  mulss  -0x8(%rax),%xmm1
  mov    -0x58(%rsp),%rdi
  sub    %rsi,%rdi
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rcx)
  movss  (%rdx,%rdi,4),%xmm0
  mulss  -0x4(%rax),%xmm0
  add    $0x4040,%rdx
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rcx)
  cmp    %rax,-0x50(%rsp)
  jne    L10
  addq   $0x1,-0x48(%rsp)
  mov    -0x48(%rsp),%rax
  add    $0x1,%rsi
  add    $0x4,%rcx
  addq   $0x1,(%rsp)
  addq   $0x1,-0x8(%rsp)
  addq   $0x1,-0x10(%rsp)
  addq   $0x1,-0x18(%rsp)
  addq   $0x1,-0x20(%rsp)
  addq   $0x1,-0x28(%rsp)
  addq   $0x1,-0x30(%rsp)
  addq   $0x1,-0x38(%rsp)
  addq   $0x1,-0x40(%rsp)
  addq   $0x1,-0x60(%rsp)
  addq   $0x1,-0x68(%rsp)
  addq   $0x1,-0x70(%rsp)
  addq   $0x1,-0x78(%rsp)
  addq   $0x1,-0x58(%rsp)
  cmp    $0x1000,%rax
  jne    L20
  addq   $0x1010,0x8(%rsp)
  mov    0x8(%rsp),%rax
  addq   $0x4000,0x20(%rsp)
  addq   $0x4040,0x28(%rsp)
  cmp    $0x1010000,%rax
  jne    L28
  add    $0x30,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void mpeg4_cpu(float result[4096][4096], float prev[4096 + 16][4096 + 16], float curr[16 * 16]) {
  unsigned int i;
  unsigned int j;
  unsigned int k;
  unsigned int l;
  for (i = 0; i < 4096; ++i)
    for (j = 0; j < 4096; ++j)
      for (k = 0; k < 16; ++k)
        for (l = 0; l < 16; ++l)
          result[i][j] += prev[i + k][j + l] * curr[k * 16 + l];
}
```