int in_triangle(double x, double y, double x1, double y1, double x2, double y2,
                double x3, double y3) {
  int c;
  c = 0;
  c += ((y1 > y) != (y2 > y)) && (x < (x2 - x1) * (y - y1) / (y2 - y1) + x1);
  c += ((y2 > y) != (y3 > y)) && (x < (x3 - x2) * (y - y2) / (y3 - y2) + x2);
  c += ((y3 > y) != (y1 > y)) && (x < (x1 - x3) * (y - y3) / (y1 - y3) + x3);
  return c % 2 == 1;
}


x86 assembly (clang, -O0):
<in_triangle>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%ecx
movsd  -0x30(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x45(%rbp)
je     119e <in_triangle+0x9e>
movsd  -0x8(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
subsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
movsd  -0x30(%rbp),%xmm2
subsd  -0x20(%rbp),%xmm2
divsd  %xmm2,%xmm0
addsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
movsd  -0x30(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%ecx
movsd  -0x40(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x46(%rbp)
je     1217 <in_triangle+0x117>
movsd  -0x8(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
subsd  -0x30(%rbp),%xmm2
mulsd  %xmm2,%xmm0
movsd  -0x40(%rbp),%xmm2
subsd  -0x30(%rbp),%xmm2
divsd  %xmm2,%xmm0
addsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x46(%rbp)
mov    -0x46(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
movsd  -0x40(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%ecx
movsd  -0x20(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x47(%rbp)
je     1290 <in_triangle+0x190>
movsd  -0x8(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
subsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
movsd  -0x20(%rbp),%xmm2
subsd  -0x40(%rbp),%xmm2
divsd  %xmm2,%xmm0
addsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x47(%rbp)
mov    -0x47(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x1,%edx
sete   %al
and    $0x1,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<in_triangle>:
ucomisd %xmm1,%xmm3
seta   %dl
ucomisd %xmm1,%xmm5
seta   %cl
xor    %eax,%eax
mov    $0x0,%esi
cmp    %cl,%dl
je     1151 <in_triangle+0x51>
movapd %xmm4,%xmm8
subsd  %xmm2,%xmm8
movapd %xmm1,%xmm9
subsd  %xmm3,%xmm9
mulsd  %xmm8,%xmm9
movapd %xmm5,%xmm8
subsd  %xmm3,%xmm8
divsd  %xmm8,%xmm9
addsd  %xmm2,%xmm9
xor    %esi,%esi
ucomisd %xmm0,%xmm9
seta   %sil
ucomisd %xmm1,%xmm5
seta   %cl
ucomisd %xmm1,%xmm7
seta   %dl
cmp    %dl,%cl
je     119a <in_triangle+0x9a>
movapd %xmm6,%xmm8
subsd  %xmm4,%xmm8
movapd %xmm1,%xmm9
subsd  %xmm5,%xmm9
mulsd  %xmm8,%xmm9
movapd %xmm7,%xmm8
subsd  %xmm5,%xmm8
divsd  %xmm8,%xmm9
addsd  %xmm4,%xmm9
xor    %eax,%eax
ucomisd %xmm0,%xmm9
seta   %al
ucomisd %xmm1,%xmm7
seta   %dil
ucomisd %xmm1,%xmm3
seta   %cl
xor    %edx,%edx
cmp    %dil,%cl
je     11d1 <in_triangle+0xd1>
subsd  %xmm6,%xmm2
subsd  %xmm7,%xmm1
mulsd  %xmm2,%xmm1
subsd  %xmm7,%xmm3
divsd  %xmm3,%xmm1
addsd  %xmm6,%xmm1
xor    %edx,%edx
ucomisd %xmm0,%xmm1
seta   %dl
add    %esi,%eax
add    %edx,%eax
and    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @in_triangle(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7) {
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca i32
store double %0, double* %9
store double %1, double* %10
store double %2, double* %11
store double %3, double* %12
store double %4, double* %13
store double %5, double* %14
store double %6, double* %15
store double %7, double* %16
store i32 0, i32* %17
%18 = load double, double* %12
%19 = load double, double* %10
%20 = fcmp ogt double %18, %19
%21 = zext i1 %20 to i32
%22 = load double, double* %14
%23 = load double, double* %10
%24 = fcmp ogt double %22, %23
%25 = zext i1 %24 to i32
%26 = icmp ne i32 %21, %25
br i1 %26, label %27, label %43
27: ; preds = %8
%28 = load double, double* %9
%29 = load double, double* %13
%30 = load double, double* %11
%31 = fsub double %29, %30
%32 = load double, double* %10
%33 = load double, double* %12
%34 = fsub double %32, %33
%35 = fmul double %31, %34
%36 = load double, double* %14
%37 = load double, double* %12
%38 = fsub double %36, %37
%39 = fdiv double %35, %38
%40 = load double, double* %11
%41 = fadd double %39, %40
%42 = fcmp olt double %28, %41
br label %43
43: ; preds = %27, %8
%44 = phi i1 [ false, %8 ], [ %42, %27 ]
%45 = zext i1 %44 to i32
%46 = load i32, i32* %17
%47 = add nsw i32 %46, %45
store i32 %47, i32* %17
%48 = load double, double* %14
%49 = load double, double* %10
%50 = fcmp ogt double %48, %49
%51 = zext i1 %50 to i32
%52 = load double, double* %16
%53 = load double, double* %10
%54 = fcmp ogt double %52, %53
%55 = zext i1 %54 to i32
%56 = icmp ne i32 %51, %55
br i1 %56, label %57, label %73
57: ; preds = %43
%58 = load double, double* %9
%59 = load double, double* %15
%60 = load double, double* %13
%61 = fsub double %59, %60
%62 = load double, double* %10
%63 = load double, double* %14
%64 = fsub double %62, %63
%65 = fmul double %61, %64
%66 = load double, double* %16
%67 = load double, double* %14
%68 = fsub double %66, %67
%69 = fdiv double %65, %68
%70 = load double, double* %13
%71 = fadd double %69, %70
%72 = fcmp olt double %58, %71
br label %73
73: ; preds = %57, %43
%74 = phi i1 [ false, %43 ], [ %72, %57 ]
%75 = zext i1 %74 to i32
%76 = load i32, i32* %17
%77 = add nsw i32 %76, %75
store i32 %77, i32* %17
%78 = load double, double* %16
%79 = load double, double* %10
%80 = fcmp ogt double %78, %79
%81 = zext i1 %80 to i32
%82 = load double, double* %12
%83 = load double, double* %10
%84 = fcmp ogt double %82, %83
%85 = zext i1 %84 to i32
%86 = icmp ne i32 %81, %85
br i1 %86, label %87, label %103
87: ; preds = %73
%88 = load double, double* %9
%89 = load double, double* %11
%90 = load double, double* %15
%91 = fsub double %89, %90
%92 = load double, double* %10
%93 = load double, double* %16
%94 = fsub double %92, %93
%95 = fmul double %91, %94
%96 = load double, double* %12
%97 = load double, double* %16
%98 = fsub double %96, %97
%99 = fdiv double %95, %98
%100 = load double, double* %15
%101 = fadd double %99, %100
%102 = fcmp olt double %88, %101
br label %103
103: ; preds = %87, %73
%104 = phi i1 [ false, %73 ], [ %102, %87 ]
%105 = zext i1 %104 to i32
%106 = load i32, i32* %17
%107 = add nsw i32 %106, %105
store i32 %107, i32* %17
%108 = load i32, i32* %17
%109 = srem i32 %108, 2
%110 = icmp eq i32 %109, 1
%111 = zext i1 %110 to i32
ret i32 %111
}

LLVM IR (-O2):
define i32 @in_triangle(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7) {
%9 = fcmp ogt double %3, %1
%10 = fcmp ogt double %5, %1
%11 = xor i1 %9, %10
br i1 %11, label %12, label %21
12: ; preds = %8
%13 = fsub double %4, %2
%14 = fsub double %1, %3
%15 = fmul double %14, %13
%16 = fsub double %5, %3
%17 = fdiv double %15, %16
%18 = fadd double %17, %2
%19 = fcmp ogt double %18, %0
%20 = zext i1 %19 to i32
br label %21
21: ; preds = %12, %8
%22 = phi i32 [ 0, %8 ], [ %20, %12 ]
%23 = fcmp ogt double %7, %1
%24 = xor i1 %10, %23
br i1 %24, label %25, label %34
25: ; preds = %21
%26 = fsub double %6, %4
%27 = fsub double %1, %5
%28 = fmul double %27, %26
%29 = fsub double %7, %5
%30 = fdiv double %28, %29
%31 = fadd double %30, %4
%32 = fcmp ogt double %31, %0
%33 = zext i1 %32 to i32
br label %34
34: ; preds = %25, %21
%35 = phi i32 [ 0, %21 ], [ %33, %25 ]
%36 = xor i1 %9, %23
br i1 %36, label %37, label %46
37: ; preds = %34
%38 = fsub double %2, %6
%39 = fsub double %1, %7
%40 = fmul double %38, %39
%41 = fsub double %3, %7
%42 = fdiv double %40, %41
%43 = fadd double %42, %6
%44 = fcmp ogt double %43, %0
%45 = zext i1 %44 to i32
br label %46
46: ; preds = %37, %34
%47 = phi i32 [ 0, %34 ], [ %45, %37 ]
%48 = add nuw nsw i32 %35, %22
%49 = add nuw nsw i32 %48, %47
%50 = and i32 %49, 1
ret i32 %50
}