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

```asm
<cotd>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x38,%rsp
  fldt   0xef5(%rip)        # 2000 <_fini+0xc44>
  fldt   0x10(%rbp)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L87
  fldt   0x10(%rbp)
  fldt   0xef3(%rip)        # 2010 <_fini+0xc54>
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L87
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L28
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L28
L87:
  fldz
  jmp    L79
L28:
  fldt   0x10(%rbp)
  fnstcw -0x92(%rbp)
  movzwl -0x92(%rbp),%eax
  or     $0xc,%ah
  mov    %ax,-0x94(%rbp)
  fldcw  -0x94(%rbp)
  fistpll -0xb0(%rbp)
  fldcw  -0x92(%rbp)
  fildll -0xb0(%rbp)
  fstpt  -0x40(%rbp)
  fldt   0x10(%rbp)
  fldt   -0x40(%rbp)
  fsubrp %st,%st(1)
  fstpt  -0x30(%rbp)
  fldz
  fldt   0x10(%rbp)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L25
  fldt   0x10(%rbp)
  fldt   0xe8c(%rip)        # 2020 <_fini+0xc64>
  fmulp  %st,%st(1)
  fldt   0xe94(%rip)        # 2030 <_fini+0xc74>
  faddp  %st,%st(1)
  fldcw  -0x94(%rbp)
  fistpll -0x88(%rbp)
  fldcw  -0x92(%rbp)
  jmp    L123
L25:
  fldt   0x10(%rbp)
  fldt   0xe65(%rip)        # 2020 <_fini+0xc64>
  fmulp  %st,%st(1)
  fldt   0xe6d(%rip)        # 2030 <_fini+0xc74>
  fsubrp %st,%st(1)
  fldcw  -0x94(%rbp)
  fistpll -0x88(%rbp)
  fldcw  -0x92(%rbp)
L123:
  fildll -0x88(%rbp)
  fstpt  -0x20(%rbp)
  fldt   -0x20(%rbp)
  fldt   0xe57(%rip)        # 2040 <_fini+0xc84>
  fmulp  %st,%st(1)
  fldt   -0x40(%rbp)
  fsubp  %st,%st(1)
  fstpt  -0x10(%rbp)
  fldt   -0x10(%rbp)
  fldt   -0x30(%rbp)
  faddp  %st,%st(1)
  fstpt  -0x10(%rbp)
  fldt   -0x20(%rbp)
  fldt   0xe49(%rip)        # 2050 <_fini+0xc94>
  fmulp  %st,%st(1)
  fldt   -0x10(%rbp)
  faddp  %st,%st(1)
  fstpt  -0x10(%rbp)
  fldt   -0x20(%rbp)
  fldt   0xe46(%rip)        # 2060 <_fini+0xca4>
  fmulp  %st,%st(1)
  fldt   -0x10(%rbp)
  fsubp  %st,%st(1)
  fstpt  -0x10(%rbp)
  fldt   -0x10(%rbp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L4
  fldt   -0x10(%rbp)
  fchs
  fstpt  -0xb0(%rbp)
  mov    -0xb0(%rbp),%rax
  mov    -0xa8(%rbp),%edx
  mov    %rax,-0x80(%rbp)
  mov    %edx,-0x78(%rbp)
  jmp    L111
L4:
  fldt   -0x10(%rbp)
  fstpt  -0x80(%rbp)
L111:
  fldt   -0x80(%rbp)
  fldt   0xe11(%rip)        # 2070 <_fini+0xcb4>
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L91
  mov    -0x88(%rbp),%rax
  and    $0x1,%eax
  test   %rax,%rax
  je     L17
  fldt   -0x10(%rbp)
  fchs
  fstpt  -0xb0(%rbp)
  mov    -0xb0(%rbp),%rax
  mov    -0xa8(%rbp),%edx
  mov    %rax,-0x70(%rbp)
  mov    %edx,-0x68(%rbp)
  jmp    L127
L17:
  fld1
  fldt   -0x10(%rbp)
  fdivrp %st,%st(1)
  fstpt  -0x70(%rbp)
L127:
  fldt   -0x70(%rbp)
  jmp    L79
L91:
  fldt   -0x10(%rbp)
  fmul   %st(0),%st
  fstpt  -0x80(%rbp)
  fldt   -0x80(%rbp)
  fldt   0xdc8(%rip)        # 2080 <_fini+0xcc4>
  fmulp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   0xdca(%rip)        # 2090 <_fini+0xcd4>
  faddp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   -0x80(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   0xdc1(%rip)        # 20a0 <_fini+0xce4>
  fsubrp %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   -0x80(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   -0x10(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x60(%rbp)
  fldt   -0x10(%rbp)
  faddp  %st,%st(1)
  fstpt  -0x60(%rbp)
  fldt   -0x80(%rbp)
  fldt   0xda2(%rip)        # 20b0 <_fini+0xcf4>
  fmulp  %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   0xda4(%rip)        # 20c0 <_fini+0xd04>
  fsubrp %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   -0x80(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   0xd9b(%rip)        # 20d0 <_fini+0xd14>
  faddp  %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   -0x80(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   0xd92(%rip)        # 20e0 <_fini+0xd24>
  fsubrp %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fldt   -0x80(%rbp)
  fmulp  %st,%st(1)
  fstpt  -0x50(%rbp)
  fldt   -0x50(%rbp)
  fld1
  faddp  %st,%st(1)
  fstpt  -0x50(%rbp)
  mov    -0x88(%rbp),%rax
  and    $0x1,%eax
  test   %rax,%rax
  je     L146
  fldt   -0x60(%rbp)
  fchs
  fstpt  -0xb0(%rbp)
  mov    -0xb0(%rbp),%rax
  mov    -0xa8(%rbp),%edx
  mov    %rax,-0x60(%rbp)
  mov    %edx,-0x58(%rbp)
  jmp    L108
L146:
  fldt   -0x50(%rbp)
  fstpt  -0x70(%rbp)
  fldt   -0x60(%rbp)
  fstpt  -0x50(%rbp)
  fldt   -0x70(%rbp)
  fstpt  -0x60(%rbp)
L108:
  fldt   -0x60(%rbp)
  fldt   -0x50(%rbp)
  fdivrp %st,%st(1)
  fstpt  -0x70(%rbp)
  fldt   -0x70(%rbp)
L79:
  leave
  ret
```

