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

```asm
<fmod>:
  endbr64
  push   %r15
  movd   %xmm1,%r15d
  movapd %xmm0,%xmm2
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  add    %r15d,%r15d
  jne    L245
L165:
  mulsd  %xmm1,%xmm2
  divsd  %xmm2,%xmm2
  movapd %xmm2,%xmm0
L261:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L245:
  movd   %xmm0,%ebp
  mov    $0x34,%ecx
  movq   %xmm0,%r13
  movsd  %xmm0,0x8(%rsp)
  sar    %cl,%ebp
  movapd %xmm1,%xmm0
  movq   %xmm1,%r12
  movsd  %xmm1,(%rsp)
  and    $0x7ff,%ebp
  movd   %xmm1,%r14d
  mov    %r13d,%ebx
  call   <isnan@plt>
  cmp    $0x7ff,%ebp
  movsd  (%rsp),%xmm1
  movsd  0x8(%rsp),%xmm2
  je     L165
  test   %rax,%rax
  jne    L165
  lea    (%rbx,%rbx,1),%edi
  cmp    %edi,%r15d
  jge    L97
  mov    %r12d,%eax
  mov    $0x34,%ecx
  sar    %cl,%eax
  and    $0x7ff,%eax
  test   %ebp,%ebp
  jne    L233
  mov    %ebx,%edx
  mov    $0x3f,%ecx
  shl    $0xc,%edx
  mov    %edx,%esi
  sar    %cl,%esi
  test   %esi,%esi
  jne    L142
  nopl   0x0(%rax,%rax,1)
L152:
  add    %edx,%edx
  mov    $0x3f,%ecx
  sub    $0x1,%esi
  mov    %edx,%edi
  sar    %cl,%edi
  test   %edi,%edi
  je     L152
  mov    $0x1,%ecx
  mov    %esi,%ebp
  sub    %esi,%ecx
  shl    %cl,%ebx
L199:
  test   %eax,%eax
  jne    L175
L173:
  mov    %r12d,%edx
  mov    $0x3f,%ecx
  shl    $0xc,%edx
  mov    %edx,%eax
  sar    %cl,%eax
  test   %eax,%eax
  jne    L267
  nopl   0x0(%rax)
L225:
  add    %edx,%edx
  mov    $0x3f,%ecx
  sub    $0x1,%eax
  mov    %edx,%esi
  sar    %cl,%esi
  test   %esi,%esi
  je     L225
  mov    $0x1,%ecx
  mov    %r12d,%r14d
  sub    %eax,%ecx
  shl    %cl,%r14d
L211:
  cmp    %ebp,%eax
  jge    L175
  nopw   0x0(%rax,%rax,1)
L236:
  mov    %ebx,%edx
  mov    $0x3f,%ecx
  sub    %r14d,%edx
  mov    %edx,%edi
  sar    %cl,%edi
  test   %edi,%edi
  jne    L93
  test   %edx,%edx
  je     L22
  mov    %edx,%ebx
L93:
  sub    $0x1,%ebp
  add    %ebx,%ebx
  cmp    %eax,%ebp
  jne    L236
L204:
  mov    %ebx,%edx
  mov    $0x3f,%ecx
  sub    %r14d,%edx
  mov    %edx,%esi
  sar    %cl,%esi
  test   %esi,%esi
  jne    L157
  mov    %edx,%ebx
  test   %edx,%edx
  jne    L157
  nopl   0x0(%rax)
L22:
  pxor   %xmm0,%xmm0
  mulsd  %xmm2,%xmm0
  jmp    L261
  nopl   (%rax)
L97:
  movapd %xmm2,%xmm0
  jne    L261
  jmp    L22
  nopl   0x0(%rax)
L112:
  add    %ebx,%ebx
  sub    $0x1,%eax
L157:
  mov    %ebx,%edx
  mov    $0x34,%ecx
  sar    %cl,%edx
  test   %edx,%edx
  je     L112
  test   %eax,%eax
  jle    L25
L48:
  movabs $0xffffffff00000000,%rax
  and    %rax,%r13
  or     %rbx,%r13
  movq   %r13,%xmm0
  jmp    L261
L233:
  test   %eax,%eax
  jne    L211
  jmp    L173
  nopl   (%rax)
L25:
  mov    $0x1,%ecx
  sub    %eax,%ecx
  sar    %cl,%ebx
  jmp    L48
L142:
  mov    %edi,%ebx
  jmp    L199
L267:
  mov    %r15d,%r14d
  xor    %eax,%eax
  jmp    L211
L175:
  mov    %ebp,%eax
  jmp    L204
```

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