void draw_hexagon(char *pixelbuf, int image_width, char *scaled_hexagon,
                  int hexagon_size, int xposn, int yposn) {
  int i, j;
  for (i = 0; i < hexagon_size; i++) {
    for (j = 0; j < hexagon_size; j++) {
      if (scaled_hexagon[(i * hexagon_size) + j] == '1') {
        *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) =
            '1';
      }
    }
  }
}


x86 assembly (clang, -O0):
<draw_hexagon>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11b1 <draw_hexagon+0xb1>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    119e <draw_hexagon+0x9e>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jne    118b <draw_hexagon+0x8b>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    -0xc(%rbp),%ecx
imul   -0x24(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
movb   $0x31,(%rax,%rcx,1)
jmp    1190 <draw_hexagon+0x90>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1134 <draw_hexagon+0x34>
jmp    11a3 <draw_hexagon+0xa3>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1121 <draw_hexagon+0x21>
pop    %rbp
ret

x86 assembly (clang, -O2):
<draw_hexagon>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,-0x28(%rsp)
test   %ecx,%ecx
jle    1431 <draw_hexagon+0x331>
imul   %esi,%r9d
movslq %r9d,%rax
movslq %r8d,%rbp
mov    %ecx,%r12d
movslq %esi,%r11
mov    -0x28(%rsp),%rdi
lea    (%rdi,%rax,1),%rsi
add    %rbp,%rsi
mov    %rsi,-0x20(%rsp)
add    %rax,%rbp
lea    (%r12,%rbp,1),%rax
mov    %rax,-0x18(%rsp)
mov    %r12d,%r15d
and    $0xfffffff0,%r15d
mov    %r12,%rax
neg    %rax
mov    %rax,-0x8(%rsp)
lea    (%rdi,%rbp,1),%rbx
add    $0xf,%rbx
lea    0x8(%rdx),%rsi
lea    0x1(%rdx),%rax
mov    %rbp,-0x10(%rsp)
lea    (%rdi,%rbp,1),%r13
add    $0x1,%r13
xor    %r9d,%r9d
movdqa 0xe82(%rip),%xmm0
movdqa 0xe8a(%rip),%xmm1
jmp    11a9 <draw_hexagon+0xa9>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r9
add    %r11,%rbx
add    %r12,%rsi
add    %r12,%rax
add    %r11,%r13
cmp    %r12,%r9
je     1431 <draw_hexagon+0x331>
mov    %r9,%r14
imul   %r11,%r14
mov    %r9,%r10
imul   %r12,%r10
cmp    $0x10,%ecx
jb     11f0 <draw_hexagon+0xf0>
lea    (%r10,%r12,1),%rdi
add    %rdx,%rdi
mov    -0x10(%rsp),%rbp
add    %r14,%rbp
mov    -0x28(%rsp),%r8
add    %r8,%rbp
cmp    %rdi,%rbp
jae    1260 <draw_hexagon+0x160>
lea    (%rdx,%r10,1),%rdi
mov    -0x18(%rsp),%rbp
add    %r14,%rbp
add    %r8,%rbp
cmp    %rbp,%rdi
jae    1260 <draw_hexagon+0x160>
xor    %edi,%edi
mov    %rdi,%rbp
test   $0x1,%r12b
je     1216 <draw_hexagon+0x116>
add    %rdi,%r10
cmpb   $0x31,(%rdx,%r10,1)
jne    120f <draw_hexagon+0x10f>
add    -0x20(%rsp),%r14
movb   $0x31,(%r14,%rdi,1)
mov    %rdi,%rbp
or     $0x1,%rbp
not    %rdi
cmp    -0x8(%rsp),%rdi
jne    123d <draw_hexagon+0x13d>
jmp    1190 <draw_hexagon+0x90>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x2,%rbp
cmp    %rbp,%r12
je     1190 <draw_hexagon+0x90>
cmpb   $0x31,-0x1(%rax,%rbp,1)
jne    124a <draw_hexagon+0x14a>
movb   $0x31,-0x1(%r13,%rbp,1)
cmpb   $0x31,(%rax,%rbp,1)
jne    1230 <draw_hexagon+0x130>
movb   $0x31,0x0(%r13,%rbp,1)
jmp    1230 <draw_hexagon+0x130>
nopl   0x0(%rax,%rax,1)
xor    %r8d,%r8d
jmp    127d <draw_hexagon+0x17d>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x10,%r8
cmp    %r8,%r15
je     1420 <draw_hexagon+0x320>
movq   -0x8(%rsi,%r8,1),%xmm4
movq   (%rsi,%r8,1),%xmm2
movdqa %xmm4,%xmm3
pcmpeqb %xmm0,%xmm3
movd   %xmm3,%edi
test   $0x1,%dil
je     12a2 <draw_hexagon+0x1a2>
movb   $0x31,-0xf(%rbx,%r8,1)
movdqa %xmm3,%xmm5
pslld  $0x8,%xmm5
movd   %xmm5,%edi
shr    $0x10,%edi
test   $0x1,%dil
je     12be <draw_hexagon+0x1be>
movb   $0x31,-0xe(%rbx,%r8,1)
pshuflw $0x55,%xmm4,%xmm5
pcmpeqb %xmm0,%xmm5
pextrw $0x2,%xmm5,%edi
test   $0x1,%dil
je     12d8 <draw_hexagon+0x1d8>
movb   $0x31,-0xd(%rbx,%r8,1)
movdqa %xmm3,%xmm5
psllq  $0x18,%xmm5
pextrw $0x3,%xmm5,%edi
test   $0x1,%dil
je     12f2 <draw_hexagon+0x1f2>
movb   $0x31,-0xc(%rbx,%r8,1)
pshufd $0x55,%xmm4,%xmm4
pcmpeqb %xmm1,%xmm4
pextrw $0x4,%xmm4,%edi
test   $0x1,%dil
je     130c <draw_hexagon+0x20c>
movb   $0x31,-0xb(%rbx,%r8,1)
movdqa %xmm3,%xmm4
pslldq $0x5,%xmm4
pextrw $0x5,%xmm4,%edi
test   $0x1,%dil
je     1326 <draw_hexagon+0x226>
movb   $0x31,-0xa(%rbx,%r8,1)
pextrw $0x3,%xmm3,%edi
test   $0x1,%dil
je     1337 <draw_hexagon+0x237>
movb   $0x31,-0x9(%rbx,%r8,1)
pslldq $0x7,%xmm3
pextrw $0x7,%xmm3,%edi
test   $0x1,%dil
je     134d <draw_hexagon+0x24d>
movb   $0x31,-0x8(%rbx,%r8,1)
movdqa %xmm2,%xmm3
pcmpeqb %xmm0,%xmm3
movd   %xmm3,%edi
test   $0x1,%dil
je     1365 <draw_hexagon+0x265>
movb   $0x31,-0x7(%rbx,%r8,1)
movdqa %xmm3,%xmm4
pslld  $0x8,%xmm4
movd   %xmm4,%edi
shr    $0x10,%edi
test   $0x1,%dil
je     1381 <draw_hexagon+0x281>
movb   $0x31,-0x6(%rbx,%r8,1)
pshuflw $0x55,%xmm2,%xmm4
pcmpeqb %xmm0,%xmm4
pextrw $0x2,%xmm4,%edi
test   $0x1,%dil
je     139b <draw_hexagon+0x29b>
movb   $0x31,-0x5(%rbx,%r8,1)
movdqa %xmm3,%xmm4
psllq  $0x18,%xmm4
pextrw $0x3,%xmm4,%edi
test   $0x1,%dil
je     13b5 <draw_hexagon+0x2b5>
movb   $0x31,-0x4(%rbx,%r8,1)
pshufd $0x55,%xmm2,%xmm2
pcmpeqb %xmm1,%xmm2
pextrw $0x4,%xmm2,%edi
test   $0x1,%dil
je     13cf <draw_hexagon+0x2cf>
movb   $0x31,-0x3(%rbx,%r8,1)
movdqa %xmm3,%xmm2
pslldq $0x5,%xmm2
pextrw $0x5,%xmm2,%edi
test   $0x1,%dil
je     13e9 <draw_hexagon+0x2e9>
movb   $0x31,-0x2(%rbx,%r8,1)
pextrw $0x3,%xmm3,%edi
test   $0x1,%dil
je     13fa <draw_hexagon+0x2fa>
movb   $0x31,-0x1(%rbx,%r8,1)
pslldq $0x7,%xmm3
pextrw $0x7,%xmm3,%edi
test   $0x1,%dil
je     1270 <draw_hexagon+0x170>
movb   $0x31,(%rbx,%r8,1)
jmp    1270 <draw_hexagon+0x170>
nopl   0x0(%rax,%rax,1)
mov    %r15,%rdi
cmp    %r12,%r15
je     1190 <draw_hexagon+0x90>
jmp    11f2 <draw_hexagon+0xf2>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @draw_hexagon(i8* %0, i32 %1, i8* %2, i32 %3, i32 %4, i32 %5) {
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i8* %0, i8** %7
store i32 %1, i32* %8
store i8* %2, i8** %9
store i32 %3, i32* %10
store i32 %4, i32* %11
store i32 %5, i32* %12
store i32 0, i32* %13
br label %15
15: ; preds = %59, %6
%16 = load i32, i32* %13
%17 = load i32, i32* %10
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %62
19: ; preds = %15
store i32 0, i32* %14
br label %20
20: ; preds = %55, %19
%21 = load i32, i32* %14
%22 = load i32, i32* %10
%23 = icmp slt i32 %21, %22
br i1 %23, label %24, label %58
24: ; preds = %20
%25 = load i8*, i8** %9
%26 = load i32, i32* %13
%27 = load i32, i32* %10
%28 = mul nsw i32 %26, %27
%29 = load i32, i32* %14
%30 = add nsw i32 %28, %29
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %25, i64 %31
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 49
br i1 %35, label %36, label %54
36: ; preds = %24
%37 = load i8*, i8** %7
%38 = load i32, i32* %8
%39 = load i32, i32* %13
%40 = mul nsw i32 %38, %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %37, i64 %41
%43 = load i32, i32* %8
%44 = load i32, i32* %12
%45 = mul nsw i32 %43, %44
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8, i8* %42, i64 %46
%48 = load i32, i32* %11
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i8, i8* %47, i64 %49
%51 = load i32, i32* %14
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %50, i64 %52
store i8 49, i8* %53
br label %54
54: ; preds = %36, %24
br label %55
55: ; preds = %54
%56 = load i32, i32* %14
%57 = add nsw i32 %56, 1
store i32 %57, i32* %14
br label %20
58: ; preds = %20
br label %59
59: ; preds = %58
%60 = load i32, i32* %13
%61 = add nsw i32 %60, 1
store i32 %61, i32* %13
br label %15
62: ; preds = %15
ret void
}

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