user: 请将以下的汇编代码转换成C语言代码：

```asm
<xvm_axpy>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x38(%rbp)
  movsd  %xmm0,-0x40(%rbp)
  mov    %rsi,-0x48(%rbp)
  mov    %rdx,-0x50(%rbp)
  mov    %rcx,-0x58(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L77
  mov    -0x38(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  jne    L77
  mov    $0x1,%eax
  jmp    L58
L77:
  mov    $0x0,%eax
L58:
  mov    %eax,%edi
  call   <assert@plt>
  cmpq   $0x0,-0x48(%rbp)
  je     L80
  mov    -0x48(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  jne    L80
  mov    $0x1,%eax
  jmp    L89
L80:
  mov    $0x0,%eax
L89:
  mov    %eax,%edi
  call   <assert@plt>
  cmpq   $0x0,-0x50(%rbp)
  je     L91
  mov    -0x50(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  jne    L91
  mov    $0x1,%eax
  jmp    L3
L91:
  mov    $0x0,%eax
L3:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <_mm_set1_pd@plt>
  mov    %eax,-0x2c(%rbp)
  movq   $0x0,-0x8(%rbp)
  jmp    L11
L86:
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_load_pd@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_load_pd@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_load_pd@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <_mm_load_pd@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_mul_pd@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_mul_pd@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_pd@plt>
  mov    %eax,-0x10(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_add_pd@plt>
  mov    %eax,-0xc(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%eax
  mov    %eax,%esi
  mov    %rdx,%rdi
  call   <_mm_store_pd@plt>
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  mov    %eax,%esi
  mov    %rdx,%rdi
  call   <_mm_store_pd@plt>
  addq   $0x4,-0x8(%rbp)
L11:
  mov    -0x8(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jb     L86
  nop
  nop
  leave
  ret
```

assistant: ```c
void xvm_axpy(double r[], double a, const double x[], const double y[], size_t N) {
  assert(r != NULL && ((size_t)r % 16) == 0);
  assert(x != NULL && ((size_t)x % 16) == 0);
  assert(y != NULL && ((size_t)y % 16) == 0);
  const __m128d va = _mm_set1_pd(a);
  for (size_t n = 0; n < N; n += 4) {
    const __m128d x0 = _mm_load_pd(x + n);
    const __m128d x1 = _mm_load_pd(x + n + 2);
    const __m128d y0 = _mm_load_pd(y + n);
    const __m128d y1 = _mm_load_pd(y + n + 2);
    const __m128d t0 = _mm_mul_pd(x0, va);
    const __m128d t1 = _mm_mul_pd(x1, va);
    const __m128d r0 = _mm_add_pd(t0, y0);
    const __m128d r1 = _mm_add_pd(t1, y1);
    _mm_store_pd(r + n, r0);
    _mm_store_pd(r + n + 2, r1);
  }
}
```