int blasDAXPY(int n, double da, double *dx, int incx, double *dy, int incy) {
  double dtmp0, dtmp, *dx0, *dy0;
  if (n > 0 && da != 0.) {
    incx *= sizeof(double);
    incy *= sizeof(double);
    *dy += da * (*dx);
    if ((n & 1) == 0) {
      dx = (double *)((char *)dx + incx);
      dy = (double *)((char *)dy + incy);
      *dy += da * (*dx);
      --n;
    }
    n = n >> 1;
    while (n > 0) {
      dy0 = (double *)((char *)dy + incy);
      dy = (double *)((char *)dy0 + incy);
      dtmp0 = (*dy0);
      dtmp = (*dy);
      dx0 = (double *)((char *)dx + incx);
      dx = (double *)((char *)dx0 + incx);
      *dy0 = dtmp0 + da * (*dx0);
      *dy = dtmp + da * (*dx);
      --n;
    }
  }
  return (0);
}


x86 assembly (clang, -O0):
<blasDAXPY>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    1290 <blasDAXPY+0x190>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1142 <blasDAXPY+0x42>
jp     1142 <blasDAXPY+0x42>
jmp    1290 <blasDAXPY+0x190>
movslq -0x1c(%rbp),%rax
shl    $0x3,%rax
mov    %eax,-0x1c(%rbp)
movslq -0x2c(%rbp),%rax
shl    $0x3,%rax
mov    %eax,-0x2c(%rbp)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    11d0 <blasDAXPY+0xd0>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    128b <blasDAXPY+0x18b>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
movslq -0x2c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movslq -0x1c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x50(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    11d9 <blasDAXPY+0xd9>
jmp    1290 <blasDAXPY+0x190>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<blasDAXPY>:
test   %edi,%edi
jle    11ae <blasDAXPY+0xae>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1118 <blasDAXPY+0x18>
jnp    11ae <blasDAXPY+0xae>
shl    $0x3,%edx
shl    $0x3,%r8d
movsd  (%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rcx),%xmm1
movsd  %xmm1,(%rcx)
movslq %edx,%rax
movslq %r8d,%rdx
test   $0x1,%dil
jne    1157 <blasDAXPY+0x57>
movsd  (%rsi,%rax,1),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rcx,%rdx,1),%xmm1
movsd  %xmm1,(%rcx,%rdx,1)
add    %rdx,%rcx
add    %rax,%rsi
add    $0xffffffff,%edi
cmp    $0x2,%edi
jb     11ae <blasDAXPY+0xae>
shr    %edi
add    $0x1,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rax,1),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rcx,%rdx,1),%xmm1
movsd  (%rcx,%rdx,2),%xmm2
movsd  %xmm1,(%rcx,%rdx,1)
movsd  (%rsi,%rax,2),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
movsd  %xmm1,(%rcx,%rdx,2)
add    %rdx,%rcx
add    %rdx,%rcx
add    %rax,%rsi
add    %rax,%rsi
add    $0xffffffff,%edi
cmp    $0x1,%edi
ja     1170 <blasDAXPY+0x70>
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @blasDAXPY(i32 %0, double %1, double* %2, i32 %3, double* %4, i32 %5) {
%7 = alloca i32
%8 = alloca double
%9 = alloca double*
%10 = alloca i32
%11 = alloca double*
%12 = alloca i32
%13 = alloca double
%14 = alloca double
%15 = alloca double*
%16 = alloca double*
store i32 %0, i32* %7
store double %1, double* %8
store double* %2, double** %9
store i32 %3, i32* %10
store double* %4, double** %11
store i32 %5, i32* %12
%17 = load i32, i32* %7
%18 = icmp sgt i32 %17, 0
br i1 %18, label %19, label %111
19: ; preds = %6
%20 = load double, double* %8
%21 = fcmp une double %20, 0.000000e+00
br i1 %21, label %22, label %111
22: ; preds = %19
%23 = load i32, i32* %10
%24 = sext i32 %23 to i64
%25 = mul i64 %24, 8
%26 = trunc i64 %25 to i32
store i32 %26, i32* %10
%27 = load i32, i32* %12
%28 = sext i32 %27 to i64
%29 = mul i64 %28, 8
%30 = trunc i64 %29 to i32
store i32 %30, i32* %12
%31 = load double, double* %8
%32 = load double*, double** %9
%33 = load double, double* %32
%34 = load double*, double** %11
%35 = load double, double* %34
%36 = call double @llvm.fmuladd.f64(double %31, double %33, double %35)
store double %36, double* %34
%37 = load i32, i32* %7
%38 = and i32 %37, 1
%39 = icmp eq i32 %38, 0
br i1 %39, label %40, label %61
40: ; preds = %22
%41 = load double*, double** %9
%42 = bitcast double* %41 to i8*
%43 = load i32, i32* %10
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = bitcast i8* %45 to double*
store double* %46, double** %9
%47 = load double*, double** %11
%48 = bitcast double* %47 to i8*
%49 = load i32, i32* %12
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
%52 = bitcast i8* %51 to double*
store double* %52, double** %11
%53 = load double, double* %8
%54 = load double*, double** %9
%55 = load double, double* %54
%56 = load double*, double** %11
%57 = load double, double* %56
%58 = call double @llvm.fmuladd.f64(double %53, double %55, double %57)
store double %58, double* %56
%59 = load i32, i32* %7
%60 = add nsw i32 %59, -1
store i32 %60, i32* %7
br label %61
61: ; preds = %40, %22
%62 = load i32, i32* %7
%63 = ashr i32 %62, 1
store i32 %63, i32* %7
br label %64
64: ; preds = %67, %61
%65 = load i32, i32* %7
%66 = icmp sgt i32 %65, 0
br i1 %66, label %67, label %110
67: ; preds = %64
%68 = load double*, double** %11
%69 = bitcast double* %68 to i8*
%70 = load i32, i32* %12
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %69, i64 %71
%73 = bitcast i8* %72 to double*
store double* %73, double** %16
%74 = load double*, double** %16
%75 = bitcast double* %74 to i8*
%76 = load i32, i32* %12
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i8, i8* %75, i64 %77
%79 = bitcast i8* %78 to double*
store double* %79, double** %11
%80 = load double*, double** %16
%81 = load double, double* %80
store double %81, double* %13
%82 = load double*, double** %11
%83 = load double, double* %82
store double %83, double* %14
%84 = load double*, double** %9
%85 = bitcast double* %84 to i8*
%86 = load i32, i32* %10
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i8, i8* %85, i64 %87
%89 = bitcast i8* %88 to double*
store double* %89, double** %15
%90 = load double*, double** %15
%91 = bitcast double* %90 to i8*
%92 = load i32, i32* %10
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = bitcast i8* %94 to double*
store double* %95, double** %9
%96 = load double, double* %13
%97 = load double, double* %8
%98 = load double*, double** %15
%99 = load double, double* %98
%100 = call double @llvm.fmuladd.f64(double %97, double %99, double %96)
%101 = load double*, double** %16
store double %100, double* %101
%102 = load double, double* %14
%103 = load double, double* %8
%104 = load double*, double** %9
%105 = load double, double* %104
%106 = call double @llvm.fmuladd.f64(double %103, double %105, double %102)
%107 = load double*, double** %11
store double %106, double* %107
%108 = load i32, i32* %7
%109 = add nsw i32 %108, -1
store i32 %109, i32* %7
br label %64
110: ; preds = %64
br label %111
111: ; preds = %110, %19, %6
ret i32 0
}

