void _op_blend_p_caa_dp(unsigned *s, unsigned *e, unsigned *d, unsigned c) {
  while (d < e) {
    *d = ((((((*s) >> 8) & 0x00ff00ff) * (c)) & 0xff00ff00) +
          (((((*s) & 0x00ff00ff) * (c)) >> 8) & 0x00ff00ff));
    d++;
    s++;
  }
}


x86 assembly (clang, -O0):
<_op_blend_p_caa_dp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    1176 <_op_blend_p_caa_dp+0x76>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
shr    $0x8,%ecx
and    $0xff00ff,%ecx
imul   -0x1c(%rbp),%ecx
and    $0xff00ff00,%ecx
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
and    $0xff00ff,%eax
imul   -0x1c(%rbp),%eax
shr    $0x8,%eax
and    $0xff00ff,%eax
add    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    1113 <_op_blend_p_caa_dp+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_op_blend_p_caa_dp>:
cmp    %rsi,%rdx
jae    133d <_op_blend_p_caa_dp+0x23d>
lea    0x4(%rdx),%r10
cmp    %r10,%rsi
mov    %r10,%r9
cmova  %rsi,%r9
mov    %rdx,%r8
not    %r8
add    %r8,%r9
cmp    $0xc,%r9
jb     1300 <_op_blend_p_caa_dp+0x200>
cmp    %r10,%rsi
cmova  %rsi,%r10
add    %r8,%r10
and    $0xfffffffffffffffc,%r10
lea    (%rdi,%r10,1),%rax
add    $0x4,%rax
cmp    %rdx,%rax
jbe    1156 <_op_blend_p_caa_dp+0x56>
lea    (%rdx,%r10,1),%rax
add    $0x4,%rax
cmp    %rdi,%rax
ja     1300 <_op_blend_p_caa_dp+0x200>
shr    $0x2,%r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffffc,%r8
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x4(%r8),%rax
mov    %rax,%r10
shr    $0x2,%r10
add    $0x1,%r10
pshufd $0xf5,%xmm0,%xmm1
test   %rax,%rax
je     133e <_op_blend_p_caa_dp+0x23e>
movabs $0x7ffffffffffffffc,%r11
ff ff 7f
add    $0x2,%r11
and    %r10,%r11
xor    %eax,%eax
movdqa 0xe5a(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
movdqu (%rdi,%rax,4),%xmm3
movdqa %xmm3,%xmm4
psrlw  $0x8,%xmm4
pshufd $0xf5,%xmm4,%xmm5
pmuludq %xmm0,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm4
pand   %xmm2,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
movdqa %xmm2,%xmm5
pandn  %xmm4,%xmm5
psrlw  $0x8,%xmm3
por    %xmm5,%xmm3
movdqu %xmm3,(%rdx,%rax,4)
movdqu 0x10(%rdi,%rax,4),%xmm3
movdqa %xmm3,%xmm4
psrlw  $0x8,%xmm4
pshufd $0xf5,%xmm4,%xmm5
pmuludq %xmm0,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm4
pand   %xmm2,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
movdqa %xmm2,%xmm5
pandn  %xmm4,%xmm5
psrlw  $0x8,%xmm3
por    %xmm5,%xmm3
movdqu %xmm3,0x10(%rdx,%rax,4)
add    $0x8,%rax
add    $0xfffffffffffffffe,%r11
jne    11b0 <_op_blend_p_caa_dp+0xb0>
test   $0x1,%r10b
je     12e4 <_op_blend_p_caa_dp+0x1e4>
movdqu (%rdi,%rax,4),%xmm2
movdqa %xmm2,%xmm3
psrlw  $0x8,%xmm3
pshufd $0xf5,%xmm3,%xmm4
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm3
movdqa 0xd4d(%rip),%xmm4
pand   %xmm4,%xmm2
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm1,%xmm2
pshufd $0xe8,%xmm2,%xmm1
punpckldq %xmm1,%xmm0
pandn  %xmm3,%xmm4
psrlw  $0x8,%xmm0
por    %xmm4,%xmm0
movdqu %xmm0,(%rdx,%rax,4)
cmp    %r8,%r9
je     133d <_op_blend_p_caa_dp+0x23d>
lea    (%rdi,%r8,4),%rdi
lea    (%rdx,%r8,4),%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rdi),%eax
mov    %eax,%r8d
shr    $0x8,%r8d
and    $0xff00ff,%r8d
imul   %ecx,%r8d
and    $0xff00ff00,%r8d
and    $0xff00ff,%eax
imul   %ecx,%eax
shr    $0x8,%eax
and    $0xff00ff,%eax
or     %r8d,%eax
mov    %eax,(%rdx)
add    $0x4,%rdx
add    $0x4,%rdi
cmp    %rsi,%rdx
jb     1300 <_op_blend_p_caa_dp+0x200>
ret
xor    %eax,%eax
test   $0x1,%r10b
jne    1282 <_op_blend_p_caa_dp+0x182>
jmp    12e4 <_op_blend_p_caa_dp+0x1e4>

