void p_env_create_sky(float *vector, float *data, float light,
                      unsigned int size) {
  int i;
  float temp;
  for (i = 0; i < size * size * 6; i++) {
    temp = vector[i * 3 + 1];
    if (vector[i * 3 + 1] > 0) {
      temp = (1 - temp) * 1.2;
      data[i * 3] = light * (temp * temp * temp + 0.1);
      data[i * 3 + 1] = light * (temp * temp + 0.2);
      data[i * 3 + 2] = light * (temp + 0.4);
    } else {
      data[i * 3] = 0.2 * light;
      data[i * 3 + 1] = 0.2 * light;
      data[i * 3 + 2] = 0.2 * light;
    }
  }
}


x86 assembly (clang, -O0):
<p_env_create_sky>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%ecx
imul   -0x18(%rbp),%ecx
imul   $0x6,%ecx,%ecx
cmp    %ecx,%eax
jae    12dd <p_env_create_sky+0x1dd>
mov    -0x8(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1249 <p_env_create_sky+0x149>
movss  0xeb1(%rip),%xmm0
subss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe98(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x20(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe5f(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x20(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe14(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xde3(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    12ca <p_env_create_sky+0x1ca>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xda6(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd7d(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd51(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    12cf <p_env_create_sky+0x1cf>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    111b <p_env_create_sky+0x1b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<p_env_create_sky>:
imul   %edx,%edx
add    %edx,%edx
lea    (%rdx,%rdx,2),%eax
test   %eax,%eax
je     11f2 <p_env_create_sky+0xf2>
cvtss2sd %xmm0,%xmm0
movsd  0xee4(%rip),%xmm1
mulsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
mov    %eax,%eax
shl    $0x2,%rax
lea    (%rax,%rax,2),%rax
xor    %ecx,%ecx
xorps  %xmm2,%xmm2
movss  0xee4(%rip),%xmm8
movsd  0xec3(%rip),%xmm9
movsd  0xec2(%rip),%xmm10
movsd  0xeaa(%rip),%xmm6
movsd  0xeba(%rip),%xmm7
jmp    117d <p_env_create_sky+0x7d>
movss  %xmm1,(%rsi,%rcx,1)
movss  %xmm1,0x4(%rsi,%rcx,1)
movaps %xmm1,%xmm3
movss  %xmm3,0x8(%rsi,%rcx,1)
add    $0xc,%rcx
cmp    %rcx,%rax
je     11f2 <p_env_create_sky+0xf2>
movss  0x4(%rdi,%rcx,1),%xmm3
ucomiss %xmm2,%xmm3
jbe    1160 <p_env_create_sky+0x60>
movaps %xmm8,%xmm4
subss  %xmm3,%xmm4
xorps  %xmm3,%xmm3
cvtss2sd %xmm4,%xmm3
mulsd  %xmm9,%xmm3
cvtsd2ss %xmm3,%xmm3
movaps %xmm3,%xmm4
mulss  %xmm3,%xmm4
xorps  %xmm5,%xmm5
cvtss2sd %xmm4,%xmm5
mulss  %xmm3,%xmm4
cvtss2sd %xmm4,%xmm4
addsd  %xmm10,%xmm4
mulsd  %xmm0,%xmm4
cvtsd2ss %xmm4,%xmm4
movss  %xmm4,(%rsi,%rcx,1)
addsd  %xmm6,%xmm5
mulsd  %xmm0,%xmm5
xorps  %xmm4,%xmm4
cvtsd2ss %xmm5,%xmm4
movss  %xmm4,0x4(%rsi,%rcx,1)
cvtss2sd %xmm3,%xmm3
addsd  %xmm7,%xmm3
mulsd  %xmm0,%xmm3
cvtsd2ss %xmm3,%xmm3
jmp    116e <p_env_create_sky+0x6e>
ret

LLVM IR (-O0):
define void @p_env_create_sky(float* %0, float* %1, float %2, i32 %3) {
%5 = alloca float*
%6 = alloca float*
%7 = alloca float
%8 = alloca i32
%9 = alloca i32
%10 = alloca float
store float* %0, float** %5
store float* %1, float** %6
store float %2, float* %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %11
11: ; preds = %115, %4
%12 = load i32, i32* %9
%13 = load i32, i32* %8
%14 = load i32, i32* %8
%15 = mul i32 %13, %14
%16 = mul i32 %15, 6
%17 = icmp ult i32 %12, %16
br i1 %17, label %18, label %118
18: ; preds = %11
%19 = load float*, float** %5
%20 = load i32, i32* %9
%21 = mul nsw i32 %20, 3
%22 = add nsw i32 %21, 1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds float, float* %19, i64 %23
%25 = load float, float* %24
store float %25, float* %10
%26 = load float*, float** %5
%27 = load i32, i32* %9
%28 = mul nsw i32 %27, 3
%29 = add nsw i32 %28, 1
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds float, float* %26, i64 %30
%32 = load float, float* %31
%33 = fcmp ogt float %32, 0.000000e+00
br i1 %33, label %34, label %84
34: ; preds = %18
%35 = load float, float* %10
%36 = fsub float 1.000000e+00, %35
%37 = fpext float %36 to double
%38 = fmul double %37, 1.200000e+00
%39 = fptrunc double %38 to float
store float %39, float* %10
%40 = load float, float* %7
%41 = fpext float %40 to double
%42 = load float, float* %10
%43 = load float, float* %10
%44 = fmul float %42, %43
%45 = load float, float* %10
%46 = fmul float %44, %45
%47 = fpext float %46 to double
%48 = fadd double %47, 1.000000e-01
%49 = fmul double %41, %48
%50 = fptrunc double %49 to float
%51 = load float*, float** %6
%52 = load i32, i32* %9
%53 = mul nsw i32 %52, 3
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds float, float* %51, i64 %54
store float %50, float* %55
%56 = load float, float* %7
%57 = fpext float %56 to double
%58 = load float, float* %10
%59 = load float, float* %10
%60 = fmul float %58, %59
%61 = fpext float %60 to double
%62 = fadd double %61, 2.000000e-01
%63 = fmul double %57, %62
%64 = fptrunc double %63 to float
%65 = load float*, float** %6
%66 = load i32, i32* %9
%67 = mul nsw i32 %66, 3
%68 = add nsw i32 %67, 1
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds float, float* %65, i64 %69
store float %64, float* %70
%71 = load float, float* %7
%72 = fpext float %71 to double
%73 = load float, float* %10
%74 = fpext float %73 to double
%75 = fadd double %74, 4.000000e-01
%76 = fmul double %72, %75
%77 = fptrunc double %76 to float
%78 = load float*, float** %6
%79 = load i32, i32* %9
%80 = mul nsw i32 %79, 3
%81 = add nsw i32 %80, 2
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds float, float* %78, i64 %82
store float %77, float* %83
br label %114
84: ; preds = %18
%85 = load float, float* %7
%86 = fpext float %85 to double
%87 = fmul double 2.000000e-01, %86
%88 = fptrunc double %87 to float
%89 = load float*, float** %6
%90 = load i32, i32* %9
%91 = mul nsw i32 %90, 3
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds float, float* %89, i64 %92
store float %88, float* %93
%94 = load float, float* %7
%95 = fpext float %94 to double
%96 = fmul double 2.000000e-01, %95
%97 = fptrunc double %96 to float
%98 = load float*, float** %6
%99 = load i32, i32* %9
%100 = mul nsw i32 %99, 3
%101 = add nsw i32 %100, 1
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds float, float* %98, i64 %102
store float %97, float* %103
%104 = load float, float* %7
%105 = fpext float %104 to double
%106 = fmul double 2.000000e-01, %105
%107 = fptrunc double %106 to float
%108 = load float*, float** %6
%109 = load i32, i32* %9
%110 = mul nsw i32 %109, 3
%111 = add nsw i32 %110, 2
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds float, float* %108, i64 %112
store float %107, float* %113
br label %114
114: ; preds = %84, %34
br label %115
115: ; preds = %114
%116 = load i32, i32* %9
%117 = add nsw i32 %116, 1
store i32 %117, i32* %9
br label %11
118: ; preds = %11
ret void
}

LLVM IR (-O2):
define void @p_env_create_sky(float* nocapture %0, float* nocapture writeonly %1, float %2, i32 %3) {
%5 = mul i32 %3, 6
%6 = mul i32 %5, %3
%7 = icmp eq i32 %6, 0
br i1 %7, label %50, label %8
8: ; preds = %4
%9 = fpext float %2 to double
%10 = fmul double %9, 2.000000e-01
%11 = fptrunc double %10 to float
%12 = zext i32 %6 to i64
br label %13
13: ; preds = %8, %44
%14 = phi i64 [ 0, %8 ], [ %48, %44 ]
%15 = mul nuw nsw i64 %14, 3
%16 = add nuw nsw i64 %15, 1
%17 = getelementptr inbounds float, float* %0, i64 %16
%18 = load float, float* %17
%19 = fcmp ogt float %18, 0.000000e+00
br i1 %19, label %20, label %41
20: ; preds = %13
%21 = fsub float 1.000000e+00, %18
%22 = fpext float %21 to double
%23 = fmul double %22, 1.200000e+00
%24 = fptrunc double %23 to float
%25 = fmul float %24, %24
%26 = fmul float %25, %24
%27 = fpext float %26 to double
%28 = fadd double %27, 1.000000e-01
%29 = fmul double %28, %9
%30 = fptrunc double %29 to float
%31 = getelementptr inbounds float, float* %1, i64 %15
store float %30, float* %31
%32 = fpext float %25 to double
%33 = fadd double %32, 2.000000e-01
%34 = fmul double %33, %9
%35 = fptrunc double %34 to float
%36 = getelementptr inbounds float, float* %1, i64 %16
store float %35, float* %36
%37 = fpext float %24 to double
%38 = fadd double %37, 4.000000e-01
%39 = fmul double %38, %9
%40 = fptrunc double %39 to float
br label %44
41: ; preds = %13
%42 = getelementptr inbounds float, float* %1, i64 %15
store float %11, float* %42
%43 = getelementptr inbounds float, float* %1, i64 %16
store float %11, float* %43
br label %44
44: ; preds = %20, %41
%45 = phi float [ %40, %20 ], [ %11, %41 ]
%46 = add nuw nsw i64 %15, 2
%47 = getelementptr inbounds float, float* %1, i64 %46
store float %45, float* %47
%48 = add nuw nsw i64 %14, 1
%49 = icmp eq i64 %48, %12
br i1 %49, label %50, label %13
50: ; preds = %44, %4
ret void
}