LLVM IR (-O2):
define i32 @blasDAXPY(i32 %0, double %1, double* nocapture %2, i32 %3, double* nocapture %4, i32 %5) {
%7 = icmp sgt i32 %0, 0
%8 = fcmp une double %1, 0.000000e+00
%9 = and i1 %7, %8
br i1 %9, label %10, label %62
10: ; preds = %6
%11 = shl i32 %3, 3
%12 = shl i32 %5, 3
%13 = load double, double* %2
%14 = load double, double* %4
%15 = tail call double @llvm.fmuladd.f64(double %1, double %13, double %14)
store double %15, double* %4
%16 = and i32 %0, 1
%17 = icmp eq i32 %16, 0
br i1 %17, label %18, label %31
18: ; preds = %10
%19 = bitcast double* %2 to i8*
%20 = sext i32 %11 to i64
%21 = getelementptr inbounds i8, i8* %19, i64 %20
%22 = bitcast i8* %21 to double*
%23 = bitcast double* %4 to i8*
%24 = sext i32 %12 to i64
%25 = getelementptr inbounds i8, i8* %23, i64 %24
%26 = bitcast i8* %25 to double*
%27 = load double, double* %22
%28 = load double, double* %26
%29 = tail call double @llvm.fmuladd.f64(double %1, double %27, double %28)
store double %29, double* %26
%30 = add nsw i32 %0, -1
br label %31
31: ; preds = %18, %10
%32 = phi double* [ %26, %18 ], [ %4, %10 ]
%33 = phi double* [ %22, %18 ], [ %2, %10 ]
%34 = phi i32 [ %30, %18 ], [ %0, %10 ]
%35 = icmp ult i32 %34, 2
br i1 %35, label %62, label %36
36: ; preds = %31
%37 = lshr i32 %34, 1
%38 = sext i32 %12 to i64
%39 = sext i32 %11 to i64
br label %40
40: ; preds = %36, %40
%41 = phi i32 [ %37, %36 ], [ %60, %40 ]
%42 = phi double* [ %33, %36 ], [ %55, %40 ]
%43 = phi double* [ %32, %36 ], [ %48, %40 ]
%44 = bitcast double* %43 to i8*
%45 = getelementptr inbounds i8, i8* %44, i64 %38
%46 = bitcast i8* %45 to double*
%47 = getelementptr inbounds i8, i8* %45, i64 %38
%48 = bitcast i8* %47 to double*
%49 = load double, double* %46
%50 = load double, double* %48
%51 = bitcast double* %42 to i8*
%52 = getelementptr inbounds i8, i8* %51, i64 %39
%53 = bitcast i8* %52 to double*
%54 = getelementptr inbounds i8, i8* %52, i64 %39
%55 = bitcast i8* %54 to double*
%56 = load double, double* %53
%57 = tail call double @llvm.fmuladd.f64(double %1, double %56, double %49)
store double %57, double* %46
%58 = load double, double* %55
%59 = tail call double @llvm.fmuladd.f64(double %1, double %58, double %50)
store double %59, double* %48
%60 = add nsw i32 %41, -1
%61 = icmp ugt i32 %41, 1
br i1 %61, label %40, label %62
62: ; preds = %40, %31, %6
ret i32 0
}