float fov(float z) {
  long a, e, f, h;
  float b, c, g;
  const float d = 1.5F;
  e = z * d;
  f = 0x8504f35f - (e << 3);
  b = z * 0.5F;
  c = z;
  g = f << 2;
  a = *(long *)&c;
  f = a;
  a = c * c * b;
  a = 0x5f3759df - (f >> 1);
  c = *(float *)&a;
  h = z + d;
  c = c * (d - (b * c * c));
  return c;
}


x86 assembly (clang, -O0):
<fov>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  0xeef(%rip),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  0xee2(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
cvttss2si %xmm0,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rcx
shl    $0x3,%rcx
mov    $0x8504f35f,%eax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
movss  0xebc(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x2,%rax
cvtsi2ss %rax,%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movss  -0x30(%rbp),%xmm0
mulss  -0x30(%rbp),%xmm0
mulss  -0x2c(%rbp),%xmm0
cvttss2si %xmm0,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rcx
sar    $0x1,%rcx
mov    $0x5f3759df,%eax
sub    %rcx,%rax
mov    %rax,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  0xe44(%rip),%xmm0
addss  -0x4(%rbp),%xmm0
cvttss2si %xmm0,%rax
mov    %rax,-0x28(%rbp)
movss  -0x30(%rbp),%xmm0
movss  -0x2c(%rbp),%xmm1
mulss  -0x30(%rbp),%xmm1
movss  -0x30(%rbp),%xmm2
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm1
movss  0xe09(%rip),%xmm2
addss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fov>:
ret

LLVM IR (-O0):
define float @fov(float %0) {
%2 = alloca float
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
store float %0, float* %2
store float 1.500000e+00, float* %10
%11 = load float, float* %2
%12 = fmul float %11, 1.500000e+00
%13 = fptosi float %12 to i64
store i64 %13, i64* %4
%14 = load i64, i64* %4
%15 = shl i64 %14, 3
%16 = sub nsw i64 2231694175, %15
store i64 %16, i64* %5
%17 = load float, float* %2
%18 = fmul float %17, 5.000000e-01
store float %18, float* %7
%19 = load float, float* %2
store float %19, float* %8
%20 = load i64, i64* %5
%21 = shl i64 %20, 2
%22 = sitofp i64 %21 to float
store float %22, float* %9
%23 = bitcast float* %8 to i64*
%24 = load i64, i64* %23
store i64 %24, i64* %3
%25 = load i64, i64* %3
store i64 %25, i64* %5
%26 = load float, float* %8
%27 = load float, float* %8
%28 = fmul float %26, %27
%29 = load float, float* %7
%30 = fmul float %28, %29
%31 = fptosi float %30 to i64
store i64 %31, i64* %3
%32 = load i64, i64* %5
%33 = ashr i64 %32, 1
%34 = sub nsw i64 1597463007, %33
store i64 %34, i64* %3
%35 = bitcast i64* %3 to float*
%36 = load float, float* %35
store float %36, float* %8
%37 = load float, float* %2
%38 = fadd float %37, 1.500000e+00
%39 = fptosi float %38 to i64
store i64 %39, i64* %6
%40 = load float, float* %8
%41 = load float, float* %7
%42 = load float, float* %8
%43 = fmul float %41, %42
%44 = load float, float* %8
%45 = fneg float %43
%46 = call float @llvm.fmuladd.f32(float %45, float %44, float 1.500000e+00)
%47 = fmul float %40, %46
store float %47, float* %8
%48 = load float, float* %8
ret float %48
}

LLVM IR (-O2):
define float @fov(float %0) {
ret float poison
}