void reconstructoutput(double *rec, int N, double *disc, int numdisc,
                       double *amp) {
  int i, j;
  j = 0;
  for (i = 0; i < numdisc; i++)
    for (; j < (int)(disc[i] - 1); j++)
      rec[j] = amp[i];
  for (; j < N; j++)
    rec[j] = amp[i];
}


x86 assembly (clang, -O0):
<reconstructoutput>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1198 <reconstructoutput+0x98>
jmp    1135 <reconstructoutput+0x35>
mov    -0x30(%rbp),%eax
mov    -0x18(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
movsd  0xeb3(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
cmp    %ecx,%eax
jge    1185 <reconstructoutput+0x85>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1135 <reconstructoutput+0x35>
jmp    118a <reconstructoutput+0x8a>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1124 <reconstructoutput+0x24>
jmp    119d <reconstructoutput+0x9d>
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11d1 <reconstructoutput+0xd1>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    119d <reconstructoutput+0x9d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<reconstructoutput>:
push   %r14
push   %rbx
test   %ecx,%ecx
jle    1166 <reconstructoutput+0x66>
mov    %ecx,%r9d
xor    %eax,%eax
movsd  0xeec(%rip),%xmm0
xor    %ecx,%ecx
jmp    1129 <reconstructoutput+0x29>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rax
cmp    %r9,%rax
je     116b <reconstructoutput+0x6b>
movsd  (%rdx,%rax,8),%xmm1
addsd  %xmm0,%xmm1
cvttsd2si %xmm1,%ebx
cmp    %ebx,%ecx
jge    1120 <reconstructoutput+0x20>
movslq %ecx,%rcx
nopl   (%rax)
movsd  (%r8,%rax,8),%xmm1
movsd  %xmm1,(%rdi,%rcx,8)
add    $0x1,%rcx
movsd  (%rdx,%rax,8),%xmm1
addsd  %xmm0,%xmm1
cvttsd2si %xmm1,%ebx
movslq %ebx,%rbx
cmp    %rbx,%rcx
jl     1140 <reconstructoutput+0x40>
jmp    1120 <reconstructoutput+0x20>
xor    %r9d,%r9d
xor    %ecx,%ecx
cmp    %esi,%ecx
jge    12a0 <reconstructoutput+0x1a0>
lea    (%r8,%r9,8),%rax
movslq %ecx,%rcx
movslq %esi,%r11
mov    %r11,%r10
sub    %rcx,%r10
cmp    $0x4,%r10
jb     1239 <reconstructoutput+0x139>
lea    (%rdi,%rcx,8),%rdx
lea    (%r8,%r9,8),%rbx
add    $0x8,%rbx
cmp    %rbx,%rdx
jae    11ab <reconstructoutput+0xab>
lea    (%rdi,%r11,8),%rdx
cmp    %rdx,%rax
jb     1239 <reconstructoutput+0x139>
mov    %r10,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rdx
mov    %rdx,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rdx,%rdx
je     12a4 <reconstructoutput+0x1a4>
mov    %r9,%rbx
and    $0xfffffffffffffffe,%rbx
movsd  (%rax),%xmm0
unpcklpd %xmm0,%xmm0
lea    (%rdi,%rcx,8),%r14
add    $0x30,%r14
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd %xmm0,-0x30(%r14,%rdx,8)
movupd %xmm0,-0x20(%r14,%rdx,8)
movupd %xmm0,-0x10(%r14,%rdx,8)
movupd %xmm0,(%r14,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rbx
jne    11f0 <reconstructoutput+0xf0>
test   $0x1,%r9b
je     1231 <reconstructoutput+0x131>
add    %rcx,%rdx
movsd  (%rax),%xmm0
unpcklpd %xmm0,%xmm0
movupd %xmm0,(%rdi,%rdx,8)
movupd %xmm0,0x10(%rdi,%rdx,8)
cmp    %r8,%r10
je     12a0 <reconstructoutput+0x1a0>
add    %r8,%rcx
sub    %ecx,%esi
mov    %rcx,%rdx
not    %rdx
add    %r11,%rdx
and    $0x3,%rsi
je     1263 <reconstructoutput+0x163>
nopw   0x0(%rax,%rax,1)
movsd  (%rax),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rsi
jne    1250 <reconstructoutput+0x150>
cmp    $0x3,%rdx
jb     12a0 <reconstructoutput+0x1a0>
nopl   0x0(%rax)
movsd  (%rax),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
movsd  (%rax),%xmm0
movsd  %xmm0,0x8(%rdi,%rcx,8)
movsd  (%rax),%xmm0
movsd  %xmm0,0x10(%rdi,%rcx,8)
movsd  (%rax),%xmm0
movsd  %xmm0,0x18(%rdi,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%r11
jne    1270 <reconstructoutput+0x170>
pop    %rbx
pop    %r14
ret
xor    %edx,%edx
test   $0x1,%r9b
jne    121b <reconstructoutput+0x11b>
jmp    1231 <reconstructoutput+0x131>

LLVM IR (-O0):
define void @reconstructoutput(double* %0, i32 %1, double* %2, i32 %3, double* %4) {
%6 = alloca double*
%7 = alloca i32
%8 = alloca double*
%9 = alloca i32
%10 = alloca double*
%11 = alloca i32
%12 = alloca i32
store double* %0, double** %6
store i32 %1, i32* %7
store double* %2, double** %8
store i32 %3, i32* %9
store double* %4, double** %10
store i32 0, i32* %12
store i32 0, i32* %11
br label %13
13: ; preds = %42, %5
%14 = load i32, i32* %11
%15 = load i32, i32* %9
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %45
17: ; preds = %13
br label %18
18: ; preds = %38, %17
%19 = load i32, i32* %12
%20 = load double*, double** %8
%21 = load i32, i32* %11
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds double, double* %20, i64 %22
%24 = load double, double* %23
%25 = fsub double %24, 1.000000e+00
%26 = fptosi double %25 to i32
%27 = icmp slt i32 %19, %26
br i1 %27, label %28, label %41
28: ; preds = %18
%29 = load double*, double** %10
%30 = load i32, i32* %11
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %29, i64 %31
%33 = load double, double* %32
%34 = load double*, double** %6
%35 = load i32, i32* %12
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds double, double* %34, i64 %36
store double %33, double* %37
br label %38
38: ; preds = %28
%39 = load i32, i32* %12
%40 = add nsw i32 %39, 1
store i32 %40, i32* %12
br label %18
41: ; preds = %18
br label %42
42: ; preds = %41
%43 = load i32, i32* %11
%44 = add nsw i32 %43, 1
store i32 %44, i32* %11
br label %13
45: ; preds = %13
br label %46
46: ; preds = %60, %45
%47 = load i32, i32* %12
%48 = load i32, i32* %7
%49 = icmp slt i32 %47, %48
br i1 %49, label %50, label %63
50: ; preds = %46
%51 = load double*, double** %10
%52 = load i32, i32* %11
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds double, double* %51, i64 %53
%55 = load double, double* %54
%56 = load double*, double** %6
%57 = load i32, i32* %12
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds double, double* %56, i64 %58
store double %55, double* %59
br label %60
60: ; preds = %50
%61 = load i32, i32* %12
%62 = add nsw i32 %61, 1
store i32 %62, i32* %12
br label %46
63: ; preds = %46
ret void
}

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