assistant: ```c
long double cotd(long double x) {
  long int n;
  long double xn;
  long double f, g;
  long double x_int, x_fract;
  long double result;
  long double xnum, xden;
  if ((x > ((421657424.0L))) || (x < -((421657424.0L))) || (x == 0.0L)) {
    return 0.0L;
  }
  x_int = ((long double)(((long)(x))));
  x_fract = ((long double)(x) - (long double)(x_int));
  if (x > 0.0) {
    n = ((long)(((long double)(((long double)(x) * (long double)((0.63661977236758134307553505349006L)))) + (long double)(0.5))));
  } else {
    n = ((long)(((long double)(((long double)(x) * (long double)((0.63661977236758134307553505349006L)))) + (long double)(-0.5))));
  }
  xn = ((long double)(n));
  f = ((long double)(x_int) - (long double)(((long double)(xn) * (long double)((1.57080078125L)))));
  f = ((long double)(f) + (long double)(x_fract));
  f = ((long double)(f) - (long double)(((long double)(xn) * (long double)((-4.45445516561449039727449417114e-6L)))));
  f = ((long double)(f) - (long double)(((long double)(xn) * (long double)((6.2233721718966133922584676705e-14L)))));
  if (f < 0.0L) {
    g = -f;
  } else {
    g = f;
  }
  if (g < (+1.490116119385e-8L)) {
    if (n & 0x0001) {
      result = -f;
    } else {
      result = ((long double)(1.0L) / (long double)(f));
    }
    return result;
  }
  g = ((long double)(f) * (long double)(f));
  xnum = ((long double)(g) * (long double)((-1.7861707342254424711e-5L)));
  xnum = ((long double)(xnum) + (long double)((+3.4248878235890589960e-3L)));
  xnum = ((long double)(xnum) * (long double)(g));
  xnum = ((long double)(xnum) + (long double)((-1.3338350006421960681e-1L)));
  xnum = ((long double)(xnum) * (long double)(g));
  xnum = ((long double)(xnum) * (long double)(f));
  xnum = ((long double)(xnum) + (long double)(f));
  xden = ((long double)(g) * (long double)((+4.9819433993786512270e-7L)));
  xden = ((long double)(xden) + (long double)((-3.1181531907010027307e-4L)));
  xden = ((long double)(xden) * (long double)(g));
  xden = ((long double)(xden) + (long double)((+2.5663832289440112864e-2L)));
  xden = ((long double)(xden) * (long double)(g));
  xden = ((long double)(xden) + (long double)((-4.6671683339755294240e-1L)));
  xden = ((long double)(xden) * (long double)(g));
  xden = ((long double)(xden) + (long double)((+1.0000000000000000000L)));
  if (n & 0x0001) {
    xnum = -xnum;
  } else {
    result = xden;
    xden = xnum;
    xnum = result;
  }
  result = ((long double)(xnum) / (long double)(xden));
  return result;
}
```