#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 */

/* Variables and functions */
int /*<<< orphan*/ imColorEncode(unsigned char, unsigned char, unsigned char);
void imRGB2Gray(int width, int height, unsigned char *red, unsigned char *green,
                unsigned char *blue, unsigned char *map, long *grays) {
  int i, count, c;
  for (c = 0; c < 256; c++)
    *grays++ =
        imColorEncode((unsigned char)c, (unsigned char)c, (unsigned char)c);
  count = width * height;
  for (i = 0; i < count; i++) {
    *map++ =
        (unsigned char)((*red++ * 30 + *green++ * 59 + *blue++ * 11) / 100);
  }
}


x86 assembly (clang, -O0):
<imRGB2Gray>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jge    1184 <imRGB2Gray+0x74>
mov    -0x34(%rbp),%eax
mov    %al,%dl
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x34(%rbp),%eax
movzbl %dl,%edi
movzbl %cl,%esi
movzbl %al,%edx
call   1030 <imColorEncode@plt>
movslq %eax,%rcx
mov    0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,0x10(%rbp)
mov    %rcx,(%rax)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1139 <imRGB2Gray+0x29>
mov    -0x4(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    120d <imRGB2Gray+0xfd>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl (%rax),%eax
imul   $0x1e,%eax,%eax
mov    -0x18(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
movzbl (%rcx),%ecx
imul   $0x3b,%ecx,%ecx
add    %ecx,%eax
mov    -0x20(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
movzbl (%rcx),%ecx
imul   $0xb,%ecx,%ecx
add    %ecx,%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1195 <imRGB2Gray+0x85>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<imRGB2Gray>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9,%r12
mov    %r8,0x8(%rsp)
mov    %rcx,0x10(%rsp)
mov    %rdx,(%rsp)
mov    %esi,%r13d
mov    %edi,%ebp
mov    0x50(%rsp),%r14
xor    %r15d,%r15d
nopl   0x0(%rax)
movzbl %r15b,%edi
mov    %edi,%esi
mov    %edi,%edx
call   1030 <imColorEncode@plt>
cltq
mov    %rax,(%r14,%r15,8)
add    $0x1,%r15
cmp    $0x100,%r15d
jne    1140 <imRGB2Gray+0x30>
imul   %ebp,%r13d
test   %r13d,%r13d
jle    130f <imRGB2Gray+0x1ff>
lea    -0x1(%r13),%r8d
xor    %r11d,%r11d
cmp    $0x7,%r8d
jae    1190 <imRGB2Gray+0x80>
mov    (%rsp),%r9
mov    %r12,%rdi
mov    0x8(%rsp),%rbp
mov    0x10(%rsp),%rcx
jmp    12c8 <imRGB2Gray+0x1b8>
mov    (%rsp),%rax
lea    (%rax,%r8,1),%rcx
add    $0x1,%rcx
cmp    %r12,%rcx
seta   %r9b
lea    (%r12,%r8,1),%rdi
add    $0x1,%rdi
cmp    %rax,%rdi
seta   %r10b
mov    0x10(%rsp),%r14
lea    (%r14,%r8,1),%rcx
add    $0x1,%rcx
cmp    %r12,%rcx
seta   %cl
cmp    %r14,%rdi
seta   %sil
mov    0x8(%rsp),%rbx
lea    (%rbx,%r8,1),%rdx
add    $0x1,%rdx
cmp    %r12,%rdx
seta   %dl
cmp    %rbx,%rdi
seta   %dil
test   %r10b,%r9b
jne    12bc <imRGB2Gray+0x1ac>
and    %sil,%cl
jne    12bc <imRGB2Gray+0x1ac>
and    %dil,%dl
jne    12bc <imRGB2Gray+0x1ac>
movabs $0x1fffffff0,%r11
cmp    $0xf,%r8d
jae    131e <imRGB2Gray+0x20e>
xor    %edx,%edx
add    $0x1,%r8
add    $0x8,%r11
and    %r8,%r11
lea    (%rax,%r11,1),%r9
lea    (%r12,%r11,1),%rdi
lea    (%rbx,%r11,1),%rbp
lea    (%r14,%r11,1),%rcx
pxor   %xmm0,%xmm0
movdqa 0xdc2(%rip),%xmm1
movdqa 0xdca(%rip),%xmm2
movdqa 0xdd2(%rip),%xmm3
movdqa 0xdda(%rip),%xmm4
movdqa 0xde2(%rip),%xmm5
xchg   %ax,%ax
movq   (%rax,%rdx,1),%xmm6
punpcklbw %xmm0,%xmm6
pmullw %xmm1,%xmm6
movq   (%r14,%rdx,1),%xmm7
punpcklbw %xmm0,%xmm7
pmullw %xmm2,%xmm7
paddw  %xmm6,%xmm7
movq   (%rbx,%rdx,1),%xmm6
punpcklbw %xmm0,%xmm6
pmullw %xmm3,%xmm6
paddw  %xmm7,%xmm6
psrlw  $0x2,%xmm6
pmulhuw %xmm4,%xmm6
psrlw  $0x1,%xmm6
pand   %xmm5,%xmm6
packuswb %xmm6,%xmm6
movq   %xmm6,(%r12,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%r11
jne    1260 <imRGB2Gray+0x150>
cmp    %r11,%r8
jne    12c8 <imRGB2Gray+0x1b8>
jmp    130f <imRGB2Gray+0x1ff>
mov    %rax,%r9
mov    %r12,%rdi
mov    %rbx,%rbp
mov    %r14,%rcx
sub    %r11d,%r13d
xor    %eax,%eax
nopl   (%rax)
movzbl (%r9,%rax,1),%ebx
mov    %ebx,%edx
shl    $0x5,%edx
sub    %ebx,%edx
sub    %ebx,%edx
movzbl (%rcx,%rax,1),%ebx
imul   $0x3b,%ebx,%ebx
add    %edx,%ebx
movzbl 0x0(%rbp,%rax,1),%edx
lea    (%rdx,%rdx,4),%esi
lea    (%rdx,%rsi,2),%edx
add    %ebx,%edx
movzwl %dx,%edx
shr    $0x2,%edx
imul   $0x147b,%edx,%edx
shr    $0x11,%edx
mov    %dl,(%rdi,%rax,1)
add    $0x1,%rax
cmp    %eax,%r13d
jne    12d0 <imRGB2Gray+0x1c0>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x1(%r8),%rcx
mov    %rcx,%rdx
and    %r11,%rdx
xor    %esi,%esi
pxor   %xmm0,%xmm0
movdqa 0xcc9(%rip),%xmm8
movdqa 0xcd0(%rip),%xmm9
movdqa 0xcd8(%rip),%xmm3
movdqa 0xce0(%rip),%xmm4
movdqa 0xce8(%rip),%xmm5
nopl   0x0(%rax,%rax,1)
movdqu (%rax,%rsi,1),%xmm6
movdqa %xmm6,%xmm7
punpcklbw %xmm0,%xmm7
punpckhbw %xmm0,%xmm6
pmullw %xmm8,%xmm6
pmullw %xmm8,%xmm7
movdqu (%r14,%rsi,1),%xmm1
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
punpckhbw %xmm0,%xmm1
pmullw %xmm9,%xmm1
paddw  %xmm6,%xmm1
pmullw %xmm9,%xmm2
paddw  %xmm7,%xmm2
movdqu (%rbx,%rsi,1),%xmm6
movdqa %xmm6,%xmm7
punpckhbw %xmm0,%xmm7
punpcklbw %xmm0,%xmm6
pmullw %xmm3,%xmm6
paddw  %xmm2,%xmm6
pmullw %xmm3,%xmm7
paddw  %xmm1,%xmm7
psrlw  $0x2,%xmm6
pmulhuw %xmm4,%xmm6
psrlw  $0x1,%xmm6
psrlw  $0x2,%xmm7
pmulhuw %xmm4,%xmm7
psrlw  $0x1,%xmm7
pand   %xmm5,%xmm7
pand   %xmm5,%xmm6
packuswb %xmm7,%xmm6
movdqu %xmm6,(%r12,%rsi,1)
add    $0x10,%rsi
cmp    %rsi,%rdx
jne    1360 <imRGB2Gray+0x250>
cmp    %rdx,%rcx
je     130f <imRGB2Gray+0x1ff>
test   $0x8,%cl
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%rbx
mov    (%rsp),%rax
jne    1217 <imRGB2Gray+0x107>
add    %rdx,%r14
add    %rdx,%rbx
add    %rdx,%r12
add    %rdx,%rax
mov    %rax,%r9
mov    %edx,%r11d
jmp    12bf <imRGB2Gray+0x1af>

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

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