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

```asm
<c_sapx>:
  endbr64
  test   %edi,%edi
  setle  %cl
  jle    L13
  ucomiss D2(%rip),%xmm0
  setnp  %al
  cmovne %ecx,%eax
  test   %al,%al
  jne    L13
  cmp    $0x1,%edx
  je     L66
  xor    %eax,%eax
  test   %edx,%edx
  js     L71
L40:
  movslq %edx,%rdx
  cltq
  lea    0x0(,%rdx,4),%rcx
  lea    (%rsi,%rax,4),%rax
  xor    %edx,%edx
  nopw   0x0(%rax,%rax,1)
L136:
  movss  (%rax),%xmm1
  add    $0x1,%edx
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rax)
  add    %rcx,%rax
  cmp    %edx,%edi
  jg     L136
L13:
  ret
  nopw   0x0(%rax,%rax,1)
L71:
  mov    $0x1,%eax
  sub    %edi,%eax
  imul   %edx,%eax
  jmp    L40
  nopl   0x0(%rax)
L66:
  movslq %edi,%rdx
  mov    %edi,%eax
  mov    %edi,%r8d
  imul   $0x66666667,%rdx,%rdx
  sar    $0x1f,%eax
  sar    $0x21,%rdx
  sub    %eax,%edx
  lea    (%rdx,%rdx,4),%eax
  sub    %eax,%r8d
  je     L12
  cmp    $0x4,%r8d
  jne    L170
  movups (%rsi),%xmm7
  movaps %xmm0,%xmm1
  shufps $0x0,%xmm1,%xmm1
  addps  %xmm7,%xmm1
  movups %xmm1,(%rsi)
  nopw   0x0(%rax,%rax,1)
L12:
  cmp    $0x4,%edi
  jle    L13
  lea    -0x1(%rdi),%eax
  mov    $0xcccccccd,%edx
  sub    %r8d,%eax
  mov    %eax,%r9d
  imul   %rdx,%r9
  shr    $0x22,%r9
  lea    0x1(%r9),%edi
  cmp    $0xe,%eax
  jbe    L61
  mov    %edi,%edx
  movslq %r8d,%rax
  movaps %xmm0,%xmm1
  shr    $0x2,%edx
  lea    (%rsi,%rax,4),%rax
  shufps $0x0,%xmm1,%xmm1
  sub    $0x1,%edx
  lea    (%rdx,%rdx,4),%rcx
  lea    0x50(%rax),%rdx
  shl    $0x4,%rcx
  add    %rdx,%rcx
  jmp    L168
  nop
L74:
  add    $0x50,%rdx
L168:
  movups 0x10(%rax),%xmm5
  movups 0x20(%rax),%xmm4
  movups 0x30(%rax),%xmm3
  movups 0x40(%rax),%xmm2
  movups (%rax),%xmm6
  addps  %xmm1,%xmm5
  addps  %xmm1,%xmm4
  addps  %xmm1,%xmm3
  addps  %xmm1,%xmm2
  addps  %xmm1,%xmm6
  movups %xmm5,0x10(%rax)
  movups %xmm4,0x20(%rax)
  movups %xmm6,(%rax)
  movups %xmm3,0x30(%rax)
  movups %xmm2,0x40(%rax)
  mov    %rdx,%rax
  cmp    %rdx,%rcx
  jne    L74
  mov    %edi,%ecx
  and    $0xfffffffc,%ecx
  lea    (%rcx,%rcx,4),%eax
  add    %r8d,%eax
  cmp    %edi,%ecx
  je     L50
L62:
  sub    %ecx,%edi
  cmp    %r9d,%ecx
  je     L90
  lea    (%rcx,%rcx,4),%rcx
  movslq %r8d,%rdx
  movaps %xmm0,%xmm1
  add    %rcx,%rdx
  shufps $0xe0,%xmm1,%xmm1
  lea    (%rsi,%rdx,4),%rdx
  movq   0x8(%rdx),%xmm2
  movq   (%rdx),%xmm6
  movaps %xmm2,%xmm5
  movq   0x10(%rdx),%xmm2
  addps  %xmm1,%xmm6
  addps  %xmm1,%xmm5
  movaps %xmm2,%xmm4
  movq   0x18(%rdx),%xmm2
  addps  %xmm1,%xmm4
  movlps %xmm6,(%rdx)
  movaps %xmm2,%xmm3
  movq   0x20(%rdx),%xmm2
  movlps %xmm5,0x8(%rdx)
  addps  %xmm1,%xmm3
  addps  %xmm1,%xmm2
  movlps %xmm4,0x10(%rdx)
  movlps %xmm3,0x18(%rdx)
  movlps %xmm2,0x20(%rdx)
  mov    %edi,%edx
  and    $0xfffffffe,%edx
  lea    (%rdx,%rdx,4),%ecx
  add    %ecx,%eax
  cmp    %edx,%edi
  je     L13
L90:
  cltq
  shl    $0x2,%rax
  lea    (%rsi,%rax,1),%rdx
  movss  (%rdx),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rdx)
  lea    0x4(%rsi,%rax,1),%rdx
  movss  (%rdx),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rdx)
  lea    0x8(%rsi,%rax,1),%rdx
  movss  (%rdx),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rdx)
  lea    0xc(%rsi,%rax,1),%rdx
  lea    0x10(%rsi,%rax,1),%rax
  movss  (%rdx),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rdx)
  addss  (%rax),%xmm0
  movss  %xmm0,(%rax)
  ret
L170:
  cmp    $0x1,%r8d
  je     L53
  movq   (%rsi),%xmm1
  movaps %xmm0,%xmm2
  mov    $0x2,%eax
  shufps $0xe0,%xmm2,%xmm2
  addps  %xmm2,%xmm1
  movlps %xmm1,(%rsi)
  cmp    $0x2,%r8d
  je     L12
L54:
  lea    (%rsi,%rax,4),%rax
  movss  (%rax),%xmm1
  addss  %xmm0,%xmm1
  movss  %xmm1,(%rax)
  jmp    L12
L50:
  ret
L61:
  mov    %r8d,%eax
  xor    %ecx,%ecx
  jmp    L62
L53:
  xor    %eax,%eax
  jmp    L54
```

tool_calls: name: parse_data
arguments: data_label: D2
datatype: f32

tool: D2: 0

assistant: ```c
void c_sapx(const int64_t N, const float alpha, float *X, const int64_t stride) {
  int64_t ix;
  int64_t m;
  int64_t i;
  if (N <= 0 || alpha == 0.0) {
    return;
  }
  if (stride == 1) {
    m = N % 5;
    if (m > 0) {
      for (i = 0; i < m; i++) {
        X[i] += alpha;
      }
    }
    if (N < 5) {
      return;
    }
    for (i = m; i < N; i += 5) {
      X[i] += alpha;
      X[i + 1] += alpha;
      X[i + 2] += alpha;
      X[i + 3] += alpha;
      X[i + 4] += alpha;
    }
    return;
  }
  if (stride < 0) {
    ix = (1 - N) * stride;
  } else {
    ix = 0;
  }
  for (i = 0; i < N; i++) {
    X[ix] += alpha;
    ix += stride;
  }
  return;
}
```