#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint8_t;

/* Variables and functions */
void set_10_pixel(uint8_t *p, unsigned row_bytes, unsigned x, unsigned y,
                  unsigned value) {
  uint8_t *addr = p + y * row_bytes + (x >> 3) * 10;
  switch (x & 7) {
  case 0:
    addr[0] = (addr[0] & 0x3F) | (value << 6);
    addr[1] = value >> 2;
    break;
  case 1:
    addr[0] = (addr[0] & 0xC0) | (value >> 4);
    addr[3] = (addr[3] & 0x0F) | (value << 4);
    break;
  case 2:
    addr[2] = (addr[2] & 0x03) | (value << 2);
    addr[3] = (addr[3] & 0xF0) | (value >> 6);
    break;
  case 3:
    addr[2] = (addr[2] & 0xFC) | (value >> 8);
    addr[5] = value;
    break;
  case 4:
    addr[4] = value >> 2;
    addr[7] = (addr[7] & 0x3F) | (value << 6);
    break;
  case 5:
    addr[6] = (addr[6] & 0x0F) | (value << 4);
    addr[7] = (addr[7] & 0xC0) | (value >> 4);
    break;
  case 6:
    addr[6] = (addr[6] & 0xF0) | (value >> 6);
    addr[9] = (addr[9] & 0x03) | (value << 2);
    break;
  case 7:
    addr[8] = value;
    addr[9] = (addr[9] & 0xFC) | (value >> 8);
    break;
  }
}


