void scale1d_2t1_ps(const unsigned char *source, int source_step,
                    unsigned int source_scale, unsigned int source_length,
                    unsigned char *dest, int dest_step, unsigned int dest_scale,
                    unsigned int dest_length) {
  unsigned int i, j;
  (void)source_length;
  (void)source_scale;
  (void)dest_scale;
  source_step *= 2;
  j = 0;
  for (i = 0; i < dest_length * dest_step; i += dest_step, j += source_step)
    dest[i] = source[j];
}


x86 assembly (clang, -O0):
<scale1d_2t1_ps>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0xc(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    0x18(%rbp),%ecx
imul   -0x24(%rbp),%ecx
cmp    %ecx,%eax
jae    1173 <scale1d_2t1_ps+0x73>
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1136 <scale1d_2t1_ps+0x36>
pop    %rbp
ret

x86 assembly (clang, -O2):
<scale1d_2t1_ps>:
mov    0x10(%rsp),%r10d
imul   %r9d,%r10d
test   %r10d,%r10d
je     1137 <scale1d_2t1_ps+0x37>
add    %esi,%esi
xor    %ecx,%ecx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %ecx,%eax
movzbl (%rdi,%rax,1),%r11d
mov    %edx,%eax
mov    %r11b,(%r8,%rax,1)
add    %r9d,%edx
add    %esi,%ecx
cmp    %r10d,%edx
jb     1120 <scale1d_2t1_ps+0x20>
ret

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

LLVM IR (-O2):
define void @scale1d_2t1_ps(i8* nocapture %0, i32 %1, i32 %2, i32 %3, i8* nocapture writeonly %4, i32 %5, i32 %6, i32 %7) {
%9 = shl nsw i32 %1, 1
%10 = mul i32 %7, %5
%11 = icmp eq i32 %10, 0
br i1 %11, label %23, label %12
12: ; preds = %8, %12
%13 = phi i32 [ %21, %12 ], [ 0, %8 ]
%14 = phi i32 [ %20, %12 ], [ 0, %8 ]
%15 = zext i32 %13 to i64
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = load i8, i8* %16
%18 = zext i32 %14 to i64
%19 = getelementptr inbounds i8, i8* %4, i64 %18
store i8 %17, i8* %19
%20 = add i32 %14, %5
%21 = add i32 %13, %9
%22 = icmp ult i32 %20, %10
br i1 %22, label %12, label %23
23: ; preds = %12, %8
ret void
}