double *bartlett(double *w, const int leng) {
  int k, m;
  double *p, slope;
  m = leng / 2;
  slope = 2.0 / (double)(leng - 1);
  for (k = 0, p = w; k < m; k++)
    *p++ = slope * k;
  for (; k < leng; k++)
    *p++ = 2.0 - slope * k;
  return (w);
}


x86 assembly (clang, -O0):
<bartlett>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  0xed5(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    117e <bartlett+0x7e>
movsd  -0x28(%rbp),%xmm0
cvtsi2sdl -0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1143 <bartlett+0x43>
jmp    1183 <bartlett+0x83>
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11e1 <bartlett+0xe1>
movsd  -0x28(%rbp),%xmm0
cvtsi2sdl -0x10(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe44(%rip),%xmm1
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1183 <bartlett+0x83>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bartlett>:
mov    %rdi,%rax
lea    -0x1(%rsi),%ecx
cvtsi2sd %ecx,%xmm0
movsd  0xeed(%rip),%xmm8
movapd %xmm8,%xmm1
divsd  %xmm0,%xmm1
xor    %r11d,%r11d
mov    %rdi,%rdx
cmp    $0x2,%esi
jl     126b <bartlett+0x16b>
mov    %esi,%r11d
shr    $0x1f,%r11d
add    %esi,%r11d
sar    %r11d
lea    -0x1(%r11),%r8d
xor    %edi,%edi
mov    %rax,%rdx
cmp    $0x3,%r8d
jb     1250 <bartlett+0x150>
add    $0x1,%r8
mov    %r8,%rdi
and    $0xfffffffffffffffc,%rdi
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
lea    -0x4(%rdi),%rcx
mov    %rcx,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     13e3 <bartlett+0x2e3>
mov    %r9,%rcx
and    $0xfffffffffffffffe,%rcx
movdqa 0xe8b(%rip),%xmm4
xor    %edx,%edx
movdqa 0xe90(%rip),%xmm9
movdqa 0xe97(%rip),%xmm10
movdqa 0xe9f(%rip),%xmm5
movdqa 0xea7(%rip),%xmm6
nopl   0x0(%rax)
movdqa %xmm4,%xmm7
cvtdq2pd %xmm4,%xmm0
paddd  %xmm9,%xmm7
cvtdq2pd %xmm7,%xmm7
mulpd  %xmm2,%xmm0
mulpd  %xmm2,%xmm7
movupd %xmm0,(%rax,%rdx,8)
movdqa %xmm4,%xmm0
paddd  %xmm10,%xmm0
movdqa %xmm4,%xmm3
paddd  %xmm5,%xmm3
cvtdq2pd %xmm0,%xmm0
cvtdq2pd %xmm3,%xmm3
movupd %xmm7,0x10(%rax,%rdx,8)
mulpd  %xmm2,%xmm0
mulpd  %xmm2,%xmm3
movupd %xmm0,0x20(%rax,%rdx,8)
movupd %xmm3,0x30(%rax,%rdx,8)
add    $0x8,%rdx
paddd  %xmm6,%xmm4
add    $0xfffffffffffffffe,%rcx
jne    11b0 <bartlett+0xb0>
test   $0x1,%r9b
je     1238 <bartlett+0x138>
cvtdq2pd %xmm4,%xmm0
paddd  0xdff(%rip),%xmm4
cvtdq2pd %xmm4,%xmm3
mulpd  %xmm2,%xmm0
mulpd  %xmm2,%xmm3
movupd %xmm0,(%rax,%rdx,8)
movupd %xmm3,0x10(%rax,%rdx,8)
lea    (%rax,%rdi,8),%rdx
cmp    %rdi,%r8
je     126b <bartlett+0x16b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2sd %edi,%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
add    $0x8,%rdx
add    $0x1,%edi
cmp    %edi,%r11d
jne    1250 <bartlett+0x150>
cmp    %esi,%r11d
jge    13e2 <bartlett+0x2e2>
xorpd  0xde4(%rip),%xmm1
mov    %r11d,%r9d
not    %r9d
add    %esi,%r9d
cmp    $0x3,%r9d
jb     13c0 <bartlett+0x2c0>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffffc,%r8
movd   %r11d,%xmm0
pshufd $0x50,%xmm0,%xmm4
paddd  0xd64(%rip),%xmm4
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
lea    -0x4(%r8),%rcx
mov    %rcx,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rcx,%rcx
je     13fc <bartlett+0x2fc>
mov    %r10,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %edi,%edi
movdqa 0xd42(%rip),%xmm9
movapd 0xd8a(%rip),%xmm5
movdqa 0xd41(%rip),%xmm10
movdqa 0xd49(%rip),%xmm7
movdqa 0xd51(%rip),%xmm0
nop
movdqa %xmm4,%xmm3
cvtdq2pd %xmm4,%xmm6
paddd  %xmm9,%xmm3
cvtdq2pd %xmm3,%xmm3
mulpd  %xmm2,%xmm6
addpd  %xmm5,%xmm6
mulpd  %xmm2,%xmm3
addpd  %xmm5,%xmm3
movupd %xmm6,(%rdx,%rdi,8)
movupd %xmm3,0x10(%rdx,%rdi,8)
movdqa %xmm4,%xmm3
paddd  %xmm10,%xmm3
movdqa %xmm4,%xmm6
cvtdq2pd %xmm3,%xmm3
paddd  %xmm7,%xmm6
cvtdq2pd %xmm6,%xmm6
mulpd  %xmm2,%xmm3
addpd  %xmm5,%xmm3
mulpd  %xmm2,%xmm6
addpd  %xmm5,%xmm6
movupd %xmm3,0x20(%rdx,%rdi,8)
movupd %xmm6,0x30(%rdx,%rdi,8)
add    $0x8,%rdi
paddd  %xmm0,%xmm4
add    $0xfffffffffffffffe,%rcx
jne    1300 <bartlett+0x200>
test   $0x1,%r10b
je     13a8 <bartlett+0x2a8>
cvtdq2pd %xmm4,%xmm0
paddd  0xc9f(%rip),%xmm4
cvtdq2pd %xmm4,%xmm3
mulpd  %xmm2,%xmm0
movapd 0xcdf(%rip),%xmm4
addpd  %xmm4,%xmm0
mulpd  %xmm2,%xmm3
addpd  %xmm4,%xmm3
movupd %xmm0,(%rdx,%rdi,8)
movupd %xmm3,0x10(%rdx,%rdi,8)
cmp    %r8,%r9
je     13e2 <bartlett+0x2e2>
add    %r8d,%r11d
lea    (%rdx,%r8,8),%rdx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xorps  %xmm0,%xmm0
cvtsi2sd %r11d,%xmm0
mulsd  %xmm1,%xmm0
addsd  %xmm8,%xmm0
movsd  %xmm0,(%rdx)
add    $0x8,%rdx
add    $0x1,%r11d
cmp    %r11d,%esi
jne    13c0 <bartlett+0x2c0>
ret
movdqa 0xc25(%rip),%xmm4
xor    %edx,%edx
test   $0x1,%r9b
jne    1215 <bartlett+0x115>
jmp    1238 <bartlett+0x138>
xor    %edi,%edi
test   $0x1,%r10b
jne    1375 <bartlett+0x275>
jmp    13a8 <bartlett+0x2a8>

LLVM IR (-O0):
define double* @bartlett(double* %0, i32 %1) {
%3 = alloca double*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca double*
%8 = alloca double
store double* %0, double** %3
store i32 %1, i32* %4
%9 = load i32, i32* %4
%10 = sdiv i32 %9, 2
store i32 %10, i32* %6
%11 = load i32, i32* %4
%12 = sub nsw i32 %11, 1
%13 = sitofp i32 %12 to double
%14 = fdiv double 2.000000e+00, %13
store double %14, double* %8
store i32 0, i32* %5
%15 = load double*, double** %3
store double* %15, double** %7
br label %16
16: ; preds = %27, %2
%17 = load i32, i32* %5
%18 = load i32, i32* %6
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %30
20: ; preds = %16
%21 = load double, double* %8
%22 = load i32, i32* %5
%23 = sitofp i32 %22 to double
%24 = fmul double %21, %23
%25 = load double*, double** %7
%26 = getelementptr inbounds double, double* %25, i32 1
store double* %26, double** %7
store double %24, double* %25
br label %27
27: ; preds = %20
%28 = load i32, i32* %5
%29 = add nsw i32 %28, 1
store i32 %29, i32* %5
br label %16
30: ; preds = %16
br label %31
31: ; preds = %43, %30
%32 = load i32, i32* %5
%33 = load i32, i32* %4
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %46
35: ; preds = %31
%36 = load double, double* %8
%37 = load i32, i32* %5
%38 = sitofp i32 %37 to double
%39 = fneg double %36
%40 = call double @llvm.fmuladd.f64(double %39, double %38, double 2.000000e+00)
%41 = load double*, double** %7
%42 = getelementptr inbounds double, double* %41, i32 1
store double* %42, double** %7
store double %40, double* %41
br label %43
43: ; preds = %35
%44 = load i32, i32* %5
%45 = add nsw i32 %44, 1
store i32 %45, i32* %5
br label %31
46: ; preds = %31
%47 = load double*, double** %3
ret double* %47
}

LLVM IR (-O2):
define double* @bartlett(double* returned writeonly %0, i32 %1) {
%3 = sdiv i32 %1, 2
%4 = add nsw i32 %1, -1
%5 = sitofp i32 %4 to double
%6 = fdiv double 2.000000e+00, %5
%7 = icmp sgt i32 %1, 1
br i1 %7, label %8, label %75
8: ; preds = %2
%9 = add nsw i32 %3, -1
%10 = zext i32 %9 to i64
%11 = add nuw nsw i64 %10, 1
%12 = icmp ult i32 %9, 3
br i1 %12, label %72, label %13
13: ; preds = %8
%14 = and i64 %11, 8589934588
%15 = trunc i64 %14 to i32
%16 = getelementptr double, double* %0, i64 %14
%17 = insertelement <2 x double> poison, double %6, i64 0
%18 = shufflevector <2 x double> %17, <2 x double> poison, <2 x i32> zeroinitializer
%19 = insertelement <2 x double> poison, double %6, i64 0
%20 = shufflevector <2 x double> %19, <2 x double> poison, <2 x i32> zeroinitializer
%21 = add nsw i64 %14, -4
%22 = lshr exact i64 %21, 2
%23 = add nuw nsw i64 %22, 1
%24 = and i64 %23, 1
%25 = icmp eq i64 %21, 0
br i1 %25, label %56, label %26
26: ; preds = %13
%27 = and i64 %23, 9223372036854775806
br label %28
28: ; preds = %28, %26
%29 = phi i64 [ 0, %26 ], [ %52, %28 ]
%30 = phi <2 x i32> [ <i32 0, i32 1>, %26 ], [ %53, %28 ]
%31 = phi i64 [ 0, %26 ], [ %54, %28 ]
%32 = add <2 x i32> %30, <i32 2, i32 2>
%33 = getelementptr double, double* %0, i64 %29
%34 = sitofp <2 x i32> %30 to <2 x double>
%35 = sitofp <2 x i32> %32 to <2 x double>
%36 = fmul <2 x double> %18, %34
%37 = fmul <2 x double> %20, %35
%38 = bitcast double* %33 to <2 x double>*
store <2 x double> %36, <2 x double>* %38
%39 = getelementptr double, double* %33, i64 2
%40 = bitcast double* %39 to <2 x double>*
store <2 x double> %37, <2 x double>* %40
%41 = or i64 %29, 4
%42 = add <2 x i32> %30, <i32 4, i32 4>
%43 = add <2 x i32> %30, <i32 6, i32 6>
%44 = getelementptr double, double* %0, i64 %41
%45 = sitofp <2 x i32> %42 to <2 x double>
%46 = sitofp <2 x i32> %43 to <2 x double>
%47 = fmul <2 x double> %18, %45
%48 = fmul <2 x double> %20, %46
%49 = bitcast double* %44 to <2 x double>*
store <2 x double> %47, <2 x double>* %49
%50 = getelementptr double, double* %44, i64 2
%51 = bitcast double* %50 to <2 x double>*
store <2 x double> %48, <2 x double>* %51
%52 = add nuw i64 %29, 8
%53 = add <2 x i32> %30, <i32 8, i32 8>
%54 = add i64 %31, 2
%55 = icmp eq i64 %54, %27
br i1 %55, label %56, label %28
56: ; preds = %28, %13
%57 = phi i64 [ 0, %13 ], [ %52, %28 ]
%58 = phi <2 x i32> [ <i32 0, i32 1>, %13 ], [ %53, %28 ]
%59 = icmp eq i64 %24, 0
br i1 %59, label %70, label %60
60: ; preds = %56
%61 = add <2 x i32> %58, <i32 2, i32 2>
%62 = getelementptr double, double* %0, i64 %57
%63 = sitofp <2 x i32> %58 to <2 x double>
%64 = sitofp <2 x i32> %61 to <2 x double>
%65 = fmul <2 x double> %18, %63
%66 = fmul <2 x double> %20, %64
%67 = bitcast double* %62 to <2 x double>*
store <2 x double> %65, <2 x double>* %67
%68 = getelementptr double, double* %62, i64 2
%69 = bitcast double* %68 to <2 x double>*
store <2 x double> %66, <2 x double>* %69
br label %70
70: ; preds = %56, %60
%71 = icmp eq i64 %11, %14
br i1 %71, label %75, label %72
72: ; preds = %8, %70
%73 = phi i32 [ 0, %8 ], [ %15, %70 ]
%74 = phi double* [ %0, %8 ], [ %16, %70 ]
br label %152
75: ; preds = %152, %70, %2
%76 = phi double* [ %0, %2 ], [ %16, %70 ], [ %157, %152 ]
%77 = phi i32 [ 0, %2 ], [ %3, %70 ], [ %3, %152 ]
%78 = icmp slt i32 %77, %1
br i1 %78, label %79, label %168
79: ; preds = %75
%80 = fneg double %6
%81 = xor i32 %77, -1
%82 = add i32 %81, %1
%83 = zext i32 %82 to i64
%84 = add nuw nsw i64 %83, 1
%85 = icmp ult i32 %82, 3
br i1 %85, label %149, label %86
86: ; preds = %79
%87 = and i64 %84, 8589934588
%88 = trunc i64 %87 to i32
%89 = add i32 %77, %88
%90 = getelementptr double, double* %76, i64 %87
%91 = insertelement <2 x i32> poison, i32 %77, i64 0
%92 = shufflevector <2 x i32> %91, <2 x i32> poison, <2 x i32> zeroinitializer
%93 = add <2 x i32> %92, <i32 0, i32 1>
%94 = insertelement <2 x double> poison, double %80, i64 0
%95 = shufflevector <2 x double> %94, <2 x double> poison, <2 x i32> zeroinitializer
%96 = insertelement <2 x double> poison, double %80, i64 0
%97 = shufflevector <2 x double> %96, <2 x double> poison, <2 x i32> zeroinitializer
%98 = add nsw i64 %87, -4
%99 = lshr exact i64 %98, 2
%100 = add nuw nsw i64 %99, 1
%101 = and i64 %100, 1
%102 = icmp eq i64 %98, 0
br i1 %102, label %133, label %103
103: ; preds = %86
%104 = and i64 %100, 9223372036854775806
br label %105
105: ; preds = %105, %103
%106 = phi i64 [ 0, %103 ], [ %129, %105 ]
%107 = phi <2 x i32> [ %93, %103 ], [ %130, %105 ]
%108 = phi i64 [ 0, %103 ], [ %131, %105 ]
%109 = add <2 x i32> %107, <i32 2, i32 2>
%110 = getelementptr double, double* %76, i64 %106
%111 = sitofp <2 x i32> %107 to <2 x double>
%112 = sitofp <2 x i32> %109 to <2 x double>
%113 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %95, <2 x double> %111, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%114 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %97, <2 x double> %112, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%115 = bitcast double* %110 to <2 x double>*
store <2 x double> %113, <2 x double>* %115
%116 = getelementptr double, double* %110, i64 2
%117 = bitcast double* %116 to <2 x double>*
store <2 x double> %114, <2 x double>* %117
%118 = or i64 %106, 4
%119 = add <2 x i32> %107, <i32 4, i32 4>
%120 = add <2 x i32> %107, <i32 6, i32 6>
%121 = getelementptr double, double* %76, i64 %118
%122 = sitofp <2 x i32> %119 to <2 x double>
%123 = sitofp <2 x i32> %120 to <2 x double>
%124 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %95, <2 x double> %122, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%125 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %97, <2 x double> %123, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%126 = bitcast double* %121 to <2 x double>*
store <2 x double> %124, <2 x double>* %126
%127 = getelementptr double, double* %121, i64 2
%128 = bitcast double* %127 to <2 x double>*
store <2 x double> %125, <2 x double>* %128
%129 = add nuw i64 %106, 8
%130 = add <2 x i32> %107, <i32 8, i32 8>
%131 = add i64 %108, 2
%132 = icmp eq i64 %131, %104
br i1 %132, label %133, label %105
133: ; preds = %105, %86
%134 = phi i64 [ 0, %86 ], [ %129, %105 ]
%135 = phi <2 x i32> [ %93, %86 ], [ %130, %105 ]
%136 = icmp eq i64 %101, 0
br i1 %136, label %147, label %137
137: ; preds = %133
%138 = add <2 x i32> %135, <i32 2, i32 2>
%139 = getelementptr double, double* %76, i64 %134
%140 = sitofp <2 x i32> %135 to <2 x double>
%141 = sitofp <2 x i32> %138 to <2 x double>
%142 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %95, <2 x double> %140, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%143 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %97, <2 x double> %141, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%144 = bitcast double* %139 to <2 x double>*
store <2 x double> %142, <2 x double>* %144
%145 = getelementptr double, double* %139, i64 2
%146 = bitcast double* %145 to <2 x double>*
store <2 x double> %143, <2 x double>* %146
br label %147
147: ; preds = %133, %137
%148 = icmp eq i64 %84, %87
br i1 %148, label %168, label %149
149: ; preds = %79, %147
%150 = phi i32 [ %77, %79 ], [ %89, %147 ]
%151 = phi double* [ %76, %79 ], [ %90, %147 ]
br label %160
152: ; preds = %72, %152
%153 = phi i32 [ %158, %152 ], [ %73, %72 ]
%154 = phi double* [ %157, %152 ], [ %74, %72 ]
%155 = sitofp i32 %153 to double
%156 = fmul double %6, %155
%157 = getelementptr inbounds double, double* %154, i64 1
store double %156, double* %154
%158 = add nuw nsw i32 %153, 1
%159 = icmp eq i32 %158, %3
br i1 %159, label %75, label %152
160: ; preds = %149, %160
%161 = phi i32 [ %166, %160 ], [ %150, %149 ]
%162 = phi double* [ %165, %160 ], [ %151, %149 ]
%163 = sitofp i32 %161 to double
%164 = tail call double @llvm.fmuladd.f64(double %80, double %163, double 2.000000e+00)
%165 = getelementptr inbounds double, double* %162, i64 1
store double %164, double* %162
%166 = add nuw nsw i32 %161, 1
%167 = icmp eq i32 %166, %1
br i1 %167, label %168, label %160
168: ; preds = %160, %147, %75
ret double* %0
}