float f(float x, float y, int max_iter) {
  float cr = x, ci = y, zr = 0, zi = 0;
  int n;
  for (n = 0; n < max_iter; n++) {
    float tzr = zr, tzi = zi;
    zr = tzr * tzr - tzi * tzi + cr;
    zi = 2 * tzr * tzi + ci;
    if (zr * zr + zi * zi > 4.0) {
      break;
    }
  }
  return 1.0 - (float)n / (float)max_iter;
}


x86 assembly (clang, -O0):
<f>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11fd <f+0xfd>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x24(%rbp),%xmm0
movss  -0x24(%rbp),%xmm2
movss  -0x28(%rbp),%xmm1
mulss  -0x28(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xe79(%rip),%xmm0
mulss  -0x24(%rbp),%xmm0
movss  -0x28(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
movss  -0x18(%rbp),%xmm2
movss  -0x1c(%rbp),%xmm1
mulss  -0x1c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe25(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11ea <f+0xea>
jmp    11fd <f+0xfd>
jmp    11ef <f+0xef>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    113c <f+0x3c>
cvtsi2ssl -0x20(%rbp),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdf1(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<f>:
xor    %eax,%eax
test   %edi,%edi
jle    1162 <f+0x62>
xorps  %xmm2,%xmm2
movss  0xeef(%rip),%xmm3
xorps  %xmm4,%xmm4
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movaps %xmm2,%xmm5
movaps %xmm4,%xmm6
mulss  %xmm4,%xmm6
mulss  %xmm2,%xmm2
subss  %xmm6,%xmm2
addss  %xmm0,%xmm2
addss  %xmm5,%xmm5
mulss  %xmm5,%xmm4
addss  %xmm1,%xmm4
movaps %xmm4,%xmm5
mulss  %xmm4,%xmm5
movaps %xmm2,%xmm6
mulss  %xmm2,%xmm6
addss  %xmm5,%xmm6
ucomiss %xmm3,%xmm6
ja     1162 <f+0x62>
add    $0x1,%eax
cmp    %eax,%edi
jne    1120 <f+0x20>
mov    %edi,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %edi,%xmm0
divss  %xmm0,%xmm1
movss  0xe88(%rip),%xmm0
subss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @f(float %0, float %1, i32 %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca i32
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca i32
%12 = alloca float
%13 = alloca float
store float %0, float* %4
store float %1, float* %5
store i32 %2, i32* %6
%14 = load float, float* %4
store float %14, float* %7
%15 = load float, float* %5
store float %15, float* %8
store float 0.000000e+00, float* %9
store float 0.000000e+00, float* %10
store i32 0, i32* %11
br label %16
16: ; preds = %47, %3
%17 = load i32, i32* %11
%18 = load i32, i32* %6
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %50
20: ; preds = %16
%21 = load float, float* %9
store float %21, float* %12
%22 = load float, float* %10
store float %22, float* %13
%23 = load float, float* %12
%24 = load float, float* %12
%25 = load float, float* %13
%26 = load float, float* %13
%27 = fmul float %25, %26
%28 = fneg float %27
%29 = call float @llvm.fmuladd.f32(float %23, float %24, float %28)
%30 = load float, float* %7
%31 = fadd float %29, %30
store float %31, float* %9
%32 = load float, float* %12
%33 = fmul float 2.000000e+00, %32
%34 = load float, float* %13
%35 = load float, float* %8
%36 = call float @llvm.fmuladd.f32(float %33, float %34, float %35)
store float %36, float* %10
%37 = load float, float* %9
%38 = load float, float* %9
%39 = load float, float* %10
%40 = load float, float* %10
%41 = fmul float %39, %40
%42 = call float @llvm.fmuladd.f32(float %37, float %38, float %41)
%43 = fpext float %42 to double
%44 = fcmp ogt double %43, 4.000000e+00
br i1 %44, label %45, label %46
45: ; preds = %20
br label %50
46: ; preds = %20
br label %47
47: ; preds = %46
%48 = load i32, i32* %11
%49 = add nsw i32 %48, 1
store i32 %49, i32* %11
br label %16
50: ; preds = %45, %16
%51 = load i32, i32* %11
%52 = sitofp i32 %51 to float
%53 = load i32, i32* %6
%54 = sitofp i32 %53 to float
%55 = fdiv float %52, %54
%56 = fpext float %55 to double
%57 = fsub double 1.000000e+00, %56
%58 = fptrunc double %57 to float
ret float %58
}

LLVM IR (-O2):
define float @f(float %0, float %1, i32 %2) {
%4 = icmp sgt i32 %2, 0
br i1 %4, label %5, label %21
5: ; preds = %3, %18
%6 = phi float [ %12, %18 ], [ 0.000000e+00, %3 ]
%7 = phi float [ %14, %18 ], [ 0.000000e+00, %3 ]
%8 = phi i32 [ %19, %18 ], [ 0, %3 ]
%9 = fneg float %7
%10 = fmul float %7, %9
%11 = tail call float @llvm.fmuladd.f32(float %6, float %6, float %10)
%12 = fadd float %11, %0
%13 = fmul float %6, 2.000000e+00
%14 = tail call float @llvm.fmuladd.f32(float %13, float %7, float %1)
%15 = fmul float %14, %14
%16 = tail call float @llvm.fmuladd.f32(float %12, float %12, float %15)
%17 = fcmp ogt float %16, 4.000000e+00
br i1 %17, label %21, label %18
18: ; preds = %5
%19 = add nuw nsw i32 %8, 1
%20 = icmp eq i32 %19, %2
br i1 %20, label %21, label %5
21: ; preds = %18, %5, %3
%22 = phi i32 [ 0, %3 ], [ %8, %5 ], [ %2, %18 ]
%23 = sitofp i32 %22 to float
%24 = sitofp i32 %2 to float
%25 = fdiv float %23, %24
%26 = fsub float 1.000000e+00, %25
ret float %26
}