int eucl_isbetween(long double *a, long double *b, long double *p) {
  long double x = a[0] * b[1] + a[1] * p[0] + b[0] * p[1] - p[1] * a[0] -
                  b[0] * a[1] - p[0] * b[1];
  if (x < 0.1)
    return 1;
  else
    return 0;
}


x86 assembly (clang, -O0):
<eucl_isbetween>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
fldt   (%rax)
mov    -0x18(%rbp),%rcx
fldt   0x10(%rcx)
fldt   0x10(%rax)
mov    -0x20(%rbp),%rax
fldt   (%rax)
fld    %st(0)
fstpt  -0x3c(%rbp)
fmul   %st(1),%st
fld    %st(3)
fmul   %st(3),%st
faddp  %st,%st(1)
fldt   (%rcx)
fldt   0x10(%rax)
fld    %st(1)
fmul   %st(1),%st
faddp  %st,%st(3)
fldt   -0x3c(%rbp)
fxch   %st(1)
fmulp  %st,%st(6)
fxch   %st(2)
fsubp  %st,%st(5)
fmulp  %st,%st(2)
fxch   %st(3)
fsubp  %st,%st(1)
fxch   %st(2)
fmulp  %st,%st(1)
fsubrp %st,%st(1)
fstpt  -0x30(%rbp)
fldt   -0x30(%rbp)
fldl   0xe9f(%rip)
fucomip %st(1),%st
fstp   %st(0)
jbe    117c <eucl_isbetween+0x7c>
jmp    1170 <eucl_isbetween+0x70>
movl   $0x1,-0x4(%rbp)
jmp    1183 <eucl_isbetween+0x83>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<eucl_isbetween>:
fldt   (%rdi)
fldt   0x10(%rsi)
fld    %st(0)
fstpt  -0x18(%rsp)
fldt   0x10(%rdi)
fldt   (%rdx)
fld    %st(1)
fmul   %st(1),%st
fxch   %st(3)
fmul   %st(4),%st
faddp  %st,%st(3)
fxch   %st(2)
fstpt  -0xc(%rsp)
fldt   (%rsi)
fldt   0x10(%rdx)
fld    %st(1)
fmul   %st(1),%st
fldt   -0xc(%rsp)
faddp  %st,%st(1)
fxch   %st(1)
fmulp  %st,%st(5)
fsubp  %st,%st(4)
fmulp  %st,%st(1)
fsubrp %st,%st(2)
fldt   -0x18(%rsp)
fmulp  %st,%st(1)
fsubrp %st,%st(1)
fldl   0xeb9(%rip)
xor    %eax,%eax
fucomip %st(1),%st
fstp   %st(0)
seta   %al
ret

