void dscal_(int n, double da, double *dx) {
  int i, m;
  if (n <= 0) {
    return;
  }
  m = n % 5;
  if (m != 0) {
    for (i = 0; i < m; ++i) {
      dx[i] = da * dx[i];
    }
    if (n < 5) {
      return;
    }
  }
  for (i = m; i < n; i += 5) {
    dx[i] = da * dx[i];
    dx[i + 1] = da * dx[i + 1];
    dx[i + 2] = da * dx[i + 2];
    dx[i + 3] = da * dx[i + 3];
    dx[i + 4] = da * dx[i + 4];
  }
}


x86 assembly (clang, -O0):
<dscal_>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     111f <dscal_+0x1f>
jmp    126e <dscal_+0x16e>
mov    -0x4(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     118b <dscal_+0x8b>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1177 <dscal_+0x77>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    113e <dscal_+0x3e>
cmpl   $0x5,-0x4(%rbp)
jge    1186 <dscal_+0x86>
jmp    126e <dscal_+0x16e>
jmp    118b <dscal_+0x8b>
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    126e <dscal_+0x16e>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x1c(%rbp)
jmp    1191 <dscal_+0x91>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dscal_>:
push   %rbx
test   %edi,%edi
jle    1273 <dscal_+0x173>
mov    %edi,%r8d
mov    $0xcccccccd,%r10d
mov    %r8,%rax
imul   %r10,%rax
shr    $0x22,%rax
lea    (%rax,%rax,4),%eax
mov    %edi,%r9d
sub    %eax,%r9d
je     1211 <dscal_+0x111>
mov    %r9d,%edx
cmp    $0x4,%r9d
jae    113c <dscal_+0x3c>
xor    %eax,%eax
jmp    11f0 <dscal_+0xf0>
mov    %edx,%eax
and    $0x4,%eax
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%rax),%rcx
mov    %rcx,%r11
shr    $0x2,%r11
add    $0x1,%r11
test   %rcx,%rcx
je     1275 <dscal_+0x175>
mov    %r11,%rbx
and    $0xfffffffffffffffe,%rbx
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movupd (%rsi,%rcx,8),%xmm2
movupd 0x10(%rsi,%rcx,8),%xmm3
movupd 0x20(%rsi,%rcx,8),%xmm4
movupd 0x30(%rsi,%rcx,8),%xmm5
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rsi,%rcx,8)
movupd %xmm3,0x10(%rsi,%rcx,8)
mulpd  %xmm1,%xmm4
mulpd  %xmm1,%xmm5
movupd %xmm4,0x20(%rsi,%rcx,8)
movupd %xmm5,0x30(%rsi,%rcx,8)
add    $0x8,%rcx
add    $0xfffffffffffffffe,%rbx
jne    1170 <dscal_+0x70>
test   $0x1,%r11b
je     11dc <dscal_+0xdc>
movupd (%rsi,%rcx,8),%xmm2
movupd 0x10(%rsi,%rcx,8),%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rsi,%rcx,8)
movupd %xmm3,0x10(%rsi,%rcx,8)
cmp    %rdx,%rax
je     1207 <dscal_+0x107>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rax,8)
add    $0x1,%rax
cmp    %rax,%rdx
jne    11f0 <dscal_+0xf0>
cmp    $0x5,%edi
jl     1273 <dscal_+0x173>
cmp    %edi,%r9d
jge    1273 <dscal_+0x173>
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
imul   %r8,%r10
shr    $0x22,%r10
lea    (%r10,%r10,4),%rax
sub    %rax,%r8
lea    (%rsi,%r8,8),%rax
add    $0x20,%rax
lea    (%r10,%r10,4),%edx
mov    %edi,%ecx
sub    %edx,%ecx
nopl   0x0(%rax,%rax,1)
movupd -0x20(%rax),%xmm2
movupd -0x10(%rax),%xmm3
mulpd  %xmm1,%xmm2
movupd %xmm2,-0x20(%rax)
mulpd  %xmm1,%xmm3
movupd %xmm3,-0x10(%rax)
movsd  (%rax),%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,(%rax)
add    $0x28,%rax
add    $0x5,%ecx
cmp    %edi,%ecx
jl     1240 <dscal_+0x140>
pop    %rbx
ret
xor    %ecx,%ecx
test   $0x1,%r11b
jne    11be <dscal_+0xbe>
jmp    11dc <dscal_+0xdc>

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

