void CopyColumn(n1, src, dest) int n1;
double *src;
double *dest;
{
  int i;
  for (i = 0; i < n1; i++) {
    dest[2 * i] = src[2 * i];
    dest[2 * i + 1] = src[2 * i + 1];
  }
}


x86 assembly (clang, -O0):
<CopyColumn>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    117e <CopyColumn+0x7e>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1116 <CopyColumn+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<CopyColumn>:
test   %edi,%edi
jle    1288 <CopyColumn+0x188>
mov    %edi,%eax
cmp    $0x1,%edi
je     112f <CopyColumn+0x2f>
mov    %rax,%rcx
shl    $0x4,%rcx
lea    (%rsi,%rcx,1),%rdi
cmp    %rdx,%rdi
jbe    11ad <CopyColumn+0xad>
add    %rdx,%rcx
cmp    %rsi,%rcx
jbe    11ad <CopyColumn+0xad>
xor    %ecx,%ecx
mov    %rcx,%r8
not    %r8
test   $0x1,%al
je     115c <CopyColumn+0x5c>
mov    %rcx,%rdi
shl    $0x4,%rdi
movsd  (%rsi,%rdi,1),%xmm0
movsd  %xmm0,(%rdx,%rdi,1)
movsd  0x8(%rsi,%rdi,1),%xmm0
movsd  %xmm0,0x8(%rdx,%rdi,1)
or     $0x1,%rcx
add    %rax,%r8
je     1288 <CopyColumn+0x188>
sub    %rcx,%rax
shl    $0x4,%rcx
add    $0x18,%rcx
movsd  -0x18(%rsi,%rcx,1),%xmm0
movsd  %xmm0,-0x18(%rdx,%rcx,1)
movsd  -0x10(%rsi,%rcx,1),%xmm0
movsd  %xmm0,-0x10(%rdx,%rcx,1)
movsd  -0x8(%rsi,%rcx,1),%xmm0
movsd  %xmm0,-0x8(%rdx,%rcx,1)
movsd  (%rsi,%rcx,1),%xmm0
movsd  %xmm0,(%rdx,%rcx,1)
add    $0x20,%rcx
add    $0xfffffffffffffffe,%rax
jne    1170 <CopyColumn+0x70>
jmp    1288 <CopyColumn+0x188>
mov    %eax,%ecx
and    $0xfffffffe,%ecx
lea    -0x2(%rcx),%rdi
mov    %rdi,%r9
shr    %r9
add    $0x1,%r9
mov    %r9d,%r8d
and    $0x3,%r8d
cmp    $0x6,%rdi
jae    11d2 <CopyColumn+0xd2>
xor    %r10d,%r10d
jmp    123c <CopyColumn+0x13c>
and    $0xfffffffffffffffc,%r9
mov    $0x30,%edi
xor    %r10d,%r10d
xchg   %ax,%ax
movups -0x60(%rsi,%rdi,2),%xmm0
movups -0x50(%rsi,%rdi,2),%xmm1
movups %xmm1,-0x50(%rdx,%rdi,2)
movups %xmm0,-0x60(%rdx,%rdi,2)
movups -0x40(%rsi,%rdi,2),%xmm0
movups -0x30(%rsi,%rdi,2),%xmm1
movups %xmm1,-0x30(%rdx,%rdi,2)
movups %xmm0,-0x40(%rdx,%rdi,2)
movups -0x20(%rsi,%rdi,2),%xmm0
movups -0x10(%rsi,%rdi,2),%xmm1
movups %xmm1,-0x10(%rdx,%rdi,2)
movups %xmm0,-0x20(%rdx,%rdi,2)
movups (%rsi,%rdi,2),%xmm0
movups 0x10(%rsi,%rdi,2),%xmm1
movups %xmm1,0x10(%rdx,%rdi,2)
movups %xmm0,(%rdx,%rdi,2)
add    $0x8,%r10
add    $0x40,%rdi
add    $0xfffffffffffffffc,%r9
jne    11e0 <CopyColumn+0xe0>
test   %r8,%r8
je     127f <CopyColumn+0x17f>
shl    $0x4,%r10
lea    (%rdx,%r10,1),%r9
add    %rsi,%r10
shl    $0x5,%r8
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups (%r10,%rdi,1),%xmm0
movups 0x10(%r10,%rdi,1),%xmm1
movups %xmm1,0x10(%r9,%rdi,1)
movups %xmm0,(%r9,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%r8
jne    1260 <CopyColumn+0x160>
cmp    %rax,%rcx
jne    1131 <CopyColumn+0x31>
ret

LLVM IR (-O0):
define void @CopyColumn(i32 %0, double* %1, double* %2) {
%4 = alloca i32
%5 = alloca double*
%6 = alloca double*
%7 = alloca i32
store i32 %0, i32* %4
store double* %1, double** %5
store double* %2, double** %6
store i32 0, i32* %7
br label %8
8: ; preds = %37, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %4
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %40
12: ; preds = %8
%13 = load double*, double** %5
%14 = load i32, i32* %7
%15 = mul nsw i32 2, %14
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds double, double* %13, i64 %16
%18 = load double, double* %17
%19 = load double*, double** %6
%20 = load i32, i32* %7
%21 = mul nsw i32 2, %20
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds double, double* %19, i64 %22
store double %18, double* %23
%24 = load double*, double** %5
%25 = load i32, i32* %7
%26 = mul nsw i32 2, %25
%27 = add nsw i32 %26, 1
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds double, double* %24, i64 %28
%30 = load double, double* %29
%31 = load double*, double** %6
%32 = load i32, i32* %7
%33 = mul nsw i32 2, %32
%34 = add nsw i32 %33, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds double, double* %31, i64 %35
store double %30, double* %36
br label %37
37: ; preds = %12
%38 = load i32, i32* %7
%39 = add nsw i32 %38, 1
store i32 %39, i32* %7
br label %8
40: ; preds = %8
ret void
}

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