user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<fmodf>:
  endbr64
  push   %r13
  movaps %xmm0,%xmm2
  push   %r12
  push   %rbp
  movd   %xmm1,%ebp
  push   %rbx
  sub    $0x18,%rsp
  add    %ebp,%ebp
  jne    L83
L11:
  mulss  %xmm1,%xmm2
  divss  %xmm2,%xmm2
  movaps %xmm2,%xmm0
L201:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nop
L83:
  movd   %xmm0,%ebx
  movss  %xmm0,0xc(%rsp)
  movd   %xmm0,%r12d
  movaps %xmm1,%xmm0
  sar    $0x17,%ebx
  movd   %xmm1,%r13d
  movss  %xmm1,0x8(%rsp)
  call   <isnan@plt>
  movzbl %bl,%ebx
  movss  0x8(%rsp),%xmm1
  movss  0xc(%rsp),%xmm2
  cmp    $0xff,%ebx
  je     L11
  test   %rax,%rax
  jne    L11
  lea    (%r12,%r12,1),%eax
  cmp    %eax,%ebp
  jge    L163
  test   %ebx,%ebx
  jne    L16
  mov    %r12d,%edx
  shl    $0x9,%edx
  js     L221
  nopl   (%rax)
L101:
  sub    $0x1,%ebx
  add    %edx,%edx
  jns    L101
  mov    $0x1,%ecx
  mov    %r12d,%eax
  sub    %ebx,%ecx
  shl    %cl,%eax
L221:
  mov    %r13d,%edx
  sar    $0x17,%edx
  and    $0xff,%edx
  jne    L81
  mov    %r13d,%ecx
  shl    $0x9,%ecx
  js     L244
  nopl   (%rax)
L58:
  sub    $0x1,%edx
  add    %ecx,%ecx
  jns    L58
  mov    $0x1,%ecx
  mov    %r13d,%ebp
  sub    %edx,%ecx
  shl    %cl,%ebp
L244:
  cmp    %edx,%ebx
  jg     L183
  jmp    L136
  nopl   0x0(%rax)
L19:
  je     L252
L2:
  sub    $0x1,%ebx
  lea    (%rcx,%rcx,1),%eax
  cmp    %edx,%ebx
  je     L3
L183:
  mov    %eax,%ecx
  sub    %ebp,%ecx
  jns    L19
  mov    %eax,%ecx
  jmp    L2
  cs nopw 0x0(%rax,%rax,1)
L163:
  movaps %xmm2,%xmm0
  jne    L201
L252:
  add    $0x18,%rsp
  pxor   %xmm0,%xmm0
  mulss  %xmm2,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L136:
  mov    %ebx,%edx
  xchg   %ax,%ax
L3:
  mov    %eax,%ecx
  sub    %ebp,%ecx
  js     L70
  mov    %ecx,%eax
  je     L252
L70:
  mov    %eax,%edi
  shr    $0x17,%edi
  jne    L204
  nopl   0x0(%rax)
L98:
  add    %eax,%eax
  sub    $0x1,%edx
  mov    %eax,%esi
  shr    $0x17,%esi
  je     L98
L204:
  test   %edx,%edx
  jle    L118
  lea    -0x800000(%rax),%ecx
  mov    %edx,%eax
  shl    $0x17,%eax
  or     %ecx,%eax
L168:
  and    $0x80000000,%r12d
  or     %eax,%r12d
  movd   %r12d,%xmm0
  jmp    L201
  nopl   0x0(%rax)
L16:
  mov    %r12d,%eax
  and    $0x7fffff,%eax
  or     $0x800000,%eax
  jmp    L221
  nopw   0x0(%rax,%rax,1)
L81:
  and    $0x7fffff,%r13d
  mov    %r13d,%ebp
  or     $0x800000,%ebp
  jmp    L244
  nopl   (%rax)
L118:
  mov    $0x1,%ecx
  sub    %edx,%ecx
  sar    %cl,%eax
  jmp    L168
```

assistant: ```c
float fmodf(float x, float y) {
  union {
    float f;
    uint32_t i;
  } ux = {x}, uy = {y};
  int ex = ux.i >> 23 & 0xff;
  int ey = uy.i >> 23 & 0xff;
  uint32_t sx = ux.i & 0x80000000;
  uint32_t i;
  uint32_t uxi = ux.i;
  if (uy.i << 1 == 0 || isnan(y) || ex == 0xff)
    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 << 9; i >> 31 == 0; ex--, i <<= 1)
      ;
    uxi <<= -ex + 1;
  } else {
    uxi &= -1U >> 9;
    uxi |= 1U << 23;
  }
  if (!ey) {
    for (i = uy.i << 9; i >> 31 == 0; ey--, i <<= 1)
      ;
    uy.i <<= -ey + 1;
  } else {
    uy.i &= -1U >> 9;
    uy.i |= 1U << 23;
  }
  for (; ex > ey; ex--) {
    i = uxi - uy.i;
    if (i >> 31 == 0) {
      if (i == 0)
        return 0 * x;
      uxi = i;
    }
    uxi <<= 1;
  }
  i = uxi - uy.i;
  if (i >> 31 == 0) {
    if (i == 0)
      return 0 * x;
    uxi = i;
  }
  for (; uxi >> 23 == 0; uxi <<= 1, ex--)
    ;
  if (ex > 0) {
    uxi -= 1U << 23;
    uxi |= (uint32_t)ex << 23;
  } else {
    uxi >>= -ex + 1;
  }
  uxi |= sx;
  ux.i = uxi;
  return ux.f;
}
```