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

```asm
<__mulsf3>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  movss  %xmm0,-0x54(%rbp)
  movss  %xmm1,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x54(%rbp),%rax
  mov    (%rax),%rax
  and    $0x7fffffff,%eax
  test   %rax,%rax
  je     L74
  lea    -0x58(%rbp),%rax
  mov    (%rax),%rax
  and    $0x7fffffff,%eax
  test   %rax,%rax
  jne    L19
L74:
  pxor   %xmm0,%xmm0
  jmp    L71
L19:
  lea    -0x54(%rbp),%rax
  mov    (%rax),%rax
  sar    $0x8,%rax
  movzwl %ax,%eax
  or     $0x80,%ah
  mov    %rax,-0x30(%rbp)
  lea    -0x58(%rbp),%rax
  mov    (%rax),%rax
  sar    $0x8,%rax
  movzwl %ax,%eax
  or     $0x80,%ah
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  imul   -0x28(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  lea    -0x54(%rbp),%rax
  mov    (%rax),%rax
  and    $0xff,%eax
  mov    %rax,-0x20(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  je     L13
  mov    -0x28(%rbp),%rax
  imul   -0x20(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  jmp    L142
L13:
  movq   $0x0,-0x40(%rbp)
L142:
  lea    -0x58(%rbp),%rax
  mov    (%rax),%rax
  and    $0xff,%eax
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L104
  mov    -0x30(%rbp),%rax
  imul   -0x18(%rbp),%rax
  add    %rax,-0x40(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  je     L104
  mov    -0x20(%rbp),%rax
  imul   -0x18(%rbp),%rax
  sar    $0x8,%rax
  add    %rax,-0x40(%rbp)
L104:
  mov    -0x40(%rbp),%rax
  sar    $0x8,%rax
  add    %rax,-0x48(%rbp)
  lea    -0x54(%rbp),%rax
  mov    (%rax),%rdx
  lea    -0x58(%rbp),%rax
  mov    (%rax),%rax
  xor    %rdx,%rax
  and    $0x80000000,%eax
  mov    %rax,-0x10(%rbp)
  lea    -0x54(%rbp),%rax
  mov    (%rax),%rax
  and    $0x7f800000,%eax
  mov    %rax,%rdx
  lea    -0x58(%rbp),%rax
  mov    (%rax),%rax
  and    $0x7f800000,%eax
  add    %rdx,%rax
  sub    $0x3f800000,%rax
  mov    %rax,-0x38(%rbp)
  mov    $0x80000000,%eax
  cmp    %rax,-0x48(%rbp)
  jge    L61
  shlq   -0x48(%rbp)
  jmp    L152
L61:
  addq   $0x800000,-0x38(%rbp)
L152:
  mov    -0x48(%rbp),%rax
  sar    $0x7,%rax
  add    $0x1,%rax
  sar    %rax
  mov    %rax,-0x48(%rbp)
  cmpq   $0x7fffff,-0x38(%rbp)
  jg     L87
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  jmp    L84
L87:
  cmpq   $0x7f000000,-0x38(%rbp)
  jle    L36
  mov    $0xc0000000,%eax
  cmp    %rax,-0x38(%rbp)
  jg     L67
  mov    D5(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <raise@plt>
  mov    -0x10(%rbp),%rax
  add    $0x7f800000,%rax
  mov    %rax,-0x50(%rbp)
  jmp    L84
L67:
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  jmp    L84
L36:
  mov    -0x10(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  sub    $0x800000,%rax
  mov    %rax,-0x50(%rbp)
L84:
  lea    -0x50(%rbp),%rax
  movss  (%rax),%xmm0
L71:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L112
  call   <__stack_chk_fail@plt>
L112:
  leave
  ret
```

assistant: ```c
float __mulsf3(float a, float b) {
  uint au, al, bu, bl, cu, cl, sign;
  long lc;
  uint expt;
  if (!((*(const long *)&a) & 0x7fffffff) || !((*(const long *)&b) & 0x7fffffff))
    return 0;
  au = (((*(const long *)&a) >> 8) & 0x7fff) | 0x8000;
  bu = (((*(const long *)&b) >> 8) & 0x7fff) | 0x8000;
  cu = au * bu;
  if ((al = (*(const long *)&a) & 0xff) != 0) {
    cl = bu * al;
  } else
    cl = 0;
  if ((bl = (*(const long *)&b) & 0xff) != 0) {
    cl += au * bl;
    if (al)
      cl += (al * bl) >> 8;
  }
  cu += cl >> 8;
  sign = ((*(const long *)&a) ^ (*(const long *)&b)) & 0x80000000;
  expt = ((*(const long *)&a) & 0x7f800000) + ((*(const long *)&b) & 0x7f800000) - (127 << 23);
  if (cu <= 0x7fffffff)
    cu <<= 1;
  else
    expt += 1 << 23;
  cu = ((cu >> 7) + 1) >> 1;
  if (expt < 1 << 23)
    lc = sign;
  else if (expt > (uint)(254 << 23)) {
    if (expt <= 0xc0000000) {
      raise(SIGFPE);
      lc = sign + 0x7f800000;
    } else {
      lc = sign;
    }
  } else
    lc = sign + expt + cu - 0x800000;
  return (*(const float *)&lc);
}
```