int xor_image(the_image, out_image, rows, cols)
short **the_image, **out_image;
long cols, rows;
{
  int i, j;
  short answer;
  for (i = 0; i < rows; i++) {
    if ((i % 10) == 0)
      printf(" %d", i);
    for (j = 0; j < cols; j++) {
      if ((the_image[i][j] != 0 && out_image[i][j] == 0))
        answer = the_image[i][j];
      if ((the_image[i][j] == 0 && out_image[i][j] != 0))
        answer = out_image[i][j];
      if ((the_image[i][j] == 0 && out_image[i][j] == 0))
        answer = 0;
      if ((the_image[i][j] != 0 && out_image[i][j] != 0))
        answer = 0;
      out_image[i][j] = answer;
    }
  }
  return (1);
}


x86 assembly (clang, -O0):
<xor_image>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movslq -0x24(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    12d4 <xor_image+0x1c4>
mov    -0x24(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1162 <xor_image+0x52>
mov    -0x24(%rbp),%esi
lea    0xea5(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x28(%rbp)
movslq -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    12c1 <xor_image+0x1b1>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     11c9 <xor_image+0xb9>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
jne    11c9 <xor_image+0xb9>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x2a(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
jne    121b <xor_image+0x10b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     121b <xor_image+0x10b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x2a(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
jne    125b <xor_image+0x14b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
jne    125b <xor_image+0x14b>
movw   $0x0,-0x2a(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     129b <xor_image+0x18b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     129b <xor_image+0x18b>
movw   $0x0,-0x2a(%rbp)
mov    -0x2a(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1169 <xor_image+0x59>
jmp    12c6 <xor_image+0x1b6>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    112f <xor_image+0x1f>
mov    $0x1,%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<xor_image>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rsi,0x10(%rsp)
mov    %rdi,0x8(%rsp)
test   %rdx,%rdx
jle    12e3 <xor_image+0x1d3>
mov    %rcx,%rbx
mov    %rdx,%r14
mov    %rcx,%r13
and    $0xfffffffffffffff0,%r13
mov    %rcx,%rax
neg    %rax
mov    %rax,(%rsp)
xor    %r15d,%r15d
pxor   %xmm6,%xmm6
xor    %r12d,%r12d
jmp    116d <xor_image+0x5d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r12
cmp    %r14,%r12
je     12e3 <xor_image+0x1d3>
imul   $0xcccccccd,%r12d,%eax
ror    %eax
cmp    $0x19999999,%eax
jbe    1190 <xor_image+0x80>
test   %rbx,%rbx
jg     11aa <xor_image+0x9a>
jmp    1160 <xor_image+0x50>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0xe69(%rip),%rdi
mov    %r12d,%esi
xor    %eax,%eax
call   1030 <printf@plt>
pxor   %xmm6,%xmm6
test   %rbx,%rbx
jle    1160 <xor_image+0x50>
mov    0x8(%rsp),%rax
mov    (%rax,%r12,8),%rax
mov    0x10(%rsp),%rcx
mov    (%rcx,%r12,8),%rcx
cmp    $0x10,%rbx
jb     11dc <xor_image+0xcc>
lea    (%rax,%rbx,2),%rdx
cmp    %rdx,%rcx
jae    1267 <xor_image+0x157>
lea    (%rcx,%rbx,2),%rdx
cmp    %rdx,%rax
jae    1267 <xor_image+0x157>
xor    %esi,%esi
mov    %rsi,%rdx
test   $0x1,%bl
je     120b <xor_image+0xfb>
movzwl (%rax,%rsi,2),%edi
movzwl (%rcx,%rsi,2),%r8d
test   %r8w,%r8w
mov    %edi,%edx
cmovne %r15d,%edx
test   %di,%di
cmove  %r8d,%edx
mov    %dx,(%rcx,%rsi,2)
mov    %rsi,%rdx
or     $0x1,%rdx
not    %rsi
cmp    (%rsp),%rsi
je     1160 <xor_image+0x50>
nopl   0x0(%rax,%rax,1)
movzwl (%rax,%rdx,2),%ebp
movzwl (%rcx,%rdx,2),%edi
test   %di,%di
mov    %ebp,%esi
cmovne %r15d,%esi
test   %bp,%bp
cmove  %edi,%esi
mov    %si,(%rcx,%rdx,2)
movzwl 0x2(%rax,%rdx,2),%ebp
movzwl 0x2(%rcx,%rdx,2),%edi
test   %di,%di
mov    %ebp,%esi
cmovne %r15d,%esi
test   %bp,%bp
cmove  %edi,%esi
mov    %si,0x2(%rcx,%rdx,2)
add    $0x2,%rdx
cmp    %rdx,%rbx
jne    1220 <xor_image+0x110>
jmp    1160 <xor_image+0x50>
xor    %edx,%edx
nopl   0x0(%rax)
movdqu (%rax,%rdx,2),%xmm0
movdqu 0x10(%rax,%rdx,2),%xmm1
movdqu (%rcx,%rdx,2),%xmm2
movdqu 0x10(%rcx,%rdx,2),%xmm3
movdqa %xmm2,%xmm4
pcmpeqw %xmm6,%xmm4
movdqa %xmm3,%xmm5
pcmpeqw %xmm6,%xmm5
pand   %xmm0,%xmm4
pcmpeqw %xmm6,%xmm0
pand   %xmm1,%xmm5
pcmpeqw %xmm6,%xmm1
pand   %xmm0,%xmm2
pandn  %xmm4,%xmm0
por    %xmm2,%xmm0
pand   %xmm1,%xmm3
pandn  %xmm5,%xmm1
por    %xmm3,%xmm1
movdqu %xmm0,(%rcx,%rdx,2)
movdqu %xmm1,0x10(%rcx,%rdx,2)
add    $0x10,%rdx
cmp    %rdx,%r13
jne    1270 <xor_image+0x160>
mov    %r13,%rsi
cmp    %rbx,%r13
je     1160 <xor_image+0x50>
jmp    11de <xor_image+0xce>
mov    $0x1,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [4 x i8] c" %d\00"
define i32 @xor_image(i16** nocapture %0, i16** nocapture %1, i64 %2, i64 %3) {
%5 = icmp sgt i64 %2, 0
br i1 %5, label %6, label %103
6: ; preds = %4
%7 = icmp sgt i64 %3, 0
%8 = icmp ult i64 %3, 16
%9 = and i64 %3, -16
%10 = icmp eq i64 %9, %3
%11 = and i64 %3, 1
%12 = icmp eq i64 %11, 0
%13 = sub i64 0, %3
br label %14
14: ; preds = %6, %100
%15 = phi i64 [ 0, %6 ], [ %101, %100 ]
%16 = trunc i64 %15 to i32
%17 = urem i32 %16, 10
%18 = icmp eq i32 %17, 0
br i1 %18, label %19, label %21
19: ; preds = %14
%20 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %16)
br label %21
21: ; preds = %19, %14
br i1 %7, label %22, label %100
22: ; preds = %21
%23 = getelementptr inbounds i16*, i16** %0, i64 %15
%24 = load i16*, i16** %23
%25 = getelementptr inbounds i16*, i16** %1, i64 %15
%26 = load i16*, i16** %25
br i1 %8, label %60, label %27
27: ; preds = %22
%28 = getelementptr i16, i16* %26, i64 %3
%29 = getelementptr i16, i16* %24, i64 %3
%30 = icmp ult i16* %26, %29
%31 = icmp ult i16* %24, %28
%32 = and i1 %30, %31
br i1 %32, label %60, label %33
33: ; preds = %27, %33
%34 = phi i64 [ %57, %33 ], [ 0, %27 ]
%35 = getelementptr inbounds i16, i16* %24, i64 %34
%36 = bitcast i16* %35 to <8 x i16>*
%37 = load <8 x i16>, <8 x i16>* %36
%38 = getelementptr inbounds i16, i16* %35, i64 8
%39 = bitcast i16* %38 to <8 x i16>*
%40 = load <8 x i16>, <8 x i16>* %39
%41 = icmp eq <8 x i16> %37, zeroinitializer
%42 = icmp eq <8 x i16> %40, zeroinitializer
%43 = getelementptr inbounds i16, i16* %26, i64 %34
%44 = bitcast i16* %43 to <8 x i16>*
%45 = load <8 x i16>, <8 x i16>* %44
%46 = getelementptr inbounds i16, i16* %43, i64 8
%47 = bitcast i16* %46 to <8 x i16>*
%48 = load <8 x i16>, <8 x i16>* %47
%49 = icmp eq <8 x i16> %45, zeroinitializer
%50 = icmp eq <8 x i16> %48, zeroinitializer
%51 = select <8 x i1> %49, <8 x i16> %37, <8 x i16> zeroinitializer
%52 = select <8 x i1> %50, <8 x i16> %40, <8 x i16> zeroinitializer
%53 = select <8 x i1> %41, <8 x i16> %45, <8 x i16> %51
%54 = select <8 x i1> %42, <8 x i16> %48, <8 x i16> %52
%55 = bitcast i16* %43 to <8 x i16>*
store <8 x i16> %53, <8 x i16>* %55
%56 = bitcast i16* %46 to <8 x i16>*
store <8 x i16> %54, <8 x i16>* %56
%57 = add nuw i64 %34, 16
%58 = icmp eq i64 %57, %9
br i1 %58, label %59, label %33
59: ; preds = %33
br i1 %10, label %100, label %60
60: ; preds = %27, %22, %59
%61 = phi i64 [ 0, %27 ], [ 0, %22 ], [ %9, %59 ]
%62 = xor i64 %61, -1
br i1 %12, label %74, label %63
63: ; preds = %60
%64 = getelementptr inbounds i16, i16* %24, i64 %61
%65 = load i16, i16* %64
%66 = icmp eq i16 %65, 0
%67 = getelementptr inbounds i16, i16* %26, i64 %61
%68 = load i16, i16* %67
%69 = icmp eq i16 %68, 0
%70 = select i1 %69, i16 %65, i16 0
%71 = select i1 %66, i16 %68, i16 %70
%72 = getelementptr inbounds i16, i16* %26, i64 %61
store i16 %71, i16* %72
%73 = or i64 %61, 1
br label %74
74: ; preds = %63, %60
%75 = phi i64 [ %61, %60 ], [ %73, %63 ]
%76 = icmp eq i64 %62, %13
br i1 %76, label %100, label %77
77: ; preds = %74, %77
%78 = phi i64 [ %98, %77 ], [ %75, %74 ]
%79 = getelementptr inbounds i16, i16* %24, i64 %78
%80 = load i16, i16* %79
%81 = icmp eq i16 %80, 0
%82 = getelementptr inbounds i16, i16* %26, i64 %78
%83 = load i16, i16* %82
%84 = icmp eq i16 %83, 0
%85 = select i1 %84, i16 %80, i16 0
%86 = select i1 %81, i16 %83, i16 %85
%87 = getelementptr inbounds i16, i16* %26, i64 %78
store i16 %86, i16* %87
%88 = add nuw nsw i64 %78, 1
%89 = getelementptr inbounds i16, i16* %24, i64 %88
%90 = load i16, i16* %89
%91 = icmp eq i16 %90, 0
%92 = getelementptr inbounds i16, i16* %26, i64 %88
%93 = load i16, i16* %92
%94 = icmp eq i16 %93, 0
%95 = select i1 %94, i16 %90, i16 0
%96 = select i1 %91, i16 %93, i16 %95
%97 = getelementptr inbounds i16, i16* %26, i64 %88
store i16 %96, i16* %97
%98 = add nuw nsw i64 %78, 2
%99 = icmp eq i64 %98, %3
br i1 %99, label %100, label %77
100: ; preds = %74, %77, %59, %21
%101 = add nuw nsw i64 %15, 1
%102 = icmp eq i64 %101, %2
br i1 %102, label %103, label %14
103: ; preds = %100, %4
ret i32 1
}