#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 */
float cos(float const);
float exp(float const);
void init(float *buff, const int nx, const int ny, const int nz, const float kx,
          const float ky, const float kz, const float dx, const float dy,
          const float dz, const float kappa, const float time) {
  float ax, ay, az;
  int jz, jy, jx;
  ax = exp(-kappa * time * (kx * kx));
  ay = exp(-kappa * time * (ky * ky));
  az = exp(-kappa * time * (kz * kz));
  for (jz = 0; jz < nz; jz++) {
    for (jy = 0; jy < ny; jy++) {
      for (jx = 0; jx < nx; jx++) {
        int j = jz * nx * ny + jy * nx + jx;
        float x = dx * ((float)(jx + 0.5));
        float y = dy * ((float)(jy + 0.5));
        float z = dz * ((float)(jz + 0.5));
        float f0 = (float)0.125 * (1.0 - ax * cos(kx * x)) *
                   (1.0 - ay * cos(ky * y)) * (1.0 - az * cos(kz * z));
        buff[j] = f0;
      }
    }
  }
}


x86 assembly (clang, -O0):
<init>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movss  %xmm0,-0x18(%rbp)
movss  %xmm1,-0x1c(%rbp)
movss  %xmm2,-0x20(%rbp)
movss  %xmm3,-0x24(%rbp)
movss  %xmm4,-0x28(%rbp)
movss  %xmm5,-0x2c(%rbp)
movss  %xmm6,-0x30(%rbp)
movss  %xmm7,-0x34(%rbp)
movss  -0x30(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  -0x34(%rbp),%xmm0
movss  -0x18(%rbp),%xmm1
mulss  -0x18(%rbp),%xmm1
mulss  %xmm1,%xmm0
call   1030 <exp@plt>
movss  %xmm0,-0x38(%rbp)
movss  -0x30(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  -0x34(%rbp),%xmm0
movss  -0x1c(%rbp),%xmm1
mulss  -0x1c(%rbp),%xmm1
mulss  %xmm1,%xmm0
call   1030 <exp@plt>
movss  %xmm0,-0x3c(%rbp)
movss  -0x30(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  -0x34(%rbp),%xmm0
movss  -0x20(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
mulss  %xmm1,%xmm0
call   1030 <exp@plt>
movss  %xmm0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13bf <init+0x29f>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    13ac <init+0x28c>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1399 <init+0x279>
mov    -0x44(%rbp),%eax
imul   -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    -0x48(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    %ecx,%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x50(%rbp)
movss  -0x24(%rbp),%xmm0
cvtsi2sdl -0x4c(%rbp),%xmm1
movsd  0xdbe(%rip),%xmm2
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x28(%rbp),%xmm0
cvtsi2sdl -0x48(%rbp),%xmm1
movsd  0xd9b(%rip),%xmm2
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x2c(%rbp),%xmm0
cvtsi2sdl -0x44(%rbp),%xmm1
movsd  0xd78(%rip),%xmm2
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x80(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x54(%rbp),%xmm0
call   1040 <cos@plt>
movaps %xmm0,%xmm1
movss  -0x80(%rbp),%xmm0
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd26(%rip),%xmm1
subsd  %xmm0,%xmm1
movsd  0xd22(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x7c(%rbp)
movss  -0x1c(%rbp),%xmm0
mulss  -0x58(%rbp),%xmm0
call   1040 <cos@plt>
movss  -0x7c(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x78(%rbp),%xmm0
mulss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xcdb(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x6c(%rbp)
movss  -0x20(%rbp),%xmm0
mulss  -0x5c(%rbp),%xmm0
call   1040 <cos@plt>
movss  -0x6c(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x68(%rbp),%xmm0
mulss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xc98(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x60(%rbp)
movss  -0x60(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    121a <init+0xfa>
jmp    139e <init+0x27e>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1207 <init+0xe7>
jmp    13b1 <init+0x291>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11f4 <init+0xd4>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<init>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
xorps  0xecb(%rip),%xmm6
movss  %xmm5,0x3c(%rsp)
movss  %xmm4,0x48(%rsp)
movss  %xmm3,0x1c(%rsp)
movss  %xmm2,0xc(%rsp)
movss  %xmm1,0x10(%rsp)
mov    %ecx,%ebp
mov    %edx,0x8(%rsp)
mov    %esi,0x14(%rsp)
mov    %rdi,%rbx
mulss  %xmm7,%xmm6
movaps %xmm6,0x60(%rsp)
movss  %xmm0,0x18(%rsp)
mulss  %xmm0,%xmm0
mulss  %xmm6,%xmm0
call   1030 <exp@plt>
movss  %xmm0,0x54(%rsp)
movss  0x10(%rsp),%xmm0
mulss  %xmm0,%xmm0
mulss  0x60(%rsp),%xmm0
call   1030 <exp@plt>
movss  %xmm0,0x50(%rsp)
movss  0xc(%rsp),%xmm0
mulss  %xmm0,%xmm0
mulss  0x60(%rsp),%xmm0
call   1030 <exp@plt>
mov    %ebp,0x40(%rsp)
test   %ebp,%ebp
jle    13a6 <init+0x286>
movaps %xmm0,%xmm2
mov    0x14(%rsp),%ecx
mov    %ecx,%ebp
mov    0x8(%rsp),%eax
imul   %ecx,%eax
mov    %rax,0x70(%rsp)
xor    %eax,%eax
mov    %rax,0x28(%rsp)
xorps  %xmm0,%xmm0
movsd  %xmm0,0x20(%rsp)
movsd  0xe25(%rip),%xmm1
movsd  0xe25(%rip),%xmm3
xor    %ecx,%ecx
movss  %xmm2,0x4c(%rsp)
jmp    1230 <init+0x110>
nopl   (%rax)
movsd  0x20(%rsp),%xmm0
addsd  %xmm3,%xmm0
movsd  %xmm0,0x20(%rsp)
mov    0x44(%rsp),%ecx
add    $0x1,%ecx
mov    0x28(%rsp),%rax
add    0x70(%rsp),%rax
mov    %rax,0x28(%rsp)
cmp    0x40(%rsp),%ecx
je     13a6 <init+0x286>
mov    %ecx,0x44(%rsp)
cmpl   $0x0,0x8(%rsp)
jle    1200 <init+0xe0>
movsd  0x20(%rsp),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  0x3c(%rsp),%xmm0
mulss  0xc(%rsp),%xmm0
movss  %xmm0,0x58(%rsp)
xor    %r14d,%r14d
xorps  %xmm0,%xmm0
movsd  %xmm0,0x30(%rsp)
mov    0x28(%rsp),%r13
jmp    1292 <init+0x172>
xchg   %ax,%ax
movsd  0x30(%rsp),%xmm0
addsd  %xmm3,%xmm0
movsd  %xmm0,0x30(%rsp)
add    $0x1,%r14d
add    %rbp,%r13
cmp    0x8(%rsp),%r14d
je     1200 <init+0xe0>
cmpl   $0x0,0x14(%rsp)
movss  0x1c(%rsp),%xmm4
movss  0x18(%rsp),%xmm5
jle    1270 <init+0x150>
movsd  0x30(%rsp),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  0x48(%rsp),%xmm0
mulss  0x10(%rsp),%xmm0
movss  %xmm0,0x5c(%rsp)
xor    %r15d,%r15d
nopl   0x0(%rax,%rax,1)
lea    (%r15,%r13,1),%r12d
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  %xmm4,%xmm0
mulss  %xmm5,%xmm0
call   1040 <cos@plt>
mulss  0x54(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd15(%rip),%xmm1
subsd  %xmm0,%xmm1
mulsd  0xd11(%rip),%xmm1
movsd  %xmm1,0x60(%rsp)
movss  0x5c(%rsp),%xmm0
call   1040 <cos@plt>
mulss  0x50(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xce6(%rip),%xmm1
subsd  %xmm0,%xmm1
mulsd  0x60(%rsp),%xmm1
movsd  %xmm1,0x60(%rsp)
movss  0x58(%rsp),%xmm0
call   1040 <cos@plt>
movss  0x18(%rsp),%xmm5
movss  0x1c(%rsp),%xmm4
movsd  0xcb7(%rip),%xmm3
movss  0x4c(%rsp),%xmm2
mulss  %xmm2,%xmm0
cvtss2sd %xmm0,%xmm0
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
mulsd  0x60(%rsp),%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movsd  0xc84(%rip),%xmm1
movslq %r12d,%rax
movss  %xmm0,(%rbx,%rax,4)
add    $0x1,%r15
cmp    %r15,%rbp
jne    12d0 <init+0x1b0>
jmp    1270 <init+0x150>
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @init(float* %0, i32 %1, i32 %2, i32 %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11) {
%13 = alloca float*
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
%24 = alloca float
%25 = alloca float
%26 = alloca float
%27 = alloca float
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca float
%33 = alloca float
%34 = alloca float
%35 = alloca float
store float* %0, float** %13
store i32 %1, i32* %14
store i32 %2, i32* %15
store i32 %3, i32* %16
store float %4, float* %17
store float %5, float* %18
store float %6, float* %19
store float %7, float* %20
store float %8, float* %21
store float %9, float* %22
store float %10, float* %23
store float %11, float* %24
%36 = load float, float* %23
%37 = fneg float %36
%38 = load float, float* %24
%39 = fmul float %37, %38
%40 = load float, float* %17
%41 = load float, float* %17
%42 = fmul float %40, %41
%43 = fmul float %39, %42
%44 = call float @exp(float %43)
store float %44, float* %25
%45 = load float, float* %23
%46 = fneg float %45
%47 = load float, float* %24
%48 = fmul float %46, %47
%49 = load float, float* %18
%50 = load float, float* %18
%51 = fmul float %49, %50
%52 = fmul float %48, %51
%53 = call float @exp(float %52)
store float %53, float* %26
%54 = load float, float* %23
%55 = fneg float %54
%56 = load float, float* %24
%57 = fmul float %55, %56
%58 = load float, float* %19
%59 = load float, float* %19
%60 = fmul float %58, %59
%61 = fmul float %57, %60
%62 = call float @exp(float %61)
store float %62, float* %27
store i32 0, i32* %28
br label %63
63: ; preds = %148, %12
%64 = load i32, i32* %28
%65 = load i32, i32* %16
%66 = icmp slt i32 %64, %65
br i1 %66, label %67, label %151
67: ; preds = %63
store i32 0, i32* %29
br label %68
68: ; preds = %144, %67
%69 = load i32, i32* %29
%70 = load i32, i32* %15
%71 = icmp slt i32 %69, %70
br i1 %71, label %72, label %147
72: ; preds = %68
store i32 0, i32* %30
br label %73
73: ; preds = %140, %72
%74 = load i32, i32* %30
%75 = load i32, i32* %14
%76 = icmp slt i32 %74, %75
br i1 %76, label %77, label %143
77: ; preds = %73
%78 = load i32, i32* %28
%79 = load i32, i32* %14
%80 = mul nsw i32 %78, %79
%81 = load i32, i32* %15
%82 = mul nsw i32 %80, %81
%83 = load i32, i32* %29
%84 = load i32, i32* %14
%85 = mul nsw i32 %83, %84
%86 = add nsw i32 %82, %85
%87 = load i32, i32* %30
%88 = add nsw i32 %86, %87
store i32 %88, i32* %31
%89 = load float, float* %20
%90 = load i32, i32* %30
%91 = sitofp i32 %90 to double
%92 = fadd double %91, 5.000000e-01
%93 = fptrunc double %92 to float
%94 = fmul float %89, %93
store float %94, float* %32
%95 = load float, float* %21
%96 = load i32, i32* %29
%97 = sitofp i32 %96 to double
%98 = fadd double %97, 5.000000e-01
%99 = fptrunc double %98 to float
%100 = fmul float %95, %99
store float %100, float* %33
%101 = load float, float* %22
%102 = load i32, i32* %28
%103 = sitofp i32 %102 to double
%104 = fadd double %103, 5.000000e-01
%105 = fptrunc double %104 to float
%106 = fmul float %101, %105
store float %106, float* %34
%107 = load float, float* %25
%108 = load float, float* %17
%109 = load float, float* %32
%110 = fmul float %108, %109
%111 = call float @cos(float %110)
%112 = fmul float %107, %111
%113 = fpext float %112 to double
%114 = fsub double 1.000000e+00, %113
%115 = fmul double 1.250000e-01, %114
%116 = load float, float* %26
%117 = load float, float* %18
%118 = load float, float* %33
%119 = fmul float %117, %118
%120 = call float @cos(float %119)
%121 = fmul float %116, %120
%122 = fpext float %121 to double
%123 = fsub double 1.000000e+00, %122
%124 = fmul double %115, %123
%125 = load float, float* %27
%126 = load float, float* %19
%127 = load float, float* %34
%128 = fmul float %126, %127
%129 = call float @cos(float %128)
%130 = fmul float %125, %129
%131 = fpext float %130 to double
%132 = fsub double 1.000000e+00, %131
%133 = fmul double %124, %132
%134 = fptrunc double %133 to float
store float %134, float* %35
%135 = load float, float* %35
%136 = load float*, float** %13
%137 = load i32, i32* %31
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds float, float* %136, i64 %138
store float %135, float* %139
br label %140
140: ; preds = %77
%141 = load i32, i32* %30
%142 = add nsw i32 %141, 1
store i32 %142, i32* %30
br label %73
143: ; preds = %73
br label %144
144: ; preds = %143
%145 = load i32, i32* %29
%146 = add nsw i32 %145, 1
store i32 %146, i32* %29
br label %68
147: ; preds = %68
br label %148
148: ; preds = %147
%149 = load i32, i32* %28
%150 = add nsw i32 %149, 1
store i32 %150, i32* %28
br label %63
151: ; preds = %63
ret void
}

LLVM IR (-O2):
define void @init(float* nocapture writeonly %0, i32 %1, i32 %2, i32 %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11) {
%13 = fneg float %10
%14 = fmul float %13, %11
%15 = fmul float %4, %4
%16 = fmul float %15, %14
%17 = tail call float @exp(float %16)
%18 = fmul float %5, %5
%19 = fmul float %18, %14
%20 = tail call float @exp(float %19)
%21 = fmul float %6, %6
%22 = fmul float %21, %14
%23 = tail call float @exp(float %22)
%24 = icmp sgt i32 %3, 0
br i1 %24, label %25, label %83
25: ; preds = %12
%26 = icmp sgt i32 %2, 0
%27 = icmp sgt i32 %1, 0
%28 = zext i32 %1 to i64
br label %29
29: ; preds = %25, %80
%30 = phi i32 [ 0, %25 ], [ %81, %80 ]
br i1 %26, label %31, label %80
31: ; preds = %29
%32 = mul i32 %30, %2
%33 = sitofp i32 %30 to double
%34 = fadd double %33, 5.000000e-01
%35 = fptrunc double %34 to float
%36 = fmul float %35, %9
%37 = fmul float %36, %6
br label %38
38: ; preds = %31, %77
%39 = phi i32 [ 0, %31 ], [ %78, %77 ]
br i1 %27, label %40, label %77
40: ; preds = %38
%41 = add i32 %39, %32
%42 = mul i32 %41, %1
%43 = sitofp i32 %39 to double
%44 = fadd double %43, 5.000000e-01
%45 = fptrunc double %44 to float
%46 = fmul float %45, %8
%47 = fmul float %46, %5
br label %48
48: ; preds = %40, %48
%49 = phi i64 [ 0, %40 ], [ %75, %48 ]
%50 = trunc i64 %49 to i32
%51 = add i32 %42, %50
%52 = sitofp i32 %50 to double
%53 = fadd double %52, 5.000000e-01
%54 = fptrunc double %53 to float
%55 = fmul float %54, %7
%56 = fmul float %55, %4
%57 = tail call float @cos(float %56)
%58 = fmul float %17, %57
%59 = fpext float %58 to double
%60 = fsub double 1.000000e+00, %59
%61 = fmul double %60, 1.250000e-01
%62 = tail call float @cos(float %47)
%63 = fmul float %20, %62
%64 = fpext float %63 to double
%65 = fsub double 1.000000e+00, %64
%66 = fmul double %61, %65
%67 = tail call float @cos(float %37)
%68 = fmul float %23, %67
%69 = fpext float %68 to double
%70 = fsub double 1.000000e+00, %69
%71 = fmul double %66, %70
%72 = fptrunc double %71 to float
%73 = sext i32 %51 to i64
%74 = getelementptr inbounds float, float* %0, i64 %73
store float %72, float* %74
%75 = add nuw nsw i64 %49, 1
%76 = icmp eq i64 %75, %28
br i1 %76, label %77, label %48
77: ; preds = %48, %38
%78 = add nuw nsw i32 %39, 1
%79 = icmp eq i32 %78, %2
br i1 %79, label %80, label %38
80: ; preds = %77, %29
%81 = add nuw nsw i32 %30, 1
%82 = icmp eq i32 %81, %3
br i1 %82, label %83, label %29
83: ; preds = %80, %12
ret void
}