makesource(s, dt, nt, a, nb) float *s;
float *dt, *a;
int nt, nb;
{
  double exp(), exp_arg;
  int it;
  float t, t2, tshift, alpha;
  float src_amp = 1.0e+05;
  tshift = 3.0 * (*a);
  alpha = -1.0 / ((*a) * (*a));
  s[0] = 0.0;
  for (it = 1; it < nt; it++) {
    t = (it - 1) * (*dt) - tshift;
    t2 = t * t;
    exp_arg = alpha * t2;
    s[it] = src_amp * exp(exp_arg);
    if (nb != 1)
      s[it] = -t * s[it];
  }
}


x86 assembly (clang, -O0):
<makesource>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
movss  0xedd(%rip),%xmm0
movss  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xebc(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
mulss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe8b(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movl   $0x1,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1271 <makesource+0x161>
mov    -0x3c(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm2
movss  -0x48(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x4c(%rbp),%xmm0
mulss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
cmpl   $0x1,-0x2c(%rbp)
je     125e <makesource+0x14e>
movss  -0x40(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1263 <makesource+0x153>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1194 <makesource+0x84>
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<makesource>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x20,%rsp
movss  (%rcx),%xmm1
movl   $0x0,(%rdi)
cmp    $0x2,%edx
jl     11d6 <makesource+0xc6>
mov    %r8d,%r14d
mov    %rsi,%r15
mov    %rdi,%r12
movaps %xmm1,%xmm0
mulss  %xmm1,%xmm0
movss  0xeb9(%rip),%xmm2
divss  %xmm0,%xmm2
movss  %xmm2,0x8(%rsp)
mulss  0xeab(%rip),%xmm1
movss  %xmm1,0xc(%rsp)
mov    %edx,%ebx
add    $0xffffffffffffffff,%rbx
xor    %ebp,%ebp
jmp    1188 <makesource+0x78>
nopl   0x0(%rax)
cvtsd2ss %xmm0,%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0x4(%r12,%rbp,4)
add    $0x1,%rbp
cmp    %rbp,%rbx
je     11d6 <makesource+0xc6>
xorps  %xmm0,%xmm0
cvtsi2ss %ebp,%xmm0
mulss  (%r15),%xmm0
addss  0xc(%rsp),%xmm0
movaps %xmm0,0x10(%rsp)
mulss  %xmm0,%xmm0
mulss  0x8(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <exp@plt>
mulsd  0xe56(%rip),%xmm0
movss  0xe46(%rip),%xmm1
cmp    $0x1,%r14d
je     1170 <makesource+0x60>
movaps 0x10(%rsp),%xmm1
xorps  0xe4c(%rip),%xmm1
jmp    1170 <makesource+0x60>
add    $0x20,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @makesource(float* %0, float* %1, i32 %2, float* %3, i32 %4) {
%6 = alloca i32
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
%10 = alloca float*
%11 = alloca i32
%12 = alloca double
%13 = alloca i32
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
store float* %0, float** %7
store float* %1, float** %8
store i32 %2, i32* %9
store float* %3, float** %10
store i32 %4, i32* %11
store float 1.000000e+05, float* %18
%19 = load float*, float** %10
%20 = load float, float* %19
%21 = fpext float %20 to double
%22 = fmul double 3.000000e+00, %21
%23 = fptrunc double %22 to float
store float %23, float* %16
%24 = load float*, float** %10
%25 = load float, float* %24
%26 = load float*, float** %10
%27 = load float, float* %26
%28 = fmul float %25, %27
%29 = fpext float %28 to double
%30 = fdiv double -1.000000e+00, %29
%31 = fptrunc double %30 to float
store float %31, float* %17
%32 = load float*, float** %7
%33 = getelementptr inbounds float, float* %32, i64 0
store float 0.000000e+00, float* %33
store i32 1, i32* %13
br label %34
34: ; preds = %80, %5
%35 = load i32, i32* %13
%36 = load i32, i32* %9
%37 = icmp slt i32 %35, %36
br i1 %37, label %38, label %83
38: ; preds = %34
%39 = load i32, i32* %13
%40 = sub nsw i32 %39, 1
%41 = sitofp i32 %40 to float
%42 = load float*, float** %8
%43 = load float, float* %42
%44 = load float, float* %16
%45 = fneg float %44
%46 = call float @llvm.fmuladd.f32(float %41, float %43, float %45)
store float %46, float* %14
%47 = load float, float* %14
%48 = load float, float* %14
%49 = fmul float %47, %48
store float %49, float* %15
%50 = load float, float* %17
%51 = load float, float* %15
%52 = fmul float %50, %51
%53 = fpext float %52 to double
store double %53, double* %12
%54 = load float, float* %18
%55 = fpext float %54 to double
%56 = load double, double* %12
%57 = call double @exp(double %56)
%58 = fmul double %55, %57
%59 = fptrunc double %58 to float
%60 = load float*, float** %7
%61 = load i32, i32* %13
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds float, float* %60, i64 %62
store float %59, float* %63
%64 = load i32, i32* %11
%65 = icmp ne i32 %64, 1
br i1 %65, label %66, label %79
66: ; preds = %38
%67 = load float, float* %14
%68 = fneg float %67
%69 = load float*, float** %7
%70 = load i32, i32* %13
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds float, float* %69, i64 %71
%73 = load float, float* %72
%74 = fmul float %68, %73
%75 = load float*, float** %7
%76 = load i32, i32* %13
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds float, float* %75, i64 %77
store float %74, float* %78
br label %79
79: ; preds = %66, %38
br label %80
80: ; preds = %79
%81 = load i32, i32* %13
%82 = add nsw i32 %81, 1
store i32 %82, i32* %13
br label %34
83: ; preds = %34
%84 = load i32, i32* %6
ret i32 %84
}

LLVM IR (-O2):
define i32 @makesource(float* nocapture writeonly %0, float* nocapture %1, i32 %2, float* nocapture %3, i32 %4) {
%6 = load float, float* %3
%7 = fmul float %6, %6
%8 = fdiv float -1.000000e+00, %7
store float 0.000000e+00, float* %0
%9 = icmp sgt i32 %2, 1
br i1 %9, label %10, label %33
10: ; preds = %5
%11 = fmul float %6, -3.000000e+00
%12 = icmp eq i32 %4, 1
%13 = zext i32 %2 to i64
br label %14
14: ; preds = %10, %14
%15 = phi i64 [ 1, %10 ], [ %31, %14 ]
%16 = trunc i64 %15 to i32
%17 = add i32 %16, -1
%18 = sitofp i32 %17 to float
%19 = load float, float* %1
%20 = tail call float @llvm.fmuladd.f32(float %18, float %19, float %11)
%21 = fmul float %20, %20
%22 = fmul float %8, %21
%23 = fpext float %22 to double
%24 = tail call double @exp(double %23)
%25 = fmul double %24, 1.000000e+05
%26 = fptrunc double %25 to float
%27 = getelementptr inbounds float, float* %0, i64 %15
%28 = fneg float %20
%29 = select i1 %12, float 1.000000e+00, float %28
%30 = fmul float %29, %26
store float %30, float* %27
%31 = add nuw nsw i64 %15, 1
%32 = icmp eq i64 %31, %13
br i1 %32, label %33, label %14
33: ; preds = %14, %5
ret i32 undef
}