void not_smatrix(short **m1, long nrl, long nrh, long ncl, long nch,
                 short **m2) {
  long i, j;
  short 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_smatrix>:
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     11c2 <not_smatrix+0xc2>
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     11ac <not_smatrix+0xac>
mov    -0x50(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x42(%rbp)
cmpw   $0x0,-0x42(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %ax,-0x44(%rbp)
mov    -0x44(%rbp),%dx
mov    -0x58(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    115a <not_smatrix+0x5a>
jmp    11b1 <not_smatrix+0xb1>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1124 <not_smatrix+0x24>
pop    %rbp
ret

x86 assembly (clang, -O2):
<not_smatrix>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
cmp    %rdx,%rsi
jle    111a <not_smatrix+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    -0x10(%r14),%r11
mov    %r11,-0x8(%rsp)
shr    $0x4,%r11
add    $0x1,%r11
mov    %r14,%rax
and    $0xfffffffffffffff0,%rax
mov    %rax,-0x10(%rsp)
add    %rcx,%rax
mov    %rax,-0x18(%rsp)
mov    %r11,%rax
and    $0xfffffffffffffffe,%rax
mov    %rax,-0x20(%rsp)
lea    0x18(%rcx),%rax
mov    %rax,-0x28(%rsp)
pxor   %xmm0,%xmm0
jmp    117c <not_smatrix+0x7c>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x1(%rsi),%rax
cmp    %rdx,%rsi
mov    %rax,%rsi
je     110f <not_smatrix+0xf>
cmp    %r8,%rcx
jg     1170 <not_smatrix+0x70>
mov    (%rdi,%rsi,8),%r12
mov    (%r9,%rsi,8),%r15
mov    %rcx,%rbx
cmp    $0x10,%r14
jb     1290 <not_smatrix+0x190>
lea    (%r15,%rcx,2),%rax
lea    (%r12,%r10,2),%rbx
cmp    %rbx,%rax
jae    11b7 <not_smatrix+0xb7>
lea    (%r15,%r10,2),%rax
lea    (%r12,%rcx,2),%rbp
mov    %rcx,%rbx
cmp    %rax,%rbp
jb     1290 <not_smatrix+0x190>
cmpq   $0x10,-0x8(%rsp)
jae    11c7 <not_smatrix+0xc7>
xor    %r13d,%r13d
jmp    1244 <not_smatrix+0x144>
mov    -0x28(%rsp),%rbx
lea    (%r15,%rbx,2),%rax
lea    (%r12,%rbx,2),%rbx
mov    -0x20(%rsp),%rbp
xor    %r13d,%r13d
nopl   0x0(%rax)
movdqu -0x30(%rbx,%r13,2),%xmm1
movdqu -0x20(%rbx,%r13,2),%xmm2
pcmpeqw %xmm0,%xmm1
psrlw  $0xf,%xmm1
pcmpeqw %xmm0,%xmm2
psrlw  $0xf,%xmm2
movdqu %xmm1,-0x30(%rax,%r13,2)
movdqu %xmm2,-0x20(%rax,%r13,2)
movdqu -0x10(%rbx,%r13,2),%xmm1
movdqu (%rbx,%r13,2),%xmm2
pcmpeqw %xmm0,%xmm1
psrlw  $0xf,%xmm1
pcmpeqw %xmm0,%xmm2
psrlw  $0xf,%xmm2
movdqu %xmm1,-0x10(%rax,%r13,2)
movdqu %xmm2,(%rax,%r13,2)
add    $0x20,%r13
add    $0xfffffffffffffffe,%rbp
jne    11e0 <not_smatrix+0xe0>
test   $0x1,%r11b
je     1279 <not_smatrix+0x179>
add    %rcx,%r13
movdqu (%r12,%r13,2),%xmm1
movdqu 0x10(%r12,%r13,2),%xmm2
pcmpeqw %xmm0,%xmm1
psrlw  $0xf,%xmm1
pcmpeqw %xmm0,%xmm2
psrlw  $0xf,%xmm2
movdqu %xmm1,(%r15,%r13,2)
movdqu %xmm2,0x10(%r15,%r13,2)
mov    -0x18(%rsp),%rbx
cmp    -0x10(%rsp),%r14
je     1170 <not_smatrix+0x70>
nopl   0x0(%rax)
mov    %r10d,%ebp
sub    %ebx,%ebp
mov    %r8,%r13
sub    %rbx,%r13
and    $0x3,%rbp
je     12ca <not_smatrix+0x1ca>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
cmpw   $0x0,(%r12,%rbx,2)
sete   %al
mov    %ax,(%r15,%rbx,2)
add    $0x1,%rbx
add    $0xffffffffffffffff,%rbp
jne    12b0 <not_smatrix+0x1b0>
cmp    $0x3,%r13
jb     1170 <not_smatrix+0x70>
mov    %r8,%r13
sub    %rbx,%r13
lea    (%r15,%rbx,2),%r15
add    $0x6,%r15
lea    (%r12,%rbx,2),%rbx
add    $0x6,%rbx
mov    $0xffffffffffffffff,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %ebp,%ebp
cmpw   $0x0,-0x4(%rbx,%rax,2)
sete   %bpl
mov    %bp,-0x4(%r15,%rax,2)
xor    %ebp,%ebp
cmpw   $0x0,-0x2(%rbx,%rax,2)
sete   %bpl
mov    %bp,-0x2(%r15,%rax,2)
xor    %ebp,%ebp
cmpw   $0x0,(%rbx,%rax,2)
sete   %bpl
mov    %bp,(%r15,%rax,2)
xor    %ebp,%ebp
cmpw   $0x0,0x2(%rbx,%rax,2)
sete   %bpl
mov    %bp,0x2(%r15,%rax,2)
add    $0x4,%rax
cmp    %rax,%r13
jne    1300 <not_smatrix+0x200>
jmp    1170 <not_smatrix+0x70>

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

LLVM IR (-O2):
define void @not_smatrix(i16** nocapture %0, i64 %1, i64 %2, i64 %3, i64 %4, i16** 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, -16
%13 = lshr i64 %12, 4
%14 = add nuw nsw i64 %13, 1
%15 = add i64 %4, 1
%16 = icmp ult i64 %11, 16
%17 = and i64 %11, -16
%18 = add i64 %17, %3
%19 = and i64 %14, 1
%20 = icmp ult i64 %12, 16
%21 = and i64 %14, 2305843009213693950
%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 i16*, i16** %0, i64 %25
%27 = load i16*, i16** %26
%28 = getelementptr inbounds i16*, i16** %5, i64 %25
%29 = load i16*, i16** %28
br i1 %9, label %143, label %30
30: ; preds = %24
br i1 %16, label %96, label %31
31: ; preds = %30
%32 = getelementptr i16, i16* %29, i64 %3
%33 = getelementptr i16, i16* %29, i64 %10
%34 = getelementptr i16, i16* %27, i64 %3
%35 = getelementptr i16, i16* %27, i64 %10
%36 = icmp ult i16* %32, %35
%37 = icmp ult i16* %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 i16, i16* %27, i64 %43
%45 = bitcast i16* %44 to <8 x i16>*
%46 = load <8 x i16>, <8 x i16>* %45
%47 = getelementptr inbounds i16, i16* %44, i64 8
%48 = bitcast i16* %47 to <8 x i16>*
%49 = load <8 x i16>, <8 x i16>* %48
%50 = icmp eq <8 x i16> %46, zeroinitializer
%51 = icmp eq <8 x i16> %49, zeroinitializer
%52 = zext <8 x i1> %50 to <8 x i16>
%53 = zext <8 x i1> %51 to <8 x i16>
%54 = getelementptr inbounds i16, i16* %29, i64 %43
%55 = bitcast i16* %54 to <8 x i16>*
store <8 x i16> %52, <8 x i16>* %55
%56 = getelementptr inbounds i16, i16* %54, i64 8
%57 = bitcast i16* %56 to <8 x i16>*
store <8 x i16> %53, <8 x i16>* %57
%58 = or i64 %41, 16
%59 = add i64 %58, %3
%60 = getelementptr inbounds i16, i16* %27, i64 %59
%61 = bitcast i16* %60 to <8 x i16>*
%62 = load <8 x i16>, <8 x i16>* %61
%63 = getelementptr inbounds i16, i16* %60, i64 8
%64 = bitcast i16* %63 to <8 x i16>*
%65 = load <8 x i16>, <8 x i16>* %64
%66 = icmp eq <8 x i16> %62, zeroinitializer
%67 = icmp eq <8 x i16> %65, zeroinitializer
%68 = zext <8 x i1> %66 to <8 x i16>
%69 = zext <8 x i1> %67 to <8 x i16>
%70 = getelementptr inbounds i16, i16* %29, i64 %59
%71 = bitcast i16* %70 to <8 x i16>*
store <8 x i16> %68, <8 x i16>* %71
%72 = getelementptr inbounds i16, i16* %70, i64 8
%73 = bitcast i16* %72 to <8 x i16>*
store <8 x i16> %69, <8 x i16>* %73
%74 = add nuw i64 %41, 32
%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 i16, i16* %27, i64 %80
%82 = bitcast i16* %81 to <8 x i16>*
%83 = load <8 x i16>, <8 x i16>* %82
%84 = getelementptr inbounds i16, i16* %81, i64 8
%85 = bitcast i16* %84 to <8 x i16>*
%86 = load <8 x i16>, <8 x i16>* %85
%87 = icmp eq <8 x i16> %83, zeroinitializer
%88 = icmp eq <8 x i16> %86, zeroinitializer
%89 = zext <8 x i1> %87 to <8 x i16>
%90 = zext <8 x i1> %88 to <8 x i16>
%91 = getelementptr inbounds i16, i16* %29, i64 %80
%92 = bitcast i16* %91 to <8 x i16>*
store <8 x i16> %89, <8 x i16>* %92
%93 = getelementptr inbounds i16, i16* %91, i64 8
%94 = bitcast i16* %93 to <8 x i16>*
store <8 x i16> %90, <8 x i16>* %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 i16, i16* %27, i64 %103
%106 = load i16, i16* %105
%107 = icmp eq i16 %106, 0
%108 = zext i1 %107 to i16
%109 = getelementptr inbounds i16, i16* %29, i64 %103
store i16 %108, i16* %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 i16, i16* %27, i64 %117
%119 = load i16, i16* %118
%120 = icmp eq i16 %119, 0
%121 = zext i1 %120 to i16
%122 = getelementptr inbounds i16, i16* %29, i64 %117
store i16 %121, i16* %122
%123 = add i64 %117, 1
%124 = getelementptr inbounds i16, i16* %27, i64 %123
%125 = load i16, i16* %124
%126 = icmp eq i16 %125, 0
%127 = zext i1 %126 to i16
%128 = getelementptr inbounds i16, i16* %29, i64 %123
store i16 %127, i16* %128
%129 = add i64 %117, 2
%130 = getelementptr inbounds i16, i16* %27, i64 %129
%131 = load i16, i16* %130
%132 = icmp eq i16 %131, 0
%133 = zext i1 %132 to i16
%134 = getelementptr inbounds i16, i16* %29, i64 %129
store i16 %133, i16* %134
%135 = add i64 %117, 3
%136 = getelementptr inbounds i16, i16* %27, i64 %135
%137 = load i16, i16* %136
%138 = icmp eq i16 %137, 0
%139 = zext i1 %138 to i16
%140 = getelementptr inbounds i16, i16* %29, i64 %135
store i16 %139, i16* %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
}