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

```asm
<mainloop>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xd30,%rsp
  mov    %rdi,-0xd28(%rbp)
  mov    %rsi,-0xd30(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xd1c(%rbp)
  jmp    L109
L30:
  mov    -0xd1c(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xd28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0xd1c(%rbp),%eax
  mov    %edx,-0xb10(%rbp,%rax,4)
  addl   $0x1,-0xd1c(%rbp)
L109:
  cmpl   $0x1f,-0xd1c(%rbp)
  jbe    L30
  movl   $0x1,-0xa90(%rbp)
  movl   $0x21,-0xd1c(%rbp)
  jmp    L20
L7:
  mov    -0xd1c(%rbp),%eax
  movl   $0x0,-0xb10(%rbp,%rax,4)
  addl   $0x1,-0xd1c(%rbp)
L20:
  cmpl   $0x3f,-0xd1c(%rbp)
  jbe    L7
  movl   $0x1,-0xa10(%rbp)
  movl   $0x1,-0xd1c(%rbp)
  jmp    L91
L45:
  mov    -0xd1c(%rbp),%eax
  movl   $0x0,-0xa10(%rbp,%rax,4)
  addl   $0x1,-0xd1c(%rbp)
L91:
  cmpl   $0x3f,-0xd1c(%rbp)
  jbe    L45
  movl   $0xfe,-0xd18(%rbp)
  jmp    L55
L56:
  mov    -0xd18(%rbp),%eax
  lea    0x7(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x3,%eax
  movslq %eax,%rdx
  mov    -0xd30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0xd18(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0xd14(%rbp)
  andl   $0x1,-0xd14(%rbp)
  mov    -0xd14(%rbp),%edi
  lea    -0xb10(%rbp),%rcx
  lea    -0xa10(%rbp),%rdx
  lea    -0x810(%rbp),%rsi
  lea    -0x910(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <select@plt>
  lea    -0x910(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x910(%rbp),%rsi
  lea    -0x510(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <add@plt>
  lea    -0x910(%rbp),%rdx
  sub    $0xffffffffffffff80,%rdx
  lea    -0x510(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x910(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <sub@plt>
  lea    -0x810(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x810(%rbp),%rsi
  lea    -0x410(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <add@plt>
  lea    -0x810(%rbp),%rdx
  sub    $0xffffffffffffff80,%rdx
  lea    -0x410(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x810(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <sub@plt>
  lea    -0x510(%rbp),%rdx
  lea    -0x310(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <square@plt>
  lea    -0x510(%rbp),%rdx
  sub    $0xffffffffffffff80,%rdx
  lea    -0x310(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <square@plt>
  lea    -0x510(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x410(%rbp),%rsi
  lea    -0x210(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <mult@plt>
  lea    -0x410(%rbp),%rcx
  sub    $0xffffffffffffff80,%rcx
  lea    -0x210(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x510(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <mult@plt>
  lea    -0x210(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x210(%rbp),%rsi
  lea    -0x110(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <add@plt>
  lea    -0x210(%rbp),%rdx
  sub    $0xffffffffffffff80,%rdx
  lea    -0x110(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x210(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <sub@plt>
  lea    -0x110(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0xd10(%rbp),%rdx
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <square@plt>
  lea    -0x310(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x310(%rbp),%rsi
  lea    -0xc90(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <sub@plt>
  lea    -0xc90(%rbp),%rdx
  lea    -0xc10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <mult121665@plt>
  lea    -0x310(%rbp),%rdx
  lea    -0xc10(%rbp),%rcx
  lea    -0xb90(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <add@plt>
  lea    -0x310(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0x310(%rbp),%rsi
  lea    -0x710(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <mult@plt>
  lea    -0x710(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  lea    -0xb90(%rbp),%rdx
  lea    -0xc90(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <mult@plt>
  lea    -0x110(%rbp),%rdx
  lea    -0x610(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <square@plt>
  lea    -0x610(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    -0xd28(%rbp),%rdx
  lea    -0xd10(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <mult@plt>
  mov    -0xd14(%rbp),%edi
  lea    -0x610(%rbp),%rcx
  lea    -0x710(%rbp),%rdx
  lea    -0xb10(%rbp),%rsi
  lea    -0xa10(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <select@plt>
  subl   $0x1,-0xd18(%rbp)
L55:
  cmpl   $0x0,-0xd18(%rbp)
  jns    L56
  movl   $0x0,-0xd1c(%rbp)
  jmp    L5
L103:
  mov    -0xd1c(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xd28(%rbp),%rax
  add    %rax,%rdx
  mov    -0xd1c(%rbp),%eax
  mov    -0xa10(%rbp,%rax,4),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0xd1c(%rbp)
L5:
  cmpl   $0x3f,-0xd1c(%rbp)
  jbe    L103
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L92
  call   <__stack_chk_fail@plt>
L92:
  leave
  ret
```

assistant: ```c
void mainloop(unsigned int work[64], const unsigned char e[32]) {
  unsigned int xzm1[64];
  unsigned int xzm[64];
  unsigned int xzmb[64];
  unsigned int xzm1b[64];
  unsigned int xznb[64];
  unsigned int xzn1b[64];
  unsigned int a0[64];
  unsigned int a1[64];
  unsigned int b0[64];
  unsigned int b1[64];
  unsigned int c1[64];
  unsigned int r[32];
  unsigned int s[32];
  unsigned int t[32];
  unsigned int u[32];
  unsigned int i;
  unsigned int j;
  unsigned int b;
  int pos;
  for (j = 0; j < 32; ++j)
    xzm1[j] = work[j];
  xzm1[32] = 1;
  for (j = 33; j < 64; ++j)
    xzm1[j] = 0;
  xzm[0] = 1;
  for (j = 1; j < 64; ++j)
    xzm[j] = 0;
  for (pos = 254; pos >= 0; --pos) {
    b = e[pos / 8] >> (pos & 7);
    b &= 1;
    select(xzmb, xzm1b, xzm, xzm1, b);
    add(a0, xzmb, xzmb + 32);
    sub(a0 + 32, xzmb, xzmb + 32);
    add(a1, xzm1b, xzm1b + 32);
    sub(a1 + 32, xzm1b, xzm1b + 32);
    square(b0, a0);
    square(b0 + 32, a0 + 32);
    mult(b1, a1, a0 + 32);
    mult(b1 + 32, a1 + 32, a0);
    add(c1, b1, b1 + 32);
    sub(c1 + 32, b1, b1 + 32);
    square(r, c1 + 32);
    sub(s, b0, b0 + 32);
    mult121665(t, s);
    add(u, t, b0);
    mult(xznb, b0, b0 + 32);
    mult(xznb + 32, s, u);
    square(xzn1b, c1);
    mult(xzn1b + 32, r, work);
    select(xzm, xzm1, xznb, xzn1b, b);
  }
  for (j = 0; j < 64; ++j)
    work[j] = xzm[j];
}
```