#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint32_t;

/* Variables and functions */
void blend_image_inplace(uint32_t *background, uint32_t *foreground,
                         int count) {
  uint32_t Rf, Gf, Bf, Af;
  uint32_t Rb, Gb, Bb;
  uint32_t R, G, B;
  while (count) {
    Rf = (*foreground) & 0xff;
    Gf = ((*foreground) >> 8) & 0xff;
    Bf = ((*foreground) >> 16) & 0xff;
    Af = ((*foreground) >> 24) & 0xff;
    Rb = (*background) & 0xff;
    Gb = ((*background) >> 8) & 0xff;
    Bb = ((*background) >> 16) & 0xff;
    R = (Rf * Af) / 256 + Rb;
    G = (Gf * Af) / 256 + Gb;
    B = (Bf * Af) / 256 + Bb;
    if (R > 255)
      R = 255;
    if (G > 255)
      G = 255;
    if (B > 255)
      B = 255;
    (*background) = R | (G << 8) | (B << 16);
    foreground += 1;
    background += 1;
    count -= 1;
  }
}


x86 assembly (clang, -O0):
<blend_image_inplace>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1244 <blend_image_inplace+0x144>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
and    $0xff,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sar    $0x10,%eax
and    $0xff,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sar    $0x18,%eax
and    $0xff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
and    $0xff,%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
sar    $0x10,%eax
and    $0xff,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
add    -0x28(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x1c(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
add    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
add    -0x30(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xff,-0x34(%rbp)
jle    11dd <blend_image_inplace+0xdd>
movl   $0xff,-0x34(%rbp)
cmpl   $0xff,-0x38(%rbp)
jle    11f1 <blend_image_inplace+0xf1>
movl   $0xff,-0x38(%rbp)
cmpl   $0xff,-0x3c(%rbp)
jle    1205 <blend_image_inplace+0x105>
movl   $0xff,-0x3c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x38(%rbp),%eax
shl    $0x8,%eax
or     %eax,%ecx
mov    -0x3c(%rbp),%eax
shl    $0x10,%eax
or     %eax,%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <blend_image_inplace+0xf>
pop    %rbp
ret

x86 assembly (clang, -O2):
<blend_image_inplace>:
push   %rbp
push   %r14
push   %rbx
test   %edx,%edx
je     11c3 <blend_image_inplace+0xc3>
lea    -0x1(%rdx),%r8d
cmp    $0x3,%r8d
jb     1138 <blend_image_inplace+0x38>
lea    (%rsi,%r8,4),%rax
add    $0x4,%rax
cmp    %rdi,%rax
jbe    11c8 <blend_image_inplace+0xc8>
lea    (%rdi,%r8,4),%rax
add    $0x4,%rax
cmp    %rsi,%rax
jbe    11c8 <blend_image_inplace+0xc8>
mov    %rdi,%r11
mov    %rsi,%r10
mov    %edx,%r8d
xor    %edx,%edx
mov    $0xff,%r9d
nopl   0x0(%rax)
mov    (%r10,%rdx,4),%ecx
movzbl %cl,%eax
movzbl %ch,%edi
mov    %ecx,%ebx
shr    $0x10,%ebx
movzbl %bl,%r14d
shr    $0x18,%ecx
mov    (%r11,%rdx,4),%ebx
movzbl %bl,%esi
movzbl %bh,%ebp
shr    $0x10,%ebx
movzbl %bl,%ebx
imul   %ecx,%eax
shr    $0x8,%eax
add    %esi,%eax
imul   %ecx,%edi
shr    $0x8,%edi
add    %ebp,%edi
imul   %r14d,%ecx
shr    $0x8,%ecx
add    %ebx,%ecx
cmp    $0xff,%eax
cmovae %r9d,%eax
cmp    $0xff,%edi
cmovae %r9d,%edi
cmp    $0xff,%ecx
cmovae %r9d,%ecx
shl    $0x8,%edi
or     %eax,%edi
shl    $0x10,%ecx
or     %edi,%ecx
mov    %ecx,(%r11,%rdx,4)
add    $0x1,%rdx
cmp    %edx,%r8d
jne    1150 <blend_image_inplace+0x50>
pop    %rbx
pop    %r14
pop    %rbp
ret
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffffc,%r9
lea    (%rdi,%r9,4),%r11
lea    (%rsi,%r9,4),%r10
sub    %r9d,%edx
xor    %ecx,%ecx
movdqa 0xe18(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
movdqu (%rsi,%rcx,4),%xmm1
movdqa %xmm1,%xmm3
pand   %xmm0,%xmm3
movdqa %xmm1,%xmm2
psrld  $0x8,%xmm2
pand   %xmm0,%xmm2
movdqa %xmm1,%xmm4
psrld  $0x10,%xmm4
pand   %xmm0,%xmm4
psrld  $0x18,%xmm1
movdqu (%rdi,%rcx,4),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
movdqa %xmm5,%xmm7
psrld  $0x8,%xmm7
pand   %xmm0,%xmm7
psrld  $0x10,%xmm5
pand   %xmm0,%xmm5
pmaddwd %xmm1,%xmm3
psrld  $0x8,%xmm3
paddd  %xmm6,%xmm3
pmaddwd %xmm1,%xmm2
psrld  $0x8,%xmm2
paddd  %xmm7,%xmm2
pmaddwd %xmm4,%xmm1
psrld  $0x8,%xmm1
paddd  %xmm5,%xmm1
movdqa %xmm0,%xmm4
pcmpgtd %xmm3,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm0,%xmm4
por    %xmm3,%xmm4
movdqa %xmm0,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm0,%xmm3
por    %xmm2,%xmm3
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm1
pandn  %xmm0,%xmm2
por    %xmm1,%xmm2
pslld  $0x8,%xmm3
por    %xmm4,%xmm3
pslld  $0x10,%xmm2
por    %xmm3,%xmm2
movdqu %xmm2,(%rdi,%rcx,4)
add    $0x4,%rcx
cmp    %rcx,%r9
jne    11f0 <blend_image_inplace+0xf0>
cmp    %r9,%r8
jne    113e <blend_image_inplace+0x3e>
jmp    11c3 <blend_image_inplace+0xc3>

LLVM IR (-O0):
define void @blend_image_inplace(i32* %0, i32* %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i32* %0, i32** %4
store i32* %1, i32** %5
store i32 %2, i32* %6
br label %17
17: ; preds = %76, %3
%18 = load i32, i32* %6
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %91
20: ; preds = %17
%21 = load i32*, i32** %5
%22 = load i32, i32* %21
%23 = and i32 %22, 255
store i32 %23, i32* %7
%24 = load i32*, i32** %5
%25 = load i32, i32* %24
%26 = ashr i32 %25, 8
%27 = and i32 %26, 255
store i32 %27, i32* %8
%28 = load i32*, i32** %5
%29 = load i32, i32* %28
%30 = ashr i32 %29, 16
%31 = and i32 %30, 255
store i32 %31, i32* %9
%32 = load i32*, i32** %5
%33 = load i32, i32* %32
%34 = ashr i32 %33, 24
%35 = and i32 %34, 255
store i32 %35, i32* %10
%36 = load i32*, i32** %4
%37 = load i32, i32* %36
%38 = and i32 %37, 255
store i32 %38, i32* %11
%39 = load i32*, i32** %4
%40 = load i32, i32* %39
%41 = ashr i32 %40, 8
%42 = and i32 %41, 255
store i32 %42, i32* %12
%43 = load i32*, i32** %4
%44 = load i32, i32* %43
%45 = ashr i32 %44, 16
%46 = and i32 %45, 255
store i32 %46, i32* %13
%47 = load i32, i32* %7
%48 = load i32, i32* %10
%49 = mul nsw i32 %47, %48
%50 = sdiv i32 %49, 256
%51 = load i32, i32* %11
%52 = add nsw i32 %50, %51
store i32 %52, i32* %14
%53 = load i32, i32* %8
%54 = load i32, i32* %10
%55 = mul nsw i32 %53, %54
%56 = sdiv i32 %55, 256
%57 = load i32, i32* %12
%58 = add nsw i32 %56, %57
store i32 %58, i32* %15
%59 = load i32, i32* %9
%60 = load i32, i32* %10
%61 = mul nsw i32 %59, %60
%62 = sdiv i32 %61, 256
%63 = load i32, i32* %13
%64 = add nsw i32 %62, %63
store i32 %64, i32* %16
%65 = load i32, i32* %14
%66 = icmp sgt i32 %65, 255
br i1 %66, label %67, label %68
67: ; preds = %20
store i32 255, i32* %14
br label %68
68: ; preds = %67, %20
%69 = load i32, i32* %15
%70 = icmp sgt i32 %69, 255
br i1 %70, label %71, label %72
71: ; preds = %68
store i32 255, i32* %15
br label %72
72: ; preds = %71, %68
%73 = load i32, i32* %16
%74 = icmp sgt i32 %73, 255
br i1 %74, label %75, label %76
75: ; preds = %72
store i32 255, i32* %16
br label %76
76: ; preds = %75, %72
%77 = load i32, i32* %14
%78 = load i32, i32* %15
%79 = shl i32 %78, 8
%80 = or i32 %77, %79
%81 = load i32, i32* %16
%82 = shl i32 %81, 16
%83 = or i32 %80, %82
%84 = load i32*, i32** %4
store i32 %83, i32* %84
%85 = load i32*, i32** %5
%86 = getelementptr inbounds i32, i32* %85, i64 1
store i32* %86, i32** %5
%87 = load i32*, i32** %4
%88 = getelementptr inbounds i32, i32* %87, i64 1
store i32* %88, i32** %4
%89 = load i32, i32* %6
%90 = sub nsw i32 %89, 1
store i32 %90, i32* %6
br label %17
91: ; preds = %17
ret void
}

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