LLVM IR (-O0):
define void @_op_blend_p_caa_dp(i32* %0, i32* %1, i32* %2, i32 %3) {
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i32* %2, i32** %7
store i32 %3, i32* %8
br label %9
9: ; preds = %13, %4
%10 = load i32*, i32** %7
%11 = load i32*, i32** %6
%12 = icmp ult i32* %10, %11
br i1 %12, label %13, label %34
13: ; preds = %9
%14 = load i32*, i32** %5
%15 = load i32, i32* %14
%16 = lshr i32 %15, 8
%17 = and i32 %16, 16711935
%18 = load i32, i32* %8
%19 = mul i32 %17, %18
%20 = and i32 %19, -16711936
%21 = load i32*, i32** %5
%22 = load i32, i32* %21
%23 = and i32 %22, 16711935
%24 = load i32, i32* %8
%25 = mul i32 %23, %24
%26 = lshr i32 %25, 8
%27 = and i32 %26, 16711935
%28 = add i32 %20, %27
%29 = load i32*, i32** %7
store i32 %28, i32* %29
%30 = load i32*, i32** %7
%31 = getelementptr inbounds i32, i32* %30, i32 1
store i32* %31, i32** %7
%32 = load i32*, i32** %5
%33 = getelementptr inbounds i32, i32* %32, i32 1
store i32* %33, i32** %5
br label %9
34: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @_op_blend_p_caa_dp(i32* nocapture %0, i32* readnone %1, i32* writeonly %2, i32 %3) {
%5 = ptrtoint i32* %2 to i64
%6 = ptrtoint i32* %2 to i64
%7 = ptrtoint i32* %1 to i64
%8 = icmp ult i32* %2, %1
br i1 %8, label %9, label %117
9: ; preds = %4
%10 = ptrtoint i32* %1 to i64
%11 = add i64 %5, 4
%12 = call i64 @llvm.umax.i64(i64 %10, i64 %11)
%13 = xor i64 %5, -1
%14 = add i64 %12, %13
%15 = lshr i64 %14, 2
%16 = add nuw nsw i64 %15, 1
%17 = icmp ult i64 %14, 12
br i1 %17, label %98, label %18
18: ; preds = %9
%19 = add i64 %6, 4
%20 = call i64 @llvm.umax.i64(i64 %7, i64 %19)
%21 = xor i64 %6, -1
%22 = add i64 %20, %21
%23 = lshr i64 %22, 2
%24 = add nuw nsw i64 %23, 1
%25 = getelementptr i32, i32* %2, i64 %24
%26 = getelementptr i32, i32* %0, i64 %24
%27 = icmp ugt i32* %26, %2
%28 = icmp ugt i32* %25, %0
%29 = and i1 %27, %28
br i1 %29, label %98, label %30
30: ; preds = %18
%31 = and i64 %16, 9223372036854775804
%32 = getelementptr i32, i32* %0, i64 %31
%33 = getelementptr i32, i32* %2, i64 %31
%34 = insertelement <4 x i32> poison, i32 %3, i64 0
%35 = shufflevector <4 x i32> %34, <4 x i32> poison, <4 x i32> zeroinitializer
%36 = add nsw i64 %31, -4
%37 = lshr exact i64 %36, 2
%38 = add nuw nsw i64 %37, 1
%39 = and i64 %38, 1
%40 = icmp eq i64 %36, 0
br i1 %40, label %78, label %41
41: ; preds = %30
%42 = and i64 %38, 9223372036854775806
br label %43
43: ; preds = %43, %41
%44 = phi i64 [ 0, %41 ], [ %75, %43 ]
%45 = phi i64 [ 0, %41 ], [ %76, %43 ]
%46 = getelementptr i32, i32* %0, i64 %44
%47 = getelementptr i32, i32* %2, i64 %44
%48 = bitcast i32* %46 to <4 x i32>*
%49 = load <4 x i32>, <4 x i32>* %48
%50 = lshr <4 x i32> %49, <i32 8, i32 8, i32 8, i32 8>
%51 = and <4 x i32> %50, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%52 = mul <4 x i32> %51, %35
%53 = and <4 x i32> %52, <i32 -16711936, i32 -16711936, i32 -16711936, i32 -16711936>
%54 = and <4 x i32> %49, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%55 = mul <4 x i32> %54, %35
%56 = lshr <4 x i32> %55, <i32 8, i32 8, i32 8, i32 8>
%57 = and <4 x i32> %56, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%58 = or <4 x i32> %53, %57
%59 = bitcast i32* %47 to <4 x i32>*
store <4 x i32> %58, <4 x i32>* %59
%60 = or i64 %44, 4
%61 = getelementptr i32, i32* %0, i64 %60
%62 = getelementptr i32, i32* %2, i64 %60
%63 = bitcast i32* %61 to <4 x i32>*
%64 = load <4 x i32>, <4 x i32>* %63
%65 = lshr <4 x i32> %64, <i32 8, i32 8, i32 8, i32 8>
%66 = and <4 x i32> %65, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%67 = mul <4 x i32> %66, %35
%68 = and <4 x i32> %67, <i32 -16711936, i32 -16711936, i32 -16711936, i32 -16711936>
%69 = and <4 x i32> %64, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%70 = mul <4 x i32> %69, %35
%71 = lshr <4 x i32> %70, <i32 8, i32 8, i32 8, i32 8>
%72 = and <4 x i32> %71, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%73 = or <4 x i32> %68, %72
%74 = bitcast i32* %62 to <4 x i32>*
store <4 x i32> %73, <4 x i32>* %74
%75 = add nuw i64 %44, 8
%76 = add i64 %45, 2
%77 = icmp eq i64 %76, %42
br i1 %77, label %78, label %43
78: ; preds = %43, %30
%79 = phi i64 [ 0, %30 ], [ %75, %43 ]
%80 = icmp eq i64 %39, 0
br i1 %80, label %96, label %81
81: ; preds = %78
%82 = getelementptr i32, i32* %0, i64 %79
%83 = getelementptr i32, i32* %2, i64 %79
%84 = bitcast i32* %82 to <4 x i32>*
%85 = load <4 x i32>, <4 x i32>* %84
%86 = lshr <4 x i32> %85, <i32 8, i32 8, i32 8, i32 8>
%87 = and <4 x i32> %86, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%88 = mul <4 x i32> %87, %35
%89 = and <4 x i32> %88, <i32 -16711936, i32 -16711936, i32 -16711936, i32 -16711936>
%90 = and <4 x i32> %85, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%91 = mul <4 x i32> %90, %35
%92 = lshr <4 x i32> %91, <i32 8, i32 8, i32 8, i32 8>
%93 = and <4 x i32> %92, <i32 16711935, i32 16711935, i32 16711935, i32 16711935>
%94 = or <4 x i32> %89, %93
%95 = bitcast i32* %83 to <4 x i32>*
store <4 x i32> %94, <4 x i32>* %95
br label %96
96: ; preds = %78, %81
%97 = icmp eq i64 %16, %31
br i1 %97, label %117, label %98
98: ; preds = %18, %9, %96
%99 = phi i32* [ %0, %18 ], [ %0, %9 ], [ %32, %96 ]
%100 = phi i32* [ %2, %18 ], [ %2, %9 ], [ %33, %96 ]
br label %101
101: ; preds = %98, %101
%102 = phi i32* [ %115, %101 ], [ %99, %98 ]
%103 = phi i32* [ %114, %101 ], [ %100, %98 ]
%104 = load i32, i32* %102
%105 = lshr i32 %104, 8
%106 = and i32 %105, 16711935
%107 = mul i32 %106, %3
%108 = and i32 %107, -16711936
%109 = and i32 %104, 16711935
%110 = mul i32 %109, %3
%111 = lshr i32 %110, 8
%112 = and i32 %111, 16711935
%113 = or i32 %108, %112
store i32 %113, i32* %103
%114 = getelementptr inbounds i32, i32* %103, i64 1
%115 = getelementptr inbounds i32, i32* %102, i64 1
%116 = icmp ult i32* %114, %1
br i1 %116, label %101, label %117
117: ; preds = %101, %96, %4
ret void
}