#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 */
typedef float uint8_t;

/* Variables and functions */
int /*<<< orphan*/ flip_buffer();
int /*<<< orphan*/ pico_exit();
float *pico_fb(int, int);
int /*<<< orphan*/ wait_sync();
int main(int argc, char **argv) {
  uint8_t *pixels = pico_fb(512, 384);
  if (!pixels)
    return -1;
  int frame;
  int val = 0;
  int dir = 1;
  for (frame = 0; frame < 100000; frame++) {
    int x, y;
    int i;
    wait_sync();
    i = 0;
    for (y = 0; y < 384; y++)
      for (x = 0; x < 512; x++) {
        float d = (x - 512 / 2) * (x - 512 / 2) + (y - 384 / 2) * (y - 384 / 2);
        pixels[i + 0] = (x & y) + frame;
        pixels[i + 1] = val;
        pixels[i + 2] = (x - 512 / 2) * frame / ((y - 384 / 2) + 0.5);
        pixels[i + 3] = d * 800 / frame;
        i += 4;
      }
    flip_buffer();
    val += dir;
    if (val >= 255 || val < 0) {
      dir *= -1;
      val += dir;
    }
  }
  pico_exit();
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    $0x200,%edi
mov    $0x180,%esi
call   1040 <pico_fb@plt>
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1180 <main+0x40>
movl   $0xffffffff,-0x4(%rbp)
jmp    132e <main+0x1ee>
movl   $0x0,-0x20(%rbp)
movl   $0x1,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x186a0,-0x1c(%rbp)
jge    1320 <main+0x1e0>
mov    $0x0,%al
call   1050 <wait_sync@plt>
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0x180,-0x2c(%rbp)
jge    12d6 <main+0x196>
movl   $0x0,-0x28(%rbp)
cmpl   $0x200,-0x28(%rbp)
jge    12c3 <main+0x183>
mov    -0x28(%rbp),%eax
sub    $0x100,%eax
mov    -0x28(%rbp),%ecx
sub    $0x100,%ecx
imul   %ecx,%eax
mov    -0x2c(%rbp),%ecx
sub    $0xc0,%ecx
mov    -0x2c(%rbp),%edx
sub    $0xc0,%edx
imul   %edx,%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x28(%rbp),%eax
and    -0x2c(%rbp),%eax
add    -0x1c(%rbp),%eax
cvtsi2ss %eax,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2ssl -0x20(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
sub    $0x100,%eax
imul   -0x1c(%rbp),%eax
cvtsi2sd %eax,%xmm0
mov    -0x2c(%rbp),%eax
sub    $0xc0,%eax
cvtsi2sd %eax,%xmm1
movsd  0xda2(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  0xd74(%rip),%xmm0
mulss  -0x34(%rbp),%xmm0
cvtsi2ssl -0x1c(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11cb <main+0x8b>
jmp    12c8 <main+0x188>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11b7 <main+0x77>
mov    $0x0,%al
call   1060 <flip_buffer@plt>
mov    -0x24(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0xff,-0x20(%rbp)
jge    12fd <main+0x1bd>
cmpl   $0x0,-0x20(%rbp)
jge    130d <main+0x1cd>
imul   $0xffffffff,-0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1312 <main+0x1d2>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1195 <main+0x55>
mov    $0x0,%al
call   1030 <pico_exit@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    $0x200,%edi
mov    $0x180,%esi
call   1040 <pico_fb@plt>
test   %rax,%rax
je     1335 <main+0x1f5>
mov    %rax,%rbx
mov    $0x1,%r14d
xor    %r15d,%r15d
xor    %ebp,%ebp
nopl   (%rax)
xor    %eax,%eax
call   1050 <wait_sync@plt>
cvtsi2ss %r15d,%xmm13
cvtsi2ss %ebp,%xmm8
movd   %ebp,%xmm1
pshufd $0x0,%xmm1,%xmm12
shufps $0x0,%xmm8,%xmm8
shufps $0x0,%xmm13,%xmm13
xor    %eax,%eax
xor    %ecx,%ecx
nopl   0x0(%rax)
lea    -0xc0(%rcx),%edx
cltq
cvtsi2sd %edx,%xmm11
addsd  0xe4a(%rip),%xmm11
imul   %edx,%edx
movd   %edx,%xmm1
pshufd $0x0,%xmm1,%xmm9
movd   %ecx,%xmm1
pshufd $0x0,%xmm1,%xmm10
unpcklpd %xmm11,%xmm11
lea    (%rbx,%rax,4),%rdx
add    $0x800,%rax
xor    %esi,%esi
movdqa 0xe2a(%rip),%xmm6
movaps 0xe42(%rip),%xmm15
movdqa 0xe49(%rip),%xmm14
nopw   0x0(%rax,%rax,1)
movdqa %xmm6,%xmm1
paddd  0xe14(%rip),%xmm1
movdqa %xmm1,%xmm7
pmuludq %xmm1,%xmm7
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xf5,%xmm1,%xmm4
pshufd $0xf5,%xmm12,%xmm5
pmuludq %xmm4,%xmm5
pmuludq %xmm4,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm7
paddd  %xmm9,%xmm7
cvtdq2ps %xmm7,%xmm7
movdqa %xmm6,%xmm4
pand   %xmm10,%xmm4
paddd  %xmm12,%xmm4
pmuludq %xmm12,%xmm1
movdqa %xmm1,%xmm3
punpckldq %xmm5,%xmm3
punpckhdq %xmm5,%xmm1
cvtdq2pd %xmm1,%xmm5
cvtdq2pd %xmm3,%xmm3
cvtdq2ps %xmm4,%xmm1
divpd  %xmm11,%xmm5
cvtpd2ps %xmm5,%xmm4
divpd  %xmm11,%xmm3
cvtpd2ps %xmm3,%xmm3
mulps  %xmm15,%xmm7
divps  %xmm8,%xmm7
movaps %xmm7,%xmm5
movlhps %xmm3,%xmm5
movaps %xmm1,%xmm2
unpcklps %xmm13,%xmm2
shufps $0x24,%xmm5,%xmm2
unpcklps %xmm7,%xmm3
movaps %xmm13,%xmm5
shufps $0x11,%xmm1,%xmm5
shufps $0xe2,%xmm3,%xmm5
movaps %xmm7,%xmm3
shufps $0x2,%xmm4,%xmm3
movaps %xmm13,%xmm0
shufps $0x33,%xmm1,%xmm0
unpckhps %xmm13,%xmm1
shufps $0x24,%xmm3,%xmm1
shufps $0x13,%xmm4,%xmm7
shufps $0x22,%xmm7,%xmm0
movups %xmm0,0x30(%rdx,%rsi,1)
movups %xmm1,0x20(%rdx,%rsi,1)
movups %xmm5,0x10(%rdx,%rsi,1)
movups %xmm2,(%rdx,%rsi,1)
paddd  %xmm14,%xmm6
add    $0x40,%rsi
cmp    $0x2000,%rsi
jne    1200 <main+0xc0>
add    $0x1,%ecx
cmp    $0x180,%ecx
jne    11a0 <main+0x60>
xor    %eax,%eax
call   1060 <flip_buffer@plt>
lea    (%r14,%r15,1),%eax
mov    %r14d,%ecx
neg    %ecx
cmp    $0xff,%eax
cmovae %r15d,%eax
cmovb  %r14d,%ecx
add    $0x1,%ebp
mov    %ecx,%r14d
mov    %eax,%r15d
cmp    $0x186a0,%ebp
jne    1170 <main+0x30>
xor    %ebx,%ebx
xor    %eax,%eax
call   1030 <pico_exit@plt>
jmp    133a <main+0x1fa>
mov    $0xffffffff,%ebx
mov    %ebx,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = tail call float* @pico_fb(i32 512, i32 384)
%4 = icmp eq float* %3, null
br i1 %4, label %74, label %5
5: ; preds = %2, %63
%6 = phi i32 [ %69, %63 ], [ 1, %2 ]
%7 = phi i32 [ %68, %63 ], [ 0, %2 ]
%8 = phi i32 [ %70, %63 ], [ 0, %2 ]
%9 = tail call i32 (...) @wait_sync()
%10 = sitofp i32 %7 to float
%11 = sitofp i32 %8 to float
%12 = insertelement <4 x i32> poison, i32 %8, i64 0
%13 = shufflevector <4 x i32> %12, <4 x i32> poison, <4 x i32> zeroinitializer
%14 = insertelement <4 x float> poison, float %11, i64 0
%15 = shufflevector <4 x float> %14, <4 x float> poison, <4 x i32> zeroinitializer
%16 = insertelement <4 x float> poison, float %10, i64 0
%17 = shufflevector <4 x float> %16, <4 x float> poison, <4 x i32> zeroinitializer
br label %18
18: ; preds = %5, %60
%19 = phi i64 [ 0, %5 ], [ %27, %60 ]
%20 = phi i32 [ 0, %5 ], [ %61, %60 ]
%21 = add nsw i32 %20, -192
%22 = shl i64 %19, 32
%23 = ashr exact i64 %22, 32
%24 = sitofp i32 %21 to double
%25 = fadd double %24, 5.000000e-01
%26 = mul nsw i32 %21, %21
%27 = add nsw i64 %23, 2048
%28 = insertelement <4 x i32> poison, i32 %26, i64 0
%29 = shufflevector <4 x i32> %28, <4 x i32> poison, <4 x i32> zeroinitializer
%30 = insertelement <4 x i32> poison, i32 %20, i64 0
%31 = shufflevector <4 x i32> %30, <4 x i32> poison, <4 x i32> zeroinitializer
%32 = insertelement <4 x double> poison, double %25, i64 0
%33 = shufflevector <4 x double> %32, <4 x double> poison, <4 x i32> zeroinitializer
br label %34
34: ; preds = %34, %18
%35 = phi i64 [ 0, %18 ], [ %57, %34 ]
%36 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %18 ], [ %58, %34 ]
%37 = shl i64 %35, 2
%38 = add i64 %23, %37
%39 = add nsw <4 x i32> %36, <i32 -256, i32 -256, i32 -256, i32 -256>
%40 = mul nsw <4 x i32> %39, %39
%41 = add nuw nsw <4 x i32> %40, %29
%42 = sitofp <4 x i32> %41 to <4 x float>
%43 = and <4 x i32> %36, %31
%44 = add nuw nsw <4 x i32> %43, %13
%45 = sitofp <4 x i32> %44 to <4 x float>
%46 = mul nsw <4 x i32> %39, %13
%47 = sitofp <4 x i32> %46 to <4 x double>
%48 = fdiv <4 x double> %47, %33
%49 = fptrunc <4 x double> %48 to <4 x float>
%50 = fmul <4 x float> %42, <float 8.000000e+02, float 8.000000e+02, float 8.000000e+02, float 8.000000e+02>
%51 = fdiv <4 x float> %50, %15
%52 = getelementptr inbounds float, float* %3, i64 %38
%53 = bitcast float* %52 to <16 x float>*
%54 = shufflevector <4 x float> %45, <4 x float> %17, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
%55 = shufflevector <4 x float> %49, <4 x float> %51, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
%56 = shufflevector <8 x float> %54, <8 x float> %55, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>
store <16 x float> %56, <16 x float>* %53
%57 = add nuw i64 %35, 4
%58 = add <4 x i32> %36, <i32 4, i32 4, i32 4, i32 4>
%59 = icmp eq i64 %57, 512
br i1 %59, label %60, label %34
60: ; preds = %34
%61 = add nuw nsw i32 %20, 1
%62 = icmp eq i32 %61, 384
br i1 %62, label %63, label %18
63: ; preds = %60
%64 = tail call i32 (...) @flip_buffer()
%65 = add nsw i32 %6, %7
%66 = icmp ugt i32 %65, 254
%67 = sub nsw i32 0, %6
%68 = select i1 %66, i32 %7, i32 %65
%69 = select i1 %66, i32 %67, i32 %6
%70 = add nuw nsw i32 %8, 1
%71 = icmp eq i32 %70, 100000
br i1 %71, label %72, label %5
72: ; preds = %63
%73 = tail call i32 (...) @pico_exit()
br label %74
74: ; preds = %2, %72
%75 = phi i32 [ 0, %72 ], [ -1, %2 ]
ret i32 %75
}