void __imlib_RotateAAInside(unsigned int *src, unsigned int *dest, int sow,
                            int dow, int dw, int dh, int x, int y, int dxh,
                            int dyh, int dxv, int dyv) {
  int i;
  if ((dw < 1) || (dh < 1))
    return;
  while (1) {
    i = dw - 1;
    do {
      unsigned int *src_x_y = (src + (x >> 12) + ((y >> 12) * sow));
      do {
        ((unsigned char *)((dest)))[2] =
            (((((((((unsigned char *)((src_x_y)))[2]) << 12) +
                 (((((unsigned char *)((src_x_y) + 1))[2]) -
                   (((unsigned char *)((src_x_y)))[2])) *
                  (((x) & ((1 << 12) - 1))))))
               << 12) +
              ((((((((unsigned char *)((src_x_y) + (sow)))[2]) << 12) +
                  (((((unsigned char *)((src_x_y) + (sow) + 1))[2]) -
                    (((unsigned char *)((src_x_y) + (sow)))[2])) *
                   (((x) & ((1 << 12) - 1)))))) -
                ((((((unsigned char *)((src_x_y)))[2]) << 12) +
                  (((((unsigned char *)((src_x_y) + 1))[2]) -
                    (((unsigned char *)((src_x_y)))[2])) *
                   (((x) & ((1 << 12) - 1))))))) *
               (((y) & ((1 << 12) - 1))))) >>
             (2 * 12));
        ((unsigned char *)((dest)))[1] =
            (((((((((unsigned char *)((src_x_y)))[1]) << 12) +
                 (((((unsigned char *)((src_x_y) + 1))[1]) -
                   (((unsigned char *)((src_x_y)))[1])) *
                  (((x) & ((1 << 12) - 1))))))
               << 12) +
              ((((((((unsigned char *)((src_x_y) + (sow)))[1]) << 12) +
                  (((((unsigned char *)((src_x_y) + (sow) + 1))[1]) -
                    (((unsigned char *)((src_x_y) + (sow)))[1])) *
                   (((x) & ((1 << 12) - 1)))))) -
                ((((((unsigned char *)((src_x_y)))[1]) << 12) +
                  (((((unsigned char *)((src_x_y) + 1))[1]) -
                    (((unsigned char *)((src_x_y)))[1])) *
                   (((x) & ((1 << 12) - 1))))))) *
               (((y) & ((1 << 12) - 1))))) >>
             (2 * 12));
        ((unsigned char *)((dest)))[0] =
            (((((((((unsigned char *)((src_x_y)))[0]) << 12) +
                 (((((unsigned char *)((src_x_y) + 1))[0]) -
                   (((unsigned char *)((src_x_y)))[0])) *
                  (((x) & ((1 << 12) - 1))))))
               << 12) +
              ((((((((unsigned char *)((src_x_y) + (sow)))[0]) << 12) +
                  (((((unsigned char *)((src_x_y) + (sow) + 1))[0]) -
                    (((unsigned char *)((src_x_y) + (sow)))[0])) *
                   (((x) & ((1 << 12) - 1)))))) -
                ((((((unsigned char *)((src_x_y)))[0]) << 12) +
                  (((((unsigned char *)((src_x_y) + 1))[0]) -
                    (((unsigned char *)((src_x_y)))[0])) *
                   (((x) & ((1 << 12) - 1))))))) *
               (((y) & ((1 << 12) - 1))))) >>
             (2 * 12));
        ((unsigned char *)((dest)))[3] =
            (((((((((unsigned char *)((src_x_y)))[3]) << 12) +
                 (((((unsigned char *)((src_x_y) + 1))[3]) -
                   (((unsigned char *)((src_x_y)))[3])) *
                  (((x) & ((1 << 12) - 1))))))
               << 12) +
              ((((((((unsigned char *)((src_x_y) + (sow)))[3]) << 12) +
                  (((((unsigned char *)((src_x_y) + (sow) + 1))[3]) -
                    (((unsigned char *)((src_x_y) + (sow)))[3])) *
                   (((x) & ((1 << 12) - 1)))))) -
                ((((((unsigned char *)((src_x_y)))[3]) << 12) +
                  (((((unsigned char *)((src_x_y) + 1))[3]) -
                    (((unsigned char *)((src_x_y)))[3])) *
                   (((x) & ((1 << 12) - 1))))))) *
               (((y) & ((1 << 12) - 1))))) >>
             (2 * 12));
      } while (0);
      x += dxh;
      y += dyh;
      dest++;
    } while (--i >= 0);
    if (--dh <= 0)
      break;
    x += dxv - dw * dxh;
    y += dyv - dw * dyh;
    dest += (dow - dw);
  }
}


