void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x,
                  float start_y, float end_x, float end_y) {
  int i;
  float inc_x, inc_y;
  inc_x = (end_x - start_x) / hexagon_size;
  inc_y = (end_y - start_y) / hexagon_size;
  for (i = 0; i < hexagon_size; i++) {
    float this_x = start_x + ((float)i * inc_x);
    float this_y = start_y + ((float)i * inc_y);
    if (((this_x >= 0) && (this_x < hexagon_size)) &&
        ((this_y >= 0) && (this_y < hexagon_size))) {
      scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = '1';
    }
  }
}


x86 assembly (clang, -O0):
<plot_hexline>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
movss  %xmm2,-0x18(%rbp)
movss  %xmm3,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
subss  -0x10(%rbp),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x1c(%rbp),%xmm0
subss  -0x14(%rbp),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1212 <plot_hexline+0x112>
movss  -0x10(%rbp),%xmm1
cvtsi2ssl -0x20(%rbp),%xmm0
movss  -0x24(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x14(%rbp),%xmm1
cvtsi2ssl -0x20(%rbp),%xmm0
movss  -0x28(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x2c(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     11ff <plot_hexline+0xff>
movss  -0x2c(%rbp),%xmm1
cvtsi2ssl -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11ff <plot_hexline+0xff>
movss  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     11ff <plot_hexline+0xff>
movss  -0x30(%rbp),%xmm1
cvtsi2ssl -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11ff <plot_hexline+0xff>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cvttss2si -0x30(%rbp),%edx
imul   %edx,%ecx
cvttss2si -0x2c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movb   $0x31,(%rax,%rcx,1)
jmp    1204 <plot_hexline+0x104>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1156 <plot_hexline+0x56>
pop    %rbp
ret

x86 assembly (clang, -O2):
<plot_hexline>:
test   %esi,%esi
jle    138f <plot_hexline+0x28f>
subss  %xmm0,%xmm2
cvtsi2ss %esi,%xmm14
divss  %xmm14,%xmm2
subss  %xmm1,%xmm3
divss  %xmm14,%xmm3
xor    %r9d,%r9d
cmp    $0x8,%esi
jb     1390 <plot_hexline+0x290>
mov    %esi,%r9d
and    $0xfffffff8,%r9d
movaps %xmm2,-0x28(%rsp)
shufps $0x0,%xmm2,%xmm2
movaps %xmm0,%xmm10
shufps $0x0,%xmm0,%xmm10
movaps %xmm3,-0x18(%rsp)
movaps %xmm3,%xmm11
shufps $0x0,%xmm3,%xmm11
movaps %xmm1,-0x38(%rsp)
movaps %xmm1,%xmm13
shufps $0x0,%xmm1,%xmm13
movaps %xmm14,-0x48(%rsp)
shufps $0x0,%xmm14,%xmm14
movaps 0xe8d(%rip),%xmm15
movaps 0xe96(%rip),%xmm7
mov    %r9d,%r8d
jmp    119b <plot_hexline+0x9b>
nop
movdqa 0xe98(%rip),%xmm1
paddd  %xmm1,%xmm7
paddd  %xmm1,%xmm15
add    $0xfffffff8,%r8d
je     1375 <plot_hexline+0x275>
cvtdq2ps %xmm7,%xmm12
cvtdq2ps %xmm15,%xmm8
movaps %xmm8,%xmm9
mulps  %xmm2,%xmm9
addps  %xmm10,%xmm9
movaps %xmm12,%xmm1
mulps  %xmm2,%xmm1
addps  %xmm10,%xmm1
mulps  %xmm11,%xmm8
addps  %xmm13,%xmm8
mulps  %xmm11,%xmm12
addps  %xmm13,%xmm12
xorps  %xmm6,%xmm6
cmpleps %xmm1,%xmm6
xorps  %xmm3,%xmm3
cmpleps %xmm9,%xmm3
packssdw %xmm3,%xmm6
movaps %xmm1,%xmm3
cmpltps %xmm14,%xmm3
movaps %xmm9,%xmm5
cmpltps %xmm14,%xmm5
packssdw %xmm5,%xmm3
pand   %xmm6,%xmm3
xorps  %xmm5,%xmm5
cmpleps %xmm12,%xmm5
pxor   %xmm6,%xmm6
cmpleps %xmm8,%xmm6
packssdw %xmm6,%xmm5
movaps %xmm12,%xmm6
cmpltps %xmm14,%xmm6
movaps %xmm8,%xmm4
cmpltps %xmm14,%xmm4
packssdw %xmm4,%xmm6
pand   %xmm5,%xmm6
pand   %xmm3,%xmm6
movd   %xmm6,%edx
test   $0x1,%dl
je     1246 <plot_hexline+0x146>
cvttss2si %xmm12,%ecx
cvttss2si %xmm1,%eax
imul   %esi,%ecx
add    %ecx,%eax
cltq
movb   $0x31,(%rdi,%rax,1)
shr    $0x10,%edx
test   $0x1,%dl
je     1272 <plot_hexline+0x172>
movaps %xmm12,%xmm3
shufps $0x55,%xmm12,%xmm3
cvttss2si %xmm3,%eax
movaps %xmm1,%xmm3
shufps $0x55,%xmm1,%xmm3
cvttss2si %xmm3,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x2,%xmm6,%eax
test   $0x1,%al
je     129f <plot_hexline+0x19f>
movaps %xmm12,%xmm3
unpckhpd %xmm12,%xmm3
cvttss2si %xmm3,%eax
movaps %xmm1,%xmm3
unpckhpd %xmm1,%xmm3
cvttss2si %xmm3,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x3,%xmm6,%eax
test   $0x1,%al
je     12c6 <plot_hexline+0x1c6>
shufps $0xff,%xmm12,%xmm12
cvttss2si %xmm12,%eax
shufps $0xff,%xmm1,%xmm1
cvttss2si %xmm1,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x4,%xmm6,%eax
test   $0x1,%al
je     12e5 <plot_hexline+0x1e5>
cvttss2si %xmm8,%eax
cvttss2si %xmm9,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x5,%xmm6,%eax
test   $0x1,%al
je     1314 <plot_hexline+0x214>
movaps %xmm8,%xmm1
shufps $0x55,%xmm8,%xmm1
cvttss2si %xmm1,%eax
movaps %xmm9,%xmm1
shufps $0x55,%xmm9,%xmm1
cvttss2si %xmm1,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x6,%xmm6,%eax
test   $0x1,%al
je     1343 <plot_hexline+0x243>
movaps %xmm8,%xmm1
unpckhpd %xmm8,%xmm1
cvttss2si %xmm1,%eax
movaps %xmm9,%xmm1
unpckhpd %xmm9,%xmm1
cvttss2si %xmm1,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
pextrw $0x7,%xmm6,%eax
test   $0x1,%al
je     1180 <plot_hexline+0x80>
shufps $0xff,%xmm8,%xmm8
cvttss2si %xmm8,%eax
shufps $0xff,%xmm9,%xmm9
cvttss2si %xmm9,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
jmp    1180 <plot_hexline+0x80>
cmp    %esi,%r9d
movaps -0x18(%rsp),%xmm3
movaps -0x28(%rsp),%xmm2
movaps -0x38(%rsp),%xmm1
movaps -0x48(%rsp),%xmm14
jne    1390 <plot_hexline+0x290>
ret
pxor   %xmm6,%xmm6
jmp    13a9 <plot_hexline+0x2a9>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r9d
cmp    %r9d,%esi
je     138f <plot_hexline+0x28f>
xorps  %xmm4,%xmm4
cvtsi2ss %r9d,%xmm4
movaps %xmm4,%xmm5
mulss  %xmm2,%xmm5
addss  %xmm0,%xmm5
ucomiss %xmm6,%xmm5
jb     13a0 <plot_hexline+0x2a0>
ucomiss %xmm5,%xmm14
jbe    13a0 <plot_hexline+0x2a0>
mulss  %xmm3,%xmm4
addss  %xmm1,%xmm4
ucomiss %xmm6,%xmm4
jb     13a0 <plot_hexline+0x2a0>
ucomiss %xmm4,%xmm14
jbe    13a0 <plot_hexline+0x2a0>
cvttss2si %xmm4,%eax
cvttss2si %xmm5,%ecx
imul   %esi,%eax
add    %eax,%ecx
movslq %ecx,%rax
movb   $0x31,(%rdi,%rax,1)
jmp    13a0 <plot_hexline+0x2a0>

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

LLVM IR (-O2):
define void @plot_hexline(i8* nocapture writeonly %0, i32 %1, float %2, float %3, float %4, float %5) {
%7 = fsub float %4, %2
%8 = sitofp i32 %1 to float
%9 = fdiv float %7, %8
%10 = fsub float %5, %3
%11 = fdiv float %10, %8
%12 = icmp sgt i32 %1, 0
br i1 %12, label %13, label %157
13: ; preds = %6
%14 = icmp ult i32 %1, 8
br i1 %14, label %133, label %15
15: ; preds = %13
%16 = and i32 %1, -8
%17 = insertelement <8 x float> poison, float %9, i64 0
%18 = shufflevector <8 x float> %17, <8 x float> poison, <8 x i32> zeroinitializer
%19 = insertelement <8 x float> poison, float %2, i64 0
%20 = shufflevector <8 x float> %19, <8 x float> poison, <8 x i32> zeroinitializer
%21 = insertelement <8 x float> poison, float %11, i64 0
%22 = shufflevector <8 x float> %21, <8 x float> poison, <8 x i32> zeroinitializer
%23 = insertelement <8 x float> poison, float %3, i64 0
%24 = shufflevector <8 x float> %23, <8 x float> poison, <8 x i32> zeroinitializer
%25 = insertelement <8 x float> poison, float %8, i64 0
%26 = shufflevector <8 x float> %25, <8 x float> poison, <8 x i32> zeroinitializer
br label %27
27: ; preds = %127, %15
%28 = phi i32 [ 0, %15 ], [ %128, %127 ]
%29 = phi <8 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, %15 ], [ %129, %127 ]
%30 = sitofp <8 x i32> %29 to <8 x float>
%31 = call <8 x float> @llvm.fmuladd.v8f32(<8 x float> %30, <8 x float> %18, <8 x float> %20)
%32 = call <8 x float> @llvm.fmuladd.v8f32(<8 x float> %30, <8 x float> %22, <8 x float> %24)
%33 = fcmp oge <8 x float> %31, zeroinitializer
%34 = fcmp olt <8 x float> %31, %26
%35 = fcmp oge <8 x float> %32, zeroinitializer
%36 = fcmp olt <8 x float> %32, %26
%37 = select <8 x i1> %33, <8 x i1> %34, <8 x i1> zeroinitializer
%38 = select <8 x i1> %37, <8 x i1> %35, <8 x i1> zeroinitializer
%39 = select <8 x i1> %38, <8 x i1> %36, <8 x i1> zeroinitializer
%40 = extractelement <8 x i1> %39, i64 0
br i1 %40, label %41, label %50
41: ; preds = %27
%42 = extractelement <8 x float> %32, i64 0
%43 = fptosi float %42 to i32
%44 = mul nsw i32 %43, %1
%45 = extractelement <8 x float> %31, i64 0
%46 = fptosi float %45 to i32
%47 = add nsw i32 %44, %46
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %0, i64 %48
store i8 49, i8* %49
br label %50
50: ; preds = %41, %27
%51 = extractelement <8 x i1> %39, i64 1
br i1 %51, label %52, label %61
52: ; preds = %50
%53 = extractelement <8 x float> %32, i64 1
%54 = fptosi float %53 to i32
%55 = mul nsw i32 %54, %1
%56 = extractelement <8 x float> %31, i64 1
%57 = fptosi float %56 to i32
%58 = add nsw i32 %55, %57
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %0, i64 %59
store i8 49, i8* %60
br label %61
61: ; preds = %52, %50
%62 = extractelement <8 x i1> %39, i64 2
br i1 %62, label %63, label %72
63: ; preds = %61
%64 = extractelement <8 x float> %32, i64 2
%65 = fptosi float %64 to i32
%66 = mul nsw i32 %65, %1
%67 = extractelement <8 x float> %31, i64 2
%68 = fptosi float %67 to i32
%69 = add nsw i32 %66, %68
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %0, i64 %70
store i8 49, i8* %71
br label %72
72: ; preds = %63, %61
%73 = extractelement <8 x i1> %39, i64 3
br i1 %73, label %74, label %83
74: ; preds = %72
%75 = extractelement <8 x float> %32, i64 3
%76 = fptosi float %75 to i32
%77 = mul nsw i32 %76, %1
%78 = extractelement <8 x float> %31, i64 3
%79 = fptosi float %78 to i32
%80 = add nsw i32 %77, %79
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i8, i8* %0, i64 %81
store i8 49, i8* %82
br label %83
83: ; preds = %74, %72
%84 = extractelement <8 x i1> %39, i64 4
br i1 %84, label %85, label %94
85: ; preds = %83
%86 = extractelement <8 x float> %32, i64 4
%87 = fptosi float %86 to i32
%88 = mul nsw i32 %87, %1
%89 = extractelement <8 x float> %31, i64 4
%90 = fptosi float %89 to i32
%91 = add nsw i32 %88, %90
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %0, i64 %92
store i8 49, i8* %93
br label %94
94: ; preds = %85, %83
%95 = extractelement <8 x i1> %39, i64 5
br i1 %95, label %96, label %105
96: ; preds = %94
%97 = extractelement <8 x float> %32, i64 5
%98 = fptosi float %97 to i32
%99 = mul nsw i32 %98, %1
%100 = extractelement <8 x float> %31, i64 5
%101 = fptosi float %100 to i32
%102 = add nsw i32 %99, %101
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %0, i64 %103
store i8 49, i8* %104
br label %105
105: ; preds = %96, %94
%106 = extractelement <8 x i1> %39, i64 6
br i1 %106, label %107, label %116
107: ; preds = %105
%108 = extractelement <8 x float> %32, i64 6
%109 = fptosi float %108 to i32
%110 = mul nsw i32 %109, %1
%111 = extractelement <8 x float> %31, i64 6
%112 = fptosi float %111 to i32
%113 = add nsw i32 %110, %112
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %0, i64 %114
store i8 49, i8* %115
br label %116
116: ; preds = %107, %105
%117 = extractelement <8 x i1> %39, i64 7
br i1 %117, label %118, label %127
118: ; preds = %116
%119 = extractelement <8 x float> %32, i64 7
%120 = fptosi float %119 to i32
%121 = mul nsw i32 %120, %1
%122 = extractelement <8 x float> %31, i64 7
%123 = fptosi float %122 to i32
%124 = add nsw i32 %121, %123
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %0, i64 %125
store i8 49, i8* %126
br label %127
127: ; preds = %118, %116
%128 = add nuw i32 %28, 8
%129 = add <8 x i32> %29, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
%130 = icmp eq i32 %128, %16
br i1 %130, label %131, label %27
131: ; preds = %127
%132 = icmp eq i32 %16, %1
br i1 %132, label %157, label %133
133: ; preds = %13, %131
%134 = phi i32 [ 0, %13 ], [ %16, %131 ]
br label %135
135: ; preds = %133, %154
%136 = phi i32 [ %155, %154 ], [ %134, %133 ]
%137 = sitofp i32 %136 to float
%138 = tail call float @llvm.fmuladd.f32(float %137, float %9, float %2)
%139 = tail call float @llvm.fmuladd.f32(float %137, float %11, float %3)
%140 = fcmp ult float %138, 0.000000e+00
br i1 %140, label %154, label %141
141: ; preds = %135
%142 = fcmp olt float %138, %8
%143 = fcmp oge float %139, 0.000000e+00
%144 = select i1 %142, i1 %143, i1 false
%145 = fcmp olt float %139, %8
%146 = select i1 %144, i1 %145, i1 false
br i1 %146, label %147, label %154
147: ; preds = %141
%148 = fptosi float %139 to i32
%149 = mul nsw i32 %148, %1
%150 = fptosi float %138 to i32
%151 = add nsw i32 %149, %150
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %0, i64 %152
store i8 49, i8* %153
br label %154
154: ; preds = %147, %141, %135
%155 = add nuw nsw i32 %136, 1
%156 = icmp eq i32 %155, %1
br i1 %156, label %157, label %135
157: ; preds = %154, %131, %6
ret void
}