void enhdif(void *p, int n, int c, int b) {
  const int s = n * c;
  const int m = n - 1;
  const int i = 0;
  if (b == 8) {
    char *q = (char *)p;
    for (int j = m; j > 0; --j)
      for (int k = 0; k < c; ++k)
        q[i * s + j * c + k] -= q[i * s + (j - 1) * c + k];
  } else if (b == 16) {
    short *q = (short *)p;
    for (int j = m; j > 0; --j)
      for (int k = 0; k < c; ++k)
        q[i * s + j * c + k] -= q[i * s + (j - 1) * c + k];
  } else if (b == 32) {
  }
}


x86 assembly (clang, -O0):
<enhdif>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x8,-0x14(%rbp)
jne    11c4 <enhdif+0xc4>
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jle    11bf <enhdif+0xbf>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11ac <enhdif+0xac>
mov    -0x28(%rbp),%rax
imul   $0x0,-0x18(%rbp),%ecx
mov    -0x2c(%rbp),%edx
sub    $0x1,%edx
imul   -0x10(%rbp),%edx
add    %edx,%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x28(%rbp),%rax
imul   $0x0,-0x18(%rbp),%ecx
mov    -0x2c(%rbp),%edx
imul   -0x10(%rbp),%edx
add    %edx,%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%edx
sub    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1154 <enhdif+0x54>
jmp    11b1 <enhdif+0xb1>
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    1143 <enhdif+0x43>
jmp    1277 <enhdif+0x177>
cmpl   $0x10,-0x14(%rbp)
jne    125e <enhdif+0x15e>
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jle    1259 <enhdif+0x159>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1246 <enhdif+0x146>
mov    -0x38(%rbp),%rax
imul   $0x0,-0x18(%rbp),%ecx
mov    -0x3c(%rbp),%edx
sub    $0x1,%edx
imul   -0x10(%rbp),%edx
add    %edx,%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%esi
mov    -0x38(%rbp),%rax
imul   $0x0,-0x18(%rbp),%ecx
mov    -0x3c(%rbp),%edx
imul   -0x10(%rbp),%edx
add    %edx,%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edx
sub    %esi,%edx
mov    %dx,(%rax,%rcx,2)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    11ed <enhdif+0xed>
jmp    124b <enhdif+0x14b>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    11dc <enhdif+0xdc>
jmp    1272 <enhdif+0x172>
cmpl   $0x20,-0x14(%rbp)
jne    126d <enhdif+0x16d>
jmp    126d <enhdif+0x16d>
jmp    1272 <enhdif+0x172>
jmp    1277 <enhdif+0x177>
pop    %rbp
ret

