void RGB444toRGB444_ROW2X_STRETCH2X(unsigned char *dest_ptr_1,
                                    unsigned char *dest_ptr_12,
                                    unsigned char *dest_ptr_2, int dest_dx,
                                    unsigned char *src_ptr, int src_dx) {
  register unsigned char *d1 = dest_ptr_1;
  register unsigned char *d12 = dest_ptr_12;
  register unsigned char *d2 = dest_ptr_2;
  register unsigned char *s = src_ptr;
  register int count = src_dx;
  if (count) {
    register unsigned int da_rgb;
    register unsigned int dc_rgb;
    register unsigned int sa_rgb;
    sa_rgb = *(unsigned short *)(s);
    da_rgb = sa_rgb;
    s += 2;
    register unsigned int sb_rgb;
    sb_rgb = *(unsigned short *)(d1);
    dc_rgb = (((da_rgb ^ sb_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                          ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                          ((1U << (0 + 4 - 1)) - (1U << 0)))) +
             (da_rgb & sb_rgb);
    d1 += 2 * 2;
    count--;
    *(unsigned short *)(d2) = da_rgb;
    d2 += 2;
    *(unsigned short *)(d12) = dc_rgb;
    d12 += 2;
    while (count >= 2) {
      register unsigned int db_rgb;
      register unsigned int dd_rgb;
      register unsigned int sa_rgb;
      sa_rgb = *(unsigned short *)(s);
      db_rgb = sa_rgb;
      da_rgb =
          (((da_rgb ^ db_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (da_rgb & db_rgb);
      *(unsigned short *)(d2) = da_rgb;
      *(unsigned short *)(d2 + 2) = db_rgb;
      register unsigned int sb_rgb;
      sb_rgb = *(unsigned short *)(d1);
      dd_rgb =
          (((db_rgb ^ sb_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (db_rgb & sb_rgb);
      dc_rgb =
          (((dc_rgb ^ dd_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (dc_rgb & dd_rgb);
      *(unsigned short *)(d12) = dc_rgb;
      *(unsigned short *)(d12 + 2) = dd_rgb;
      sa_rgb = *(unsigned short *)(s + 2);
      da_rgb = sa_rgb;
      db_rgb =
          (((db_rgb ^ da_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (db_rgb & da_rgb);
      *(unsigned short *)(d2 + 2 * 2) = db_rgb;
      *(unsigned short *)(d2 + 3 * 2) = da_rgb;
      sb_rgb = *(unsigned short *)(d1 + 2 * 2);
      dc_rgb =
          (((da_rgb ^ sb_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (da_rgb & sb_rgb);
      dd_rgb =
          (((dd_rgb ^ dc_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (dd_rgb & dc_rgb);
      *(unsigned short *)(d12 + 2 * 2) = dd_rgb;
      *(unsigned short *)(d12 + 3 * 2) = dc_rgb;
      s += 4;
      d1 += 4 * 2;
      d2 += 4 * 2;
      d12 += 4 * 2;
      count -= 2;
    }
    if (count) {
      register unsigned int db_rgb;
      register unsigned int dd_rgb;
      register unsigned int sa_rgb;
      sa_rgb = *(unsigned short *)(s);
      db_rgb = sa_rgb;
      da_rgb =
          (((da_rgb ^ db_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (da_rgb & db_rgb);
      *(unsigned short *)(d2) = da_rgb;
      *(unsigned short *)(d2 + 2) = db_rgb;
      *(unsigned short *)(d2 + 2 * 2) = db_rgb;
      register unsigned int sb_rgb;
      sb_rgb = *(unsigned short *)(d1);
      dd_rgb =
          (((db_rgb ^ sb_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (db_rgb & sb_rgb);
      dc_rgb =
          (((dc_rgb ^ dd_rgb) >> 1) & (((1U << (8 + 4 - 1)) - (1U << 8)) |
                                       ((1U << (4 + 4 - 1)) - (1U << 4)) |
                                       ((1U << (0 + 4 - 1)) - (1U << 0)))) +
          (dc_rgb & dd_rgb);
      *(unsigned short *)(d12) = dc_rgb;
      *(unsigned short *)(d12 + 2) = dd_rgb;
      *(unsigned short *)(d12 + 2 * 2) = dd_rgb;
    } else {
      *(unsigned short *)(d2) = da_rgb;
      *(unsigned short *)(d12) = dc_rgb;
    }
  }
}


x86 assembly (clang, -O0):
<RGB444toRGB444_ROW2X_STRETCH2X>:
push   %rbp
mov    %rsp,%rbp
push   %rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x0,-0x54(%rbp)
je     1442 <RGB444toRGB444_ROW2X_STRETCH2X+0x342>
mov    -0x50(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x64(%rbp)
mov    -0x58(%rbp),%eax
xor    -0x64(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x58(%rbp),%ecx
and    -0x64(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x54(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,(%rax)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
mov    -0x5c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,(%rax)
mov    -0x40(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x40(%rbp)
cmpl   $0x2,-0x54(%rbp)
jl     1354 <RGB444toRGB444_ROW2X_STRETCH2X+0x254>
mov    -0x50(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    -0x58(%rbp),%eax
xor    -0x68(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x58(%rbp),%ecx
and    -0x68(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,(%rax)
mov    -0x68(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,0x2(%rax)
mov    -0x38(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x74(%rbp)
mov    -0x68(%rbp),%eax
xor    -0x74(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x68(%rbp),%ecx
and    -0x74(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x5c(%rbp),%eax
xor    -0x6c(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x5c(%rbp),%ecx
and    -0x6c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,(%rax)
mov    -0x6c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,0x2(%rax)
mov    -0x50(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x68(%rbp),%eax
xor    -0x58(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x68(%rbp),%ecx
and    -0x58(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x68(%rbp)
mov    -0x68(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,0x4(%rax)
mov    -0x58(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,0x6(%rax)
mov    -0x38(%rbp),%rax
movzwl 0x4(%rax),%eax
mov    %eax,-0x74(%rbp)
mov    -0x58(%rbp),%eax
xor    -0x74(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x58(%rbp),%ecx
and    -0x74(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x6c(%rbp),%eax
xor    -0x5c(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x6c(%rbp),%ecx
and    -0x5c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,0x4(%rax)
mov    -0x5c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,0x6(%rax)
mov    -0x50(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x40(%rbp)
mov    -0x54(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x54(%rbp)
jmp    11d2 <RGB444toRGB444_ROW2X_STRETCH2X+0xd2>
cmpl   $0x0,-0x54(%rbp)
je     1423 <RGB444toRGB444_ROW2X_STRETCH2X+0x323>
mov    -0x50(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x80(%rbp)
mov    -0x80(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    -0x58(%rbp),%eax
xor    -0x78(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x58(%rbp),%ecx
and    -0x78(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,(%rax)
mov    -0x78(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,0x2(%rax)
mov    -0x78(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,0x4(%rax)
mov    -0x38(%rbp),%rax
movzwl (%rax),%eax
mov    %eax,-0x84(%rbp)
mov    -0x78(%rbp),%eax
xor    -0x84(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x78(%rbp),%ecx
and    -0x84(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x7c(%rbp)
mov    -0x5c(%rbp),%eax
xor    -0x7c(%rbp),%eax
shr    $0x1,%eax
and    $0x777,%eax
mov    -0x5c(%rbp),%ecx
and    -0x7c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,(%rax)
mov    -0x7c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,0x2(%rax)
mov    -0x7c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,0x4(%rax)
jmp    143d <RGB444toRGB444_ROW2X_STRETCH2X+0x33d>
mov    -0x58(%rbp),%eax
mov    %ax,%cx
mov    -0x48(%rbp),%rax
mov    %cx,(%rax)
mov    -0x5c(%rbp),%eax
mov    %ax,%cx
mov    -0x40(%rbp),%rax
mov    %cx,(%rax)
jmp    1442 <RGB444toRGB444_ROW2X_STRETCH2X+0x342>
add    $0x8,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<RGB444toRGB444_ROW2X_STRETCH2X>:
test   %r9d,%r9d
je     12ab <RGB444toRGB444_ROW2X_STRETCH2X+0x1ab>
push   %rbp
push   %r14
push   %rbx
movzwl (%r8),%r11d
add    $0x2,%r8
movzwl (%rdi),%eax
mov    %eax,%ecx
xor    %r11d,%ecx
shr    %ecx
and    $0x777,%ecx
and    %r11d,%eax
movzwl %ax,%r14d
add    %ecx,%r14d
add    $0x4,%rdi
mov    %r11w,(%rdx)
add    $0x2,%rdx
mov    %r14w,(%rsi)
add    $0x2,%rsi
cmp    $0x3,%r9d
jl     1294 <RGB444toRGB444_ROW2X_STRETCH2X+0x194>
add    $0x1,%r9d
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzwl (%r8),%ecx
mov    %ecx,%ebx
xor    %r11d,%ebx
shr    %ebx
and    $0x777,%ebx
and    %ecx,%r11d
add    %ebx,%r11d
mov    %r11w,(%rdx,%r10,1)
mov    %cx,0x2(%rdx,%r10,1)
movzwl (%rdi,%r10,1),%eax
mov    %eax,%ebx
xor    %ecx,%ebx
shr    %ebx
and    $0x777,%ebx
and    %ecx,%eax
movzwl %ax,%ebp
add    %ebx,%ebp
mov    %ebp,%eax
xor    %r14d,%eax
shr    %eax
and    $0x777,%eax
and    %ebp,%r14d
add    %eax,%r14d
mov    %r14w,(%rsi,%r10,1)
mov    %bp,0x2(%rsi,%r10,1)
movzwl 0x2(%r8),%r11d
mov    %r11d,%eax
xor    %ecx,%eax
shr    %eax
and    $0x777,%eax
and    %r11d,%ecx
add    %eax,%ecx
mov    %cx,0x4(%rdx,%r10,1)
mov    %r11w,0x6(%rdx,%r10,1)
movzwl 0x4(%rdi,%r10,1),%eax
mov    %eax,%ecx
xor    %r11d,%ecx
shr    %ecx
and    $0x777,%ecx
and    %r11d,%eax
movzwl %ax,%r14d
add    %ecx,%r14d
mov    %r14d,%eax
xor    %ebp,%eax
shr    %eax
and    $0x777,%eax
and    %r14d,%ebp
add    %eax,%ebp
mov    %bp,0x4(%rsi,%r10,1)
mov    %r14w,0x6(%rsi,%r10,1)
add    $0x4,%r8
add    $0x8,%r10
add    $0xfffffffe,%r9d
cmp    $0x3,%r9d
ja     1160 <RGB444toRGB444_ROW2X_STRETCH2X+0x60>
add    %r10,%rdi
add    %r10,%rsi
add    %r10,%rdx
add    $0xfffffffe,%r9d
test   %r9d,%r9d
je     129d <RGB444toRGB444_ROW2X_STRETCH2X+0x19d>
movzwl (%r8),%eax
mov    %eax,%ecx
xor    %r11d,%ecx
shr    %ecx
and    $0x777,%ecx
and    %eax,%r11d
add    %ecx,%r11d
mov    %r11w,(%rdx)
mov    %ax,0x2(%rdx)
mov    %ax,0x4(%rdx)
movzwl (%rdi),%ecx
mov    %ecx,%edx
xor    %eax,%edx
shr    %edx
and    $0x777,%edx
and    %eax,%ecx
movzwl %cx,%ecx
add    %edx,%ecx
mov    %ecx,%eax
xor    %r14d,%eax
shr    %eax
and    $0x777,%eax
and    %ecx,%r14d
add    %eax,%r14d
mov    %r14w,(%rsi)
mov    %cx,0x2(%rsi)
add    $0x4,%rsi
jmp    12a4 <RGB444toRGB444_ROW2X_STRETCH2X+0x1a4>
add    $0xffffffff,%r9d
test   %r9d,%r9d
jne    123b <RGB444toRGB444_ROW2X_STRETCH2X+0x13b>
mov    %r11w,(%rdx)
mov    %r14d,%ecx
mov    %cx,(%rsi)
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @RGB444toRGB444_ROW2X_STRETCH2X(i8* %0, i8* %1, i8* %2, i32 %3, i8* %4, i32 %5) {
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i32
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i8*
%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
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
store i8* %0, i8** %7
store i8* %1, i8** %8
store i8* %2, i8** %9
store i32 %3, i32* %10
store i8* %4, i8** %11
store i32 %5, i32* %12
%30 = load i8*, i8** %7
store i8* %30, i8** %13
%31 = load i8*, i8** %8
store i8* %31, i8** %14
%32 = load i8*, i8** %9
store i8* %32, i8** %15
%33 = load i8*, i8** %11
store i8* %33, i8** %16
%34 = load i32, i32* %12
store i32 %34, i32* %17
%35 = load i32, i32* %17
%36 = icmp ne i32 %35, 0
br i1 %36, label %37, label %278
37: ; preds = %6
%38 = load i8*, i8** %16
%39 = bitcast i8* %38 to i16*
%40 = load i16, i16* %39
%41 = zext i16 %40 to i32
store i32 %41, i32* %20
%42 = load i32, i32* %20
store i32 %42, i32* %18
%43 = load i8*, i8** %16
%44 = getelementptr inbounds i8, i8* %43, i64 2
store i8* %44, i8** %16
%45 = load i8*, i8** %13
%46 = bitcast i8* %45 to i16*
%47 = load i16, i16* %46
%48 = zext i16 %47 to i32
store i32 %48, i32* %21
%49 = load i32, i32* %18
%50 = load i32, i32* %21
%51 = xor i32 %49, %50
%52 = lshr i32 %51, 1
%53 = and i32 %52, 1911
%54 = load i32, i32* %18
%55 = load i32, i32* %21
%56 = and i32 %54, %55
%57 = add i32 %53, %56
store i32 %57, i32* %19
%58 = load i8*, i8** %13
%59 = getelementptr inbounds i8, i8* %58, i64 4
store i8* %59, i8** %13
%60 = load i32, i32* %17
%61 = add nsw i32 %60, -1
store i32 %61, i32* %17
%62 = load i32, i32* %18
%63 = trunc i32 %62 to i16
%64 = load i8*, i8** %15
%65 = bitcast i8* %64 to i16*
store i16 %63, i16* %65
%66 = load i8*, i8** %15
%67 = getelementptr inbounds i8, i8* %66, i64 2
store i8* %67, i8** %15
%68 = load i32, i32* %19
%69 = trunc i32 %68 to i16
%70 = load i8*, i8** %14
%71 = bitcast i8* %70 to i16*
store i16 %69, i16* %71
%72 = load i8*, i8** %14
%73 = getelementptr inbounds i8, i8* %72, i64 2
store i8* %73, i8** %14
br label %74
74: ; preds = %77, %37
%75 = load i32, i32* %17
%76 = icmp sge i32 %75, 2
br i1 %76, label %77, label %200
77: ; preds = %74
%78 = load i8*, i8** %16
%79 = bitcast i8* %78 to i16*
%80 = load i16, i16* %79
%81 = zext i16 %80 to i32
store i32 %81, i32* %24
%82 = load i32, i32* %24
store i32 %82, i32* %22
%83 = load i32, i32* %18
%84 = load i32, i32* %22
%85 = xor i32 %83, %84
%86 = lshr i32 %85, 1
%87 = and i32 %86, 1911
%88 = load i32, i32* %18
%89 = load i32, i32* %22
%90 = and i32 %88, %89
%91 = add i32 %87, %90
store i32 %91, i32* %18
%92 = load i32, i32* %18
%93 = trunc i32 %92 to i16
%94 = load i8*, i8** %15
%95 = bitcast i8* %94 to i16*
store i16 %93, i16* %95
%96 = load i32, i32* %22
%97 = trunc i32 %96 to i16
%98 = load i8*, i8** %15
%99 = getelementptr inbounds i8, i8* %98, i64 2
%100 = bitcast i8* %99 to i16*
store i16 %97, i16* %100
%101 = load i8*, i8** %13
%102 = bitcast i8* %101 to i16*
%103 = load i16, i16* %102
%104 = zext i16 %103 to i32
store i32 %104, i32* %25
%105 = load i32, i32* %22
%106 = load i32, i32* %25
%107 = xor i32 %105, %106
%108 = lshr i32 %107, 1
%109 = and i32 %108, 1911
%110 = load i32, i32* %22
%111 = load i32, i32* %25
%112 = and i32 %110, %111
%113 = add i32 %109, %112
store i32 %113, i32* %23
%114 = load i32, i32* %19
%115 = load i32, i32* %23
%116 = xor i32 %114, %115
%117 = lshr i32 %116, 1
%118 = and i32 %117, 1911
%119 = load i32, i32* %19
%120 = load i32, i32* %23
%121 = and i32 %119, %120
%122 = add i32 %118, %121
store i32 %122, i32* %19
%123 = load i32, i32* %19
%124 = trunc i32 %123 to i16
%125 = load i8*, i8** %14
%126 = bitcast i8* %125 to i16*
store i16 %124, i16* %126
%127 = load i32, i32* %23
%128 = trunc i32 %127 to i16
%129 = load i8*, i8** %14
%130 = getelementptr inbounds i8, i8* %129, i64 2
%131 = bitcast i8* %130 to i16*
store i16 %128, i16* %131
%132 = load i8*, i8** %16
%133 = getelementptr inbounds i8, i8* %132, i64 2
%134 = bitcast i8* %133 to i16*
%135 = load i16, i16* %134
%136 = zext i16 %135 to i32
store i32 %136, i32* %24
%137 = load i32, i32* %24
store i32 %137, i32* %18
%138 = load i32, i32* %22
%139 = load i32, i32* %18
%140 = xor i32 %138, %139
%141 = lshr i32 %140, 1
%142 = and i32 %141, 1911
%143 = load i32, i32* %22
%144 = load i32, i32* %18
%145 = and i32 %143, %144
%146 = add i32 %142, %145
store i32 %146, i32* %22
%147 = load i32, i32* %22
%148 = trunc i32 %147 to i16
%149 = load i8*, i8** %15
%150 = getelementptr inbounds i8, i8* %149, i64 4
%151 = bitcast i8* %150 to i16*
store i16 %148, i16* %151
%152 = load i32, i32* %18
%153 = trunc i32 %152 to i16
%154 = load i8*, i8** %15
%155 = getelementptr inbounds i8, i8* %154, i64 6
%156 = bitcast i8* %155 to i16*
store i16 %153, i16* %156
%157 = load i8*, i8** %13
%158 = getelementptr inbounds i8, i8* %157, i64 4
%159 = bitcast i8* %158 to i16*
%160 = load i16, i16* %159
%161 = zext i16 %160 to i32
store i32 %161, i32* %25
%162 = load i32, i32* %18
%163 = load i32, i32* %25
%164 = xor i32 %162, %163
%165 = lshr i32 %164, 1
%166 = and i32 %165, 1911
%167 = load i32, i32* %18
%168 = load i32, i32* %25
%169 = and i32 %167, %168
%170 = add i32 %166, %169
store i32 %170, i32* %19
%171 = load i32, i32* %23
%172 = load i32, i32* %19
%173 = xor i32 %171, %172
%174 = lshr i32 %173, 1
%175 = and i32 %174, 1911
%176 = load i32, i32* %23
%177 = load i32, i32* %19
%178 = and i32 %176, %177
%179 = add i32 %175, %178
store i32 %179, i32* %23
%180 = load i32, i32* %23
%181 = trunc i32 %180 to i16
%182 = load i8*, i8** %14
%183 = getelementptr inbounds i8, i8* %182, i64 4
%184 = bitcast i8* %183 to i16*
store i16 %181, i16* %184
%185 = load i32, i32* %19
%186 = trunc i32 %185 to i16
%187 = load i8*, i8** %14
%188 = getelementptr inbounds i8, i8* %187, i64 6
%189 = bitcast i8* %188 to i16*
store i16 %186, i16* %189
%190 = load i8*, i8** %16
%191 = getelementptr inbounds i8, i8* %190, i64 4
store i8* %191, i8** %16
%192 = load i8*, i8** %13
%193 = getelementptr inbounds i8, i8* %192, i64 8
store i8* %193, i8** %13
%194 = load i8*, i8** %15
%195 = getelementptr inbounds i8, i8* %194, i64 8
store i8* %195, i8** %15
%196 = load i8*, i8** %14
%197 = getelementptr inbounds i8, i8* %196, i64 8
store i8* %197, i8** %14
%198 = load i32, i32* %17
%199 = sub nsw i32 %198, 2
store i32 %199, i32* %17
br label %74
200: ; preds = %74
%201 = load i32, i32* %17
%202 = icmp ne i32 %201, 0
br i1 %202, label %203, label %268
203: ; preds = %200
%204 = load i8*, i8** %16
%205 = bitcast i8* %204 to i16*
%206 = load i16, i16* %205
%207 = zext i16 %206 to i32
store i32 %207, i32* %28
%208 = load i32, i32* %28
store i32 %208, i32* %26
%209 = load i32, i32* %18
%210 = load i32, i32* %26
%211 = xor i32 %209, %210
%212 = lshr i32 %211, 1
%213 = and i32 %212, 1911
%214 = load i32, i32* %18
%215 = load i32, i32* %26
%216 = and i32 %214, %215
%217 = add i32 %213, %216
store i32 %217, i32* %18
%218 = load i32, i32* %18
%219 = trunc i32 %218 to i16
%220 = load i8*, i8** %15
%221 = bitcast i8* %220 to i16*
store i16 %219, i16* %221
%222 = load i32, i32* %26
%223 = trunc i32 %222 to i16
%224 = load i8*, i8** %15
%225 = getelementptr inbounds i8, i8* %224, i64 2
%226 = bitcast i8* %225 to i16*
store i16 %223, i16* %226
%227 = load i32, i32* %26
%228 = trunc i32 %227 to i16
%229 = load i8*, i8** %15
%230 = getelementptr inbounds i8, i8* %229, i64 4
%231 = bitcast i8* %230 to i16*
store i16 %228, i16* %231
%232 = load i8*, i8** %13
%233 = bitcast i8* %232 to i16*
%234 = load i16, i16* %233
%235 = zext i16 %234 to i32
store i32 %235, i32* %29
%236 = load i32, i32* %26
%237 = load i32, i32* %29
%238 = xor i32 %236, %237
%239 = lshr i32 %238, 1
%240 = and i32 %239, 1911
%241 = load i32, i32* %26
%242 = load i32, i32* %29
%243 = and i32 %241, %242
%244 = add i32 %240, %243
store i32 %244, i32* %27
%245 = load i32, i32* %19
%246 = load i32, i32* %27
%247 = xor i32 %245, %246
%248 = lshr i32 %247, 1
%249 = and i32 %248, 1911
%250 = load i32, i32* %19
%251 = load i32, i32* %27
%252 = and i32 %250, %251
%253 = add i32 %249, %252
store i32 %253, i32* %19
%254 = load i32, i32* %19
%255 = trunc i32 %254 to i16
%256 = load i8*, i8** %14
%257 = bitcast i8* %256 to i16*
store i16 %255, i16* %257
%258 = load i32, i32* %27
%259 = trunc i32 %258 to i16
%260 = load i8*, i8** %14
%261 = getelementptr inbounds i8, i8* %260, i64 2
%262 = bitcast i8* %261 to i16*
store i16 %259, i16* %262
%263 = load i32, i32* %27
%264 = trunc i32 %263 to i16
%265 = load i8*, i8** %14
%266 = getelementptr inbounds i8, i8* %265, i64 4
%267 = bitcast i8* %266 to i16*
store i16 %264, i16* %267
br label %277
268: ; preds = %200
%269 = load i32, i32* %18
%270 = trunc i32 %269 to i16
%271 = load i8*, i8** %15
%272 = bitcast i8* %271 to i16*
store i16 %270, i16* %272
%273 = load i32, i32* %19
%274 = trunc i32 %273 to i16
%275 = load i8*, i8** %14
%276 = bitcast i8* %275 to i16*
store i16 %274, i16* %276
br label %277
277: ; preds = %268, %203
br label %278
278: ; preds = %277, %6
ret void
}

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