user: 请从给定的汇编指令推导出C源代码：

```asm
<hypotl>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  fldt   0x60(%rsp)
  fld    %st(0)
  fstpt  0x10(%rsp)
  fldt   0x70(%rsp)
  fld    %st(0)
  fstpt  0x20(%rsp)
  fxch   %st(1)
  fabs
  fstpt  (%rsp)
  mov    (%rsp),%r12
  mov    0x8(%rsp),%r13d
  fabs
  fstpt  (%rsp)
  push   %r13
  push   %r12
  call   <isfinite@plt>
  pop    %rdx
  pop    %rcx
  test   %eax,%eax
  je     L3
  push   0x8(%rsp)
  push   0x8(%rsp)
  call   <isfinite@plt>
  pop    %r11
  pop    %rbx
  test   %eax,%eax
  je     L3
  fldz
  fldt   0x10(%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L131
  je     L137
L131:
  fldz
  fldt   0x20(%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L37
  jne    L37
L45:
  mov    %r12,(%rsp)
  mov    %r13d,0x8(%rsp)
  fldt   (%rsp)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   (%rax)
L3:
  push   %r13
  push   %r12
  call   <isinf@plt>
  pop    %rbp
  pop    %r12
  test   %rax,%rax
  je     L128
L133:
  mov    D33(%rip),%rax
  fldt   (%rax)
  fstpt  (%rsp)
L137:
  fldt   (%rsp)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax,%rax,1)
L128:
  push   0x8(%rsp)
  push   0x8(%rsp)
  call   <isinf@plt>
  pop    %r9
  pop    %r10
  test   %rax,%rax
  jne    L133
  mov    D24(%rip),%rax
  fldt   (%rax)
  fstpt  (%rsp)
  jmp    L137
  nopl   0x0(%rax)
L37:
  push   %r13
  push   %r12
  call   <logbl@plt>
  push   0x18(%rsp)
  push   0x18(%rsp)
  mov    %eax,%ebx
  call   <logbl@plt>
  mov    %ebx,%edx
  add    $0x20,%rsp
  sub    %eax,%edx
  cmp    $0x20,%edx
  jg     L45
  cmp    $0xffffffe0,%edx
  jl     L137
  add    %eax,%ebx
  push   %r13
  sar    %ebx
  push   %r12
  mov    %ebx,%ebp
  neg    %ebp
  mov    %ebp,%edi
  call   <scalbnl@plt>
  mov    %ebp,%edi
  fstpt  0x20(%rsp)
  push   0x18(%rsp)
  push   0x18(%rsp)
  call   <scalbnl@plt>
  fldt   0x30(%rsp)
  add    $0x20,%rsp
  fmul   %st(0),%st
  fxch   %st(1)
  fmul   %st(0),%st
  faddp  %st,%st(1)
  fldz
  fucomip %st(1),%st
  ja     L157
  fsqrt
L11:
  sub    $0x10,%rsp
  fld    %st(0)
  fstpt  (%rsp)
  fstpt  0x10(%rsp)
  call   <logbl@plt>
  pop    %rdx
  mov    D9(%rip),%rdx
  add    %ebx,%eax
  pop    %rcx
  fldt   (%rsp)
  cmp    %eax,(%rdx)
  jl     L156
  mov    D23(%rip),%rdx
  cmp    %eax,(%rdx)
  jg     L6
  fstpt  0x60(%rsp)
  add    $0x38,%rsp
  mov    %ebx,%edi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    10c0 <scalbnl@plt>
  nopl   0x0(%rax)
L156:
  fstp   %st(0)
  mov    D1(%rip),%rax
  mov    (%rax),%edx
  mov    D12(%rip),%rax
  mov    %edx,(%rax)
  mov    D33(%rip),%rax
  fldt   (%rax)
  fstpt  (%rsp)
  jmp    L137
  nopl   (%rax)
L6:
  fstp   %st(0)
  fldz
  fstpt  (%rsp)
  jmp    L137
L157:
  push   %rsi
  push   %rsi
  fstpt  (%rsp)
  call   <sqrtl@plt>
  pop    %rdi
  pop    %r8
  jmp    L11
```

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));
}
```