LLVM IR (-O0):
define i32 @eucl_isbetween(x86_fp80* %0, x86_fp80* %1, x86_fp80* %2) {
%4 = alloca i32
%5 = alloca x86_fp80*
%6 = alloca x86_fp80*
%7 = alloca x86_fp80*
%8 = alloca x86_fp80
store x86_fp80* %0, x86_fp80** %5
store x86_fp80* %1, x86_fp80** %6
store x86_fp80* %2, x86_fp80** %7
%9 = load x86_fp80*, x86_fp80** %5
%10 = getelementptr inbounds x86_fp80, x86_fp80* %9, i64 0
%11 = load x86_fp80, x86_fp80* %10
%12 = load x86_fp80*, x86_fp80** %6
%13 = getelementptr inbounds x86_fp80, x86_fp80* %12, i64 1
%14 = load x86_fp80, x86_fp80* %13
%15 = load x86_fp80*, x86_fp80** %5
%16 = getelementptr inbounds x86_fp80, x86_fp80* %15, i64 1
%17 = load x86_fp80, x86_fp80* %16
%18 = load x86_fp80*, x86_fp80** %7
%19 = getelementptr inbounds x86_fp80, x86_fp80* %18, i64 0
%20 = load x86_fp80, x86_fp80* %19
%21 = fmul x86_fp80 %17, %20
%22 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %11, x86_fp80 %14, x86_fp80 %21)
%23 = load x86_fp80*, x86_fp80** %6
%24 = getelementptr inbounds x86_fp80, x86_fp80* %23, i64 0
%25 = load x86_fp80, x86_fp80* %24
%26 = load x86_fp80*, x86_fp80** %7
%27 = getelementptr inbounds x86_fp80, x86_fp80* %26, i64 1
%28 = load x86_fp80, x86_fp80* %27
%29 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %25, x86_fp80 %28, x86_fp80 %22)
%30 = load x86_fp80*, x86_fp80** %7
%31 = getelementptr inbounds x86_fp80, x86_fp80* %30, i64 1
%32 = load x86_fp80, x86_fp80* %31
%33 = load x86_fp80*, x86_fp80** %5
%34 = getelementptr inbounds x86_fp80, x86_fp80* %33, i64 0
%35 = load x86_fp80, x86_fp80* %34
%36 = fneg x86_fp80 %32
%37 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %36, x86_fp80 %35, x86_fp80 %29)
%38 = load x86_fp80*, x86_fp80** %6
%39 = getelementptr inbounds x86_fp80, x86_fp80* %38, i64 0
%40 = load x86_fp80, x86_fp80* %39
%41 = load x86_fp80*, x86_fp80** %5
%42 = getelementptr inbounds x86_fp80, x86_fp80* %41, i64 1
%43 = load x86_fp80, x86_fp80* %42
%44 = fneg x86_fp80 %40
%45 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %44, x86_fp80 %43, x86_fp80 %37)
%46 = load x86_fp80*, x86_fp80** %7
%47 = getelementptr inbounds x86_fp80, x86_fp80* %46, i64 0
%48 = load x86_fp80, x86_fp80* %47
%49 = load x86_fp80*, x86_fp80** %6
%50 = getelementptr inbounds x86_fp80, x86_fp80* %49, i64 1
%51 = load x86_fp80, x86_fp80* %50
%52 = fneg x86_fp80 %48
%53 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %52, x86_fp80 %51, x86_fp80 %45)
store x86_fp80 %53, x86_fp80* %8
%54 = load x86_fp80, x86_fp80* %8
%55 = fcmp olt x86_fp80 %54, 0xK3FFBCCCCCCCCCCCCD000
br i1 %55, label %56, label %57
56: ; preds = %3
store i32 1, i32* %4
br label %58
57: ; preds = %3
store i32 0, i32* %4
br label %58
58: ; preds = %57, %56
%59 = load i32, i32* %4
ret i32 %59
}

LLVM IR (-O2):
define i32 @eucl_isbetween(x86_fp80* nocapture %0, x86_fp80* nocapture %1, x86_fp80* nocapture %2) {
%4 = load x86_fp80, x86_fp80* %0
%5 = getelementptr inbounds x86_fp80, x86_fp80* %1, i64 1
%6 = load x86_fp80, x86_fp80* %5
%7 = getelementptr inbounds x86_fp80, x86_fp80* %0, i64 1
%8 = load x86_fp80, x86_fp80* %7
%9 = load x86_fp80, x86_fp80* %2
%10 = fmul x86_fp80 %8, %9
%11 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %4, x86_fp80 %6, x86_fp80 %10)
%12 = load x86_fp80, x86_fp80* %1
%13 = getelementptr inbounds x86_fp80, x86_fp80* %2, i64 1
%14 = load x86_fp80, x86_fp80* %13
%15 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %12, x86_fp80 %14, x86_fp80 %11)
%16 = fneg x86_fp80 %14
%17 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %16, x86_fp80 %4, x86_fp80 %15)
%18 = fneg x86_fp80 %12
%19 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %18, x86_fp80 %8, x86_fp80 %17)
%20 = fneg x86_fp80 %9
%21 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %20, x86_fp80 %6, x86_fp80 %19)
%22 = fcmp olt x86_fp80 %21, 0xK3FFBCCCCCCCCCCCCD000
%23 = zext i1 %22 to i32
ret i32 %23
}