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

```asm
<mult_polys>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %rdi,%r13
  add    $0x8,%rdi
  push   %r12
  mov    %r13,%rcx
  mov    %rdx,%r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0xd8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  xor    %eax,%eax
  movq   $0x0,-0x8(%rdi)
  lea    0x20(%rsp),%rbp
  movq   $0x0,0x90(%rdi)
  and    $0xfffffffffffffff8,%rdi
  mov    %rbp,%r14
  sub    %rdi,%rcx
  add    $0xa0,%ecx
  shr    $0x3,%ecx
  rep stos %rax,%es:(%rdi)
  lea    0x70(%rsp),%rax
  movq   $0x0,0x8(%rsp)
  mov    %rax,0x18(%rsp)
  nopl   0x0(%rax)
L53:
  mov    0x8(%rsp),%rax
  pxor   %xmm0,%xmm0
  xor    %r15d,%r15d
  mov    %eax,0x10(%rsp)
  mov    %eax,0x14(%rsp)
  mov    0x18(%rsp),%rax
  movaps %xmm0,(%rax)
  movaps %xmm0,0x10(%rax)
  movaps %xmm0,0x20(%rax)
  movaps %xmm0,0x30(%rax)
  movaps %xmm0,0x40(%rax)
  nopl   0x0(%rax)
L5:
  mov    (%r12,%r15,1),%edi
  mov    (%rbx),%esi
  call   <gmult@plt>
  mov    %eax,0x0(%rbp,%r15,1)
  add    $0x4,%r15
  cmp    $0x50,%r15
  jne    L5
  movdqu 0x90(%r14),%xmm1
  mov    $0x28,%ecx
  sub    0x10(%rsp),%ecx
  mov    %ecx,%eax
  movaps %xmm1,0xb0(%rsp)
  shr    $0x2,%eax
  movdqu 0x80(%r14),%xmm2
  movaps %xmm2,0xa0(%rsp)
  movdqu 0x70(%r14),%xmm3
  movaps %xmm3,0x90(%rsp)
  movdqu 0x60(%r14),%xmm4
  movaps %xmm4,0x80(%rsp)
  movdqu 0x50(%r14),%xmm5
  movaps %xmm5,0x70(%rsp)
  cmp    $0x5,%eax
  je     L1
  movdqu 0x40(%r14),%xmm6
  movaps %xmm6,0x60(%rsp)
  cmp    $0x6,%eax
  je     L1
  movdqu 0x30(%r14),%xmm7
  movaps %xmm7,0x50(%rsp)
  cmp    $0x7,%eax
  je     L1
  movdqu 0x20(%r14),%xmm7
  movaps %xmm7,0x40(%rsp)
  cmp    $0x8,%eax
  je     L1
  movdqu 0x10(%r14),%xmm6
  movaps %xmm6,0x30(%rsp)
  cmp    $0xa,%eax
  jne    L1
  movdqu (%r14),%xmm6
  movaps %xmm6,0x20(%rsp)
L1:
  mov    %ecx,%edx
  mov    $0x27,%eax
  and    $0xfffffffc,%edx
  sub    %edx,%eax
  cmp    %edx,%ecx
  je     L56
  mov    0x14(%rsp),%esi
  mov    %eax,%ecx
  cltq
  mov    0x8(%rsp),%rdi
  sub    %esi,%ecx
  movslq %ecx,%rcx
  mov    0x20(%rsp,%rcx,4),%ecx
  mov    %ecx,0x20(%rsp,%rax,4)
  mov    $0x26,%eax
  sub    %edx,%eax
  cmp    %edi,%eax
  jl     L56
  mov    %eax,%ecx
  cltq
  sub    %esi,%ecx
  movslq %ecx,%rcx
  mov    0x20(%rsp,%rcx,4),%ecx
  mov    %ecx,0x20(%rsp,%rax,4)
  mov    $0x25,%eax
  sub    %edx,%eax
  cmp    %edi,%eax
  jl     L56
  mov    %eax,%edx
  cltq
  sub    %esi,%edx
  movslq %edx,%rdx
  mov    0x20(%rsp,%rdx,4),%edx
  mov    %edx,0x20(%rsp,%rax,4)
L56:
  cmpq   $0x0,0x8(%rsp)
  je     L79
  mov    0x10(%rsp),%eax
  xor    %esi,%esi
  mov    %rbp,%rdi
  sub    $0x1,%eax
  lea    0x4(,%rax,4),%rdx
  call   <memset@plt>
L79:
  movdqu 0x0(%r13),%xmm0
  pxor   0x20(%rsp),%xmm0
  add    $0x4,%rbx
  sub    $0x4,%r14
  addq   $0x1,0x8(%rsp)
  movups %xmm0,0x0(%r13)
  movdqu 0x10(%r13),%xmm0
  pxor   0x30(%rsp),%xmm0
  movups %xmm0,0x10(%r13)
  movdqu 0x20(%r13),%xmm0
  pxor   0x40(%rsp),%xmm0
  movups %xmm0,0x20(%r13)
  movdqu 0x30(%r13),%xmm0
  pxor   0x50(%rsp),%xmm0
  movups %xmm0,0x30(%r13)
  movdqu 0x40(%r13),%xmm0
  pxor   0x60(%rsp),%xmm0
  movups %xmm0,0x40(%r13)
  movdqu 0x50(%r13),%xmm0
  pxor   0x70(%rsp),%xmm0
  movups %xmm0,0x50(%r13)
  movdqu 0x60(%r13),%xmm0
  pxor   0x80(%rsp),%xmm0
  movups %xmm0,0x60(%r13)
  movdqu 0x70(%r13),%xmm0
  pxor   0x90(%rsp),%xmm0
  movups %xmm0,0x70(%r13)
  movdqu 0x80(%r13),%xmm0
  pxor   0xa0(%rsp),%xmm0
  movups %xmm0,0x80(%r13)
  movdqu 0x90(%r13),%xmm0
  pxor   0xb0(%rsp),%xmm0
  movups %xmm0,0x90(%r13)
  mov    0x8(%rsp),%rax
  cmp    $0x14,%rax
  jne    L53
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L52
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L52:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void mult_polys(int dst[], int p1[], int p2[]) {
  int i, j;
  int tmp1[(10 * 2) * 2];
  for (i = 0; i < ((10 * 2) * 2); i++)
    dst[i] = 0;
  for (i = 0; i < (10 * 2); i++) {
    for (j = (10 * 2); j < ((10 * 2) * 2); j++)
      tmp1[j] = 0;
    for (j = 0; j < (10 * 2); j++)
      tmp1[j] = gmult(p2[j], p1[i]);
    for (j = ((10 * 2) * 2) - 1; j >= i; j--)
      tmp1[j] = tmp1[j - i];
    for (j = 0; j < i; j++)
      tmp1[j] = 0;
    for (j = 0; j < ((10 * 2) * 2); j++)
      dst[j] ^= tmp1[j];
  }
}
```