int _point_proj(long double *P, long double *A, long double *B,
                long double *H) {
  if (B[0] == A[0]) {
    H[0] = B[0];
    H[1] = P[1];
    return 1;
  }
  long double m = (B[1] - A[1]) / (B[0] - A[0]);
  long double c = A[1] - A[0] * m;
  H[0] = (P[0] / m + P[1] - c) / (m + 1. / m);
  H[1] = m * ((P[0] / m + P[1] - c) / (m + 1. / m)) + c;
  return 1;
}


x86 assembly (clang, -O0):
<_point_proj>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x20(%rbp),%rax
fldt   (%rax)
mov    -0x18(%rbp),%rax
fldt   (%rax)
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jne    115d <_point_proj+0x5d>
jp     115d <_point_proj+0x5d>
jmp    1137 <_point_proj+0x37>
mov    -0x20(%rbp),%rax
fldt   (%rax)
mov    -0x28(%rbp),%rax
fstpt  (%rax)
mov    -0x10(%rbp),%rax
fldt   0x10(%rax)
mov    -0x28(%rbp),%rax
fstpt  0x10(%rax)
movl   $0x1,-0x4(%rbp)
jmp    11e1 <_point_proj+0xe1>
mov    -0x20(%rbp),%rcx
fldt   0x10(%rcx)
mov    -0x18(%rbp),%rax
fldt   0x10(%rax)
fsubrp %st,%st(1)
fldt   (%rcx)
fldt   (%rax)
fsubrp %st,%st(1)
fdivrp %st,%st(1)
fstpt  -0x40(%rbp)
mov    -0x18(%rbp),%rax
fldt   0x10(%rax)
fldt   (%rax)
fldt   -0x40(%rbp)
fmulp  %st,%st(1)
fsubrp %st,%st(1)
fstpt  -0x50(%rbp)
mov    -0x10(%rbp),%rax
fldt   (%rax)
fldt   -0x40(%rbp)
fdivr  %st,%st(1)
fldt   0x10(%rax)
faddp  %st,%st(2)
fldt   -0x50(%rbp)
fsubrp %st,%st(2)
fld1
fld    %st(0)
fdiv   %st(2),%st
faddp  %st,%st(2)
fxch   %st(2)
fdivp  %st,%st(1)
mov    -0x28(%rbp),%rax
fstpt  (%rax)
fldt   -0x40(%rbp)
mov    -0x10(%rbp),%rax
fldt   (%rax)
fdiv   %st(1),%st
fldt   0x10(%rax)
faddp  %st,%st(1)
fldt   -0x50(%rbp)
fsubr  %st,%st(1)
fxch   %st(3)
fdiv   %st(2),%st
fadd   %st(2),%st
fdivrp %st,%st(1)
fmulp  %st,%st(1)
faddp  %st,%st(1)
mov    -0x28(%rbp),%rax
fstpt  0x10(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_point_proj>:
fldt   (%rdx)
fldt   (%rsi)
fxch   %st(1)
fucomi %st(1),%st
jne    1115 <_point_proj+0x15>
jp     1115 <_point_proj+0x15>
fstp   %st(1)
fstpt  (%rcx)
fldt   0x10(%rdi)
jmp    1151 <_point_proj+0x51>
fldt   0x10(%rdx)
fldt   0x10(%rsi)
fsubr  %st,%st(1)
fxch   %st(2)
fsub   %st(3),%st
fdivrp %st,%st(1)
fmul   %st,%st(2)
fxch   %st(1)
fsubp  %st,%st(2)
fldt   (%rdi)
fdiv   %st(1),%st
fldt   0x10(%rdi)
faddp  %st,%st(1)
fsub   %st(2),%st
fld1
fdiv   %st(2),%st
fadd   %st(2),%st
fdivr  %st,%st(1)
fxch   %st(1)
fstpt  (%rcx)
fldt   (%rdi)
fdiv   %st(2),%st
fldt   0x10(%rdi)
faddp  %st,%st(1)
fsub   %st(3),%st
fdivp  %st,%st(1)
fmulp  %st,%st(1)
faddp  %st,%st(1)
fstpt  0x10(%rcx)
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @_point_proj(x86_fp80* %0, x86_fp80* %1, x86_fp80* %2, x86_fp80* %3) {
%5 = alloca i32
%6 = alloca x86_fp80*
%7 = alloca x86_fp80*
%8 = alloca x86_fp80*
%9 = alloca x86_fp80*
%10 = alloca x86_fp80
%11 = alloca x86_fp80
store x86_fp80* %0, x86_fp80** %6
store x86_fp80* %1, x86_fp80** %7
store x86_fp80* %2, x86_fp80** %8
store x86_fp80* %3, x86_fp80** %9
%12 = load x86_fp80*, x86_fp80** %8
%13 = getelementptr inbounds x86_fp80, x86_fp80* %12, i64 0
%14 = load x86_fp80, x86_fp80* %13
%15 = load x86_fp80*, x86_fp80** %7
%16 = getelementptr inbounds x86_fp80, x86_fp80* %15, i64 0
%17 = load x86_fp80, x86_fp80* %16
%18 = fcmp oeq x86_fp80 %14, %17
br i1 %18, label %19, label %30
19: ; preds = %4
%20 = load x86_fp80*, x86_fp80** %8
%21 = getelementptr inbounds x86_fp80, x86_fp80* %20, i64 0
%22 = load x86_fp80, x86_fp80* %21
%23 = load x86_fp80*, x86_fp80** %9
%24 = getelementptr inbounds x86_fp80, x86_fp80* %23, i64 0
store x86_fp80 %22, x86_fp80* %24
%25 = load x86_fp80*, x86_fp80** %6
%26 = getelementptr inbounds x86_fp80, x86_fp80* %25, i64 1
%27 = load x86_fp80, x86_fp80* %26
%28 = load x86_fp80*, x86_fp80** %9
%29 = getelementptr inbounds x86_fp80, x86_fp80* %28, i64 1
store x86_fp80 %27, x86_fp80* %29
store i32 1, i32* %5
br label %94
30: ; preds = %4
%31 = load x86_fp80*, x86_fp80** %8
%32 = getelementptr inbounds x86_fp80, x86_fp80* %31, i64 1
%33 = load x86_fp80, x86_fp80* %32
%34 = load x86_fp80*, x86_fp80** %7
%35 = getelementptr inbounds x86_fp80, x86_fp80* %34, i64 1
%36 = load x86_fp80, x86_fp80* %35
%37 = fsub x86_fp80 %33, %36
%38 = load x86_fp80*, x86_fp80** %8
%39 = getelementptr inbounds x86_fp80, x86_fp80* %38, i64 0
%40 = load x86_fp80, x86_fp80* %39
%41 = load x86_fp80*, x86_fp80** %7
%42 = getelementptr inbounds x86_fp80, x86_fp80* %41, i64 0
%43 = load x86_fp80, x86_fp80* %42
%44 = fsub x86_fp80 %40, %43
%45 = fdiv x86_fp80 %37, %44
store x86_fp80 %45, x86_fp80* %10
%46 = load x86_fp80*, x86_fp80** %7
%47 = getelementptr inbounds x86_fp80, x86_fp80* %46, i64 1
%48 = load x86_fp80, x86_fp80* %47
%49 = load x86_fp80*, x86_fp80** %7
%50 = getelementptr inbounds x86_fp80, x86_fp80* %49, i64 0
%51 = load x86_fp80, x86_fp80* %50
%52 = load x86_fp80, x86_fp80* %10
%53 = fneg x86_fp80 %51
%54 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %53, x86_fp80 %52, x86_fp80 %48)
store x86_fp80 %54, x86_fp80* %11
%55 = load x86_fp80*, x86_fp80** %6
%56 = getelementptr inbounds x86_fp80, x86_fp80* %55, i64 0
%57 = load x86_fp80, x86_fp80* %56
%58 = load x86_fp80, x86_fp80* %10
%59 = fdiv x86_fp80 %57, %58
%60 = load x86_fp80*, x86_fp80** %6
%61 = getelementptr inbounds x86_fp80, x86_fp80* %60, i64 1
%62 = load x86_fp80, x86_fp80* %61
%63 = fadd x86_fp80 %59, %62
%64 = load x86_fp80, x86_fp80* %11
%65 = fsub x86_fp80 %63, %64
%66 = load x86_fp80, x86_fp80* %10
%67 = load x86_fp80, x86_fp80* %10
%68 = fdiv x86_fp80 0xK3FFF8000000000000000, %67
%69 = fadd x86_fp80 %66, %68
%70 = fdiv x86_fp80 %65, %69
%71 = load x86_fp80*, x86_fp80** %9
%72 = getelementptr inbounds x86_fp80, x86_fp80* %71, i64 0
store x86_fp80 %70, x86_fp80* %72
%73 = load x86_fp80, x86_fp80* %10
%74 = load x86_fp80*, x86_fp80** %6
%75 = getelementptr inbounds x86_fp80, x86_fp80* %74, i64 0
%76 = load x86_fp80, x86_fp80* %75
%77 = load x86_fp80, x86_fp80* %10
%78 = fdiv x86_fp80 %76, %77
%79 = load x86_fp80*, x86_fp80** %6
%80 = getelementptr inbounds x86_fp80, x86_fp80* %79, i64 1
%81 = load x86_fp80, x86_fp80* %80
%82 = fadd x86_fp80 %78, %81
%83 = load x86_fp80, x86_fp80* %11
%84 = fsub x86_fp80 %82, %83
%85 = load x86_fp80, x86_fp80* %10
%86 = load x86_fp80, x86_fp80* %10
%87 = fdiv x86_fp80 0xK3FFF8000000000000000, %86
%88 = fadd x86_fp80 %85, %87
%89 = fdiv x86_fp80 %84, %88
%90 = load x86_fp80, x86_fp80* %11
%91 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %73, x86_fp80 %89, x86_fp80 %90)
%92 = load x86_fp80*, x86_fp80** %9
%93 = getelementptr inbounds x86_fp80, x86_fp80* %92, i64 1
store x86_fp80 %91, x86_fp80* %93
store i32 1, i32* %5
br label %94
94: ; preds = %30, %19
%95 = load i32, i32* %5
ret i32 %95
}

