void midpoint(int *x, int *y, int *x_coord, int *y_coord, int length) {
  float xf = 0.0f;
  float yf = 0.0f;
  int i;
  if (length == 0)
    return;
  for (i = 0; i < length; i++) {
    xf += x_coord[i];
    yf += y_coord[i];
  }
  xf /= length;
  yf /= length;
  if (xf - (int)xf >= 0.5) {
    *x = (int)xf + 1;
  } else {
    *x = (int)xf;
  }
  if (yf - (int)yf >= 0.5) {
    *y = (int)yf + 1;
  } else {
    *y = (int)yf;
  }
}


x86 assembly (clang, -O0):
<midpoint>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    1137 <midpoint+0x37>
jmp    1238 <midpoint+0x138>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1186 <midpoint+0x86>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm0
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm0
addss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    113e <midpoint+0x3e>
cvtsi2ssl -0x24(%rbp),%xmm1
movss  -0x28(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
cvtsi2ssl -0x24(%rbp),%xmm1
movss  -0x2c(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x28(%rbp),%xmm0
cvttss2si -0x28(%rbp),%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe36(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     11e7 <midpoint+0xe7>
cvttss2si -0x28(%rbp),%ecx
add    $0x1,%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
jmp    11f2 <midpoint+0xf2>
cvttss2si -0x28(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
movss  -0x2c(%rbp),%xmm0
cvttss2si -0x2c(%rbp),%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdf0(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     122d <midpoint+0x12d>
cvttss2si -0x2c(%rbp),%ecx
add    $0x1,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    1238 <midpoint+0x138>
cvttss2si -0x2c(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<midpoint>:
test   %r8d,%r8d
je     11c4 <midpoint+0xc4>
jle    111b <midpoint+0x1b>
mov    %r8d,%r9d
cmp    $0x1,%r8d
jne    1120 <midpoint+0x20>
xorps  %xmm0,%xmm0
xor    %eax,%eax
jmp    1161 <midpoint+0x61>
xorps  %xmm0,%xmm0
jmp    117a <midpoint+0x7a>
mov    %r9d,%r10d
and    $0xfffffffe,%r10d
xorps  %xmm0,%xmm0
xor    %eax,%eax
nopl   0x0(%rax)
movss  (%rcx,%rax,4),%xmm1
movss  (%rdx,%rax,4),%xmm2
unpcklps %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm1
addps  %xmm0,%xmm1
movss  0x4(%rcx,%rax,4),%xmm0
movss  0x4(%rdx,%rax,4),%xmm2
unpcklps %xmm0,%xmm2
cvtdq2ps %xmm2,%xmm0
addps  %xmm1,%xmm0
add    $0x2,%rax
cmp    %rax,%r10
jne    1130 <midpoint+0x30>
test   $0x1,%r9b
je     117a <midpoint+0x7a>
movss  (%rcx,%rax,4),%xmm1
movss  (%rdx,%rax,4),%xmm2
unpcklps %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm1
addps  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %r8d,%xmm1
shufps $0x0,%xmm1,%xmm1
divps  %xmm1,%xmm0
cvttps2dq %xmm0,%xmm1
cvtdq2ps %xmm1,%xmm2
subps  %xmm2,%xmm0
movaps 0xe66(%rip),%xmm2
cmpleps %xmm0,%xmm2
unpcklps %xmm2,%xmm2
movmskpd %xmm2,%eax
mov    %eax,%ecx
shr    %cl
and    $0x1,%eax
movd   %xmm1,%edx
add    %eax,%edx
mov    %edx,(%rdi)
movzbl %cl,%eax
pshufd $0x55,%xmm1,%xmm0
movd   %xmm0,%ecx
add    %eax,%ecx
mov    %ecx,(%rsi)
ret

LLVM IR (-O0):
define void @midpoint(i32* %0, i32* %1, i32* %2, i32* %3, i32 %4) {
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32
%11 = alloca float
%12 = alloca float
%13 = alloca i32
store i32* %0, i32** %6
store i32* %1, i32** %7
store i32* %2, i32** %8
store i32* %3, i32** %9
store i32 %4, i32* %10
store float 0.000000e+00, float* %11
store float 0.000000e+00, float* %12
%14 = load i32, i32* %10
%15 = icmp eq i32 %14, 0
br i1 %15, label %16, label %17
16: ; preds = %5
br label %84
17: ; preds = %5
store i32 0, i32* %13
br label %18
18: ; preds = %39, %17
%19 = load i32, i32* %13
%20 = load i32, i32* %10
%21 = icmp slt i32 %19, %20
br i1 %21, label %22, label %42
22: ; preds = %18
%23 = load i32*, i32** %8
%24 = load i32, i32* %13
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i32, i32* %23, i64 %25
%27 = load i32, i32* %26
%28 = sitofp i32 %27 to float
%29 = load float, float* %11
%30 = fadd float %29, %28
store float %30, float* %11
%31 = load i32*, i32** %9
%32 = load i32, i32* %13
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i32, i32* %31, i64 %33
%35 = load i32, i32* %34
%36 = sitofp i32 %35 to float
%37 = load float, float* %12
%38 = fadd float %37, %36
store float %38, float* %12
br label %39
39: ; preds = %22
%40 = load i32, i32* %13
%41 = add nsw i32 %40, 1
store i32 %41, i32* %13
br label %18
42: ; preds = %18
%43 = load i32, i32* %10
%44 = sitofp i32 %43 to float
%45 = load float, float* %11
%46 = fdiv float %45, %44
store float %46, float* %11
%47 = load i32, i32* %10
%48 = sitofp i32 %47 to float
%49 = load float, float* %12
%50 = fdiv float %49, %48
store float %50, float* %12
%51 = load float, float* %11
%52 = load float, float* %11
%53 = fptosi float %52 to i32
%54 = sitofp i32 %53 to float
%55 = fsub float %51, %54
%56 = fpext float %55 to double
%57 = fcmp oge double %56, 5.000000e-01
br i1 %57, label %58, label %63
58: ; preds = %42
%59 = load float, float* %11
%60 = fptosi float %59 to i32
%61 = add nsw i32 %60, 1
%62 = load i32*, i32** %6
store i32 %61, i32* %62
br label %67
63: ; preds = %42
%64 = load float, float* %11
%65 = fptosi float %64 to i32
%66 = load i32*, i32** %6
store i32 %65, i32* %66
br label %67
67: ; preds = %63, %58
%68 = load float, float* %12
%69 = load float, float* %12
%70 = fptosi float %69 to i32
%71 = sitofp i32 %70 to float
%72 = fsub float %68, %71
%73 = fpext float %72 to double
%74 = fcmp oge double %73, 5.000000e-01
br i1 %74, label %75, label %80
75: ; preds = %67
%76 = load float, float* %12
%77 = fptosi float %76 to i32
%78 = add nsw i32 %77, 1
%79 = load i32*, i32** %7
store i32 %78, i32* %79
br label %84
80: ; preds = %67
%81 = load float, float* %12
%82 = fptosi float %81 to i32
%83 = load i32*, i32** %7
store i32 %82, i32* %83
br label %84
84: ; preds = %16, %80, %75
ret void
}

LLVM IR (-O2):
define void @midpoint(i32* nocapture writeonly %0, i32* nocapture writeonly %1, i32* nocapture %2, i32* nocapture %3, i32 %4) {
%6 = icmp eq i32 %4, 0
br i1 %6, label %71, label %7
7: ; preds = %5
%8 = icmp sgt i32 %4, 0
br i1 %8, label %9, label %53
9: ; preds = %7
%10 = zext i32 %4 to i64
%11 = and i64 %10, 1
%12 = icmp eq i32 %4, 1
br i1 %12, label %39, label %13
13: ; preds = %9
%14 = and i64 %10, 4294967294
br label %15
15: ; preds = %15, %13
%16 = phi i64 [ 0, %13 ], [ %36, %15 ]
%17 = phi <2 x float> [ zeroinitializer, %13 ], [ %35, %15 ]
%18 = phi i64 [ 0, %13 ], [ %37, %15 ]
%19 = getelementptr inbounds i32, i32* %2, i64 %16
%20 = load i32, i32* %19
%21 = getelementptr inbounds i32, i32* %3, i64 %16
%22 = load i32, i32* %21
%23 = insertelement <2 x i32> poison, i32 %20, i64 0
%24 = insertelement <2 x i32> %23, i32 %22, i64 1
%25 = sitofp <2 x i32> %24 to <2 x float>
%26 = fadd <2 x float> %17, %25
%27 = or i64 %16, 1
%28 = getelementptr inbounds i32, i32* %2, i64 %27
%29 = load i32, i32* %28
%30 = getelementptr inbounds i32, i32* %3, i64 %27
%31 = load i32, i32* %30
%32 = insertelement <2 x i32> poison, i32 %29, i64 0
%33 = insertelement <2 x i32> %32, i32 %31, i64 1
%34 = sitofp <2 x i32> %33 to <2 x float>
%35 = fadd <2 x float> %26, %34
%36 = add nuw nsw i64 %16, 2
%37 = add i64 %18, 2
%38 = icmp eq i64 %37, %14
br i1 %38, label %39, label %15
39: ; preds = %15, %9
%40 = phi <2 x float> [ undef, %9 ], [ %35, %15 ]
%41 = phi i64 [ 0, %9 ], [ %36, %15 ]
%42 = phi <2 x float> [ zeroinitializer, %9 ], [ %35, %15 ]
%43 = icmp eq i64 %11, 0
br i1 %43, label %53, label %44
44: ; preds = %39
%45 = getelementptr inbounds i32, i32* %2, i64 %41
%46 = load i32, i32* %45
%47 = getelementptr inbounds i32, i32* %3, i64 %41
%48 = load i32, i32* %47
%49 = insertelement <2 x i32> poison, i32 %46, i64 0
%50 = insertelement <2 x i32> %49, i32 %48, i64 1
%51 = sitofp <2 x i32> %50 to <2 x float>
%52 = fadd <2 x float> %42, %51
br label %53
53: ; preds = %44, %39, %7
%54 = phi <2 x float> [ zeroinitializer, %7 ], [ %40, %39 ], [ %52, %44 ]
%55 = sitofp i32 %4 to float
%56 = insertelement <2 x float> poison, float %55, i64 0
%57 = shufflevector <2 x float> %56, <2 x float> poison, <2 x i32> zeroinitializer
%58 = fdiv <2 x float> %54, %57
%59 = fptosi <2 x float> %58 to <2 x i32>
%60 = sitofp <2 x i32> %59 to <2 x float>
%61 = fsub <2 x float> %58, %60
%62 = fcmp oge <2 x float> %61, <float 5.000000e-01, float 5.000000e-01>
%63 = extractelement <2 x i1> %62, i64 0
%64 = zext i1 %63 to i32
%65 = extractelement <2 x i32> %59, i64 0
%66 = add nsw i32 %65, %64
store i32 %66, i32* %0
%67 = extractelement <2 x i1> %62, i64 1
%68 = zext i1 %67 to i32
%69 = extractelement <2 x i32> %59, i64 1
%70 = add nsw i32 %69, %68
store i32 %70, i32* %1
br label %71
71: ; preds = %5, %53
ret void
}