x86 assembly (clang, -O2):
<enhdif>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %edx,-0x6c(%rsp)
mov    %rdi,-0x60(%rsp)
cmp    $0x10,%ecx
je     1446 <enhdif+0x346>
cmp    $0x8,%ecx
jne    16fc <enhdif+0x5fc>
cmp    $0x2,%esi
jl     16fc <enhdif+0x5fc>
mov    %esi,%ebx
lea    -0x1(%rbx),%rdi
mov    -0x6c(%rsp),%eax
movslq %eax,%rbp
mov    %eax,%esi
mov    %rdi,%rdx
imul   %rbp,%rdx
lea    (%rdx,%rsi,1),%rax
mov    %rax,-0x28(%rsp)
add    $0xfffffffffffffffe,%rbx
imul   %rbp,%rbx
lea    (%rbx,%rsi,1),%rax
mov    %rax,-0x20(%rsp)
mov    %esi,%eax
and    $0xffffffe0,%eax
mov    %rax,-0x50(%rsp)
add    $0xffffffffffffffe0,%rax
mov    %rax,-0x40(%rsp)
mov    %rax,%rcx
shr    $0x5,%rcx
add    $0x1,%rcx
mov    %rcx,%rax
mov    %rcx,-0x48(%rsp)
and    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x8(%rsp)
mov    %esi,%eax
and    $0xfffffff8,%eax
mov    %rax,-0x38(%rsp)
mov    %rsi,%rax
neg    %rax
mov    %rax,-0x10(%rsp)
mov    -0x60(%rsp),%rax
lea    (%rax,%rbx,1),%r14
add    $0x30,%r14
mov    %rbp,%rcx
neg    %rcx
lea    (%rax,%rdx,1),%r9
add    $0x30,%r9
mov    %rbx,-0x30(%rsp)
lea    (%rax,%rbx,1),%r15
mov    %rdx,-0x18(%rsp)
lea    (%rax,%rdx,1),%r13
xor    %r11d,%r11d
mov    %rbp,-0x58(%rsp)
jmp    11fa <enhdif+0xfa>
nopl   0x0(%rax)
add    $0x1,%r11
add    %rcx,%r14
add    %rcx,%r9
add    %rcx,%r15
add    %rcx,%r13
cmp    $0x1,%rax
jle    16fc <enhdif+0x5fc>
mov    %rdi,%rax
add    $0xffffffffffffffff,%rdi
cmpl   $0x0,-0x6c(%rsp)
jle    11e0 <enhdif+0xe0>
mov    %rdi,%r10
imul   %rbp,%r10
mov    %rax,%r8
imul   %rbp,%r8
cmpl   $0x8,-0x6c(%rsp)
jae    1230 <enhdif+0x130>
xor    %edx,%edx
jmp    13d0 <enhdif+0x2d0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rdi,-0x68(%rsp)
mov    %r11,%rdx
imul   %rbp,%rdx
mov    -0x18(%rsp),%rbx
sub    %rdx,%rbx
mov    -0x60(%rsp),%rdi
add    %rdi,%rbx
mov    -0x20(%rsp),%rbp
sub    %rdx,%rbp
add    %rdi,%rbp
cmp    %rbp,%rbx
jae    1288 <enhdif+0x188>
mov    -0x28(%rsp),%rbx
sub    %rdx,%rbx
add    %rdi,%rbx
mov    -0x30(%rsp),%rbp
sub    %rdx,%rbp
add    %rdi,%rbp
cmp    %rbx,%rbp
jae    1288 <enhdif+0x188>
xor    %edx,%edx
mov    -0x58(%rsp),%rbp
mov    -0x68(%rsp),%rdi
jmp    13d0 <enhdif+0x2d0>
cmpl   $0x20,-0x6c(%rsp)
jae    12a0 <enhdif+0x1a0>
xor    %ebx,%ebx
mov    -0x58(%rsp),%rbp
mov    -0x68(%rsp),%rdi
jmp    138e <enhdif+0x28e>
cmpq   $0x0,-0x40(%rsp)
mov    -0x68(%rsp),%rdi
je     1433 <enhdif+0x333>
mov    -0x8(%rsp),%rbp
xor    %r12d,%r12d
nopl   0x0(%rax)
movdqu -0x30(%r14,%r12,1),%xmm0
movdqu -0x20(%r14,%r12,1),%xmm1
movdqu -0x30(%r9,%r12,1),%xmm2
psubb  %xmm0,%xmm2
movdqu -0x20(%r9,%r12,1),%xmm0
psubb  %xmm1,%xmm0
movdqu -0x10(%r9,%r12,1),%xmm1
movdqu (%r9,%r12,1),%xmm3
movdqu %xmm2,-0x30(%r9,%r12,1)
movdqu %xmm0,-0x20(%r9,%r12,1)
movdqu -0x10(%r14,%r12,1),%xmm0
psubb  %xmm0,%xmm1
movdqu (%r14,%r12,1),%xmm0
psubb  %xmm0,%xmm3
movdqu %xmm1,-0x10(%r9,%r12,1)
movdqu %xmm3,(%r9,%r12,1)
add    $0x40,%r12
add    $0xfffffffffffffffe,%rbp
jne    12c0 <enhdif+0x1c0>
testb  $0x1,-0x48(%rsp)
je     1370 <enhdif+0x270>
lea    (%r12,%r10,1),%rdx
mov    -0x60(%rsp),%rdi
movdqu (%rdi,%rdx,1),%xmm0
movdqu 0x10(%rdi,%rdx,1),%xmm1
add    %r8,%r12
movdqu (%rdi,%r12,1),%xmm2
psubb  %xmm0,%xmm2
movdqu 0x10(%rdi,%r12,1),%xmm0
psubb  %xmm1,%xmm0
movdqu %xmm2,(%rdi,%r12,1)
movdqu %xmm0,0x10(%rdi,%r12,1)
mov    -0x68(%rsp),%rdi
cmp    %rsi,-0x50(%rsp)
mov    -0x58(%rsp),%rbp
je     11e0 <enhdif+0xe0>
mov    -0x50(%rsp),%rdx
mov    %rdx,%rbx
test   $0x18,%sil
je     13d0 <enhdif+0x2d0>
mov    -0x38(%rsp),%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movq   (%r15,%rbx,1),%xmm0
movq   0x0(%r13,%rbx,1),%xmm1
psubb  %xmm0,%xmm1
movq   %xmm1,0x0(%r13,%rbx,1)
add    $0x8,%rbx
cmp    %rbx,%rdx
jne    13a0 <enhdif+0x2a0>
mov    %rdx,%rbx
cmp    %rsi,%rdx
je     11e0 <enhdif+0xe0>
nopl   (%rax)
mov    %rdx,%rbx
test   $0x1,%sil
je     13f9 <enhdif+0x2f9>
add    %rdx,%r10
mov    %rdi,%r12
mov    -0x60(%rsp),%rdi
mov    (%rdi,%r10,1),%bl
add    %rdx,%r8
sub    %bl,(%rdi,%r8,1)
mov    %r12,%rdi
mov    %rdx,%rbx
or     $0x1,%rbx
not    %rdx
cmp    -0x10(%rsp),%rdx
je     11e0 <enhdif+0xe0>
nopw   0x0(%rax,%rax,1)
movzbl (%r15,%rbx,1),%edx
sub    %dl,0x0(%r13,%rbx,1)
movzbl 0x1(%r15,%rbx,1),%edx
sub    %dl,0x1(%r13,%rbx,1)
add    $0x2,%rbx
cmp    %rbx,%rsi
jne    1410 <enhdif+0x310>
jmp    11e0 <enhdif+0xe0>
xor    %r12d,%r12d
testb  $0x1,-0x48(%rsp)
jne    1332 <enhdif+0x232>
jmp    1370 <enhdif+0x270>
cmp    $0x2,%esi
jl     16fc <enhdif+0x5fc>
mov    %esi,%esi
lea    -0x1(%rsi),%rbx
movslq -0x6c(%rsp),%r13
mov    %r13d,%ecx
mov    %rbx,%rdx
imul   %r13,%rdx
lea    (%rdx,%rdx,1),%rax
mov    %rax,-0x18(%rsp)
mov    %r13,%r12
add    %r13,%r12
neg    %r12
lea    (%rcx,%rcx,1),%rdi
lea    (%rdi,%rdx,2),%rax
mov    %rax,-0x58(%rsp)
add    $0xfffffffffffffffe,%rsi
imul   %r13,%rsi
lea    (%rdi,%rsi,2),%rax
mov    %rax,-0x20(%rsp)
mov    %ecx,%eax
and    $0xfffffff0,%eax
mov    %rax,-0x50(%rsp)
add    $0xfffffffffffffff0,%rax
mov    %rax,-0x38(%rsp)
mov    %rax,%rdi
shr    $0x4,%rdi
add    $0x1,%rdi
mov    %rdi,%rax
mov    %rdi,-0x40(%rsp)
and    $0xfffffffffffffffe,%rdi
mov    %rdi,-0x48(%rsp)
mov    %rcx,%rax
neg    %rax
mov    %rax,-0x10(%rsp)
mov    -0x60(%rsp),%rax
lea    (%rax,%rdx,2),%rbp
add    $0x30,%rbp
lea    0x2(%rax,%rdx,2),%r15
lea    (%rsi,%rsi,1),%rdx
mov    %rdx,-0x28(%rsp)
lea    (%rax,%rsi,2),%r8
add    $0x30,%r8
lea    (%rax,%rsi,2),%r11
xor    %r9d,%r9d
mov    %r13,-0x30(%rsp)
jmp    151a <enhdif+0x41a>
nop
add    $0x1,%r9
add    %r12,%r8
add    %r12,%rbp
add    %r12,%r15
add    %r12,%r11
cmp    $0x1,%r10
jle    16fc <enhdif+0x5fc>
mov    %rbx,%r10
add    $0xffffffffffffffff,%rbx
cmpl   $0x0,-0x6c(%rsp)
jle    1500 <enhdif+0x400>
mov    %rbx,%r14
imul   %r13,%r14
mov    %r10,%rsi
imul   %r13,%rsi
cmpl   $0x10,-0x6c(%rsp)
jae    1550 <enhdif+0x450>
xor    %edx,%edx
jmp    1680 <enhdif+0x580>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rbx,-0x68(%rsp)
mov    %r12,%rdx
imul   %r9,%rdx
mov    -0x18(%rsp),%rax
lea    (%rax,%rdx,1),%rbx
mov    -0x60(%rsp),%rdi
add    %rdi,%rbx
mov    -0x20(%rsp),%rax
add    %rdx,%rax
add    %rdi,%rax
cmp    %rax,%rbx
jae    15a1 <enhdif+0x4a1>
mov    -0x58(%rsp),%rax
add    %rdx,%rax
add    %rdi,%rax
add    -0x28(%rsp),%rdx
add    %rdi,%rdx
cmp    %rax,%rdx
jae    15a1 <enhdif+0x4a1>
xor    %edx,%edx
mov    -0x68(%rsp),%rbx
jmp    1680 <enhdif+0x580>
cmpq   $0x0,-0x38(%rsp)
je     16e4 <enhdif+0x5e4>
mov    -0x48(%rsp),%rdx
xor    %r13d,%r13d
mov    -0x68(%rsp),%rbx
nopw   0x0(%rax,%rax,1)
movdqu -0x30(%r8,%r13,2),%xmm0
movdqu -0x20(%r8,%r13,2),%xmm1
movdqu -0x30(%rbp,%r13,2),%xmm2
psubw  %xmm0,%xmm2
movdqu -0x20(%rbp,%r13,2),%xmm0
psubw  %xmm1,%xmm0
movdqu -0x10(%rbp,%r13,2),%xmm1
movdqu 0x0(%rbp,%r13,2),%xmm3
movdqu %xmm2,-0x30(%rbp,%r13,2)
movdqu %xmm0,-0x20(%rbp,%r13,2)
movdqu -0x10(%r8,%r13,2),%xmm0
psubw  %xmm0,%xmm1
movdqu (%r8,%r13,2),%xmm0
psubw  %xmm0,%xmm3
movdqu %xmm1,-0x10(%rbp,%r13,2)
movdqu %xmm3,0x0(%rbp,%r13,2)
add    $0x20,%r13
add    $0xfffffffffffffffe,%rdx
jne    15c0 <enhdif+0x4c0>
testb  $0x1,-0x40(%rsp)
je     1668 <enhdif+0x568>
lea    (%r14,%r13,1),%rax
movdqu (%rdi,%rax,2),%xmm0
movdqu 0x10(%rdi,%rax,2),%xmm1
add    %rsi,%r13
movdqu (%rdi,%r13,2),%xmm2
psubw  %xmm0,%xmm2
movdqu 0x10(%rdi,%r13,2),%xmm0
psubw  %xmm1,%xmm0
movdqu %xmm2,(%rdi,%r13,2)
movdqu %xmm0,0x10(%rdi,%r13,2)
mov    -0x50(%rsp),%rax
mov    %rax,%rdx
cmp    %rcx,%rax
mov    -0x30(%rsp),%r13
je     1500 <enhdif+0x400>
xchg   %ax,%ax
mov    %rdx,%rdi
test   $0x1,%cl
je     16a3 <enhdif+0x5a3>
add    %rdx,%r14
mov    -0x60(%rsp),%rdi
movzwl (%rdi,%r14,2),%eax
add    %rdx,%rsi
sub    %ax,(%rdi,%rsi,2)
mov    %rdx,%rdi
or     $0x1,%rdi
not    %rdx
cmp    -0x10(%rsp),%rdx
je     1500 <enhdif+0x400>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzwl (%r11,%rdi,2),%eax
sub    %ax,-0x2(%r15,%rdi,2)
movzwl 0x2(%r11,%rdi,2),%eax
sub    %ax,(%r15,%rdi,2)
add    $0x2,%rdi
cmp    %rdi,%rcx
jne    16c0 <enhdif+0x5c0>
jmp    1500 <enhdif+0x400>
xor    %r13d,%r13d
mov    -0x68(%rsp),%rbx
testb  $0x1,-0x40(%rsp)
jne    1634 <enhdif+0x534>
jmp    1668 <enhdif+0x568>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @enhdif(i8* nocapture %0, i32 %1, i32 %2, i32 %3) {
switch i32 %3, label %334 [
i32 8, label %5
i32 16, label %179
]
5: ; preds = %4
%6 = icmp sgt i32 %1, 1
br i1 %6, label %7, label %334
7: ; preds = %5
%8 = icmp sgt i32 %2, 0
%9 = zext i32 %1 to i64
%10 = add nsw i64 %9, -1
%11 = sext i32 %2 to i64
%12 = zext i32 %2 to i64
%13 = mul i64 %10, %11
%14 = add i64 %13, %12
%15 = add nsw i64 %9, -2
%16 = mul i64 %15, %11
%17 = add i64 %16, %12
%18 = and i64 %12, 4294967264
%19 = add nsw i64 %18, -32
%20 = lshr exact i64 %19, 5
%21 = add nuw nsw i64 %20, 1
%22 = icmp ult i32 %2, 8
%23 = icmp ult i32 %2, 32
%24 = and i64 %12, 4294967264
%25 = and i64 %21, 1
%26 = icmp eq i64 %19, 0
%27 = and i64 %21, 1152921504606846974
%28 = icmp eq i64 %25, 0
%29 = icmp eq i64 %24, %12
%30 = and i64 %12, 24
%31 = icmp eq i64 %30, 0
%32 = and i64 %12, 4294967288
%33 = icmp eq i64 %32, %12
%34 = and i64 %12, 1
%35 = icmp eq i64 %34, 0
%36 = sub nsw i64 0, %12
br label %37
37: ; preds = %7, %157
%38 = phi i64 [ 0, %7 ], [ %159, %157 ]
%39 = phi i64 [ %10, %7 ], [ %49, %157 ]
%40 = mul i64 %38, %11
%41 = sub i64 %13, %40
%42 = getelementptr i8, i8* %0, i64 %41
%43 = sub i64 %14, %40
%44 = getelementptr i8, i8* %0, i64 %43
%45 = sub i64 %16, %40
%46 = getelementptr i8, i8* %0, i64 %45
%47 = sub i64 %17, %40
%48 = getelementptr i8, i8* %0, i64 %47
%49 = add nsw i64 %39, -1
br i1 %8, label %50, label %157
50: ; preds = %37
%51 = mul nsw i64 %49, %11
%52 = mul nsw i64 %39, %11
br i1 %22, label %142, label %53
53: ; preds = %50
%54 = icmp ult i8* %42, %48
%55 = icmp ult i8* %46, %44
%56 = and i1 %54, %55
br i1 %56, label %142, label %57
57: ; preds = %53
br i1 %23, label %125, label %58
58: ; preds = %57
br i1 %26, label %102, label %59
59: ; preds = %58, %59
%60 = phi i64 [ %99, %59 ], [ 0, %58 ]
%61 = phi i64 [ %100, %59 ], [ 0, %58 ]
%62 = add nsw i64 %60, %51
%63 = getelementptr inbounds i8, i8* %0, i64 %62
%64 = bitcast i8* %63 to <16 x i8>*
%65 = load <16 x i8>, <16 x i8>* %64
%66 = getelementptr inbounds i8, i8* %63, i64 16
%67 = bitcast i8* %66 to <16 x i8>*
%68 = load <16 x i8>, <16 x i8>* %67
%69 = add nsw i64 %60, %52
%70 = getelementptr inbounds i8, i8* %0, i64 %69
%71 = bitcast i8* %70 to <16 x i8>*
%72 = load <16 x i8>, <16 x i8>* %71
%73 = getelementptr inbounds i8, i8* %70, i64 16
%74 = bitcast i8* %73 to <16 x i8>*
%75 = load <16 x i8>, <16 x i8>* %74
%76 = sub <16 x i8> %72, %65
%77 = sub <16 x i8> %75, %68
%78 = bitcast i8* %70 to <16 x i8>*
store <16 x i8> %76, <16 x i8>* %78
%79 = bitcast i8* %73 to <16 x i8>*
store <16 x i8> %77, <16 x i8>* %79
%80 = or i64 %60, 32
%81 = add nsw i64 %80, %51
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = bitcast i8* %82 to <16 x i8>*
%84 = load <16 x i8>, <16 x i8>* %83
%85 = getelementptr inbounds i8, i8* %82, i64 16
%86 = bitcast i8* %85 to <16 x i8>*
%87 = load <16 x i8>, <16 x i8>* %86
%88 = add nsw i64 %80, %52
%89 = getelementptr inbounds i8, i8* %0, i64 %88
%90 = bitcast i8* %89 to <16 x i8>*
%91 = load <16 x i8>, <16 x i8>* %90
%92 = getelementptr inbounds i8, i8* %89, i64 16
%93 = bitcast i8* %92 to <16 x i8>*
%94 = load <16 x i8>, <16 x i8>* %93
%95 = sub <16 x i8> %91, %84
%96 = sub <16 x i8> %94, %87
%97 = bitcast i8* %89 to <16 x i8>*
store <16 x i8> %95, <16 x i8>* %97
%98 = bitcast i8* %92 to <16 x i8>*
store <16 x i8> %96, <16 x i8>* %98
%99 = add nuw i64 %60, 64
%100 = add i64 %61, 2
%101 = icmp eq i64 %100, %27
br i1 %101, label %102, label %59
102: ; preds = %59, %58
%103 = phi i64 [ 0, %58 ], [ %99, %59 ]
br i1 %28, label %123, label %104
104: ; preds = %102
%105 = add nsw i64 %103, %51
%106 = getelementptr inbounds i8, i8* %0, i64 %105
%107 = bitcast i8* %106 to <16 x i8>*
%108 = load <16 x i8>, <16 x i8>* %107
%109 = getelementptr inbounds i8, i8* %106, i64 16
%110 = bitcast i8* %109 to <16 x i8>*
%111 = load <16 x i8>, <16 x i8>* %110
%112 = add nsw i64 %103, %52
%113 = getelementptr inbounds i8, i8* %0, i64 %112
%114 = bitcast i8* %113 to <16 x i8>*
%115 = load <16 x i8>, <16 x i8>* %114
%116 = getelementptr inbounds i8, i8* %113, i64 16
%117 = bitcast i8* %116 to <16 x i8>*
%118 = load <16 x i8>, <16 x i8>* %117
%119 = sub <16 x i8> %115, %108
%120 = sub <16 x i8> %118, %111
%121 = bitcast i8* %113 to <16 x i8>*
store <16 x i8> %119, <16 x i8>* %121
%122 = bitcast i8* %116 to <16 x i8>*
store <16 x i8> %120, <16 x i8>* %122
br label %123
123: ; preds = %102, %104
br i1 %29, label %157, label %124
124: ; preds = %123
br i1 %31, label %142, label %125
125: ; preds = %57, %124
%126 = phi i64 [ %24, %124 ], [ 0, %57 ]
br label %127
127: ; preds = %127, %125
%128 = phi i64 [ %126, %125 ], [ %139, %127 ]
%129 = add nsw i64 %128, %51
%130 = getelementptr inbounds i8, i8* %0, i64 %129
%131 = bitcast i8* %130 to <8 x i8>*
%132 = load <8 x i8>, <8 x i8>* %131
%133 = add nsw i64 %128, %52
%134 = getelementptr inbounds i8, i8* %0, i64 %133
%135 = bitcast i8* %134 to <8 x i8>*
%136 = load <8 x i8>, <8 x i8>* %135
%137 = sub <8 x i8> %136, %132
%138 = bitcast i8* %134 to <8 x i8>*
store <8 x i8> %137, <8 x i8>* %138
%139 = add nuw i64 %128, 8
%140 = icmp eq i64 %139, %32
br i1 %140, label %141, label %127
141: ; preds = %127
br i1 %33, label %157, label %142
142: ; preds = %53, %50, %124, %141
%143 = phi i64 [ 0, %50 ], [ 0, %53 ], [ %24, %124 ], [ %32, %141 ]
%144 = xor i64 %143, -1
br i1 %35, label %154, label %145
145: ; preds = %142
%146 = add nsw i64 %143, %51
%147 = getelementptr inbounds i8, i8* %0, i64 %146
%148 = load i8, i8* %147
%149 = add nsw i64 %143, %52
%150 = getelementptr inbounds i8, i8* %0, i64 %149
%151 = load i8, i8* %150
%152 = sub i8 %151, %148
store i8 %152, i8* %150
%153 = or i64 %143, 1
br label %154
154: ; preds = %145, %142
%155 = phi i64 [ %143, %142 ], [ %153, %145 ]
%156 = icmp eq i64 %144, %36
br i1 %156, label %157, label %160
157: ; preds = %154, %160, %123, %141, %37
%158 = icmp sgt i64 %39, 1
%159 = add i64 %38, 1
br i1 %158, label %37, label %334
160: ; preds = %154, %160
%161 = phi i64 [ %177, %160 ], [ %155, %154 ]
%162 = add nsw i64 %161, %51
%163 = getelementptr inbounds i8, i8* %0, i64 %162
%164 = load i8, i8* %163
%165 = add nsw i64 %161, %52
%166 = getelementptr inbounds i8, i8* %0, i64 %165
%167 = load i8, i8* %166
%168 = sub i8 %167, %164
store i8 %168, i8* %166
%169 = add nuw nsw i64 %161, 1
%170 = add nsw i64 %169, %51
%171 = getelementptr inbounds i8, i8* %0, i64 %170
%172 = load i8, i8* %171
%173 = add nsw i64 %169, %52
%174 = getelementptr inbounds i8, i8* %0, i64 %173
%175 = load i8, i8* %174
%176 = sub i8 %175, %172
store i8 %176, i8* %174
%177 = add nuw nsw i64 %161, 2
%178 = icmp eq i64 %177, %12
br i1 %178, label %157, label %160
179: ; preds = %4
%180 = bitcast i8* %0 to i16*
%181 = icmp sgt i32 %1, 1
br i1 %181, label %182, label %334
182: ; preds = %179
%183 = icmp sgt i32 %2, 0
%184 = zext i32 %1 to i64
%185 = add nsw i64 %184, -1
%186 = sext i32 %2 to i64
%187 = zext i32 %2 to i64
%188 = mul i64 %185, %186
%189 = shl i64 %188, 1
%190 = mul nsw i64 %186, -2
%191 = shl nuw nsw i64 %187, 1
%192 = add i64 %189, %191
%193 = add nsw i64 %184, -2
%194 = mul i64 %193, %186
%195 = shl i64 %194, 1
%196 = add i64 %195, %191
%197 = and i64 %187, 4294967280
%198 = add nsw i64 %197, -16
%199 = lshr exact i64 %198, 4
%200 = add nuw nsw i64 %199, 1
%201 = icmp ult i32 %2, 16
%202 = and i64 %187, 4294967280
%203 = and i64 %200, 1
%204 = icmp eq i64 %198, 0
%205 = and i64 %200, 2305843009213693950
%206 = icmp eq i64 %203, 0
%207 = icmp eq i64 %202, %187
%208 = and i64 %187, 1
%209 = icmp eq i64 %208, 0
%210 = sub nsw i64 0, %187
br label %211
211: ; preds = %182, %312
%212 = phi i64 [ 0, %182 ], [ %314, %312 ]
%213 = phi i64 [ %185, %182 ], [ %223, %312 ]
%214 = mul i64 %190, %212
%215 = add i64 %189, %214
%216 = getelementptr i8, i8* %0, i64 %215
%217 = add i64 %192, %214
%218 = getelementptr i8, i8* %0, i64 %217
%219 = add i64 %195, %214
%220 = getelementptr i8, i8* %0, i64 %219
%221 = add i64 %196, %214
%222 = getelementptr i8, i8* %0, i64 %221
%223 = add nsw i64 %213, -1
br i1 %183, label %224, label %312
224: ; preds = %211
%225 = mul nsw i64 %223, %186
%226 = mul nsw i64 %213, %186
br i1 %201, label %297, label %227
227: ; preds = %224
%228 = icmp ult i8* %216, %222
%229 = icmp ult i8* %220, %218
%230 = and i1 %228, %229
br i1 %230, label %297, label %231
231: ; preds = %227
br i1 %204, label %275, label %232
232: ; preds = %231, %232
%233 = phi i64 [ %272, %232 ], [ 0, %231 ]
%234 = phi i64 [ %273, %232 ], [ 0, %231 ]
%235 = add nsw i64 %233, %225
%236 = getelementptr inbounds i16, i16* %180, i64 %235
%237 = bitcast i16* %236 to <8 x i16>*
%238 = load <8 x i16>, <8 x i16>* %237
%239 = getelementptr inbounds i16, i16* %236, i64 8
%240 = bitcast i16* %239 to <8 x i16>*
%241 = load <8 x i16>, <8 x i16>* %240
%242 = add nsw i64 %233, %226
%243 = getelementptr inbounds i16, i16* %180, i64 %242
%244 = bitcast i16* %243 to <8 x i16>*
%245 = load <8 x i16>, <8 x i16>* %244
%246 = getelementptr inbounds i16, i16* %243, i64 8
%247 = bitcast i16* %246 to <8 x i16>*
%248 = load <8 x i16>, <8 x i16>* %247
%249 = sub <8 x i16> %245, %238
%250 = sub <8 x i16> %248, %241
%251 = bitcast i16* %243 to <8 x i16>*
store <8 x i16> %249, <8 x i16>* %251
%252 = bitcast i16* %246 to <8 x i16>*
store <8 x i16> %250, <8 x i16>* %252
%253 = or i64 %233, 16
%254 = add nsw i64 %253, %225
%255 = getelementptr inbounds i16, i16* %180, i64 %254
%256 = bitcast i16* %255 to <8 x i16>*
%257 = load <8 x i16>, <8 x i16>* %256
%258 = getelementptr inbounds i16, i16* %255, i64 8
%259 = bitcast i16* %258 to <8 x i16>*
%260 = load <8 x i16>, <8 x i16>* %259
%261 = add nsw i64 %253, %226
%262 = getelementptr inbounds i16, i16* %180, i64 %261
%263 = bitcast i16* %262 to <8 x i16>*
%264 = load <8 x i16>, <8 x i16>* %263
%265 = getelementptr inbounds i16, i16* %262, i64 8
%266 = bitcast i16* %265 to <8 x i16>*
%267 = load <8 x i16>, <8 x i16>* %266
%268 = sub <8 x i16> %264, %257
%269 = sub <8 x i16> %267, %260
%270 = bitcast i16* %262 to <8 x i16>*
store <8 x i16> %268, <8 x i16>* %270
%271 = bitcast i16* %265 to <8 x i16>*
store <8 x i16> %269, <8 x i16>* %271
%272 = add nuw i64 %233, 32
%273 = add i64 %234, 2
%274 = icmp eq i64 %273, %205
br i1 %274, label %275, label %232
275: ; preds = %232, %231
%276 = phi i64 [ 0, %231 ], [ %272, %232 ]
br i1 %206, label %296, label %277
277: ; preds = %275
%278 = add nsw i64 %276, %225
%279 = getelementptr inbounds i16, i16* %180, i64 %278
%280 = bitcast i16* %279 to <8 x i16>*
%281 = load <8 x i16>, <8 x i16>* %280
%282 = getelementptr inbounds i16, i16* %279, i64 8
%283 = bitcast i16* %282 to <8 x i16>*
%284 = load <8 x i16>, <8 x i16>* %283
%285 = add nsw i64 %276, %226
%286 = getelementptr inbounds i16, i16* %180, i64 %285
%287 = bitcast i16* %286 to <8 x i16>*
%288 = load <8 x i16>, <8 x i16>* %287
%289 = getelementptr inbounds i16, i16* %286, i64 8
%290 = bitcast i16* %289 to <8 x i16>*
%291 = load <8 x i16>, <8 x i16>* %290
%292 = sub <8 x i16> %288, %281
%293 = sub <8 x i16> %291, %284
%294 = bitcast i16* %286 to <8 x i16>*
store <8 x i16> %292, <8 x i16>* %294
%295 = bitcast i16* %289 to <8 x i16>*
store <8 x i16> %293, <8 x i16>* %295
br label %296
296: ; preds = %275, %277
br i1 %207, label %312, label %297
297: ; preds = %227, %224, %296
%298 = phi i64 [ 0, %227 ], [ 0, %224 ], [ %202, %296 ]
%299 = xor i64 %298, -1
br i1 %209, label %309, label %300
300: ; preds = %297
%301 = add nsw i64 %298, %225
%302 = getelementptr inbounds i16, i16* %180, i64 %301
%303 = load i16, i16* %302
%304 = add nsw i64 %298, %226
%305 = getelementptr inbounds i16, i16* %180, i64 %304
%306 = load i16, i16* %305
%307 = sub i16 %306, %303
store i16 %307, i16* %305
%308 = or i64 %298, 1
br label %309
309: ; preds = %300, %297
%310 = phi i64 [ %298, %297 ], [ %308, %300 ]
%311 = icmp eq i64 %299, %210
br i1 %311, label %312, label %315
312: ; preds = %309, %315, %296, %211
%313 = icmp sgt i64 %213, 1
%314 = add i64 %212, 1
br i1 %313, label %211, label %334
315: ; preds = %309, %315
%316 = phi i64 [ %332, %315 ], [ %310, %309 ]
%317 = add nsw i64 %316, %225
%318 = getelementptr inbounds i16, i16* %180, i64 %317
%319 = load i16, i16* %318
%320 = add nsw i64 %316, %226
%321 = getelementptr inbounds i16, i16* %180, i64 %320
%322 = load i16, i16* %321
%323 = sub i16 %322, %319
store i16 %323, i16* %321
%324 = add nuw nsw i64 %316, 1
%325 = add nsw i64 %324, %225
%326 = getelementptr inbounds i16, i16* %180, i64 %325
%327 = load i16, i16* %326
%328 = add nsw i64 %324, %226
%329 = getelementptr inbounds i16, i16* %180, i64 %328
%330 = load i16, i16* %329
%331 = sub i16 %330, %327
store i16 %331, i16* %329
%332 = add nuw nsw i64 %316, 2
%333 = icmp eq i64 %332, %187
br i1 %333, label %312, label %315
334: ; preds = %312, %157, %179, %5, %4
ret void
}