user: 下面的汇编指令对应的C源代码是什么:

```asm
<fmod>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  movsd  %xmm0,-0x38(%rbp)
  movsd  %xmm1,-0x40(%rbp)
  movsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  mov    $0x34,%edx
  mov    %edx,%ecx
  sar    %cl,%eax
  and    $0x7ff,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x8(%rbp),%eax
  mov    $0x34,%edx
  mov    %edx,%ecx
  sar    %cl,%eax
  and    $0x7ff,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x10(%rbp),%eax
  mov    $0x3f,%edx
  mov    %edx,%ecx
  sar    %cl,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%eax
  add    %eax,%eax
  test   %eax,%eax
  je     L5
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <isnan@plt>
  test   %rax,%rax
  jne    L5
  cmpl   $0x7ff,-0x24(%rbp)
  jne    L48
L5:
  movsd  -0x38(%rbp),%xmm0
  mulsd  -0x40(%rbp),%xmm0
  movsd  -0x38(%rbp),%xmm1
  mulsd  -0x40(%rbp),%xmm1
  divsd  %xmm1,%xmm0
  jmp    L25
L48:
  mov    -0x18(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,%edx
  jg     L91
  mov    -0x18(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,%edx
  jne    L221
  movsd  -0x38(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulsd  %xmm1,%xmm0
  jmp    L25
L221:
  movsd  -0x38(%rbp),%xmm0
  jmp    L25
L91:
  cmpl   $0x0,-0x24(%rbp)
  jne    L203
  mov    -0x18(%rbp),%eax
  shl    $0xc,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L179
L9:
  subl   $0x1,-0x24(%rbp)
  shll   -0x1c(%rbp)
L179:
  mov    $0x3f,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  test   %eax,%eax
  je     L9
  mov    $0x1,%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%ecx
  shll   %cl,-0x18(%rbp)
L203:
  cmpl   $0x0,-0x20(%rbp)
  jne    L181
  mov    -0x8(%rbp),%eax
  shl    $0xc,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L116
L249:
  subl   $0x1,-0x20(%rbp)
  shll   -0x1c(%rbp)
L116:
  mov    $0x3f,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  test   %eax,%eax
  je     L249
  mov    -0x8(%rbp),%edx
  mov    $0x1,%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x8(%rbp)
  jmp    L182
L181:
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  jmp    L182
L101:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    $0x3f,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  test   %eax,%eax
  jne    L120
  cmpl   $0x0,-0x1c(%rbp)
  jne    L162
  movsd  -0x38(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulsd  %xmm1,%xmm0
  jmp    L25
L162:
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x18(%rbp)
L120:
  shll   -0x18(%rbp)
  subl   $0x1,-0x24(%rbp)
L182:
  mov    -0x24(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jg     L101
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    $0x3f,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  test   %eax,%eax
  jne    L178
  cmpl   $0x0,-0x1c(%rbp)
  jne    L50
  movsd  -0x38(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulsd  %xmm1,%xmm0
  jmp    L25
L50:
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L178
L14:
  shll   -0x18(%rbp)
  subl   $0x1,-0x24(%rbp)
L178:
  mov    $0x34,%edx
  mov    -0x18(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  test   %eax,%eax
  je     L14
  cmpl   $0x0,-0x24(%rbp)
  jle    L248
  mov    $0x34,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  or     %eax,-0x18(%rbp)
  jmp    L240
L248:
  mov    $0x1,%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%ecx
  sarl   %cl,-0x18(%rbp)
L240:
  mov    $0x3f,%edx
  mov    -0x14(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  or     %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
L25:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

assistant: ```c
double fmod(double x, double y) {
  union {
    double f;
    uint64_t i;
  } ux = {x}, uy = {y};
  int ex = ux.i >> 52 & 0x7ff;
  int ey = uy.i >> 52 & 0x7ff;
  int sx = ux.i >> 63;
  uint64_t i;
  uint64_t uxi = ux.i;
  if (uy.i << 1 == 0 || isnan(y) || ex == 0x7ff)
    return (x * y) / (x * y);
  if (uxi << 1 <= uy.i << 1) {
    if (uxi << 1 == uy.i << 1)
      return 0 * x;
    return x;
  }
  if (!ex) {
    for (i = uxi << 12; i >> 63 == 0; ex--, i <<= 1)
      ;
    uxi <<= -ex + 1;
  } else {
    uxi &= -1ULL >> 12;
    uxi |= 1ULL << 52;
  }
  if (!ey) {
    for (i = uy.i << 12; i >> 63 == 0; ey--, i <<= 1)
      ;
    uy.i <<= -ey + 1;
  } else {
    uy.i &= -1ULL >> 12;
    uy.i |= 1ULL << 52;
  }
  for (; ex > ey; ex--) {
    i = uxi - uy.i;
    if (i >> 63 == 0) {
      if (i == 0)
        return 0 * x;
      uxi = i;
    }
    uxi <<= 1;
  }
  i = uxi - uy.i;
  if (i >> 63 == 0) {
    if (i == 0)
      return 0 * x;
    uxi = i;
  }
  for (; uxi >> 52 == 0; uxi <<= 1, ex--)
    ;
  if (ex > 0) {
    uxi -= 1ULL << 52;
    uxi |= (uint64_t)ex << 52;
  } else {
    uxi >>= -ex + 1;
  }
  uxi |= (uint64_t)sx << 63;
  ux.i = uxi;
  return ux.f;
}
```