user: 这段汇编代码用C语言表示是什么样的?

```asm
<fmodf>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  movss  %xmm0,-0x24(%rbp)
  movss  %xmm1,-0x28(%rbp)
  movss  -0x24(%rbp),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0x28(%rbp),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  sar    $0x17,%eax
  and    $0xff,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  sar    $0x17,%eax
  and    $0xff,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x1c(%rbp),%eax
  and    $0x80000000,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%eax
  add    %eax,%eax
  test   %eax,%eax
  je     L263
  mov    -0x28(%rbp),%eax
  movd   %eax,%xmm0
  call   <isnan@plt>
  test   %rax,%rax
  jne    L263
  cmpl   $0xff,-0x14(%rbp)
  jne    L229
L263:
  movss  -0x24(%rbp),%xmm0
  mulss  -0x28(%rbp),%xmm0
  movss  -0x24(%rbp),%xmm1
  mulss  -0x28(%rbp),%xmm1
  divss  %xmm1,%xmm0
  jmp    L71
L229:
  mov    -0x8(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,%edx
  jg     L137
  mov    -0x8(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,%edx
  jne    L197
  movss  -0x24(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulss  %xmm1,%xmm0
  jmp    L71
L197:
  movss  -0x24(%rbp),%xmm0
  jmp    L71
L137:
  cmpl   $0x0,-0x14(%rbp)
  jne    L31
  mov    -0x8(%rbp),%eax
  shl    $0x9,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L27
L226:
  subl   $0x1,-0x14(%rbp)
  shll   -0xc(%rbp)
L27:
  cmpl   $0x0,-0xc(%rbp)
  jns    L226
  mov    $0x1,%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,%ecx
  shll   %cl,-0x8(%rbp)
  jmp    L133
L31:
  andl   $0x7fffff,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  or     $0x800000,%eax
  mov    %eax,-0x8(%rbp)
L133:
  cmpl   $0x0,-0x10(%rbp)
  jne    L132
  mov    -0x18(%rbp),%eax
  shl    $0x9,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L144
L242:
  subl   $0x1,-0x10(%rbp)
  shll   -0xc(%rbp)
L144:
  cmpl   $0x0,-0xc(%rbp)
  jns    L242
  mov    -0x18(%rbp),%edx
  mov    $0x1,%eax
  sub    -0x10(%rbp),%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x18(%rbp)
  jmp    L185
L132:
  mov    -0x18(%rbp),%eax
  and    $0x7fffff,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  or     $0x800000,%eax
  mov    %eax,-0x18(%rbp)
  jmp    L185
L64:
  mov    -0x18(%rbp),%edx
  mov    -0x8(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  js     L187
  cmpl   $0x0,-0xc(%rbp)
  jne    L213
  movss  -0x24(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulss  %xmm1,%xmm0
  jmp    L71
L213:
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x8(%rbp)
L187:
  shll   -0x8(%rbp)
  subl   $0x1,-0x14(%rbp)
L185:
  mov    -0x14(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jg     L64
  mov    -0x18(%rbp),%edx
  mov    -0x8(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  js     L155
  cmpl   $0x0,-0xc(%rbp)
  jne    L139
  movss  -0x24(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  mulss  %xmm1,%xmm0
  jmp    L71
L139:
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  jmp    L155
L92:
  shll   -0x8(%rbp)
  subl   $0x1,-0x14(%rbp)
L155:
  mov    -0x8(%rbp),%eax
  sar    $0x17,%eax
  test   %eax,%eax
  je     L92
  cmpl   $0x0,-0x14(%rbp)
  jle    L157
  mov    -0x8(%rbp),%eax
  sub    $0x800000,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x14(%rbp),%eax
  shl    $0x17,%eax
  or     %eax,-0x8(%rbp)
  jmp    L140
L157:
  mov    $0x1,%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,%ecx
  sarl   %cl,-0x8(%rbp)
L140:
  mov    -0x4(%rbp),%eax
  or     %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  movss  -0x1c(%rbp),%xmm0
L71:
  leave
  ret
```

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