void binarize(int npixels, unsigned char *b) {
  int i;
  for (i = 0; i < npixels; i++)
    b[i] = (b[i] > 225 ? 0xff : 0);
}


x86 assembly (clang, -O0):
<binarize>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1155 <binarize+0x55>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%edx
xor    %eax,%eax
mov    $0xff,%ecx
cmp    $0xe1,%edx
cmovg  %ecx,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1112 <binarize+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<binarize>:
test   %edi,%edi
jle    1258 <binarize+0x158>
mov    %edi,%eax
cmp    $0x8,%edi
jae    1116 <binarize+0x16>
xor    %ecx,%ecx
jmp    1240 <binarize+0x140>
cmp    $0x20,%edi
jae    1122 <binarize+0x22>
xor    %ecx,%ecx
jmp    11f9 <binarize+0xf9>
mov    %eax,%ecx
and    $0xffffffe0,%ecx
lea    -0x20(%rcx),%rdx
mov    %rdx,%r8
shr    $0x5,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     1259 <binarize+0x159>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %edx,%edx
movdqa 0xeb0(%rip),%xmm0
movdqu (%rsi,%rdx,1),%xmm1
movdqu 0x10(%rsi,%rdx,1),%xmm2
movdqu 0x20(%rsi,%rdx,1),%xmm3
movdqu 0x30(%rsi,%rdx,1),%xmm4
movdqa %xmm1,%xmm5
pmaxub %xmm0,%xmm5
pcmpeqb %xmm1,%xmm5
movdqa %xmm2,%xmm1
pmaxub %xmm0,%xmm1
pcmpeqb %xmm2,%xmm1
movdqu %xmm5,(%rsi,%rdx,1)
movdqu %xmm1,0x10(%rsi,%rdx,1)
movdqa %xmm3,%xmm1
pmaxub %xmm0,%xmm1
pcmpeqb %xmm3,%xmm1
movdqa %xmm4,%xmm2
pmaxub %xmm0,%xmm2
pcmpeqb %xmm4,%xmm2
movdqu %xmm1,0x20(%rsi,%rdx,1)
movdqu %xmm2,0x30(%rsi,%rdx,1)
add    $0x40,%rdx
add    $0xfffffffffffffffe,%rdi
jne    1150 <binarize+0x50>
test   $0x1,%r8b
je     11f0 <binarize+0xf0>
movdqu (%rsi,%rdx,1),%xmm0
movdqu 0x10(%rsi,%rdx,1),%xmm1
movdqa 0xe2f(%rip),%xmm2
movdqa %xmm0,%xmm3
pmaxub %xmm2,%xmm3
pcmpeqb %xmm0,%xmm3
pmaxub %xmm1,%xmm2
pcmpeqb %xmm1,%xmm2
movdqu %xmm3,(%rsi,%rdx,1)
movdqu %xmm2,0x10(%rsi,%rdx,1)
cmp    %rax,%rcx
je     1258 <binarize+0x158>
test   $0x18,%al
je     1240 <binarize+0x140>
mov    %rcx,%rdx
mov    %eax,%ecx
and    $0xfffffff8,%ecx
movdqa 0xe07(%rip),%xmm0
pcmpeqd %xmm1,%xmm1
nopl   (%rax)
movq   (%rsi,%rdx,1),%xmm2
movdqa %xmm2,%xmm3
pminub %xmm0,%xmm3
pcmpeqb %xmm2,%xmm3
pxor   %xmm1,%xmm3
movq   %xmm3,(%rsi,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%rcx
jne    1210 <binarize+0x110>
cmp    %rax,%rcx
je     1258 <binarize+0x158>
nopl   0x0(%rax,%rax,1)
cmpb   $0xe2,(%rsi,%rcx,1)
mov    $0x0,%edx
adc    $0xff,%dl
mov    %dl,(%rsi,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1240 <binarize+0x140>
ret
xor    %edx,%edx
test   $0x1,%r8b
jne    11be <binarize+0xbe>
jmp    11f0 <binarize+0xf0>

LLVM IR (-O0):
define void @binarize(i32 %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
store i32 %0, i32* %3
store i8* %1, i8** %4
store i32 0, i32* %5
br label %6
6: ; preds = %25, %2
%7 = load i32, i32* %5
%8 = load i32, i32* %3
%9 = icmp slt i32 %7, %8
br i1 %9, label %10, label %28
10: ; preds = %6
%11 = load i8*, i8** %4
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i8, i8* %11, i64 %13
%15 = load i8, i8* %14
%16 = zext i8 %15 to i32
%17 = icmp sgt i32 %16, 225
%18 = zext i1 %17 to i64
%19 = select i1 %17, i32 255, i32 0
%20 = trunc i32 %19 to i8
%21 = load i8*, i8** %4
%22 = load i32, i32* %5
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i8, i8* %21, i64 %23
store i8 %20, i8* %24
br label %25
25: ; preds = %10
%26 = load i32, i32* %5
%27 = add nsw i32 %26, 1
store i32 %27, i32* %5
br label %6
28: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @binarize(i32 %0, i8* nocapture %1) {
%3 = icmp sgt i32 %0, 0
br i1 %3, label %4, label %95
4: ; preds = %2
%5 = zext i32 %0 to i64
%6 = icmp ult i32 %0, 8
br i1 %6, label %85, label %7
7: ; preds = %4
%8 = icmp ult i32 %0, 32
br i1 %8, label %70, label %9
9: ; preds = %7
%10 = and i64 %5, 4294967264
%11 = add nsw i64 %10, -32
%12 = lshr exact i64 %11, 5
%13 = add nuw nsw i64 %12, 1
%14 = and i64 %13, 1
%15 = icmp eq i64 %11, 0
br i1 %15, label %49, label %16
16: ; preds = %9
%17 = and i64 %13, 1152921504606846974
br label %18
18: ; preds = %18, %16
%19 = phi i64 [ 0, %16 ], [ %46, %18 ]
%20 = phi i64 [ 0, %16 ], [ %47, %18 ]
%21 = getelementptr inbounds i8, i8* %1, i64 %19
%22 = bitcast i8* %21 to <16 x i8>*
%23 = load <16 x i8>, <16 x i8>* %22
%24 = getelementptr inbounds i8, i8* %21, i64 16
%25 = bitcast i8* %24 to <16 x i8>*
%26 = load <16 x i8>, <16 x i8>* %25
%27 = icmp ugt <16 x i8> %23, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%28 = icmp ugt <16 x i8> %26, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%29 = sext <16 x i1> %27 to <16 x i8>
%30 = sext <16 x i1> %28 to <16 x i8>
%31 = bitcast i8* %21 to <16 x i8>*
store <16 x i8> %29, <16 x i8>* %31
%32 = bitcast i8* %24 to <16 x i8>*
store <16 x i8> %30, <16 x i8>* %32
%33 = or i64 %19, 32
%34 = getelementptr inbounds i8, i8* %1, i64 %33
%35 = bitcast i8* %34 to <16 x i8>*
%36 = load <16 x i8>, <16 x i8>* %35
%37 = getelementptr inbounds i8, i8* %34, i64 16
%38 = bitcast i8* %37 to <16 x i8>*
%39 = load <16 x i8>, <16 x i8>* %38
%40 = icmp ugt <16 x i8> %36, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%41 = icmp ugt <16 x i8> %39, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%42 = sext <16 x i1> %40 to <16 x i8>
%43 = sext <16 x i1> %41 to <16 x i8>
%44 = bitcast i8* %34 to <16 x i8>*
store <16 x i8> %42, <16 x i8>* %44
%45 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %43, <16 x i8>* %45
%46 = add nuw i64 %19, 64
%47 = add i64 %20, 2
%48 = icmp eq i64 %47, %17
br i1 %48, label %49, label %18
49: ; preds = %18, %9
%50 = phi i64 [ 0, %9 ], [ %46, %18 ]
%51 = icmp eq i64 %14, 0
br i1 %51, label %65, label %52
52: ; preds = %49
%53 = getelementptr inbounds i8, i8* %1, i64 %50
%54 = bitcast i8* %53 to <16 x i8>*
%55 = load <16 x i8>, <16 x i8>* %54
%56 = getelementptr inbounds i8, i8* %53, i64 16
%57 = bitcast i8* %56 to <16 x i8>*
%58 = load <16 x i8>, <16 x i8>* %57
%59 = icmp ugt <16 x i8> %55, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%60 = icmp ugt <16 x i8> %58, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%61 = sext <16 x i1> %59 to <16 x i8>
%62 = sext <16 x i1> %60 to <16 x i8>
%63 = bitcast i8* %53 to <16 x i8>*
store <16 x i8> %61, <16 x i8>* %63
%64 = bitcast i8* %56 to <16 x i8>*
store <16 x i8> %62, <16 x i8>* %64
br label %65
65: ; preds = %49, %52
%66 = icmp eq i64 %10, %5
br i1 %66, label %95, label %67
67: ; preds = %65
%68 = and i64 %5, 24
%69 = icmp eq i64 %68, 0
br i1 %69, label %85, label %70
70: ; preds = %7, %67
%71 = phi i64 [ %10, %67 ], [ 0, %7 ]
%72 = and i64 %5, 4294967288
br label %73
73: ; preds = %73, %70
%74 = phi i64 [ %71, %70 ], [ %81, %73 ]
%75 = getelementptr inbounds i8, i8* %1, i64 %74
%76 = bitcast i8* %75 to <8 x i8>*
%77 = load <8 x i8>, <8 x i8>* %76
%78 = icmp ugt <8 x i8> %77, <i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31, i8 -31>
%79 = sext <8 x i1> %78 to <8 x i8>
%80 = bitcast i8* %75 to <8 x i8>*
store <8 x i8> %79, <8 x i8>* %80
%81 = add nuw i64 %74, 8
%82 = icmp eq i64 %81, %72
br i1 %82, label %83, label %73
83: ; preds = %73
%84 = icmp eq i64 %72, %5
br i1 %84, label %95, label %85
85: ; preds = %4, %67, %83
%86 = phi i64 [ 0, %4 ], [ %10, %67 ], [ %72, %83 ]
br label %87
87: ; preds = %85, %87
%88 = phi i64 [ %93, %87 ], [ %86, %85 ]
%89 = getelementptr inbounds i8, i8* %1, i64 %88
%90 = load i8, i8* %89
%91 = icmp ugt i8 %90, -31
%92 = sext i1 %91 to i8
store i8 %92, i8* %89
%93 = add nuw nsw i64 %88, 1
%94 = icmp eq i64 %93, %5
br i1 %94, label %95, label %87
95: ; preds = %87, %65, %83, %2
ret void
}