int _escape(double real, double imag, int limit) {
  double x = 0, y = 0, x_temp;
  int n = 0;
  while (x * x + y * y < 2 * 2 && n < limit) {
    x_temp = x;
    x = x * x - y * y + real;
    y = 2 * x_temp * y + imag;
    n++;
  };
  if (n == limit) {
    return 0;
  } else {
    return n;
  };
}


x86 assembly (clang, -O0):
<_escape>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
mov    %edi,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
movsd  -0x28(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
xor    %eax,%eax
movsd  0xeb2(%rip),%xmm0
ucomisd %xmm1,%xmm0
mov    %al,-0x3d(%rbp)
jbe    1167 <_escape+0x67>
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
setl   %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    1177 <_escape+0x77>
jmp    11f0 <_escape+0xf0>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xe42(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1128 <_escape+0x28>
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jne    1208 <_escape+0x108>
movl   $0x0,-0x4(%rbp)
jmp    120e <_escape+0x10e>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_escape>:
xor    %eax,%eax
mov    $0x0,%ecx
test   %edi,%edi
jle    116d <_escape+0x6d>
xor    %ecx,%ecx
xorpd  %xmm5,%xmm5
movsd  0xee7(%rip),%xmm2
xorpd  %xmm3,%xmm3
xorpd  %xmm4,%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movapd %xmm4,%xmm6
mulsd  %xmm4,%xmm4
subsd  %xmm5,%xmm4
addsd  %xmm0,%xmm4
addsd  %xmm6,%xmm6
mulsd  %xmm6,%xmm3
addsd  %xmm1,%xmm3
add    $0x1,%ecx
movapd %xmm3,%xmm5
mulsd  %xmm3,%xmm5
movapd %xmm4,%xmm6
mulsd  %xmm4,%xmm6
addsd  %xmm5,%xmm6
ucomisd %xmm6,%xmm2
jbe    116d <_escape+0x6d>
cmp    %edi,%ecx
jl     1130 <_escape+0x30>
cmp    %edi,%ecx
cmovne %ecx,%eax
ret

LLVM IR (-O0):
define i32 @_escape(double %0, double %1, i32 %2) {
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca i32
store double %0, double* %5
store double %1, double* %6
store i32 %2, i32* %7
store double 0.000000e+00, double* %8
store double 0.000000e+00, double* %9
store i32 0, i32* %11
br label %12
12: ; preds = %26, %3
%13 = load double, double* %8
%14 = load double, double* %8
%15 = load double, double* %9
%16 = load double, double* %9
%17 = fmul double %15, %16
%18 = call double @llvm.fmuladd.f64(double %13, double %14, double %17)
%19 = fcmp olt double %18, 4.000000e+00
br i1 %19, label %20, label %24
20: ; preds = %12
%21 = load i32, i32* %11
%22 = load i32, i32* %7
%23 = icmp slt i32 %21, %22
br label %24
24: ; preds = %20, %12
%25 = phi i1 [ false, %12 ], [ %23, %20 ]
br i1 %25, label %26, label %44
26: ; preds = %24
%27 = load double, double* %8
store double %27, double* %10
%28 = load double, double* %8
%29 = load double, double* %8
%30 = load double, double* %9
%31 = load double, double* %9
%32 = fmul double %30, %31
%33 = fneg double %32
%34 = call double @llvm.fmuladd.f64(double %28, double %29, double %33)
%35 = load double, double* %5
%36 = fadd double %34, %35
store double %36, double* %8
%37 = load double, double* %10
%38 = fmul double 2.000000e+00, %37
%39 = load double, double* %9
%40 = load double, double* %6
%41 = call double @llvm.fmuladd.f64(double %38, double %39, double %40)
store double %41, double* %9
%42 = load i32, i32* %11
%43 = add nsw i32 %42, 1
store i32 %43, i32* %11
br label %12
44: ; preds = %24
%45 = load i32, i32* %11
%46 = load i32, i32* %7
%47 = icmp eq i32 %45, %46
br i1 %47, label %48, label %49
48: ; preds = %44
store i32 0, i32* %4
br label %51
49: ; preds = %44
%50 = load i32, i32* %11
store i32 %50, i32* %4
br label %51
51: ; preds = %49, %48
%52 = load i32, i32* %4
ret i32 %52
}

LLVM IR (-O2):
define i32 @_escape(double %0, double %1, i32 %2) {
%4 = icmp sgt i32 %2, 0
br i1 %4, label %5, label %21
5: ; preds = %3, %5
%6 = phi double [ %16, %5 ], [ 0.000000e+00, %3 ]
%7 = phi i32 [ %15, %5 ], [ 0, %3 ]
%8 = phi double [ %14, %5 ], [ 0.000000e+00, %3 ]
%9 = phi double [ %12, %5 ], [ 0.000000e+00, %3 ]
%10 = fneg double %6
%11 = tail call double @llvm.fmuladd.f64(double %9, double %9, double %10)
%12 = fadd double %11, %0
%13 = fmul double %9, 2.000000e+00
%14 = tail call double @llvm.fmuladd.f64(double %13, double %8, double %1)
%15 = add nuw nsw i32 %7, 1
%16 = fmul double %14, %14
%17 = tail call double @llvm.fmuladd.f64(double %12, double %12, double %16)
%18 = fcmp olt double %17, 4.000000e+00
%19 = icmp slt i32 %15, %2
%20 = select i1 %18, i1 %19, i1 false
br i1 %20, label %5, label %21
21: ; preds = %5, %3
%22 = phi i32 [ 0, %3 ], [ %15, %5 ]
%23 = icmp eq i32 %22, %2
%24 = select i1 %23, i32 0, i32 %22
ret i32 %24
}