void not_imatrix(int **m1, long nrl, long nrh, long ncl, long nch, int **m2) {
  long i, j;
  int x, y, *Xi, *Yi;
  for (i = nrl; i <= nrh; i++) {
    Xi = m1[i];
    Yi = m2[i];
    for (j = ncl; j <= nch; j++) {
      x = Xi[j];
      y = !x;
      Yi[j] = y;
    }
  }
}


x86 assembly (clang, -O0):
<not_imatrix>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x18(%rbp),%rax
jg     11bc <not_imatrix+0xbc>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x50(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x28(%rbp),%rax
jg     11a6 <not_imatrix+0xa6>
mov    -0x50(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%edx
mov    -0x58(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    115a <not_imatrix+0x5a>
jmp    11ab <not_imatrix+0xab>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1124 <not_imatrix+0x24>
pop    %rbp
ret

x86 assembly (clang, -O2):
<not_imatrix>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
cmp    %rdx,%rsi
jle    111a <not_imatrix+0x1a>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x1(%r8),%r10
mov    %r10,%r14
sub    %rcx,%r14
lea    -0x8(%r14),%rax
mov    %rax,-0x8(%rsp)
mov    %rax,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
mov    %r14,%rax
and    $0xfffffffffffffff8,%rax
mov    %rax,-0x18(%rsp)
add    %rcx,%rax
mov    %rax,-0x20(%rsp)
mov    %rbp,%rax
mov    %rbp,-0x10(%rsp)
and    $0xfffffffffffffffe,%rbp
mov    %rbp,-0x28(%rsp)
lea    0xc(%rcx),%rax
mov    %rax,-0x30(%rsp)
pxor   %xmm0,%xmm0
jmp    117c <not_imatrix+0x7c>
nopl   0x0(%rax)
lea    0x1(%rsi),%rax
cmp    %rdx,%rsi
mov    %rax,%rsi
je     110f <not_imatrix+0xf>
cmp    %r8,%rcx
jg     1170 <not_imatrix+0x70>
mov    (%rdi,%rsi,8),%r11
mov    (%r9,%rsi,8),%r15
mov    %rcx,%rbx
cmp    $0x8,%r14
jb     1290 <not_imatrix+0x190>
lea    (%r15,%rcx,4),%rax
lea    (%r11,%r10,4),%rbx
cmp    %rbx,%rax
jae    11b7 <not_imatrix+0xb7>
lea    (%r15,%r10,4),%rax
lea    (%r11,%rcx,4),%rbp
mov    %rcx,%rbx
cmp    %rax,%rbp
jb     1290 <not_imatrix+0x190>
cmpq   $0x8,-0x8(%rsp)
jae    11c7 <not_imatrix+0xc7>
xor    %r13d,%r13d
jmp    1244 <not_imatrix+0x144>
mov    -0x30(%rsp),%rax
lea    (%r15,%rax,4),%rbx
lea    (%r11,%rax,4),%r12
mov    -0x28(%rsp),%rax
xor    %r13d,%r13d
nopl   0x0(%rax)
movdqu -0x30(%r12,%r13,4),%xmm1
movdqu -0x20(%r12,%r13,4),%xmm2
pcmpeqd %xmm0,%xmm1
psrld  $0x1f,%xmm1
pcmpeqd %xmm0,%xmm2
psrld  $0x1f,%xmm2
movdqu %xmm1,-0x30(%rbx,%r13,4)
movdqu %xmm2,-0x20(%rbx,%r13,4)
movdqu -0x10(%r12,%r13,4),%xmm1
movdqu (%r12,%r13,4),%xmm2
pcmpeqd %xmm0,%xmm1
psrld  $0x1f,%xmm1
pcmpeqd %xmm0,%xmm2
psrld  $0x1f,%xmm2
movdqu %xmm1,-0x10(%rbx,%r13,4)
movdqu %xmm2,(%rbx,%r13,4)
add    $0x10,%r13
add    $0xfffffffffffffffe,%rax
jne    11e0 <not_imatrix+0xe0>
testb  $0x1,-0x10(%rsp)
je     127a <not_imatrix+0x17a>
add    %rcx,%r13
movdqu (%r11,%r13,4),%xmm1
movdqu 0x10(%r11,%r13,4),%xmm2
pcmpeqd %xmm0,%xmm1
psrld  $0x1f,%xmm1
pcmpeqd %xmm0,%xmm2
psrld  $0x1f,%xmm2
movdqu %xmm1,(%r15,%r13,4)
movdqu %xmm2,0x10(%r15,%r13,4)
mov    -0x20(%rsp),%rbx
cmp    -0x18(%rsp),%r14
je     1170 <not_imatrix+0x70>
nopw   0x0(%rax,%rax,1)
mov    %r10d,%ebp
sub    %ebx,%ebp
mov    %r8,%r12
sub    %rbx,%r12
and    $0x3,%rbp
je     12c8 <not_imatrix+0x1c8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
cmpl   $0x0,(%r11,%rbx,4)
sete   %al
mov    %eax,(%r15,%rbx,4)
add    $0x1,%rbx
add    $0xffffffffffffffff,%rbp
jne    12b0 <not_imatrix+0x1b0>
cmp    $0x3,%r12
jb     1170 <not_imatrix+0x70>
mov    %r8,%r12
sub    %rbx,%r12
lea    (%r15,%rbx,4),%r15
add    $0xc,%r15
lea    (%r11,%rbx,4),%rbx
add    $0xc,%rbx
mov    $0xffffffffffffffff,%rax
nop
xor    %ebp,%ebp
cmpl   $0x0,-0x8(%rbx,%rax,4)
sete   %bpl
mov    %ebp,-0x8(%r15,%rax,4)
xor    %ebp,%ebp
cmpl   $0x0,-0x4(%rbx,%rax,4)
sete   %bpl
mov    %ebp,-0x4(%r15,%rax,4)
xor    %ebp,%ebp
cmpl   $0x0,(%rbx,%rax,4)
sete   %bpl
mov    %ebp,(%r15,%rax,4)
xor    %ebp,%ebp
cmpl   $0x0,0x4(%rbx,%rax,4)
sete   %bpl
mov    %ebp,0x4(%r15,%rax,4)
add    $0x4,%rax
cmp    %rax,%r12
jne    12f0 <not_imatrix+0x1f0>
jmp    1170 <not_imatrix+0x70>

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

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