#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 cosf(float);
float fabsf(float);
float sinf(float);
void crta_r(float *sl, int w, int h, float size, float amp, float tilt) {
  int i, j;
  float d, st, ct, g;
  st = sinf(tilt);
  ct = cosf(tilt);
  for (i = 0; i < h; i++)
    for (j = 0; j < w; j++) {
      d = (i - h / 2) * ct + (j - w / 2) * st;
      if (fabsf(d) > size / 2.0) {
        if (d > 0.0)
          sl[i * w + j] = 0.5 - amp / 2.0;
        else
          sl[i * w + j] = 0.5 + amp / 2.0;
      } else {
        if (d > size / 2.0)
          d = size / 2.0;
        g = 0.5 - amp * (d / size);
        sl[i * w + j] = g;
      }
    }
}


x86 assembly (clang, -O0):
<crta_r>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movss  %xmm2,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
call   1030 <sinf@plt>
movss  %xmm0,-0x2c(%rbp)
movss  -0x1c(%rbp),%xmm0
call   1040 <cosf@plt>
movss  %xmm0,-0x30(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1350 <crta_r+0x230>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    133d <crta_r+0x21d>
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  -0x30(%rbp),%xmm2
mov    -0x24(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
sub    %ecx,%eax
cvtsi2ss %eax,%xmm1
mulss  -0x2c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
movaps 0xe30(%rip),%xmm1
pand   %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe07(%rip),%xmm2
divsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    129d <crta_r+0x17d>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    125d <crta_r+0x13d>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdd2(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xdce(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1298 <crta_r+0x178>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd92(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xd8e(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    132a <crta_r+0x20a>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd49(%rip),%xmm2
divsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    12e3 <crta_r+0x1c3>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd2a(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x18(%rbp),%xmm0
movss  -0x28(%rbp),%xmm1
divss  -0x14(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd06(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    132f <crta_r+0x20f>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1179 <crta_r+0x59>
jmp    1342 <crta_r+0x222>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1166 <crta_r+0x46>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<crta_r>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
movss  %xmm2,0xc(%rsp)
movss  %xmm1,0x14(%rsp)
movss  %xmm0,0x10(%rsp)
mov    %edx,%r14d
mov    %esi,%r15d
mov    %rdi,%rbx
movaps %xmm2,%xmm0
call   1030 <sinf@plt>
movss  %xmm0,0x8(%rsp)
movss  0xc(%rsp),%xmm0
call   1040 <cosf@plt>
movss  0x8(%rsp),%xmm7
movss  0x10(%rsp),%xmm12
movss  0x14(%rsp),%xmm13
test   %r14d,%r14d
jle    12a8 <crta_r+0x188>
mov    %r14d,%r8d
shr    %r8d
mov    %r15d,%ecx
shr    $0x1f,%ecx
add    %r15d,%ecx
sar    %ecx
xorps  %xmm1,%xmm1
cvtss2sd %xmm12,%xmm1
movsd  0xe64(%rip),%xmm2
mulsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm6
cvtss2sd %xmm13,%xmm3
mulsd  %xmm2,%xmm3
movapd %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvtsd2ss %xmm4,%xmm8
neg    %ecx
subsd  %xmm3,%xmm2
cvtsd2ss %xmm2,%xmm9
movslq %r15d,%rdx
mov    %r14d,%r9d
mov    %edx,%edi
shl    $0x2,%rdx
xor    %eax,%eax
movaps 0xe36(%rip),%xmm5
xorps  %xmm10,%xmm10
movss  0xe39(%rip),%xmm11
jmp    1200 <crta_r+0xe0>
nopl   0x0(%rax)
add    $0x1,%rax
add    %rdx,%rbx
cmp    %r9,%rax
je     12a8 <crta_r+0x188>
test   %r15d,%r15d
jle    11f0 <crta_r+0xd0>
mov    %eax,%ebp
sub    %r8d,%ebp
xorps  %xmm4,%xmm4
cvtsi2ss %ebp,%xmm4
xor    %ebp,%ebp
jmp    1240 <crta_r+0x120>
cs nopw 0x0(%rax,%rax,1)
nop
divss  %xmm12,%xmm2
mulss  %xmm13,%xmm2
movaps %xmm11,%xmm3
subss  %xmm2,%xmm3
movss  %xmm3,(%rbx,%rbp,4)
add    $0x1,%rbp
cmp    %rbp,%rdi
je     11f0 <crta_r+0xd0>
lea    (%rcx,%rbp,1),%esi
xorps  %xmm2,%xmm2
cvtsi2ss %esi,%xmm2
mulss  %xmm7,%xmm2
movaps %xmm4,%xmm3
mulss  %xmm0,%xmm3
addss  %xmm2,%xmm3
movaps %xmm3,%xmm2
andps  %xmm5,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
jbe    1280 <crta_r+0x160>
ucomiss %xmm10,%xmm3
jbe    12a0 <crta_r+0x180>
movss  %xmm9,(%rbx,%rbp,4)
jmp    1237 <crta_r+0x117>
nopw   0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
ucomisd %xmm1,%xmm2
movaps %xmm6,%xmm2
ja     1220 <crta_r+0x100>
movaps %xmm3,%xmm2
jmp    1220 <crta_r+0x100>
cs nopw 0x0(%rax,%rax,1)
nop
movss  %xmm8,(%rbx,%rbp,4)
jmp    1237 <crta_r+0x117>
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @crta_r(float* nocapture writeonly %0, i32 %1, i32 %2, float %3, float %4, float %5) {
%7 = tail call float @sinf(float %5)
%8 = tail call float @cosf(float %5)
%9 = icmp sgt i32 %2, 0
br i1 %9, label %10, label %64
10: ; preds = %6
%11 = icmp sgt i32 %1, 0
%12 = lshr i32 %2, 1
%13 = sdiv i32 %1, -2
%14 = fpext float %3 to double
%15 = fmul double %14, 5.000000e-01
%16 = fptrunc double %15 to float
%17 = fpext float %4 to double
%18 = fmul double %17, 5.000000e-01
%19 = fadd double %18, 5.000000e-01
%20 = fptrunc double %19 to float
%21 = fsub double 5.000000e-01, %18
%22 = fptrunc double %21 to float
%23 = sext i32 %1 to i64
%24 = zext i32 %2 to i64
%25 = zext i32 %1 to i64
br label %26
26: ; preds = %10, %61
%27 = phi i64 [ 0, %10 ], [ %62, %61 ]
br i1 %11, label %28, label %61
28: ; preds = %26
%29 = trunc i64 %27 to i32
%30 = sub i32 %29, %12
%31 = sitofp i32 %30 to float
%32 = mul nsw i64 %27, %23
br label %33
33: ; preds = %28, %58
%34 = phi i64 [ 0, %28 ], [ %59, %58 ]
%35 = trunc i64 %34 to i32
%36 = add i32 %13, %35
%37 = sitofp i32 %36 to float
%38 = fmul float %7, %37
%39 = tail call float @llvm.fmuladd.f32(float %31, float %8, float %38)
%40 = tail call float @llvm.fabs.f32(float %39)
%41 = fpext float %40 to double
%42 = fcmp olt double %15, %41
br i1 %42, label %43, label %49
43: ; preds = %33
%44 = fcmp ogt float %39, 0.000000e+00
%45 = add nsw i64 %34, %32
%46 = getelementptr inbounds float, float* %0, i64 %45
br i1 %44, label %47, label %48
47: ; preds = %43
store float %22, float* %46
br label %58
48: ; preds = %43
store float %20, float* %46
br label %58
49: ; preds = %33
%50 = fpext float %39 to double
%51 = fcmp olt double %15, %50
%52 = select i1 %51, float %16, float %39
%53 = fdiv float %52, %3
%54 = fmul float %53, %4
%55 = fsub float 5.000000e-01, %54
%56 = add nsw i64 %34, %32
%57 = getelementptr inbounds float, float* %0, i64 %56
store float %55, float* %57
br label %58
58: ; preds = %49, %48, %47
%59 = add nuw nsw i64 %34, 1
%60 = icmp eq i64 %59, %25
br i1 %60, label %61, label %33
61: ; preds = %58, %26
%62 = add nuw nsw i64 %27, 1
%63 = icmp eq i64 %62, %24
br i1 %63, label %64, label %26
64: ; preds = %61, %6
ret void
}