user: Please show me the C implementation that matches the assembly code listed below:

```asm
<hypotl>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  fldt   0x10(%rbp)
  fabs
  fstpt  -0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x38(%rbp),%edx
  mov    %rax,-0x20(%rbp)
  mov    %edx,-0x18(%rbp)
  fldt   0x20(%rbp)
  fabs
  fstpt  -0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x38(%rbp),%edx
  mov    %rax,-0x10(%rbp)
  mov    %edx,-0x8(%rbp)
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  call   <isfinite@plt>
  add    $0x10,%rsp
  test   %eax,%eax
  je     L84
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  call   <isfinite@plt>
  add    $0x10,%rsp
  test   %eax,%eax
  jne    L18
L84:
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  call   <isinf@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  jne    L147
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  call   <isinf@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L183
L147:
  mov    D12(%rip),%rax
  mov    0x8(%rax),%edx
  mov    (%rax),%rax
  jmp    L17
L183:
  mov    D23(%rip),%rax
  mov    0x8(%rax),%edx
  mov    (%rax),%rax
  jmp    L17
L18:
  fldt   -0x20(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L126
  fldt   -0x20(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L126
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%edx
  jmp    L17
L126:
  fldt   -0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L148
  fldt   -0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L148
  mov    -0x20(%rbp),%rax
  mov    -0x18(%rbp),%edx
  jmp    L17
L148:
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  call   <logbl@plt>
  add    $0x10,%rsp
  mov    %eax,-0x2c(%rbp)
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  call   <logbl@plt>
  add    $0x10,%rsp
  mov    %eax,-0x28(%rbp)
  mov    -0x2c(%rbp),%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  cmpl   $0x20,-0x24(%rbp)
  jle    L54
  mov    -0x20(%rbp),%rax
  mov    -0x18(%rbp),%edx
  jmp    L17
L54:
  cmpl   $0xffffffe0,-0x24(%rbp)
  jge    L7
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%edx
  jmp    L17
L7:
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  sar    %eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  neg    %eax
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  mov    %eax,%edi
  call   <scalbnl@plt>
  add    $0x10,%rsp
  fstpt  0x10(%rbp)
  mov    -0x24(%rbp),%eax
  neg    %eax
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  mov    %eax,%edi
  call   <scalbnl@plt>
  add    $0x10,%rsp
  fstpt  0x20(%rbp)
  fldt   0x10(%rbp)
  fld    %st(0)
  fmulp  %st,%st(1)
  fldt   0x20(%rbp)
  fmul   %st(0),%st
  faddp  %st,%st(1)
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  call   <sqrtl@plt>
  add    $0x10,%rsp
  fstpt  -0x20(%rbp)
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  call   <logbl@plt>
  add    $0x10,%rsp
  mov    %eax,-0x2c(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x2c(%rbp)
  mov    D5(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x2c(%rbp)
  jle    L53
  mov    D7(%rip),%rax
  mov    (%rax),%edx
  mov    D13(%rip),%rax
  mov    %edx,(%rax)
  mov    D12(%rip),%rax
  mov    0x8(%rax),%edx
  mov    (%rax),%rax
  jmp    L17
L53:
  mov    D61(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x2c(%rbp)
  jge    L170
  mov    $0x0,%eax
  mov    $0x0,%edx
  jmp    L17
L170:
  mov    -0x24(%rbp),%eax
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  mov    %eax,%edi
  call   <scalbnl@plt>
  add    $0x10,%rsp
  fstpt  -0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x38(%rbp),%edx
L17:
  mov    %rax,-0x40(%rbp)
  mov    %edx,-0x38(%rbp)
  fldt   -0x40(%rbp)
  leave
  ret
```

assistant: ```c
long double hypotl(long double x, long double y) {
  int exx;
  int eyy;
  int scale;
  long double xx = fabsl(x);
  long double yy = fabsl(y);
  if (!isfinite(xx) || !isfinite(yy)) {
    return (isinf(xx) || isinf(yy)) ? INFINITY : NAN;
  }
  if (xx == 0.0L)
    return yy;
  if (yy == 0.0L)
    return xx;
  exx = logbl(xx);
  eyy = logbl(yy);
  scale = exx - eyy;
  if (scale > 32)
    return xx;
  if (scale < -32)
    return yy;
  scale = (exx + eyy) >> 1;
  x = scalbnl(xx, -scale);
  y = scalbnl(yy, -scale);
  xx = sqrtl(x * x + y * y);
  exx = logbl(xx);
  exx += scale;
  if (exx > LDBL_MAX_EXP) {
    errno = ERANGE;
    return INFINITY;
  }
  if (exx < LDBL_MIN_EXP)
    return 0.0L;
  return (scalbnl(xx, scale));
}
```