x86 assembly (clang, -O0):
<__imlib_RotateAAInside>:
push   %rbp
mov    %rsp,%rbp
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jl     1140 <__imlib_RotateAAInside+0x40>
cmpl   $0x1,-0x20(%rbp)
jge    1145 <__imlib_RotateAAInside+0x45>
jmp    14bc <__imlib_RotateAAInside+0x3bc>
jmp    114a <__imlib_RotateAAInside+0x4a>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    0x10(%rbp),%ecx
sar    $0xc,%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    0x18(%rbp),%ecx
sar    $0xc,%ecx
imul   -0x14(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movzbl 0x2(%rax),%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movzbl 0x6(%rcx),%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x2(%rdx),%edx
sub    %edx,%ecx
mov    0x10(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x2(%rcx,%rdx,4),%ecx
shl    $0xc,%ecx
mov    -0x30(%rbp),%rdx
movslq -0x14(%rbp),%rsi
movzbl 0x6(%rdx,%rsi,4),%edx
mov    -0x30(%rbp),%rsi
movslq -0x14(%rbp),%rdi
movzbl 0x2(%rsi,%rdi,4),%esi
sub    %esi,%edx
mov    0x10(%rbp),%esi
and    $0xfff,%esi
imul   %esi,%edx
add    %edx,%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x2(%rdx),%edx
shl    $0xc,%edx
mov    -0x30(%rbp),%rsi
movzbl 0x6(%rsi),%esi
mov    -0x30(%rbp),%rdi
movzbl 0x2(%rdi),%edi
sub    %edi,%esi
mov    0x10(%rbp),%edi
and    $0xfff,%edi
imul   %edi,%esi
add    %esi,%edx
sub    %edx,%ecx
mov    0x18(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
sar    $0x18,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x1(%rax),%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x1(%rdx),%edx
sub    %edx,%ecx
mov    0x10(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,4),%ecx
shl    $0xc,%ecx
mov    -0x30(%rbp),%rdx
movslq -0x14(%rbp),%rsi
movzbl 0x5(%rdx,%rsi,4),%edx
mov    -0x30(%rbp),%rsi
movslq -0x14(%rbp),%rdi
movzbl 0x1(%rsi,%rdi,4),%esi
sub    %esi,%edx
mov    0x10(%rbp),%esi
and    $0xfff,%esi
imul   %esi,%edx
add    %edx,%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x1(%rdx),%edx
shl    $0xc,%edx
mov    -0x30(%rbp),%rsi
movzbl 0x5(%rsi),%esi
mov    -0x30(%rbp),%rdi
movzbl 0x1(%rdi),%edi
sub    %edi,%esi
mov    0x10(%rbp),%edi
and    $0xfff,%edi
imul   %edi,%esi
add    %esi,%edx
sub    %edx,%ecx
mov    0x18(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
sar    $0x18,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
movzbl (%rax),%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
mov    -0x30(%rbp),%rdx
movzbl (%rdx),%edx
sub    %edx,%ecx
mov    0x10(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl (%rcx,%rdx,4),%ecx
shl    $0xc,%ecx
mov    -0x30(%rbp),%rdx
movslq -0x14(%rbp),%rsi
movzbl 0x4(%rdx,%rsi,4),%edx
mov    -0x30(%rbp),%rsi
movslq -0x14(%rbp),%rdi
movzbl (%rsi,%rdi,4),%esi
sub    %esi,%edx
mov    0x10(%rbp),%esi
and    $0xfff,%esi
imul   %esi,%edx
add    %edx,%ecx
mov    -0x30(%rbp),%rdx
movzbl (%rdx),%edx
shl    $0xc,%edx
mov    -0x30(%rbp),%rsi
movzbl 0x4(%rsi),%esi
mov    -0x30(%rbp),%rdi
movzbl (%rdi),%edi
sub    %edi,%esi
mov    0x10(%rbp),%edi
and    $0xfff,%edi
imul   %edi,%esi
add    %esi,%edx
sub    %edx,%ecx
mov    0x18(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
sar    $0x18,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x3(%rax),%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movzbl 0x7(%rcx),%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x3(%rdx),%edx
sub    %edx,%ecx
mov    0x10(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
shl    $0xc,%eax
mov    -0x30(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x3(%rcx,%rdx,4),%ecx
shl    $0xc,%ecx
mov    -0x30(%rbp),%rdx
movslq -0x14(%rbp),%rsi
movzbl 0x7(%rdx,%rsi,4),%edx
mov    -0x30(%rbp),%rsi
movslq -0x14(%rbp),%rdi
movzbl 0x3(%rsi,%rdi,4),%esi
sub    %esi,%edx
mov    0x10(%rbp),%esi
and    $0xfff,%esi
imul   %esi,%edx
add    %edx,%ecx
mov    -0x30(%rbp),%rdx
movzbl 0x3(%rdx),%edx
shl    $0xc,%edx
mov    -0x30(%rbp),%rsi
movzbl 0x7(%rsi),%esi
mov    -0x30(%rbp),%rdi
movzbl 0x3(%rdi),%edi
sub    %edi,%esi
mov    0x10(%rbp),%edi
and    $0xfff,%edi
imul   %edi,%esi
add    %esi,%edx
sub    %edx,%ecx
mov    0x18(%rbp),%edx
and    $0xfff,%edx
imul   %edx,%ecx
add    %ecx,%eax
sar    $0x18,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x3(%rax)
mov    0x20(%rbp),%eax
add    0x10(%rbp),%eax
mov    %eax,0x10(%rbp)
mov    0x28(%rbp),%eax
add    0x18(%rbp),%eax
mov    %eax,0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmp    $0x0,%eax
jge    1153 <__imlib_RotateAAInside+0x53>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
cmp    $0x0,%eax
jg     147b <__imlib_RotateAAInside+0x37b>
jmp    14bc <__imlib_RotateAAInside+0x3bc>
mov    0x30(%rbp),%eax
mov    -0x1c(%rbp),%ecx
imul   0x20(%rbp),%ecx
sub    %ecx,%eax
add    0x10(%rbp),%eax
mov    %eax,0x10(%rbp)
mov    0x38(%rbp),%eax
mov    -0x1c(%rbp),%ecx
imul   0x28(%rbp),%ecx
sub    %ecx,%eax
add    0x18(%rbp),%eax
mov    %eax,0x18(%rbp)
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    114a <__imlib_RotateAAInside+0x4a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<__imlib_RotateAAInside>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %r8d,%r8d
jle    1304 <__imlib_RotateAAInside+0x204>
test   %r9d,%r9d
jle    1304 <__imlib_RotateAAInside+0x204>
mov    %rdi,%r10
mov    %r8d,%ebp
mov    %r9d,-0x18(%rsp)
mov    0x60(%rsp),%r8d
mov    0x58(%rsp),%ebx
mov    0x50(%rsp),%edi
mov    0x48(%rsp),%eax
mov    0x40(%rsp),%r15d
mov    0x38(%rsp),%r14d
movslq %edx,%r12
imul   %ebp,%eax
sub    %eax,%ebx
mov    %ebx,-0x14(%rsp)
mov    %edi,%eax
imul   %ebp,%eax
sub    %eax,%r8d
mov    %r8d,-0x10(%rsp)
movslq %ecx,%rcx
shl    $0x2,%rcx
movslq %ebp,%rax
add    $0x1,%ebp
mov    %ebp,-0xc(%rsp)
shl    $0x2,%rax
sub    %rax,%rcx
mov    %rcx,-0x8(%rsp)
nopl   0x0(%rax,%rax,1)
mov    -0xc(%rsp),%r9d
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r14d,%eax
sar    $0xc,%eax
cltq
mov    %r10,%rdi
lea    (%r10,%rax,4),%r10
mov    %r15d,%eax
sar    $0xc,%eax
mov    %r12d,%ebx
imul   %eax,%ebx
movslq %ebx,%r11
lea    (%r10,%r11,4),%rbx
movzbl 0x2(%r10,%r11,4),%ebp
movzbl 0x6(%r10,%r11,4),%r8d
sub    %ebp,%r8d
shl    $0xc,%ebp
mov    %r14d,%eax
and    $0xfff,%eax
imul   %eax,%r8d
add    %ebp,%r8d
movzbl 0x2(%rbx,%r12,4),%ebp
movzbl 0x6(%rbx,%r12,4),%ecx
sub    %ebp,%ecx
shl    $0xc,%ebp
imul   %eax,%ecx
sub    %r8d,%ebp
shl    $0xc,%r8d
add    %ecx,%ebp
mov    %r15d,%r13d
and    $0xfff,%r13d
imul   %r13d,%ebp
add    %r8d,%ebp
shr    $0x18,%ebp
mov    %bpl,0x2(%rsi)
movzbl 0x1(%r10,%r11,4),%ecx
movzbl 0x5(%r10,%r11,4),%ebp
sub    %ecx,%ebp
shl    $0xc,%ecx
imul   %eax,%ebp
add    %ecx,%ebp
movzbl 0x1(%rbx,%r12,4),%ecx
movzbl 0x5(%rbx,%r12,4),%edx
sub    %ecx,%edx
shl    $0xc,%ecx
imul   %eax,%edx
sub    %ebp,%ecx
shl    $0xc,%ebp
add    %edx,%ecx
imul   %r13d,%ecx
add    %ebp,%ecx
shr    $0x18,%ecx
mov    %cl,0x1(%rsi)
movzbl (%r10,%r11,4),%ecx
movzbl 0x4(%r10,%r11,4),%edx
sub    %ecx,%edx
shl    $0xc,%ecx
imul   %eax,%edx
add    %ecx,%edx
movzbl (%rbx,%r12,4),%ecx
movzbl 0x4(%rbx,%r12,4),%ebp
sub    %ecx,%ebp
shl    $0xc,%ecx
imul   %eax,%ebp
sub    %edx,%ecx
add    %ebp,%ecx
shl    $0xc,%edx
imul   %r13d,%ecx
add    %edx,%ecx
shr    $0x18,%ecx
mov    %cl,(%rsi)
movzbl 0x3(%r10,%r11,4),%ecx
movzbl 0x7(%r10,%r11,4),%edx
mov    0x48(%rsp),%r8d
mov    %rdi,%r10
mov    0x50(%rsp),%edi
sub    %ecx,%edx
shl    $0xc,%ecx
imul   %eax,%edx
add    %ecx,%edx
movzbl 0x3(%rbx,%r12,4),%ecx
movzbl 0x7(%rbx,%r12,4),%ebp
sub    %ecx,%ebp
imul   %eax,%ebp
shl    $0xc,%ecx
sub    %edx,%ecx
add    %ebp,%ecx
imul   %r13d,%ecx
shl    $0xc,%edx
add    %edx,%ecx
shr    $0x18,%ecx
mov    %cl,0x3(%rsi)
add    %r8d,%r14d
add    %edi,%r15d
add    $0x4,%rsi
add    $0xffffffff,%r9d
cmp    $0x1,%r9d
jg     1190 <__imlib_RotateAAInside+0x90>
mov    -0x18(%rsp),%eax
cmp    $0x2,%eax
jl     1304 <__imlib_RotateAAInside+0x204>
add    $0xffffffff,%eax
mov    %eax,-0x18(%rsp)
add    -0x14(%rsp),%r14d
add    -0x10(%rsp),%r15d
add    -0x8(%rsp),%rsi
jmp    1180 <__imlib_RotateAAInside+0x80>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @__imlib_RotateAAInside(i32* %0, i32* %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11) {
%13 = alloca i32*
%14 = alloca i32*
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32*
store i32* %0, i32** %13
store i32* %1, i32** %14
store i32 %2, i32* %15
store i32 %3, i32* %16
store i32 %4, i32* %17
store i32 %5, i32* %18
store i32 %6, i32* %19
store i32 %7, i32* %20
store i32 %8, i32* %21
store i32 %9, i32* %22
store i32 %10, i32* %23
store i32 %11, i32* %24
%27 = load i32, i32* %17
%28 = icmp slt i32 %27, 1
br i1 %28, label %32, label %29
29: ; preds = %12
%30 = load i32, i32* %18
%31 = icmp slt i32 %30, 1
br i1 %31, label %32, label %33
32: ; preds = %29, %12
br label %433
33: ; preds = %29
br label %34
34: ; preds = %33, %412
%35 = load i32, i32* %17
%36 = sub nsw i32 %35, 1
store i32 %36, i32* %25
br label %37
37: ; preds = %403, %34
%38 = load i32*, i32** %13
%39 = load i32, i32* %19
%40 = ashr i32 %39, 12
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i32, i32* %38, i64 %41
%43 = load i32, i32* %20
%44 = ashr i32 %43, 12
%45 = load i32, i32* %15
%46 = mul nsw i32 %44, %45
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i32, i32* %42, i64 %47
store i32* %48, i32** %26
br label %49
49: ; preds = %37
%50 = load i32*, i32** %26
%51 = bitcast i32* %50 to i8*
%52 = getelementptr inbounds i8, i8* %51, i64 2
%53 = load i8, i8* %52
%54 = zext i8 %53 to i32
%55 = shl i32 %54, 12
%56 = load i32*, i32** %26
%57 = getelementptr inbounds i32, i32* %56, i64 1
%58 = bitcast i32* %57 to i8*
%59 = getelementptr inbounds i8, i8* %58, i64 2
%60 = load i8, i8* %59
%61 = zext i8 %60 to i32
%62 = load i32*, i32** %26
%63 = bitcast i32* %62 to i8*
%64 = getelementptr inbounds i8, i8* %63, i64 2
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = sub nsw i32 %61, %66
%68 = load i32, i32* %19
%69 = and i32 %68, 4095
%70 = mul nsw i32 %67, %69
%71 = add nsw i32 %55, %70
%72 = shl i32 %71, 12
%73 = load i32*, i32** %26
%74 = load i32, i32* %15
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds i32, i32* %73, i64 %75
%77 = bitcast i32* %76 to i8*
%78 = getelementptr inbounds i8, i8* %77, i64 2
%79 = load i8, i8* %78
%80 = zext i8 %79 to i32
%81 = shl i32 %80, 12
%82 = load i32*, i32** %26
%83 = load i32, i32* %15
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i32, i32* %82, i64 %84
%86 = getelementptr inbounds i32, i32* %85, i64 1
%87 = bitcast i32* %86 to i8*
%88 = getelementptr inbounds i8, i8* %87, i64 2
%89 = load i8, i8* %88
%90 = zext i8 %89 to i32
%91 = load i32*, i32** %26
%92 = load i32, i32* %15
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i32, i32* %91, i64 %93
%95 = bitcast i32* %94 to i8*
%96 = getelementptr inbounds i8, i8* %95, i64 2
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = sub nsw i32 %90, %98
%100 = load i32, i32* %19
%101 = and i32 %100, 4095
%102 = mul nsw i32 %99, %101
%103 = add nsw i32 %81, %102
%104 = load i32*, i32** %26
%105 = bitcast i32* %104 to i8*
%106 = getelementptr inbounds i8, i8* %105, i64 2
%107 = load i8, i8* %106
%108 = zext i8 %107 to i32
%109 = shl i32 %108, 12
%110 = load i32*, i32** %26
%111 = getelementptr inbounds i32, i32* %110, i64 1
%112 = bitcast i32* %111 to i8*
%113 = getelementptr inbounds i8, i8* %112, i64 2
%114 = load i8, i8* %113
%115 = zext i8 %114 to i32
%116 = load i32*, i32** %26
%117 = bitcast i32* %116 to i8*
%118 = getelementptr inbounds i8, i8* %117, i64 2
%119 = load i8, i8* %118
%120 = zext i8 %119 to i32
%121 = sub nsw i32 %115, %120
%122 = load i32, i32* %19
%123 = and i32 %122, 4095
%124 = mul nsw i32 %121, %123
%125 = add nsw i32 %109, %124
%126 = sub nsw i32 %103, %125
%127 = load i32, i32* %20
%128 = and i32 %127, 4095
%129 = mul nsw i32 %126, %128
%130 = add nsw i32 %72, %129
%131 = ashr i32 %130, 24
%132 = trunc i32 %131 to i8
%133 = load i32*, i32** %14
%134 = bitcast i32* %133 to i8*
%135 = getelementptr inbounds i8, i8* %134, i64 2
store i8 %132, i8* %135
%136 = load i32*, i32** %26
%137 = bitcast i32* %136 to i8*
%138 = getelementptr inbounds i8, i8* %137, i64 1
%139 = load i8, i8* %138
%140 = zext i8 %139 to i32
%141 = shl i32 %140, 12
%142 = load i32*, i32** %26
%143 = getelementptr inbounds i32, i32* %142, i64 1
%144 = bitcast i32* %143 to i8*
%145 = getelementptr inbounds i8, i8* %144, i64 1
%146 = load i8, i8* %145
%147 = zext i8 %146 to i32
%148 = load i32*, i32** %26
%149 = bitcast i32* %148 to i8*
%150 = getelementptr inbounds i8, i8* %149, i64 1
%151 = load i8, i8* %150
%152 = zext i8 %151 to i32
%153 = sub nsw i32 %147, %152
%154 = load i32, i32* %19
%155 = and i32 %154, 4095
%156 = mul nsw i32 %153, %155
%157 = add nsw i32 %141, %156
%158 = shl i32 %157, 12
%159 = load i32*, i32** %26
%160 = load i32, i32* %15
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds i32, i32* %159, i64 %161
%163 = bitcast i32* %162 to i8*
%164 = getelementptr inbounds i8, i8* %163, i64 1
%165 = load i8, i8* %164
%166 = zext i8 %165 to i32
%167 = shl i32 %166, 12
%168 = load i32*, i32** %26
%169 = load i32, i32* %15
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds i32, i32* %168, i64 %170
%172 = getelementptr inbounds i32, i32* %171, i64 1
%173 = bitcast i32* %172 to i8*
%174 = getelementptr inbounds i8, i8* %173, i64 1
%175 = load i8, i8* %174
%176 = zext i8 %175 to i32
%177 = load i32*, i32** %26
%178 = load i32, i32* %15
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds i32, i32* %177, i64 %179
%181 = bitcast i32* %180 to i8*
%182 = getelementptr inbounds i8, i8* %181, i64 1
%183 = load i8, i8* %182
%184 = zext i8 %183 to i32
%185 = sub nsw i32 %176, %184
%186 = load i32, i32* %19
%187 = and i32 %186, 4095
%188 = mul nsw i32 %185, %187
%189 = add nsw i32 %167, %188
%190 = load i32*, i32** %26
%191 = bitcast i32* %190 to i8*
%192 = getelementptr inbounds i8, i8* %191, i64 1
%193 = load i8, i8* %192
%194 = zext i8 %193 to i32
%195 = shl i32 %194, 12
%196 = load i32*, i32** %26
%197 = getelementptr inbounds i32, i32* %196, i64 1
%198 = bitcast i32* %197 to i8*
%199 = getelementptr inbounds i8, i8* %198, i64 1
%200 = load i8, i8* %199
%201 = zext i8 %200 to i32
%202 = load i32*, i32** %26
%203 = bitcast i32* %202 to i8*
%204 = getelementptr inbounds i8, i8* %203, i64 1
%205 = load i8, i8* %204
%206 = zext i8 %205 to i32
%207 = sub nsw i32 %201, %206
%208 = load i32, i32* %19
%209 = and i32 %208, 4095
%210 = mul nsw i32 %207, %209
%211 = add nsw i32 %195, %210
%212 = sub nsw i32 %189, %211
%213 = load i32, i32* %20
%214 = and i32 %213, 4095
%215 = mul nsw i32 %212, %214
%216 = add nsw i32 %158, %215
%217 = ashr i32 %216, 24
%218 = trunc i32 %217 to i8
%219 = load i32*, i32** %14
%220 = bitcast i32* %219 to i8*
%221 = getelementptr inbounds i8, i8* %220, i64 1
store i8 %218, i8* %221
%222 = load i32*, i32** %26
%223 = bitcast i32* %222 to i8*
%224 = getelementptr inbounds i8, i8* %223, i64 0
%225 = load i8, i8* %224
%226 = zext i8 %225 to i32
%227 = shl i32 %226, 12
%228 = load i32*, i32** %26
%229 = getelementptr inbounds i32, i32* %228, i64 1
%230 = bitcast i32* %229 to i8*
%231 = getelementptr inbounds i8, i8* %230, i64 0
%232 = load i8, i8* %231
%233 = zext i8 %232 to i32
%234 = load i32*, i32** %26
%235 = bitcast i32* %234 to i8*
%236 = getelementptr inbounds i8, i8* %235, i64 0
%237 = load i8, i8* %236
%238 = zext i8 %237 to i32
%239 = sub nsw i32 %233, %238
%240 = load i32, i32* %19
%241 = and i32 %240, 4095
%242 = mul nsw i32 %239, %241
%243 = add nsw i32 %227, %242
%244 = shl i32 %243, 12
%245 = load i32*, i32** %26
%246 = load i32, i32* %15
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds i32, i32* %245, i64 %247
%249 = bitcast i32* %248 to i8*
%250 = getelementptr inbounds i8, i8* %249, i64 0
%251 = load i8, i8* %250
%252 = zext i8 %251 to i32
%253 = shl i32 %252, 12
%254 = load i32*, i32** %26
%255 = load i32, i32* %15
%256 = sext i32 %255 to i64
%257 = getelementptr inbounds i32, i32* %254, i64 %256
%258 = getelementptr inbounds i32, i32* %257, i64 1
%259 = bitcast i32* %258 to i8*
%260 = getelementptr inbounds i8, i8* %259, i64 0
%261 = load i8, i8* %260
%262 = zext i8 %261 to i32
%263 = load i32*, i32** %26
%264 = load i32, i32* %15
%265 = sext i32 %264 to i64
%266 = getelementptr inbounds i32, i32* %263, i64 %265
%267 = bitcast i32* %266 to i8*
%268 = getelementptr inbounds i8, i8* %267, i64 0
%269 = load i8, i8* %268
%270 = zext i8 %269 to i32
%271 = sub nsw i32 %262, %270
%272 = load i32, i32* %19
%273 = and i32 %272, 4095
%274 = mul nsw i32 %271, %273
%275 = add nsw i32 %253, %274
%276 = load i32*, i32** %26
%277 = bitcast i32* %276 to i8*
%278 = getelementptr inbounds i8, i8* %277, i64 0
%279 = load i8, i8* %278
%280 = zext i8 %279 to i32
%281 = shl i32 %280, 12
%282 = load i32*, i32** %26
%283 = getelementptr inbounds i32, i32* %282, i64 1
%284 = bitcast i32* %283 to i8*
%285 = getelementptr inbounds i8, i8* %284, i64 0
%286 = load i8, i8* %285
%287 = zext i8 %286 to i32
%288 = load i32*, i32** %26
%289 = bitcast i32* %288 to i8*
%290 = getelementptr inbounds i8, i8* %289, i64 0
%291 = load i8, i8* %290
%292 = zext i8 %291 to i32
%293 = sub nsw i32 %287, %292
%294 = load i32, i32* %19
%295 = and i32 %294, 4095
%296 = mul nsw i32 %293, %295
%297 = add nsw i32 %281, %296
%298 = sub nsw i32 %275, %297
%299 = load i32, i32* %20
%300 = and i32 %299, 4095
%301 = mul nsw i32 %298, %300
%302 = add nsw i32 %244, %301
%303 = ashr i32 %302, 24
%304 = trunc i32 %303 to i8
%305 = load i32*, i32** %14
%306 = bitcast i32* %305 to i8*
%307 = getelementptr inbounds i8, i8* %306, i64 0
store i8 %304, i8* %307
%308 = load i32*, i32** %26
%309 = bitcast i32* %308 to i8*
%310 = getelementptr inbounds i8, i8* %309, i64 3
%311 = load i8, i8* %310
%312 = zext i8 %311 to i32
%313 = shl i32 %312, 12
%314 = load i32*, i32** %26
%315 = getelementptr inbounds i32, i32* %314, i64 1
%316 = bitcast i32* %315 to i8*
%317 = getelementptr inbounds i8, i8* %316, i64 3
%318 = load i8, i8* %317
%319 = zext i8 %318 to i32
%320 = load i32*, i32** %26
%321 = bitcast i32* %320 to i8*
%322 = getelementptr inbounds i8, i8* %321, i64 3
%323 = load i8, i8* %322
%324 = zext i8 %323 to i32
%325 = sub nsw i32 %319, %324
%326 = load i32, i32* %19
%327 = and i32 %326, 4095
%328 = mul nsw i32 %325, %327
%329 = add nsw i32 %313, %328
%330 = shl i32 %329, 12
%331 = load i32*, i32** %26
%332 = load i32, i32* %15
%333 = sext i32 %332 to i64
%334 = getelementptr inbounds i32, i32* %331, i64 %333
%335 = bitcast i32* %334 to i8*
%336 = getelementptr inbounds i8, i8* %335, i64 3
%337 = load i8, i8* %336
%338 = zext i8 %337 to i32
%339 = shl i32 %338, 12
%340 = load i32*, i32** %26
%341 = load i32, i32* %15
%342 = sext i32 %341 to i64
%343 = getelementptr inbounds i32, i32* %340, i64 %342
%344 = getelementptr inbounds i32, i32* %343, i64 1
%345 = bitcast i32* %344 to i8*
%346 = getelementptr inbounds i8, i8* %345, i64 3
%347 = load i8, i8* %346
%348 = zext i8 %347 to i32
%349 = load i32*, i32** %26
%350 = load i32, i32* %15
%351 = sext i32 %350 to i64
%352 = getelementptr inbounds i32, i32* %349, i64 %351
%353 = bitcast i32* %352 to i8*
%354 = getelementptr inbounds i8, i8* %353, i64 3
%355 = load i8, i8* %354
%356 = zext i8 %355 to i32
%357 = sub nsw i32 %348, %356
%358 = load i32, i32* %19
%359 = and i32 %358, 4095
%360 = mul nsw i32 %357, %359
%361 = add nsw i32 %339, %360
%362 = load i32*, i32** %26
%363 = bitcast i32* %362 to i8*
%364 = getelementptr inbounds i8, i8* %363, i64 3
%365 = load i8, i8* %364
%366 = zext i8 %365 to i32
%367 = shl i32 %366, 12
%368 = load i32*, i32** %26
%369 = getelementptr inbounds i32, i32* %368, i64 1
%370 = bitcast i32* %369 to i8*
%371 = getelementptr inbounds i8, i8* %370, i64 3
%372 = load i8, i8* %371
%373 = zext i8 %372 to i32
%374 = load i32*, i32** %26
%375 = bitcast i32* %374 to i8*
%376 = getelementptr inbounds i8, i8* %375, i64 3
%377 = load i8, i8* %376
%378 = zext i8 %377 to i32
%379 = sub nsw i32 %373, %378
%380 = load i32, i32* %19
%381 = and i32 %380, 4095
%382 = mul nsw i32 %379, %381
%383 = add nsw i32 %367, %382
%384 = sub nsw i32 %361, %383
%385 = load i32, i32* %20
%386 = and i32 %385, 4095
%387 = mul nsw i32 %384, %386
%388 = add nsw i32 %330, %387
%389 = ashr i32 %388, 24
%390 = trunc i32 %389 to i8
%391 = load i32*, i32** %14
%392 = bitcast i32* %391 to i8*
%393 = getelementptr inbounds i8, i8* %392, i64 3
store i8 %390, i8* %393
br label %394
394: ; preds = %49
%395 = load i32, i32* %21
%396 = load i32, i32* %19
%397 = add nsw i32 %396, %395
store i32 %397, i32* %19
%398 = load i32, i32* %22
%399 = load i32, i32* %20
%400 = add nsw i32 %399, %398
store i32 %400, i32* %20
%401 = load i32*, i32** %14
%402 = getelementptr inbounds i32, i32* %401, i32 1
store i32* %402, i32** %14
br label %403
403: ; preds = %394
%404 = load i32, i32* %25
%405 = add nsw i32 %404, -1
store i32 %405, i32* %25
%406 = icmp sge i32 %405, 0
br i1 %406, label %37, label %407
407: ; preds = %403
%408 = load i32, i32* %18
%409 = add nsw i32 %408, -1
store i32 %409, i32* %18
%410 = icmp sle i32 %409, 0
br i1 %410, label %411, label %412
411: ; preds = %407
br label %433
412: ; preds = %407
%413 = load i32, i32* %23
%414 = load i32, i32* %17
%415 = load i32, i32* %21
%416 = mul nsw i32 %414, %415
%417 = sub nsw i32 %413, %416
%418 = load i32, i32* %19
%419 = add nsw i32 %418, %417
store i32 %419, i32* %19
%420 = load i32, i32* %24
%421 = load i32, i32* %17
%422 = load i32, i32* %22
%423 = mul nsw i32 %421, %422
%424 = sub nsw i32 %420, %423
%425 = load i32, i32* %20
%426 = add nsw i32 %425, %424
store i32 %426, i32* %20
%427 = load i32, i32* %16
%428 = load i32, i32* %17
%429 = sub nsw i32 %427, %428
%430 = load i32*, i32** %14
%431 = sext i32 %429 to i64
%432 = getelementptr inbounds i32, i32* %430, i64 %431
store i32* %432, i32** %14
br label %34
433: ; preds = %32, %411
ret void
}

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