int do_lines_intersect(long p0_x, long p0_y, long p1_x, long p1_y, long p2_x,
                       long p2_y, long p3_x, long p3_y) {
  long s02_x, s02_y, s10_x, s10_y, s32_x, s32_y;
  long long s_numer, t_numer, denom;
  s10_x = p1_x - p0_x;
  s10_y = p1_y - p0_y;
  s32_x = p3_x - p2_x;
  s32_y = p3_y - p2_y;
  denom =
      (long long)s10_x * (long long)s32_y - (long long)s32_x * (long long)s10_y;
  if (denom == 0)
    return 0;
  char denomPositive = denom > 0;
  s02_x = p0_x - p2_x;
  s02_y = p0_y - p2_y;
  s_numer =
      (long long)s10_x * (long long)s02_y - (long long)s10_y * (long long)s02_x;
  if ((s_numer < 0) == denomPositive)
    return 0;
  t_numer =
      (long long)s32_x * (long long)s02_y - (long long)s32_y * (long long)s02_x;
  if ((t_numer < 0) == denomPositive)
    return 0;
  if (((s_numer > denom) == denomPositive) ||
      ((t_numer > denom) == denomPositive))
    return 0;
  if (t_numer == 0)
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<do_lines_intersect>:
push   %rbp
mov    %rsp,%rbp
push   %rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x20(%rbp),%rax
sub    -0x10(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
sub    -0x18(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    0x10(%rbp),%rax
sub    -0x30(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    0x18(%rbp),%rax
sub    -0x38(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x50(%rbp),%rax
imul   -0x68(%rbp),%rax
mov    -0x60(%rbp),%rcx
imul   -0x58(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x80(%rbp)
cmpq   $0x0,-0x80(%rbp)
jne    1185 <do_lines_intersect+0x85>
movl   $0x0,-0x4(%rbp)
jmp    129a <do_lines_intersect+0x19a>
cmpq   $0x0,-0x80(%rbp)
setg   %al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x81(%rbp)
mov    -0x10(%rbp),%rax
sub    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
sub    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
imul   -0x48(%rbp),%rax
mov    -0x58(%rbp),%rcx
imul   -0x40(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
setl   %al
and    $0x1,%al
movzbl %al,%eax
movsbl -0x81(%rbp),%ecx
cmp    %ecx,%eax
jne    11f1 <do_lines_intersect+0xf1>
movl   $0x0,-0x4(%rbp)
jmp    129a <do_lines_intersect+0x19a>
mov    -0x60(%rbp),%rax
imul   -0x48(%rbp),%rax
mov    -0x68(%rbp),%rcx
imul   -0x40(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
setl   %al
and    $0x1,%al
movzbl %al,%eax
movsbl -0x81(%rbp),%ecx
cmp    %ecx,%eax
jne    1232 <do_lines_intersect+0x132>
movl   $0x0,-0x4(%rbp)
jmp    129a <do_lines_intersect+0x19a>
mov    -0x70(%rbp),%rax
cmp    -0x80(%rbp),%rax
setg   %al
and    $0x1,%al
movzbl %al,%eax
movsbl -0x81(%rbp),%ecx
cmp    %ecx,%eax
je     1270 <do_lines_intersect+0x170>
mov    -0x78(%rbp),%rax
cmp    -0x80(%rbp),%rax
setg   %al
and    $0x1,%al
movzbl %al,%eax
movsbl -0x81(%rbp),%ecx
cmp    %ecx,%eax
jne    127c <do_lines_intersect+0x17c>
movl   $0x0,-0x4(%rbp)
jmp    129a <do_lines_intersect+0x19a>
cmpq   $0x0,-0x78(%rbp)
jne    1293 <do_lines_intersect+0x193>
movl   $0x0,-0x4(%rbp)
jmp    129a <do_lines_intersect+0x19a>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x8,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<do_lines_intersect>:
push   %rbp
push   %rbx
mov    0x20(%rsp),%rbx
mov    0x18(%rsp),%r10
sub    %rdi,%rdx
sub    %rsi,%rcx
sub    %r8,%r10
sub    %r9,%rbx
mov    %rbx,%r11
imul   %rdx,%r11
mov    %r10,%rbp
imul   %rcx,%rbp
xor    %eax,%eax
sub    %rbp,%r11
je     118c <do_lines_intersect+0x8c>
xor    %ebp,%ebp
test   %r11,%r11
setg   %bpl
sub    %r8,%rdi
sub    %r9,%rsi
imul   %rsi,%rdx
imul   %rdi,%rcx
sub    %rcx,%rdx
mov    %rdx,%rcx
shr    $0x3f,%rcx
cmp    %ebp,%ecx
je     118c <do_lines_intersect+0x8c>
imul   %rsi,%r10
imul   %rdi,%rbx
sub    %rbx,%r10
mov    %r10,%rcx
shr    $0x3f,%rcx
cmp    %ebp,%ecx
je     118c <do_lines_intersect+0x8c>
test   %r11,%r11
setg   %cl
cmp    %r11,%rdx
setle  %bl
xor    %cl,%bl
cmp    %r11,%r10
setle  %dl
test   %bl,%bl
jne    118c <do_lines_intersect+0x8c>
xor    %cl,%dl
jne    118c <do_lines_intersect+0x8c>
xor    %eax,%eax
test   %r10,%r10
setne  %al
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @do_lines_intersect(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7) {
%9 = sub nsw i64 %2, %0
%10 = sub nsw i64 %3, %1
%11 = sub nsw i64 %6, %4
%12 = sub nsw i64 %7, %5
%13 = mul nsw i64 %12, %9
%14 = mul nsw i64 %11, %10
%15 = sub nsw i64 %13, %14
%16 = icmp eq i64 %15, 0
br i1 %16, label %44, label %17
17: ; preds = %8
%18 = icmp sgt i64 %15, 0
%19 = sub nsw i64 %0, %4
%20 = sub nsw i64 %1, %5
%21 = mul nsw i64 %20, %9
%22 = mul nsw i64 %19, %10
%23 = sub nsw i64 %21, %22
%24 = lshr i64 %23, 63
%25 = trunc i64 %24 to i32
%26 = zext i1 %18 to i32
%27 = icmp eq i32 %25, %26
br i1 %27, label %44, label %28
28: ; preds = %17
%29 = mul nsw i64 %11, %20
%30 = mul nsw i64 %12, %19
%31 = sub nsw i64 %29, %30
%32 = lshr i64 %31, 63
%33 = trunc i64 %32 to i32
%34 = icmp eq i32 %33, %26
br i1 %34, label %44, label %35
35: ; preds = %28
%36 = icmp sle i64 %23, %15
%37 = xor i1 %36, %18
%38 = icmp sle i64 %31, %15
%39 = xor i1 %38, %18
%40 = select i1 %37, i1 true, i1 %39
br i1 %40, label %44, label %41
41: ; preds = %35
%42 = icmp ne i64 %31, 0
%43 = zext i1 %42 to i32
br label %44
44: ; preds = %17, %28, %35, %41, %8
%45 = phi i32 [ 0, %8 ], [ 0, %17 ], [ 0, %28 ], [ 0, %35 ], [ %43, %41 ]
ret i32 %45
}