user: 请从给定的汇编指令推导出C源代码：

```asm
<stdlib_strided_svariancepn>:
  endbr64
  test   %rdi,%rdi
  jle    L123
  pxor   %xmm5,%xmm5
  push   %r12
  cvtss2sd %xmm0,%xmm0
  cvtsi2sd %rdi,%xmm5
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  movapd %xmm5,%xmm6
  sub    $0x10,%rsp
  subsd  %xmm0,%xmm6
  pxor   %xmm0,%xmm0
  comisd %xmm6,%xmm0
  jae    L121
  movsd  %xmm6,0x8(%rsp)
  movsd  %xmm5,(%rsp)
  cmp    $0x1,%rdi
  je     L17
  mov    %rdx,%rbp
  test   %rdx,%rdx
  je     L17
  mov    %rsi,%r12
  call   <stdlib_strided_ssumpw@plt>
  pxor   %xmm4,%xmm4
  movsd  (%rsp),%xmm5
  test   %rbp,%rbp
  cvtsi2sd %rax,%xmm4
  movsd  0x8(%rsp),%xmm6
  divsd  %xmm5,%xmm4
  cvtsd2ss %xmm4,%xmm4
  js     L10
  cmp    $0x1,%rbp
  jne    L88
  lea    -0x1(%rbx),%rax
  cmp    $0x2,%rax
  jbe    L64
  mov    %rbx,%rdx
  pxor   %xmm3,%xmm3
  movaps %xmm4,%xmm7
  mov    %r12,%rax
  shr    $0x2,%rdx
  movaps %xmm3,%xmm1
  shufps $0x0,%xmm7,%xmm7
  shl    $0x4,%rdx
  add    %r12,%rdx
L72:
  movups (%rax),%xmm0
  add    $0x10,%rax
  subps  %xmm7,%xmm0
  movaps %xmm0,%xmm2
  addss  %xmm0,%xmm3
  mulps  %xmm0,%xmm2
  addss  %xmm2,%xmm1
  movaps %xmm2,%xmm8
  shufps $0x55,%xmm2,%xmm8
  addss  %xmm1,%xmm8
  movaps %xmm2,%xmm1
  unpckhps %xmm2,%xmm1
  shufps $0xff,%xmm2,%xmm2
  addss  %xmm8,%xmm1
  addss  %xmm2,%xmm1
  movaps %xmm0,%xmm2
  shufps $0x55,%xmm0,%xmm2
  addss  %xmm3,%xmm2
  movaps %xmm0,%xmm3
  unpckhps %xmm0,%xmm3
  shufps $0xff,%xmm0,%xmm0
  addss  %xmm2,%xmm3
  addss  %xmm0,%xmm3
  cmp    %rdx,%rax
  jne    L72
  mov    %rbx,%rbp
  and    $0xfffffffffffffffc,%rbp
  test   $0x3,%bl
  je     L53
  movss  (%r12,%rbp,4),%xmm0
  lea    0x0(,%rbp,4),%rax
  add    $0x1,%rbp
  subss  %xmm4,%xmm0
  movaps %xmm0,%xmm2
  addss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  addss  %xmm2,%xmm1
  cmp    %rbp,%rbx
  jle    L53
L27:
  movss  0x4(%r12,%rax,1),%xmm0
  add    $0x1,%rbp
  subss  %xmm4,%xmm0
  movaps %xmm0,%xmm2
  addss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  addss  %xmm2,%xmm1
  cmp    %rbp,%rbx
  jle    L53
  movss  0x8(%r12,%rax,1),%xmm0
  subss  %xmm4,%xmm0
  movaps %xmm0,%xmm2
  addss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  addss  %xmm2,%xmm1
L53:
  pxor   %xmm0,%xmm0
  cvtss2sd %xmm3,%xmm3
  add    $0x10,%rsp
  cvtss2sd %xmm1,%xmm0
  divsd  %xmm6,%xmm0
  movapd %xmm3,%xmm1
  pop    %rbx
  pop    %rbp
  pop    %r12
  divsd  %xmm5,%xmm1
  cvtsd2ss %xmm0,%xmm0
  divsd  %xmm6,%xmm3
  cvtsd2ss %xmm1,%xmm1
  cvtsd2ss %xmm3,%xmm3
  mulss  %xmm3,%xmm1
  subss  %xmm1,%xmm0
  ret
  nopw   0x0(%rax,%rax,1)
L17:
  add    $0x10,%rsp
  pxor   %xmm0,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L121:
  add    $0x10,%rsp
  pxor   %xmm0,%xmm0
  divss  %xmm0,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L10:
  mov    $0x1,%eax
  sub    %rbx,%rax
  imul   %rbp,%rax
L55:
  pxor   %xmm3,%xmm3
  lea    (%r12,%rax,4),%rdx
  shl    $0x2,%rbp
  xor    %eax,%eax
  movaps %xmm3,%xmm1
  nopl   (%rax)
L87:
  movss  (%rdx),%xmm0
  add    $0x1,%rax
  add    %rbp,%rdx
  subss  %xmm4,%xmm0
  movaps %xmm0,%xmm2
  addss  %xmm0,%xmm3
  mulss  %xmm0,%xmm2
  addss  %xmm2,%xmm1
  cmp    %rax,%rbx
  jne    L87
  jmp    L53
L123:
  pxor   %xmm0,%xmm0
  divss  %xmm0,%xmm0
  ret
L64:
  movss  (%r12),%xmm3
  pxor   %xmm0,%xmm0
  xor    %eax,%eax
  subss  %xmm4,%xmm3
  movaps %xmm3,%xmm1
  mulss  %xmm3,%xmm1
  addss  %xmm0,%xmm3
  addss  %xmm0,%xmm1
  jmp    L27
L88:
  xor    %eax,%eax
  jmp    L55
```

assistant: ```c
float stdlib_strided_svariancepn(const int64_t N, const float correction, const float *X, const int64_t stride) {
  int64_t ix;
  int64_t i;
  double dN;
  double n;
  float mu;
  float M2;
  float M;
  float d;
  dN = (double)N;
  n = dN - (double)correction;
  if (N <= 0 || n <= 0.0f) {
    return 0.0f / 0.0f;
  }
  if (N == 1 || stride == 0) {
    return 0.0f;
  }
  mu = (double)stdlib_strided_ssumpw(N, X, stride) / dN;
  if (stride < 0) {
    ix = (1 - N) * stride;
  } else {
    ix = 0;
  }
  M2 = 0.0f;
  M = 0.0f;
  for (i = 0; i < N; i++) {
    d = X[ix] - mu;
    M2 += d * d;
    M += d;
    ix += stride;
  }
  return (float)((double)M2 / n) - ((float)((double)M / dN) * (float)((double)M / n));
}
```