#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int exp(double);
double square(double);
void populate_Diffusion(double *Aup, double *Adn, double *A2p_up,
                        double *A2p_dn, double TM, double Eb_tab[311],
                        double A1s_tab[311]) {
  unsigned b;
  double DE2;
  DE2 = 10.198714553953742 * 10.198714553953742 * 2. * TM / 0.93878299831e9;
  b = 140 - 80 / 2;
  Aup[b] = DE2 / square(Eb_tab[b + 1] - Eb_tab[b]) * A1s_tab[b];
  for (b = 140 - 80 / 2 + 1; b < 140 - 1; b++) {
    Adn[b] = exp((Eb_tab[b] - Eb_tab[b - 1]) / TM) * Aup[b - 1];
    Aup[b] = (DE2 * A1s_tab[b] - square(Eb_tab[b] - Eb_tab[b - 1]) * Adn[b]) /
             square(Eb_tab[b + 1] - Eb_tab[b]);
  }
  b = 140 - 1;
  Adn[b] = exp((Eb_tab[b] - Eb_tab[b - 1]) / TM) * Aup[b - 1];
  Aup[b] = (DE2 * A1s_tab[b] - square(Eb_tab[b] - Eb_tab[b - 1]) * Adn[b]) /
           square(10.198714553953742 - Eb_tab[b]);
  *A2p_dn = exp((10.198714553953742 - Eb_tab[b]) / TM) / 3. * Aup[b];
  b = 140 + 80 / 2 - 1;
  Adn[b] = DE2 / square(Eb_tab[b] - Eb_tab[b - 1]) * A1s_tab[b];
  for (b = 140 + 80 / 2 - 2; b > 140; b--) {
    Aup[b] = exp((Eb_tab[b] - Eb_tab[b + 1]) / TM) * Adn[b + 1];
    Adn[b] = (DE2 * A1s_tab[b] - square(Eb_tab[b + 1] - Eb_tab[b]) * Aup[b]) /
             square(Eb_tab[b] - Eb_tab[b - 1]);
  }
  b = 140;
  Aup[b] = exp((Eb_tab[b] - Eb_tab[b + 1]) / TM) * Adn[b + 1];
  Adn[b] = (DE2 * A1s_tab[b] - square(Eb_tab[b + 1] - Eb_tab[b]) * Aup[b]) /
           square(Eb_tab[b] - 10.198714553953742);
  *A2p_up = exp((10.198714553953742 - Eb_tab[b]) / TM) / 3. * Adn[b];
}