LLVM IR (-O2):
define void @dscal_(i32 %0, double %1, double* nocapture %2) {
%4 = icmp slt i32 %0, 1
br i1 %4, label %107, label %5
5: ; preds = %3
%6 = urem i32 %0, 5
%7 = icmp eq i32 %6, 0
br i1 %7, label %80, label %8
8: ; preds = %5
%9 = zext i32 %6 to i64
%10 = icmp ult i32 %6, 4
br i1 %10, label %67, label %11
11: ; preds = %8
%12 = and i64 %9, 4
%13 = insertelement <2 x double> poison, double %1, i64 0
%14 = shufflevector <2 x double> %13, <2 x double> poison, <2 x i32> zeroinitializer
%15 = insertelement <2 x double> poison, double %1, i64 0
%16 = shufflevector <2 x double> %15, <2 x double> poison, <2 x i32> zeroinitializer
%17 = add nsw i64 %12, -4
%18 = lshr exact i64 %17, 2
%19 = add nuw nsw i64 %18, 1
%20 = and i64 %19, 1
%21 = icmp eq i64 %17, 0
br i1 %21, label %51, label %22
22: ; preds = %11
%23 = and i64 %19, 9223372036854775806
br label %24
24: ; preds = %24, %22
%25 = phi i64 [ 0, %22 ], [ %48, %24 ]
%26 = phi i64 [ 0, %22 ], [ %49, %24 ]
%27 = getelementptr inbounds double, double* %2, i64 %25
%28 = bitcast double* %27 to <2 x double>*
%29 = load <2 x double>, <2 x double>* %28
%30 = getelementptr inbounds double, double* %27, i64 2
%31 = bitcast double* %30 to <2 x double>*
%32 = load <2 x double>, <2 x double>* %31
%33 = fmul <2 x double> %29, %14
%34 = fmul <2 x double> %32, %16
%35 = bitcast double* %27 to <2 x double>*
store <2 x double> %33, <2 x double>* %35
%36 = bitcast double* %30 to <2 x double>*
store <2 x double> %34, <2 x double>* %36
%37 = or i64 %25, 4
%38 = getelementptr inbounds double, double* %2, i64 %37
%39 = bitcast double* %38 to <2 x double>*
%40 = load <2 x double>, <2 x double>* %39
%41 = getelementptr inbounds double, double* %38, i64 2
%42 = bitcast double* %41 to <2 x double>*
%43 = load <2 x double>, <2 x double>* %42
%44 = fmul <2 x double> %40, %14
%45 = fmul <2 x double> %43, %16
%46 = bitcast double* %38 to <2 x double>*
store <2 x double> %44, <2 x double>* %46
%47 = bitcast double* %41 to <2 x double>*
store <2 x double> %45, <2 x double>* %47
%48 = add nuw i64 %25, 8
%49 = add i64 %26, 2
%50 = icmp eq i64 %49, %23
br i1 %50, label %51, label %24
51: ; preds = %24, %11
%52 = phi i64 [ 0, %11 ], [ %48, %24 ]
%53 = icmp eq i64 %20, 0
br i1 %53, label %65, label %54
54: ; preds = %51
%55 = getelementptr inbounds double, double* %2, i64 %52
%56 = bitcast double* %55 to <2 x double>*
%57 = load <2 x double>, <2 x double>* %56
%58 = getelementptr inbounds double, double* %55, i64 2
%59 = bitcast double* %58 to <2 x double>*
%60 = load <2 x double>, <2 x double>* %59
%61 = fmul <2 x double> %57, %14
%62 = fmul <2 x double> %60, %16
%63 = bitcast double* %55 to <2 x double>*
store <2 x double> %61, <2 x double>* %63
%64 = bitcast double* %58 to <2 x double>*
store <2 x double> %62, <2 x double>* %64
br label %65
65: ; preds = %51, %54
%66 = icmp eq i64 %12, %9
br i1 %66, label %76, label %67
67: ; preds = %8, %65
%68 = phi i64 [ 0, %8 ], [ %12, %65 ]
br label %69
69: ; preds = %67, %69
%70 = phi i64 [ %74, %69 ], [ %68, %67 ]
%71 = getelementptr inbounds double, double* %2, i64 %70
%72 = load double, double* %71
%73 = fmul double %72, %1
store double %73, double* %71
%74 = add nuw nsw i64 %70, 1
%75 = icmp eq i64 %74, %9
br i1 %75, label %76, label %69
76: ; preds = %69, %65
%77 = icmp sgt i32 %0, 4
%78 = icmp slt i32 %6, %0
%79 = and i1 %77, %78
br i1 %79, label %80, label %107
80: ; preds = %5, %76
%81 = urem i32 %0, 5
%82 = zext i32 %81 to i64
%83 = insertelement <2 x double> poison, double %1, i64 0
%84 = shufflevector <2 x double> %83, <2 x double> poison, <2 x i32> zeroinitializer
%85 = insertelement <2 x double> poison, double %1, i64 0
%86 = shufflevector <2 x double> %85, <2 x double> poison, <2 x i32> zeroinitializer
br label %87
87: ; preds = %80, %87
%88 = phi i64 [ %82, %80 ], [ %104, %87 ]
%89 = getelementptr inbounds double, double* %2, i64 %88
%90 = bitcast double* %89 to <2 x double>*
%91 = load <2 x double>, <2 x double>* %90
%92 = fmul <2 x double> %91, %84
%93 = bitcast double* %89 to <2 x double>*
store <2 x double> %92, <2 x double>* %93
%94 = add nuw nsw i64 %88, 2
%95 = getelementptr inbounds double, double* %2, i64 %94
%96 = bitcast double* %95 to <2 x double>*
%97 = load <2 x double>, <2 x double>* %96
%98 = fmul <2 x double> %97, %86
%99 = bitcast double* %95 to <2 x double>*
store <2 x double> %98, <2 x double>* %99
%100 = add nuw nsw i64 %88, 4
%101 = getelementptr inbounds double, double* %2, i64 %100
%102 = load double, double* %101
%103 = fmul double %102, %1
store double %103, double* %101
%104 = add nuw nsw i64 %88, 5
%105 = trunc i64 %104 to i32
%106 = icmp slt i32 %105, %0
br i1 %106, label %87, label %107
107: ; preds = %87, %76, %3
ret void
}