LLVM IR (-O2):
define i32 @_point_proj(x86_fp80* nocapture %0, x86_fp80* nocapture %1, x86_fp80* nocapture %2, x86_fp80* nocapture writeonly %3) {
%5 = load x86_fp80, x86_fp80* %2
%6 = load x86_fp80, x86_fp80* %1
%7 = fcmp oeq x86_fp80 %5, %6
br i1 %7, label %8, label %11
8: ; preds = %4
store x86_fp80 %5, x86_fp80* %3
%9 = getelementptr inbounds x86_fp80, x86_fp80* %0, i64 1
%10 = load x86_fp80, x86_fp80* %9
br label %37
11: ; preds = %4
%12 = getelementptr inbounds x86_fp80, x86_fp80* %2, i64 1
%13 = load x86_fp80, x86_fp80* %12
%14 = getelementptr inbounds x86_fp80, x86_fp80* %1, i64 1
%15 = load x86_fp80, x86_fp80* %14
%16 = fsub x86_fp80 %13, %15
%17 = fsub x86_fp80 %5, %6
%18 = fdiv x86_fp80 %16, %17
%19 = fneg x86_fp80 %6
%20 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %19, x86_fp80 %18, x86_fp80 %15)
%21 = load x86_fp80, x86_fp80* %0
%22 = fdiv x86_fp80 %21, %18
%23 = getelementptr inbounds x86_fp80, x86_fp80* %0, i64 1
%24 = load x86_fp80, x86_fp80* %23
%25 = fadd x86_fp80 %24, %22
%26 = fsub x86_fp80 %25, %20
%27 = fdiv x86_fp80 0xK3FFF8000000000000000, %18
%28 = fadd x86_fp80 %18, %27
%29 = fdiv x86_fp80 %26, %28
store x86_fp80 %29, x86_fp80* %3
%30 = load x86_fp80, x86_fp80* %0
%31 = fdiv x86_fp80 %30, %18
%32 = load x86_fp80, x86_fp80* %23
%33 = fadd x86_fp80 %31, %32
%34 = fsub x86_fp80 %33, %20
%35 = fdiv x86_fp80 %34, %28
%36 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %18, x86_fp80 %35, x86_fp80 %20)
br label %37
37: ; preds = %11, %8
%38 = phi x86_fp80 [ %10, %8 ], [ %36, %11 ]
%39 = getelementptr inbounds x86_fp80, x86_fp80* %3, i64 1
store x86_fp80 %38, x86_fp80* %39
ret i32 1
}