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

```asm
<inner_product_single>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x20(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x24(%rbp)
  mov    $0x0,%eax
  call   <_mm_setzero_ps@plt>
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x7,-0x44(%rbp)
  jbe    L43
  jmp    L35
L8:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_loadu_ps@plt>
  mov    %eax,%ebx
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_loadu_ps@plt>
  mov    %ebx,%esi
  mov    %eax,%edi
  call   <_mm_mul_ps@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_ps@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  add    $0x4,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_loadu_ps@plt>
  mov    %eax,%ebx
  mov    -0x20(%rbp),%eax
  cltq
  add    $0x4,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_loadu_ps@plt>
  mov    %ebx,%esi
  mov    %eax,%edi
  call   <_mm_mul_ps@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_ps@plt>
  mov    %eax,-0x1c(%rbp)
  addl   $0x8,-0x20(%rbp)
L35:
  mov    -0x44(%rbp),%eax
  lea    -0x7(%rax),%edx
  mov    -0x20(%rbp),%eax
  cmp    %eax,%edx
  ja     L8
  mov    -0x1c(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_movehl_ps@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_ps@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%ecx
  mov    -0x1c(%rbp),%eax
  mov    $0x55,%edx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <_mm_shuffle_ps@plt>
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_ss@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%edx
  lea    -0x24(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <_mm_store_ss@plt>
  jmp    L43
L51:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x24(%rbp),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x24(%rbp)
  addl   $0x1,-0x20(%rbp)
L43:
  mov    -0x20(%rbp),%eax
  cmp    %eax,-0x44(%rbp)
  ja     L51
  movss  -0x24(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L32
  call   <__stack_chk_fail@plt>
L32:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
float inner_product_single(const float *a, const float *b, unsigned int len) {
  int i = 0;
  float ret = 0;
  __m128 sum = _mm_setzero_ps();
  if (len > 7) {
    for (; i < len - 7; i += 8) {
      sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a + i), _mm_loadu_ps(b + i)));
      sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a + i + 4), _mm_loadu_ps(b + i + 4)));
    }
    sum = _mm_add_ps(sum, _mm_movehl_ps(sum, sum));
    sum = _mm_add_ss(sum, _mm_shuffle_ps(sum, sum, 0x55));
    _mm_store_ss(&ret, sum);
  }
  for (; i < len; i++)
    ret += a[i] * b[i];
  return ret;
}
```