x86 assembly (clang, -O0):
<set_10_pixel>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    -0xc(%rbp),%edx
imul   %edx,%ecx
lea    (%rax,%rcx,4),%rax
mov    -0x10(%rbp),%edx
shr    $0x2,%edx
and    $0xfffffffe,%edx
mov    %edx,%ecx
lea    (%rcx,%rcx,4),%ecx
lea    (%rax,%rcx,4),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%eax
and    $0x7,%eax
mov    %rax,-0x28(%rbp)
sub    $0x7,%eax
ja     12ee <set_10_pixel+0x1ee>
mov    -0x28(%rbp),%rax
lea    0xea6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0x3f,%ecx
mov    -0x18(%rbp),%eax
shl    $0x6,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%ecx
shr    $0x2,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x4(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xc0,%ecx
mov    -0x18(%rbp),%eax
shr    $0x4,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    0xc(%rax),%ecx
and    $0xf,%ecx
mov    -0x18(%rbp),%eax
shl    $0x4,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0xc(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%ecx
and    $0x3,%ecx
mov    -0x18(%rbp),%eax
shl    $0x2,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x20(%rbp),%rax
mov    0xc(%rax),%ecx
and    $0xf0,%ecx
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0xc(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%ecx
and    $0xfc,%ecx
mov    -0x18(%rbp),%eax
shr    $0x8,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x14(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x18(%rbp),%ecx
shr    $0x2,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x10(%rax)
mov    -0x20(%rbp),%rax
mov    0x1c(%rax),%ecx
and    $0x3f,%ecx
mov    -0x18(%rbp),%eax
shl    $0x6,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x1c(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%ecx
and    $0xf,%ecx
mov    -0x18(%rbp),%eax
shl    $0x4,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x18(%rax)
mov    -0x20(%rbp),%rax
mov    0x1c(%rax),%ecx
and    $0xc0,%ecx
mov    -0x18(%rbp),%eax
shr    $0x4,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x1c(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%ecx
and    $0xf0,%ecx
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x18(%rax)
mov    -0x20(%rbp),%rax
mov    0x24(%rax),%ecx
and    $0x3,%ecx
mov    -0x18(%rbp),%eax
shl    $0x2,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x24(%rax)
jmp    12ee <set_10_pixel+0x1ee>
mov    -0x18(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x20(%rax)
mov    -0x20(%rbp),%rax
mov    0x24(%rax),%ecx
and    $0xfc,%ecx
mov    -0x18(%rbp),%eax
shr    $0x8,%eax
or     %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x24(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_10_pixel>:
imul   %ecx,%esi
lea    (%rdi,%rsi,4),%rax
mov    %edx,%ecx
shr    $0x2,%ecx
and    $0xfffffffe,%ecx
lea    (%rcx,%rcx,4),%ecx
and    $0x7,%edx
lea    0xee4(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    (%rax,%rcx,4),%edx
and    $0x3f,%edx
mov    %r8d,%esi
shl    $0x6,%esi
or     %edx,%esi
mov    %esi,(%rax,%rcx,4)
shr    $0x2,%r8d
mov    %r8d,0x4(%rax,%rcx,4)
ret
mov    $0xc0,%edx
and    (%rax,%rcx,4),%edx
mov    %r8d,%esi
shr    $0x4,%esi
or     %edx,%esi
mov    %esi,(%rax,%rcx,4)
mov    0xc(%rax,%rcx,4),%edx
and    $0xf,%edx
shl    $0x4,%r8d
jmp    117c <set_10_pixel+0x7c>
mov    0x8(%rax,%rcx,4),%edx
and    $0x3,%edx
lea    (%rdx,%r8,4),%edx
mov    %edx,0x8(%rax,%rcx,4)
mov    $0xf0,%edx
and    0xc(%rax,%rcx,4),%edx
shr    $0x6,%r8d
or     %edx,%r8d
mov    %r8d,0xc(%rax,%rcx,4)
ret
mov    $0xfc,%edx
and    0x8(%rax,%rcx,4),%edx
mov    %r8d,%esi
shr    $0x8,%esi
or     %edx,%esi
mov    %esi,0x8(%rax,%rcx,4)
mov    %r8d,0x14(%rax,%rcx,4)
ret
mov    %r8d,%edx
shr    $0x2,%edx
mov    %edx,0x10(%rax,%rcx,4)
mov    0x1c(%rax,%rcx,4),%edx
and    $0x3f,%edx
shl    $0x6,%r8d
jmp    11d7 <set_10_pixel+0xd7>
mov    0x18(%rax,%rcx,4),%edx
and    $0xf,%edx
mov    %r8d,%esi
shl    $0x4,%esi
or     %edx,%esi
mov    %esi,0x18(%rax,%rcx,4)
mov    $0xc0,%edx
and    0x1c(%rax,%rcx,4),%edx
shr    $0x4,%r8d
or     %edx,%r8d
mov    %r8d,0x1c(%rax,%rcx,4)
ret
mov    $0xf0,%edx
and    0x18(%rax,%rcx,4),%edx
mov    %r8d,%esi
shr    $0x6,%esi
or     %edx,%esi
mov    %esi,0x18(%rax,%rcx,4)
mov    0x24(%rax,%rcx,4),%edx
and    $0x3,%edx
lea    (%rdx,%r8,4),%edx
mov    %edx,0x24(%rax,%rcx,4)
ret
mov    %r8d,0x20(%rax,%rcx,4)
mov    $0xfc,%edx
and    0x24(%rax,%rcx,4),%edx
shr    $0x8,%r8d
or     %edx,%r8d
mov    %r8d,0x24(%rax,%rcx,4)
ret

LLVM IR (-O0):
define void @set_10_pixel(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 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
%12 = load i32*, i32** %6
%13 = load i32, i32* %9
%14 = load i32, i32* %7
%15 = mul i32 %13, %14
%16 = zext i32 %15 to i64
%17 = getelementptr inbounds i32, i32* %12, i64 %16
%18 = load i32, i32* %8
%19 = lshr i32 %18, 3
%20 = mul i32 %19, 10
%21 = zext i32 %20 to i64
%22 = getelementptr inbounds i32, i32* %17, i64 %21
store i32* %22, i32** %11
%23 = load i32, i32* %8
%24 = and i32 %23, 7
switch i32 %24, label %155 [
i32 0, label %25
i32 1, label %39
i32 2, label %58
i32 3, label %77
i32 4, label %90
i32 5, label %104
i32 6, label %123
i32 7, label %142
]
25: ; preds = %5
%26 = load i32*, i32** %11
%27 = getelementptr inbounds i32, i32* %26, i64 0
%28 = load i32, i32* %27
%29 = and i32 %28, 63
%30 = load i32, i32* %10
%31 = shl i32 %30, 6
%32 = or i32 %29, %31
%33 = load i32*, i32** %11
%34 = getelementptr inbounds i32, i32* %33, i64 0
store i32 %32, i32* %34
%35 = load i32, i32* %10
%36 = lshr i32 %35, 2
%37 = load i32*, i32** %11
%38 = getelementptr inbounds i32, i32* %37, i64 1
store i32 %36, i32* %38
br label %155
39: ; preds = %5
%40 = load i32*, i32** %11
%41 = getelementptr inbounds i32, i32* %40, i64 0
%42 = load i32, i32* %41
%43 = and i32 %42, 192
%44 = load i32, i32* %10
%45 = lshr i32 %44, 4
%46 = or i32 %43, %45
%47 = load i32*, i32** %11
%48 = getelementptr inbounds i32, i32* %47, i64 0
store i32 %46, i32* %48
%49 = load i32*, i32** %11
%50 = getelementptr inbounds i32, i32* %49, i64 3
%51 = load i32, i32* %50
%52 = and i32 %51, 15
%53 = load i32, i32* %10
%54 = shl i32 %53, 4
%55 = or i32 %52, %54
%56 = load i32*, i32** %11
%57 = getelementptr inbounds i32, i32* %56, i64 3
store i32 %55, i32* %57
br label %155
58: ; preds = %5
%59 = load i32*, i32** %11
%60 = getelementptr inbounds i32, i32* %59, i64 2
%61 = load i32, i32* %60
%62 = and i32 %61, 3
%63 = load i32, i32* %10
%64 = shl i32 %63, 2
%65 = or i32 %62, %64
%66 = load i32*, i32** %11
%67 = getelementptr inbounds i32, i32* %66, i64 2
store i32 %65, i32* %67
%68 = load i32*, i32** %11
%69 = getelementptr inbounds i32, i32* %68, i64 3
%70 = load i32, i32* %69
%71 = and i32 %70, 240
%72 = load i32, i32* %10
%73 = lshr i32 %72, 6
%74 = or i32 %71, %73
%75 = load i32*, i32** %11
%76 = getelementptr inbounds i32, i32* %75, i64 3
store i32 %74, i32* %76
br label %155
77: ; preds = %5
%78 = load i32*, i32** %11
%79 = getelementptr inbounds i32, i32* %78, i64 2
%80 = load i32, i32* %79
%81 = and i32 %80, 252
%82 = load i32, i32* %10
%83 = lshr i32 %82, 8
%84 = or i32 %81, %83
%85 = load i32*, i32** %11
%86 = getelementptr inbounds i32, i32* %85, i64 2
store i32 %84, i32* %86
%87 = load i32, i32* %10
%88 = load i32*, i32** %11
%89 = getelementptr inbounds i32, i32* %88, i64 5
store i32 %87, i32* %89
br label %155
90: ; preds = %5
%91 = load i32, i32* %10
%92 = lshr i32 %91, 2
%93 = load i32*, i32** %11
%94 = getelementptr inbounds i32, i32* %93, i64 4
store i32 %92, i32* %94
%95 = load i32*, i32** %11
%96 = getelementptr inbounds i32, i32* %95, i64 7
%97 = load i32, i32* %96
%98 = and i32 %97, 63
%99 = load i32, i32* %10
%100 = shl i32 %99, 6
%101 = or i32 %98, %100
%102 = load i32*, i32** %11
%103 = getelementptr inbounds i32, i32* %102, i64 7
store i32 %101, i32* %103
br label %155
104: ; preds = %5
%105 = load i32*, i32** %11
%106 = getelementptr inbounds i32, i32* %105, i64 6
%107 = load i32, i32* %106
%108 = and i32 %107, 15
%109 = load i32, i32* %10
%110 = shl i32 %109, 4
%111 = or i32 %108, %110
%112 = load i32*, i32** %11
%113 = getelementptr inbounds i32, i32* %112, i64 6
store i32 %111, i32* %113
%114 = load i32*, i32** %11
%115 = getelementptr inbounds i32, i32* %114, i64 7
%116 = load i32, i32* %115
%117 = and i32 %116, 192
%118 = load i32, i32* %10
%119 = lshr i32 %118, 4
%120 = or i32 %117, %119
%121 = load i32*, i32** %11
%122 = getelementptr inbounds i32, i32* %121, i64 7
store i32 %120, i32* %122
br label %155
123: ; preds = %5
%124 = load i32*, i32** %11
%125 = getelementptr inbounds i32, i32* %124, i64 6
%126 = load i32, i32* %125
%127 = and i32 %126, 240
%128 = load i32, i32* %10
%129 = lshr i32 %128, 6
%130 = or i32 %127, %129
%131 = load i32*, i32** %11
%132 = getelementptr inbounds i32, i32* %131, i64 6
store i32 %130, i32* %132
%133 = load i32*, i32** %11
%134 = getelementptr inbounds i32, i32* %133, i64 9
%135 = load i32, i32* %134
%136 = and i32 %135, 3
%137 = load i32, i32* %10
%138 = shl i32 %137, 2
%139 = or i32 %136, %138
%140 = load i32*, i32** %11
%141 = getelementptr inbounds i32, i32* %140, i64 9
store i32 %139, i32* %141
br label %155
142: ; preds = %5
%143 = load i32, i32* %10
%144 = load i32*, i32** %11
%145 = getelementptr inbounds i32, i32* %144, i64 8
store i32 %143, i32* %145
%146 = load i32*, i32** %11
%147 = getelementptr inbounds i32, i32* %146, i64 9
%148 = load i32, i32* %147
%149 = and i32 %148, 252
%150 = load i32, i32* %10
%151 = lshr i32 %150, 8
%152 = or i32 %149, %151
%153 = load i32*, i32** %11
%154 = getelementptr inbounds i32, i32* %153, i64 9
store i32 %152, i32* %154
br label %155
155: ; preds = %5, %142, %123, %104, %90, %77, %58, %39, %25
ret void
}

LLVM IR (-O2):
define void @set_10_pixel(i32* nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = mul i32 %3, %1
%7 = zext i32 %6 to i64
%8 = getelementptr inbounds i32, i32* %0, i64 %7
%9 = lshr i32 %2, 3
%10 = mul i32 %9, 10
%11 = zext i32 %10 to i64
%12 = getelementptr inbounds i32, i32* %8, i64 %11
%13 = and i32 %2, 7
switch i32 %13, label %86 [
i32 0, label %14
i32 1, label %21
i32 2, label %31
i32 3, label %42
i32 4, label %49
i32 5, label %57
i32 6, label %68
i32 7, label %79
]
14: ; preds = %5
%15 = load i32, i32* %12
%16 = and i32 %15, 63
%17 = shl i32 %4, 6
%18 = or i32 %16, %17
store i32 %18, i32* %12
%19 = lshr i32 %4, 2
%20 = getelementptr inbounds i32, i32* %12, i64 1
store i32 %19, i32* %20
br label %87
21: ; preds = %5
%22 = load i32, i32* %12
%23 = and i32 %22, 192
%24 = lshr i32 %4, 4
%25 = or i32 %23, %24
store i32 %25, i32* %12
%26 = getelementptr inbounds i32, i32* %12, i64 3
%27 = load i32, i32* %26
%28 = and i32 %27, 15
%29 = shl i32 %4, 4
%30 = or i32 %28, %29
store i32 %30, i32* %26
br label %87
31: ; preds = %5
%32 = getelementptr inbounds i32, i32* %12, i64 2
%33 = load i32, i32* %32
%34 = and i32 %33, 3
%35 = shl i32 %4, 2
%36 = or i32 %34, %35
store i32 %36, i32* %32
%37 = getelementptr inbounds i32, i32* %12, i64 3
%38 = load i32, i32* %37
%39 = and i32 %38, 240
%40 = lshr i32 %4, 6
%41 = or i32 %39, %40
store i32 %41, i32* %37
br label %87
42: ; preds = %5
%43 = getelementptr inbounds i32, i32* %12, i64 2
%44 = load i32, i32* %43
%45 = and i32 %44, 252
%46 = lshr i32 %4, 8
%47 = or i32 %45, %46
store i32 %47, i32* %43
%48 = getelementptr inbounds i32, i32* %12, i64 5
store i32 %4, i32* %48
br label %87
49: ; preds = %5
%50 = lshr i32 %4, 2
%51 = getelementptr inbounds i32, i32* %12, i64 4
store i32 %50, i32* %51
%52 = getelementptr inbounds i32, i32* %12, i64 7
%53 = load i32, i32* %52
%54 = and i32 %53, 63
%55 = shl i32 %4, 6
%56 = or i32 %54, %55
store i32 %56, i32* %52
br label %87
57: ; preds = %5
%58 = getelementptr inbounds i32, i32* %12, i64 6
%59 = load i32, i32* %58
%60 = and i32 %59, 15
%61 = shl i32 %4, 4
%62 = or i32 %60, %61
store i32 %62, i32* %58
%63 = getelementptr inbounds i32, i32* %12, i64 7
%64 = load i32, i32* %63
%65 = and i32 %64, 192
%66 = lshr i32 %4, 4
%67 = or i32 %65, %66
store i32 %67, i32* %63
br label %87
68: ; preds = %5
%69 = getelementptr inbounds i32, i32* %12, i64 6
%70 = load i32, i32* %69
%71 = and i32 %70, 240
%72 = lshr i32 %4, 6
%73 = or i32 %71, %72
store i32 %73, i32* %69
%74 = getelementptr inbounds i32, i32* %12, i64 9
%75 = load i32, i32* %74
%76 = and i32 %75, 3
%77 = shl i32 %4, 2
%78 = or i32 %76, %77
store i32 %78, i32* %74
br label %87
79: ; preds = %5
%80 = getelementptr inbounds i32, i32* %12, i64 8
store i32 %4, i32* %80
%81 = getelementptr inbounds i32, i32* %12, i64 9
%82 = load i32, i32* %81
%83 = and i32 %82, 252
%84 = lshr i32 %4, 8
%85 = or i32 %83, %84
store i32 %85, i32* %81
br label %87
86: ; preds = %5
unreachable
87: ; preds = %79, %68, %57, %49, %42, %31, %21, %14
ret void
}