#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 */

/* Variables and functions */
int /*<<< orphan*/ color_content(short, short *, short *, short *);
int /*<<< orphan*/ init_color(short, short, short, short);
void blend(short color1, float i1, short color2, float i2, short dest) {
  short r1, r2;
  short g1, g2;
  short b1, b2;
  color_content(color1, &r1, &g1, &b1);
  color_content(color2, &r2, &g2, &b2);
  r1 = (i1 == 0.0) ? r2 : (((i1 * r1) + (i2 * r2)) / 2);
  g1 = (i1 == 0.0) ? g2 : (((i1 * g1) + (i2 * g2)) / 2);
  b1 = (i1 == 0.0) ? b2 : (((i1 * b1) + (i2 * b2)) / 2);
  init_color(dest, r1, g1, b1);
}


x86 assembly (clang, -O0):
<blend>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %dx,%ax
mov    %si,%cx
mov    %di,%dx
mov    %dx,-0x2(%rbp)
movss  %xmm0,-0x8(%rbp)
mov    %cx,-0xa(%rbp)
movss  %xmm1,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
lea    -0x14(%rbp),%rsi
lea    -0x18(%rbp),%rdx
lea    -0x1c(%rbp),%rcx
movswl -0x2(%rbp),%edi
call   1040 <color_content@plt>
lea    -0x16(%rbp),%rsi
lea    -0x1a(%rbp),%rdx
lea    -0x1e(%rbp),%rcx
movswl -0xa(%rbp),%edi
call   1040 <color_content@plt>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    119f <blend+0x7f>
jp     119f <blend+0x7f>
movswl -0x16(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    11d6 <blend+0xb6>
movss  -0x8(%rbp),%xmm0
movswl -0x14(%rbp),%eax
cvtsi2ss %eax,%xmm2
movss  -0x10(%rbp),%xmm1
movswl -0x16(%rbp),%eax
cvtsi2ss %eax,%xmm3
mulss  %xmm3,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe33(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1211 <blend+0xf1>
jp     1211 <blend+0xf1>
movswl -0x1a(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    1248 <blend+0x128>
movss  -0x8(%rbp),%xmm0
movswl -0x18(%rbp),%eax
cvtsi2ss %eax,%xmm2
movss  -0x10(%rbp),%xmm1
movswl -0x1a(%rbp),%eax
cvtsi2ss %eax,%xmm3
mulss  %xmm3,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xdc1(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1283 <blend+0x163>
jp     1283 <blend+0x163>
movswl -0x1e(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    12ba <blend+0x19a>
movss  -0x8(%rbp),%xmm0
movswl -0x1c(%rbp),%eax
cvtsi2ss %eax,%xmm2
movss  -0x10(%rbp),%xmm1
movswl -0x1e(%rbp),%eax
cvtsi2ss %eax,%xmm3
mulss  %xmm3,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xd4f(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,-0x1c(%rbp)
mov    -0x12(%rbp),%dx
mov    -0x14(%rbp),%cx
mov    -0x18(%rbp),%ax
movswl %dx,%edi
movswl %cx,%esi
movswl %ax,%edx
movswl -0x1c(%rbp),%ecx
call   1030 <init_color@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<blend>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
mov    %edx,%ebx
movss  %xmm1,0x10(%rsp)
mov    %esi,%ebp
movss  %xmm0,0x14(%rsp)
lea    0x6(%rsp),%rsi
lea    0x4(%rsp),%rdx
lea    0xa(%rsp),%rcx
call   1040 <color_content@plt>
lea    0xe(%rsp),%rsi
lea    0xc(%rsp),%rdx
lea    0x8(%rsp),%rcx
mov    %ebp,%edi
call   1040 <color_content@plt>
movss  0x14(%rsp),%xmm3
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm3
jne    1195 <blend+0x75>
jp     1195 <blend+0x75>
movzwl 0xe(%rsp),%eax
mov    %ax,0x6(%rsp)
movzwl 0xc(%rsp),%ecx
mov    %cx,0x4(%rsp)
movswl 0x8(%rsp),%edx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
jmp    122a <blend+0x10a>
movswl 0x6(%rsp),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movswl 0xe(%rsp),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
movss  0x10(%rsp),%xmm4
mulss  %xmm4,%xmm1
mulss  %xmm3,%xmm0
addss  %xmm1,%xmm0
movss  0xe39(%rip),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
movswl 0x4(%rsp),%ecx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
movswl 0xc(%rsp),%ecx
cvtsi2ss %ecx,%xmm2
mov    %ax,0x6(%rsp)
mulss  %xmm4,%xmm2
mulss  %xmm3,%xmm0
addss  %xmm2,%xmm0
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%ecx
mov    %cx,0x4(%rsp)
movswl 0xa(%rsp),%edx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
movswl 0x8(%rsp),%edx
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
mulss  %xmm4,%xmm2
mulss  %xmm3,%xmm0
addss  %xmm2,%xmm0
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%ebp
mov    %bp,0xa(%rsp)
movswl %bx,%edi
movswl %ax,%esi
movswl %cx,%edx
movswl %bp,%ecx
call   1030 <init_color@plt>
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @blend(i16 signext %0, float %1, i16 signext %2, float %3, i16 signext %4) {
%6 = alloca i16
%7 = alloca float
%8 = alloca i16
%9 = alloca float
%10 = alloca i16
%11 = alloca i16
%12 = alloca i16
%13 = alloca i16
%14 = alloca i16
%15 = alloca i16
%16 = alloca i16
store i16 %0, i16* %6
store float %1, float* %7
store i16 %2, i16* %8
store float %3, float* %9
store i16 %4, i16* %10
%17 = load i16, i16* %6
%18 = call i32 @color_content(i16 signext %17, i16* %11, i16* %13, i16* %15)
%19 = load i16, i16* %8
%20 = call i32 @color_content(i16 signext %19, i16* %12, i16* %14, i16* %16)
%21 = load float, float* %7
%22 = fpext float %21 to double
%23 = fcmp oeq double %22, 0.000000e+00
br i1 %23, label %24, label %28
24: ; preds = %5
%25 = load i16, i16* %12
%26 = sext i16 %25 to i32
%27 = sitofp i32 %26 to float
br label %40
28: ; preds = %5
%29 = load float, float* %7
%30 = load i16, i16* %11
%31 = sext i16 %30 to i32
%32 = sitofp i32 %31 to float
%33 = load float, float* %9
%34 = load i16, i16* %12
%35 = sext i16 %34 to i32
%36 = sitofp i32 %35 to float
%37 = fmul float %33, %36
%38 = call float @llvm.fmuladd.f32(float %29, float %32, float %37)
%39 = fdiv float %38, 2.000000e+00
br label %40
40: ; preds = %28, %24
%41 = phi float [ %27, %24 ], [ %39, %28 ]
%42 = fptosi float %41 to i16
store i16 %42, i16* %11
%43 = load float, float* %7
%44 = fpext float %43 to double
%45 = fcmp oeq double %44, 0.000000e+00
br i1 %45, label %46, label %50
46: ; preds = %40
%47 = load i16, i16* %14
%48 = sext i16 %47 to i32
%49 = sitofp i32 %48 to float
br label %62
50: ; preds = %40
%51 = load float, float* %7
%52 = load i16, i16* %13
%53 = sext i16 %52 to i32
%54 = sitofp i32 %53 to float
%55 = load float, float* %9
%56 = load i16, i16* %14
%57 = sext i16 %56 to i32
%58 = sitofp i32 %57 to float
%59 = fmul float %55, %58
%60 = call float @llvm.fmuladd.f32(float %51, float %54, float %59)
%61 = fdiv float %60, 2.000000e+00
br label %62
62: ; preds = %50, %46
%63 = phi float [ %49, %46 ], [ %61, %50 ]
%64 = fptosi float %63 to i16
store i16 %64, i16* %13
%65 = load float, float* %7
%66 = fpext float %65 to double
%67 = fcmp oeq double %66, 0.000000e+00
br i1 %67, label %68, label %72
68: ; preds = %62
%69 = load i16, i16* %16
%70 = sext i16 %69 to i32
%71 = sitofp i32 %70 to float
br label %84
72: ; preds = %62
%73 = load float, float* %7
%74 = load i16, i16* %15
%75 = sext i16 %74 to i32
%76 = sitofp i32 %75 to float
%77 = load float, float* %9
%78 = load i16, i16* %16
%79 = sext i16 %78 to i32
%80 = sitofp i32 %79 to float
%81 = fmul float %77, %80
%82 = call float @llvm.fmuladd.f32(float %73, float %76, float %81)
%83 = fdiv float %82, 2.000000e+00
br label %84
84: ; preds = %72, %68
%85 = phi float [ %71, %68 ], [ %83, %72 ]
%86 = fptosi float %85 to i16
store i16 %86, i16* %15
%87 = load i16, i16* %10
%88 = load i16, i16* %11
%89 = load i16, i16* %13
%90 = load i16, i16* %15
%91 = call i32 @init_color(i16 signext %87, i16 signext %88, i16 signext %89, i16 signext %90)
ret void
}

LLVM IR (-O2):
define void @blend(i16 signext %0, float %1, i16 signext %2, float %3, i16 signext %4) {
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
%11 = alloca i16
%12 = bitcast i16* %6 to i8*
%13 = bitcast i16* %7 to i8*
%14 = bitcast i16* %8 to i8*
%15 = bitcast i16* %9 to i8*
%16 = bitcast i16* %10 to i8*
%17 = bitcast i16* %11 to i8*
%18 = call i32 @color_content(i16 signext %0, i16* %6, i16* %8, i16* %10)
%19 = call i32 @color_content(i16 signext %2, i16* %7, i16* %9, i16* %11)
%20 = fcmp oeq float %1, 0.000000e+00
br i1 %20, label %21, label %26
21: ; preds = %5
%22 = load i16, i16* %7
store i16 %22, i16* %6
%23 = load i16, i16* %9
store i16 %23, i16* %8
%24 = load i16, i16* %11
%25 = sitofp i16 %24 to float
br label %50
26: ; preds = %5
%27 = load i16, i16* %6
%28 = sitofp i16 %27 to float
%29 = load i16, i16* %7
%30 = sitofp i16 %29 to float
%31 = fmul float %30, %3
%32 = call float @llvm.fmuladd.f32(float %1, float %28, float %31)
%33 = fmul float %32, 5.000000e-01
%34 = fptosi float %33 to i16
store i16 %34, i16* %6
%35 = load i16, i16* %8
%36 = sitofp i16 %35 to float
%37 = load i16, i16* %9
%38 = sitofp i16 %37 to float
%39 = fmul float %38, %3
%40 = call float @llvm.fmuladd.f32(float %1, float %36, float %39)
%41 = fmul float %40, 5.000000e-01
%42 = fptosi float %41 to i16
store i16 %42, i16* %8
%43 = load i16, i16* %10
%44 = sitofp i16 %43 to float
%45 = load i16, i16* %11
%46 = sitofp i16 %45 to float
%47 = fmul float %46, %3
%48 = call float @llvm.fmuladd.f32(float %1, float %44, float %47)
%49 = fmul float %48, 5.000000e-01
br label %50
50: ; preds = %26, %21
%51 = phi i16 [ %23, %21 ], [ %42, %26 ]
%52 = phi i16 [ %22, %21 ], [ %34, %26 ]
%53 = phi float [ %25, %21 ], [ %49, %26 ]
%54 = fptosi float %53 to i16
store i16 %54, i16* %10
%55 = call i32 @init_color(i16 signext %4, i16 signext %52, i16 signext %51, i16 signext %54)
ret void
}