x86 assembly (clang, -O0):
<populate_Diffusion>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
movsd  0xeb8(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  0xea3(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x64,-0x3c(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x65,-0x3c(%rbp)
cmpl   $0x8b,-0x3c(%rbp)
jae    12db <populate_Diffusion+0x1bb>
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movsd  -0x68(%rbp),%xmm2
movaps %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
divsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11c4 <populate_Diffusion+0xa4>
movl   $0x8b,-0x3c(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movsd  -0x88(%rbp),%xmm2
ff
movaps %xmm0,%xmm1
movsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  0xc5f(%rip),%xmm0
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
divsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  0xc2e(%rip),%xmm0
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
movsd  0xc0b(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0xb3,-0x3c(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0xb2,-0x3c(%rbp)
cmpl   $0x8c,-0x3c(%rbp)
jbe    15a4 <populate_Diffusion+0x484>
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movsd  -0xa0(%rbp),%xmm2
ff
movaps %xmm0,%xmm1
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0x90(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    147b <populate_Diffusion+0x35b>
movl   $0x8c,-0x3c(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x38(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <square@plt>
movsd  -0xb8(%rbp),%xmm2
ff
movaps %xmm0,%xmm1
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  0x988(%rip),%xmm1
subsd  %xmm1,%xmm0
call   1030 <square@plt>
movaps %xmm0,%xmm1
movsd  -0xa8(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  0x955(%rip),%xmm0
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
call   1040 <exp@plt>
cvtsi2sd %eax,%xmm0
movsd  0x932(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<populate_Diffusion>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
movsd  0xeca(%rip),%xmm1
movsd  %xmm0,0x18(%rsp)
mulsd  %xmm0,%xmm1
divsd  0xec0(%rip),%xmm1
movsd  %xmm1,0x10(%rsp)
mov    %r9,%r13
mov    %r8,%rbx
mov    %rcx,%rbp
mov    %rdx,0x20(%rsp)
mov    %rsi,%r15
mov    %rdi,%r12
movsd  0x328(%r8),%xmm0
subsd  0x320(%r8),%xmm0
call   1030 <square@plt>
movsd  0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
mulsd  0x320(%r13),%xmm1
movsd  %xmm1,0x320(%r12)
xor    %r14d,%r14d
nopl   0x0(%rax)
movsd  0x328(%rbx,%r14,1),%xmm0
subsd  0x320(%rbx,%r14,1),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x320(%r12,%r14,1),%xmm0
movsd  %xmm0,0x328(%r15,%r14,1)
movsd  0x328(%rbx,%r14,1),%xmm0
subsd  0x320(%rbx,%r14,1),%xmm0
movsd  0x328(%r13,%r14,1),%xmm1
mulsd  0x10(%rsp),%xmm1
movsd  %xmm1,0x8(%rsp)
call   1030 <square@plt>
mulsd  0x328(%r15,%r14,1),%xmm0
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0x330(%rbx,%r14,1),%xmm0
subsd  0x328(%rbx,%r14,1),%xmm0
call   1030 <square@plt>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x328(%r12,%r14,1)
add    $0x8,%r14
cmp    $0x130,%r14
jne    11a0 <populate_Diffusion+0x80>
movsd  0x458(%rbx),%xmm0
subsd  0x450(%rbx),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x450(%r12),%xmm0
movsd  %xmm0,0x458(%r15)
movsd  0x458(%rbx),%xmm0
subsd  0x450(%rbx),%xmm0
movsd  0x458(%r13),%xmm1
mulsd  0x10(%rsp),%xmm1
movsd  %xmm1,0x8(%rsp)
call   1030 <square@plt>
mulsd  0x458(%r15),%xmm0
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0xd2f(%rip),%xmm0
subsd  0x458(%rbx),%xmm0
call   1030 <square@plt>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x458(%r12)
movsd  0xd06(%rip),%xmm0
subsd  0x458(%rbx),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
divsd  0xcec(%rip),%xmm0
mulsd  0x458(%r12),%xmm0
movsd  %xmm0,0x0(%rbp)
movsd  0x598(%rbx),%xmm0
subsd  0x590(%rbx),%xmm0
call   1030 <square@plt>
movsd  0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
mulsd  0x598(%r13),%xmm1
movsd  %xmm1,0x598(%r15)
xor    %ebp,%ebp
xchg   %ax,%ax
movsd  0x590(%rbx,%rbp,8),%xmm0
subsd  0x598(%rbx,%rbp,8),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x598(%r15,%rbp,8),%xmm0
movsd  %xmm0,0x590(%r12,%rbp,8)
movsd  0x598(%rbx,%rbp,8),%xmm0
subsd  0x590(%rbx,%rbp,8),%xmm0
movsd  0x590(%r13,%rbp,8),%xmm1
mulsd  0x10(%rsp),%xmm1
movsd  %xmm1,0x8(%rsp)
call   1030 <square@plt>
mulsd  0x590(%r12,%rbp,8),%xmm0
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0x590(%rbx,%rbp,8),%xmm0
subsd  0x588(%rbx,%rbp,8),%xmm0
call   1030 <square@plt>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x590(%r15,%rbp,8)
lea    -0x1(%rbp),%rax
add    $0xb1,%rbp
cmp    $0x8c,%rbp
mov    %rax,%rbp
ja     1370 <populate_Diffusion+0x250>
movsd  0x460(%rbx),%xmm0
subsd  0x468(%rbx),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x468(%r15),%xmm0
movsd  %xmm0,0x460(%r12)
movsd  0x468(%rbx),%xmm0
subsd  0x460(%rbx),%xmm0
movsd  0x10(%rsp),%xmm1
mulsd  0x460(%r13),%xmm1
movsd  %xmm1,0x10(%rsp)
call   1030 <square@plt>
mulsd  0x460(%r12),%xmm0
movsd  0x10(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0x460(%rbx),%xmm0
addsd  0xb62(%rip),%xmm0
call   1030 <square@plt>
movsd  0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x460(%r15)
movsd  0xb32(%rip),%xmm0
subsd  0x460(%rbx),%xmm0
divsd  0x18(%rsp),%xmm0
call   1040 <exp@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
divsd  0xb18(%rip),%xmm0
mulsd  0x460(%r15),%xmm0
mov    0x20(%rsp),%rax
movsd  %xmm0,(%rax)
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @populate_Diffusion(double* %0, double* %1, double* %2, double* %3, double %4, double* %5, double* %6) {
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double
%13 = alloca double*
%14 = alloca double*
%15 = alloca i32
%16 = alloca double
store double* %0, double** %8
store double* %1, double** %9
store double* %2, double** %10
store double* %3, double** %11
store double %4, double* %12
store double* %5, double** %13
store double* %6, double** %14
%17 = load double, double* %12
%18 = fmul double 0x406A00E1BF70A905, %17
%19 = fdiv double %18, 0x41CBFA588B27AE14
store double %19, double* %16
store i32 100, i32* %15
%20 = load double, double* %16
%21 = load double*, double** %13
%22 = load i32, i32* %15
%23 = add i32 %22, 1
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds double, double* %21, i64 %24
%26 = load double, double* %25
%27 = load double*, double** %13
%28 = load i32, i32* %15
%29 = zext i32 %28 to i64
%30 = getelementptr inbounds double, double* %27, i64 %29
%31 = load double, double* %30
%32 = fsub double %26, %31
%33 = call double @square(double %32)
%34 = fdiv double %20, %33
%35 = load double*, double** %14
%36 = load i32, i32* %15
%37 = zext i32 %36 to i64
%38 = getelementptr inbounds double, double* %35, i64 %37
%39 = load double, double* %38
%40 = fmul double %34, %39
%41 = load double*, double** %8
%42 = load i32, i32* %15
%43 = zext i32 %42 to i64
%44 = getelementptr inbounds double, double* %41, i64 %43
store double %40, double* %44
store i32 101, i32* %15
br label %45
45: ; preds = %121, %7
%46 = load i32, i32* %15
%47 = icmp ult i32 %46, 139
br i1 %47, label %48, label %124
48: ; preds = %45
%49 = load double*, double** %13
%50 = load i32, i32* %15
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds double, double* %49, i64 %51
%53 = load double, double* %52
%54 = load double*, double** %13
%55 = load i32, i32* %15
%56 = sub i32 %55, 1
%57 = zext i32 %56 to i64
%58 = getelementptr inbounds double, double* %54, i64 %57
%59 = load double, double* %58
%60 = fsub double %53, %59
%61 = load double, double* %12
%62 = fdiv double %60, %61
%63 = call i32 @exp(double %62)
%64 = sitofp i32 %63 to double
%65 = load double*, double** %8
%66 = load i32, i32* %15
%67 = sub i32 %66, 1
%68 = zext i32 %67 to i64
%69 = getelementptr inbounds double, double* %65, i64 %68
%70 = load double, double* %69
%71 = fmul double %64, %70
%72 = load double*, double** %9
%73 = load i32, i32* %15
%74 = zext i32 %73 to i64
%75 = getelementptr inbounds double, double* %72, i64 %74
store double %71, double* %75
%76 = load double, double* %16
%77 = load double*, double** %14
%78 = load i32, i32* %15
%79 = zext i32 %78 to i64
%80 = getelementptr inbounds double, double* %77, i64 %79
%81 = load double, double* %80
%82 = load double*, double** %13
%83 = load i32, i32* %15
%84 = zext i32 %83 to i64
%85 = getelementptr inbounds double, double* %82, i64 %84
%86 = load double, double* %85
%87 = load double*, double** %13
%88 = load i32, i32* %15
%89 = sub i32 %88, 1
%90 = zext i32 %89 to i64
%91 = getelementptr inbounds double, double* %87, i64 %90
%92 = load double, double* %91
%93 = fsub double %86, %92
%94 = call double @square(double %93)
%95 = load double*, double** %9
%96 = load i32, i32* %15
%97 = zext i32 %96 to i64
%98 = getelementptr inbounds double, double* %95, i64 %97
%99 = load double, double* %98
%100 = fmul double %94, %99
%101 = fneg double %100
%102 = call double @llvm.fmuladd.f64(double %76, double %81, double %101)
%103 = load double*, double** %13
%104 = load i32, i32* %15
%105 = add i32 %104, 1
%106 = zext i32 %105 to i64
%107 = getelementptr inbounds double, double* %103, i64 %106
%108 = load double, double* %107
%109 = load double*, double** %13
%110 = load i32, i32* %15
%111 = zext i32 %110 to i64
%112 = getelementptr inbounds double, double* %109, i64 %111
%113 = load double, double* %112
%114 = fsub double %108, %113
%115 = call double @square(double %114)
%116 = fdiv double %102, %115
%117 = load double*, double** %8
%118 = load i32, i32* %15
%119 = zext i32 %118 to i64
%120 = getelementptr inbounds double, double* %117, i64 %119
store double %116, double* %120
br label %121
121: ; preds = %48
%122 = load i32, i32* %15
%123 = add i32 %122, 1
store i32 %123, i32* %15
br label %45
124: ; preds = %45
store i32 139, i32* %15
%125 = load double*, double** %13
%126 = load i32, i32* %15
%127 = zext i32 %126 to i64
%128 = getelementptr inbounds double, double* %125, i64 %127
%129 = load double, double* %128
%130 = load double*, double** %13
%131 = load i32, i32* %15
%132 = sub i32 %131, 1
%133 = zext i32 %132 to i64
%134 = getelementptr inbounds double, double* %130, i64 %133
%135 = load double, double* %134
%136 = fsub double %129, %135
%137 = load double, double* %12
%138 = fdiv double %136, %137
%139 = call i32 @exp(double %138)
%140 = sitofp i32 %139 to double
%141 = load double*, double** %8
%142 = load i32, i32* %15
%143 = sub i32 %142, 1
%144 = zext i32 %143 to i64
%145 = getelementptr inbounds double, double* %141, i64 %144
%146 = load double, double* %145
%147 = fmul double %140, %146
%148 = load double*, double** %9
%149 = load i32, i32* %15
%150 = zext i32 %149 to i64
%151 = getelementptr inbounds double, double* %148, i64 %150
store double %147, double* %151
%152 = load double, double* %16
%153 = load double*, double** %14
%154 = load i32, i32* %15
%155 = zext i32 %154 to i64
%156 = getelementptr inbounds double, double* %153, i64 %155
%157 = load double, double* %156
%158 = load double*, double** %13
%159 = load i32, i32* %15
%160 = zext i32 %159 to i64
%161 = getelementptr inbounds double, double* %158, i64 %160
%162 = load double, double* %161
%163 = load double*, double** %13
%164 = load i32, i32* %15
%165 = sub i32 %164, 1
%166 = zext i32 %165 to i64
%167 = getelementptr inbounds double, double* %163, i64 %166
%168 = load double, double* %167
%169 = fsub double %162, %168
%170 = call double @square(double %169)
%171 = load double*, double** %9
%172 = load i32, i32* %15
%173 = zext i32 %172 to i64
%174 = getelementptr inbounds double, double* %171, i64 %173
%175 = load double, double* %174
%176 = fmul double %170, %175
%177 = fneg double %176
%178 = call double @llvm.fmuladd.f64(double %152, double %157, double %177)
%179 = load double*, double** %13
%180 = load i32, i32* %15
%181 = zext i32 %180 to i64
%182 = getelementptr inbounds double, double* %179, i64 %181
%183 = load double, double* %182
%184 = fsub double 0x402465BDE9FCF0EC, %183
%185 = call double @square(double %184)
%186 = fdiv double %178, %185
%187 = load double*, double** %8
%188 = load i32, i32* %15
%189 = zext i32 %188 to i64
%190 = getelementptr inbounds double, double* %187, i64 %189
store double %186, double* %190
%191 = load double*, double** %13
%192 = load i32, i32* %15
%193 = zext i32 %192 to i64
%194 = getelementptr inbounds double, double* %191, i64 %193
%195 = load double, double* %194
%196 = fsub double 0x402465BDE9FCF0EC, %195
%197 = load double, double* %12
%198 = fdiv double %196, %197
%199 = call i32 @exp(double %198)
%200 = sitofp i32 %199 to double
%201 = fdiv double %200, 3.000000e+00
%202 = load double*, double** %8
%203 = load i32, i32* %15
%204 = zext i32 %203 to i64
%205 = getelementptr inbounds double, double* %202, i64 %204
%206 = load double, double* %205
%207 = fmul double %201, %206
%208 = load double*, double** %11
store double %207, double* %208
store i32 179, i32* %15
%209 = load double, double* %16
%210 = load double*, double** %13
%211 = load i32, i32* %15
%212 = zext i32 %211 to i64
%213 = getelementptr inbounds double, double* %210, i64 %212
%214 = load double, double* %213
%215 = load double*, double** %13
%216 = load i32, i32* %15
%217 = sub i32 %216, 1
%218 = zext i32 %217 to i64
%219 = getelementptr inbounds double, double* %215, i64 %218
%220 = load double, double* %219
%221 = fsub double %214, %220
%222 = call double @square(double %221)
%223 = fdiv double %209, %222
%224 = load double*, double** %14
%225 = load i32, i32* %15
%226 = zext i32 %225 to i64
%227 = getelementptr inbounds double, double* %224, i64 %226
%228 = load double, double* %227
%229 = fmul double %223, %228
%230 = load double*, double** %9
%231 = load i32, i32* %15
%232 = zext i32 %231 to i64
%233 = getelementptr inbounds double, double* %230, i64 %232
store double %229, double* %233
store i32 178, i32* %15
br label %234
234: ; preds = %310, %124
%235 = load i32, i32* %15
%236 = icmp ugt i32 %235, 140
br i1 %236, label %237, label %313
237: ; preds = %234
%238 = load double*, double** %13
%239 = load i32, i32* %15
%240 = zext i32 %239 to i64
%241 = getelementptr inbounds double, double* %238, i64 %240
%242 = load double, double* %241
%243 = load double*, double** %13
%244 = load i32, i32* %15
%245 = add i32 %244, 1
%246 = zext i32 %245 to i64
%247 = getelementptr inbounds double, double* %243, i64 %246
%248 = load double, double* %247
%249 = fsub double %242, %248
%250 = load double, double* %12
%251 = fdiv double %249, %250
%252 = call i32 @exp(double %251)
%253 = sitofp i32 %252 to double
%254 = load double*, double** %9
%255 = load i32, i32* %15
%256 = add i32 %255, 1
%257 = zext i32 %256 to i64
%258 = getelementptr inbounds double, double* %254, i64 %257
%259 = load double, double* %258
%260 = fmul double %253, %259
%261 = load double*, double** %8
%262 = load i32, i32* %15
%263 = zext i32 %262 to i64
%264 = getelementptr inbounds double, double* %261, i64 %263
store double %260, double* %264
%265 = load double, double* %16
%266 = load double*, double** %14
%267 = load i32, i32* %15
%268 = zext i32 %267 to i64
%269 = getelementptr inbounds double, double* %266, i64 %268
%270 = load double, double* %269
%271 = load double*, double** %13
%272 = load i32, i32* %15
%273 = add i32 %272, 1
%274 = zext i32 %273 to i64
%275 = getelementptr inbounds double, double* %271, i64 %274
%276 = load double, double* %275
%277 = load double*, double** %13
%278 = load i32, i32* %15
%279 = zext i32 %278 to i64
%280 = getelementptr inbounds double, double* %277, i64 %279
%281 = load double, double* %280
%282 = fsub double %276, %281
%283 = call double @square(double %282)
%284 = load double*, double** %8
%285 = load i32, i32* %15
%286 = zext i32 %285 to i64
%287 = getelementptr inbounds double, double* %284, i64 %286
%288 = load double, double* %287
%289 = fmul double %283, %288
%290 = fneg double %289
%291 = call double @llvm.fmuladd.f64(double %265, double %270, double %290)
%292 = load double*, double** %13
%293 = load i32, i32* %15
%294 = zext i32 %293 to i64
%295 = getelementptr inbounds double, double* %292, i64 %294
%296 = load double, double* %295
%297 = load double*, double** %13
%298 = load i32, i32* %15
%299 = sub i32 %298, 1
%300 = zext i32 %299 to i64
%301 = getelementptr inbounds double, double* %297, i64 %300
%302 = load double, double* %301
%303 = fsub double %296, %302
%304 = call double @square(double %303)
%305 = fdiv double %291, %304
%306 = load double*, double** %9
%307 = load i32, i32* %15
%308 = zext i32 %307 to i64
%309 = getelementptr inbounds double, double* %306, i64 %308
store double %305, double* %309
br label %310
310: ; preds = %237
%311 = load i32, i32* %15
%312 = add i32 %311, -1
store i32 %312, i32* %15
br label %234
313: ; preds = %234
store i32 140, i32* %15
%314 = load double*, double** %13
%315 = load i32, i32* %15
%316 = zext i32 %315 to i64
%317 = getelementptr inbounds double, double* %314, i64 %316
%318 = load double, double* %317
%319 = load double*, double** %13
%320 = load i32, i32* %15
%321 = add i32 %320, 1
%322 = zext i32 %321 to i64
%323 = getelementptr inbounds double, double* %319, i64 %322
%324 = load double, double* %323
%325 = fsub double %318, %324
%326 = load double, double* %12
%327 = fdiv double %325, %326
%328 = call i32 @exp(double %327)
%329 = sitofp i32 %328 to double
%330 = load double*, double** %9
%331 = load i32, i32* %15
%332 = add i32 %331, 1
%333 = zext i32 %332 to i64
%334 = getelementptr inbounds double, double* %330, i64 %333
%335 = load double, double* %334
%336 = fmul double %329, %335
%337 = load double*, double** %8
%338 = load i32, i32* %15
%339 = zext i32 %338 to i64
%340 = getelementptr inbounds double, double* %337, i64 %339
store double %336, double* %340
%341 = load double, double* %16
%342 = load double*, double** %14
%343 = load i32, i32* %15
%344 = zext i32 %343 to i64
%345 = getelementptr inbounds double, double* %342, i64 %344
%346 = load double, double* %345
%347 = load double*, double** %13
%348 = load i32, i32* %15
%349 = add i32 %348, 1
%350 = zext i32 %349 to i64
%351 = getelementptr inbounds double, double* %347, i64 %350
%352 = load double, double* %351
%353 = load double*, double** %13
%354 = load i32, i32* %15
%355 = zext i32 %354 to i64
%356 = getelementptr inbounds double, double* %353, i64 %355
%357 = load double, double* %356
%358 = fsub double %352, %357
%359 = call double @square(double %358)
%360 = load double*, double** %8
%361 = load i32, i32* %15
%362 = zext i32 %361 to i64
%363 = getelementptr inbounds double, double* %360, i64 %362
%364 = load double, double* %363
%365 = fmul double %359, %364
%366 = fneg double %365
%367 = call double @llvm.fmuladd.f64(double %341, double %346, double %366)
%368 = load double*, double** %13
%369 = load i32, i32* %15
%370 = zext i32 %369 to i64
%371 = getelementptr inbounds double, double* %368, i64 %370
%372 = load double, double* %371
%373 = fsub double %372, 0x402465BDE9FCF0EC
%374 = call double @square(double %373)
%375 = fdiv double %367, %374
%376 = load double*, double** %9
%377 = load i32, i32* %15
%378 = zext i32 %377 to i64
%379 = getelementptr inbounds double, double* %376, i64 %378
store double %375, double* %379
%380 = load double*, double** %13
%381 = load i32, i32* %15
%382 = zext i32 %381 to i64
%383 = getelementptr inbounds double, double* %380, i64 %382
%384 = load double, double* %383
%385 = fsub double 0x402465BDE9FCF0EC, %384
%386 = load double, double* %12
%387 = fdiv double %385, %386
%388 = call i32 @exp(double %387)
%389 = sitofp i32 %388 to double
%390 = fdiv double %389, 3.000000e+00
%391 = load double*, double** %9
%392 = load i32, i32* %15
%393 = zext i32 %392 to i64
%394 = getelementptr inbounds double, double* %391, i64 %393
%395 = load double, double* %394
%396 = fmul double %390, %395
%397 = load double*, double** %10
store double %396, double* %397
ret void
}

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