inside(xp, yp, xv, yv, nv) float *xp, *yp, *xv, *yv;
int nv;
{
  float x1, y1, x2, y2, xx;
  int i, flag;
  int nleft = 0;
  x2 = xv[nv - 1];
  y2 = yv[nv - 1];
  for (i = 0; i < nv; i++) {
    x1 = x2;
    y1 = y2;
    x2 = xv[i];
    y2 = yv[i];
    if (y1 == (*yp) && y2 == (*yp)) {
      if ((x1 < (*xp) && x2 >= (*xp)) || (x2 < (*xp) && x1 >= (*yp)))
        return (1);
    } else if ((y1 < (*yp) && y2 >= (*yp)) || (y2 < (*yp) && y1 >= (*yp))) {
      xx = x1 + ((*yp) - y1) * (x2 - x1) / (y2 - y1);
      if (xx == (*xp))
        return (1);
      else if (xx > (*xp))
        nleft++;
    }
  }
  if (nleft == 0)
    flag = 0;
  else
    flag = nleft % 2;
  return (flag);
}


x86 assembly (clang, -O0):
<inside>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x3c(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1311 <inside+0x211>
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomiss (%rax),%xmm0
jne    1229 <inside+0x129>
jp     1229 <inside+0x129>
movss  -0x3c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomiss (%rax),%xmm0
jne    1229 <inside+0x129>
jp     1229 <inside+0x129>
movss  -0x30(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    11f0 <inside+0xf0>
movss  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
ucomiss (%rax),%xmm0
jae    1218 <inside+0x118>
movss  -0x38(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1224 <inside+0x124>
movss  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomiss (%rax),%xmm0
jb     1224 <inside+0x124>
movl   $0x1,-0x4(%rbp)
jmp    133b <inside+0x23b>
jmp    12fe <inside+0x1fe>
movss  -0x34(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    1251 <inside+0x151>
movss  -0x3c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomiss (%rax),%xmm0
jae    1279 <inside+0x179>
movss  -0x3c(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    12f9 <inside+0x1f9>
movss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomiss (%rax),%xmm0
jb     12f9 <inside+0x1f9>
movss  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
subss  -0x34(%rbp),%xmm1
movss  -0x38(%rbp),%xmm2
subss  -0x30(%rbp),%xmm2
mulss  %xmm2,%xmm1
movss  -0x3c(%rbp),%xmm2
subss  -0x34(%rbp),%xmm2
divss  %xmm2,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
ucomiss (%rax),%xmm0
jne    12d4 <inside+0x1d4>
jp     12d4 <inside+0x1d4>
movl   $0x1,-0x4(%rbp)
jmp    133b <inside+0x23b>
movss  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    12ef <inside+0x1ef>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12f4 <inside+0x1f4>
jmp    12f9 <inside+0x1f9>
jmp    12fe <inside+0x1fe>
jmp    1303 <inside+0x203>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1154 <inside+0x54>
cmpl   $0x0,-0x4c(%rbp)
jne    1327 <inside+0x227>
movl   $0x0,-0x48(%rbp)
jmp    1335 <inside+0x235>
mov    -0x4c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %edx,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<inside>:
test   %r8d,%r8d
jle    11cb <inside+0xcb>
lea    -0x1(%r8),%eax
cltq
movss  (%rcx,%rax,4),%xmm1
movss  (%rdx,%rax,4),%xmm2
movss  (%rsi),%xmm0
mov    %r8d,%r9d
xor    %esi,%esi
xor    %r8d,%r8d
mov    $0x1,%eax
jmp    113d <inside+0x3d>
nopl   0x0(%rax)
add    $0x1,%rsi
cmp    %rsi,%r9
je     11ce <inside+0xce>
movaps %xmm2,%xmm3
movaps %xmm1,%xmm4
movss  (%rdx,%rsi,4),%xmm2
movss  (%rcx,%rsi,4),%xmm1
ucomiss %xmm0,%xmm4
jne    1180 <inside+0x80>
jp     1180 <inside+0x80>
ucomiss %xmm0,%xmm1
jne    1180 <inside+0x80>
jp     1180 <inside+0x80>
movss  (%rdi),%xmm4
ucomiss %xmm3,%xmm4
jbe    1169 <inside+0x69>
ucomiss %xmm4,%xmm2
jae    11e0 <inside+0xe0>
ucomiss %xmm2,%xmm4
jbe    1130 <inside+0x30>
ucomiss %xmm0,%xmm3
jb     1130 <inside+0x30>
jmp    11e0 <inside+0xe0>
cs nopw 0x0(%rax,%rax,1)
nop
ucomiss %xmm4,%xmm0
jbe    118a <inside+0x8a>
ucomiss %xmm0,%xmm1
jae    1194 <inside+0x94>
ucomiss %xmm1,%xmm0
jbe    1130 <inside+0x30>
ucomiss %xmm0,%xmm4
jb     1130 <inside+0x30>
movaps %xmm0,%xmm5
subss  %xmm4,%xmm5
movaps %xmm2,%xmm6
subss  %xmm3,%xmm6
mulss  %xmm5,%xmm6
movaps %xmm1,%xmm5
subss  %xmm4,%xmm5
divss  %xmm5,%xmm6
addss  %xmm3,%xmm6
ucomiss (%rdi),%xmm6
jne    11bc <inside+0xbc>
jnp    11e1 <inside+0xe1>
jbe    1130 <inside+0x30>
add    $0x1,%r8d
jmp    1130 <inside+0x30>
xor    %r8d,%r8d
mov    %r8d,%eax
shr    $0x1f,%eax
add    %r8d,%eax
and    $0xfffffffe,%eax
sub    %eax,%r8d
mov    %r8d,%eax
ret
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @inside(float* %0, float* %1, float* %2, float* %3, i32 %4) {
%6 = alloca i32
%7 = alloca float*
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca i32
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
store float* %0, float** %7
store float* %1, float** %8
store float* %2, float** %9
store float* %3, float** %10
store i32 %4, i32* %11
store i32 0, i32* %19
%20 = load float*, float** %9
%21 = load i32, i32* %11
%22 = sub nsw i32 %21, 1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds float, float* %20, i64 %23
%25 = load float, float* %24
store float %25, float* %14
%26 = load float*, float** %10
%27 = load i32, i32* %11
%28 = sub nsw i32 %27, 1
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds float, float* %26, i64 %29
%31 = load float, float* %30
store float %31, float* %15
store i32 0, i32* %17
br label %32
32: ; preds = %132, %5
%33 = load i32, i32* %17
%34 = load i32, i32* %11
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %135
36: ; preds = %32
%37 = load float, float* %14
store float %37, float* %12
%38 = load float, float* %15
store float %38, float* %13
%39 = load float*, float** %9
%40 = load i32, i32* %17
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds float, float* %39, i64 %41
%43 = load float, float* %42
store float %43, float* %14
%44 = load float*, float** %10
%45 = load i32, i32* %17
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
store float %48, float* %15
%49 = load float, float* %13
%50 = load float*, float** %8
%51 = load float, float* %50
%52 = fcmp oeq float %49, %51
br i1 %52, label %53, label %80
53: ; preds = %36
%54 = load float, float* %15
%55 = load float*, float** %8
%56 = load float, float* %55
%57 = fcmp oeq float %54, %56
br i1 %57, label %58, label %80
58: ; preds = %53
%59 = load float, float* %12
%60 = load float*, float** %7
%61 = load float, float* %60
%62 = fcmp olt float %59, %61
br i1 %62, label %63, label %68
63: ; preds = %58
%64 = load float, float* %14
%65 = load float*, float** %7
%66 = load float, float* %65
%67 = fcmp oge float %64, %66
br i1 %67, label %78, label %68
68: ; preds = %63, %58
%69 = load float, float* %14
%70 = load float*, float** %7
%71 = load float, float* %70
%72 = fcmp olt float %69, %71
br i1 %72, label %73, label %79
73: ; preds = %68
%74 = load float, float* %12
%75 = load float*, float** %8
%76 = load float, float* %75
%77 = fcmp oge float %74, %76
br i1 %77, label %78, label %79
78: ; preds = %73, %63
store i32 1, i32* %6
br label %144
79: ; preds = %73, %68
br label %131
80: ; preds = %53, %36
%81 = load float, float* %13
%82 = load float*, float** %8
%83 = load float, float* %82
%84 = fcmp olt float %81, %83
br i1 %84, label %85, label %90
85: ; preds = %80
%86 = load float, float* %15
%87 = load float*, float** %8
%88 = load float, float* %87
%89 = fcmp oge float %86, %88
br i1 %89, label %100, label %90
90: ; preds = %85, %80
%91 = load float, float* %15
%92 = load float*, float** %8
%93 = load float, float* %92
%94 = fcmp olt float %91, %93
br i1 %94, label %95, label %130
95: ; preds = %90
%96 = load float, float* %13
%97 = load float*, float** %8
%98 = load float, float* %97
%99 = fcmp oge float %96, %98
br i1 %99, label %100, label %130
100: ; preds = %95, %85
%101 = load float, float* %12
%102 = load float*, float** %8
%103 = load float, float* %102
%104 = load float, float* %13
%105 = fsub float %103, %104
%106 = load float, float* %14
%107 = load float, float* %12
%108 = fsub float %106, %107
%109 = fmul float %105, %108
%110 = load float, float* %15
%111 = load float, float* %13
%112 = fsub float %110, %111
%113 = fdiv float %109, %112
%114 = fadd float %101, %113
store float %114, float* %16
%115 = load float, float* %16
%116 = load float*, float** %7
%117 = load float, float* %116
%118 = fcmp oeq float %115, %117
br i1 %118, label %119, label %120
119: ; preds = %100
store i32 1, i32* %6
br label %144
120: ; preds = %100
%121 = load float, float* %16
%122 = load float*, float** %7
%123 = load float, float* %122
%124 = fcmp ogt float %121, %123
br i1 %124, label %125, label %128
125: ; preds = %120
%126 = load i32, i32* %19
%127 = add nsw i32 %126, 1
store i32 %127, i32* %19
br label %128
128: ; preds = %125, %120
br label %129
129: ; preds = %128
br label %130
130: ; preds = %129, %95, %90
br label %131
131: ; preds = %130, %79
br label %132
132: ; preds = %131
%133 = load i32, i32* %17
%134 = add nsw i32 %133, 1
store i32 %134, i32* %17
br label %32
135: ; preds = %32
%136 = load i32, i32* %19
%137 = icmp eq i32 %136, 0
br i1 %137, label %138, label %139
138: ; preds = %135
store i32 0, i32* %18
br label %142
139: ; preds = %135
%140 = load i32, i32* %19
%141 = srem i32 %140, 2
store i32 %141, i32* %18
br label %142
142: ; preds = %139, %138
%143 = load i32, i32* %18
store i32 %143, i32* %6
br label %144
144: ; preds = %142, %119, %78
%145 = load i32, i32* %6
ret i32 %145
}

LLVM IR (-O2):
define i32 @inside(float* nocapture %0, float* nocapture %1, float* nocapture %2, float* nocapture %3, i32 %4) {
%6 = add nsw i32 %4, -1
%7 = sext i32 %6 to i64
%8 = icmp sgt i32 %4, 0
br i1 %8, label %9, label %62
9: ; preds = %5
%10 = getelementptr inbounds float, float* %3, i64 %7
%11 = load float, float* %10
%12 = getelementptr inbounds float, float* %2, i64 %7
%13 = load float, float* %12
%14 = load float, float* %1
%15 = zext i32 %4 to i64
br label %16
16: ; preds = %9, %58
%17 = phi i64 [ 0, %9 ], [ %60, %58 ]
%18 = phi i32 [ 0, %9 ], [ %59, %58 ]
%19 = phi float [ %11, %9 ], [ %24, %58 ]
%20 = phi float [ %13, %9 ], [ %22, %58 ]
%21 = getelementptr inbounds float, float* %2, i64 %17
%22 = load float, float* %21
%23 = getelementptr inbounds float, float* %3, i64 %17
%24 = load float, float* %23
%25 = fcmp oeq float %19, %14
%26 = fcmp oeq float %24, %14
%27 = select i1 %25, i1 %26, i1 false
br i1 %27, label %28, label %37
28: ; preds = %16
%29 = load float, float* %0
%30 = fcmp uge float %20, %29
%31 = fcmp ult float %22, %29
%32 = select i1 %30, i1 true, i1 %31
br i1 %32, label %33, label %65
33: ; preds = %28
%34 = fcmp uge float %22, %29
%35 = fcmp ult float %20, %14
%36 = select i1 %34, i1 true, i1 %35
br i1 %36, label %58, label %65
37: ; preds = %16
%38 = fcmp uge float %19, %14
%39 = fcmp ult float %24, %14
%40 = select i1 %38, i1 true, i1 %39
br i1 %40, label %41, label %45
41: ; preds = %37
%42 = fcmp uge float %24, %14
%43 = fcmp ult float %19, %14
%44 = select i1 %42, i1 true, i1 %43
br i1 %44, label %58, label %45
45: ; preds = %41, %37
%46 = fsub float %14, %19
%47 = fsub float %22, %20
%48 = fmul float %47, %46
%49 = fsub float %24, %19
%50 = fdiv float %48, %49
%51 = fadd float %20, %50
%52 = load float, float* %0
%53 = fcmp oeq float %51, %52
br i1 %53, label %65, label %54
54: ; preds = %45
%55 = fcmp ogt float %51, %52
br i1 %55, label %56, label %58
56: ; preds = %54
%57 = add nsw i32 %18, 1
br label %58
58: ; preds = %33, %56, %54, %41
%59 = phi i32 [ %18, %33 ], [ %57, %56 ], [ %18, %54 ], [ %18, %41 ]
%60 = add nuw nsw i64 %17, 1
%61 = icmp eq i64 %60, %15
br i1 %61, label %62, label %16
62: ; preds = %58, %5
%63 = phi i32 [ 0, %5 ], [ %59, %58 ]
%64 = srem i32 %63, 2
br label %65
65: ; preds = %33, %45, %28, %62
%66 = phi i32 [ %64, %62 ], [ 1, %28 ], [ 1, %45 ], [ 1, %33 ]
ret i32 %66
}