#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 float uint8_t;

/* Variables and functions */
void rgb2yuv(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t *y, uint8_t *u,
             uint8_t *v, int dark) {
  float m[9] = {0.29900, 0.58700, 0.11400,  -0.14713, -0.28886,
                0.43600, 0.61500, -0.51499, -0.10001};
  if (dark) {
    *y = (a * (m[0] * r + m[1] * g + m[2] * b) + (255 - a) * *y) / 255;
    *u = (a * (m[3] * r + m[4] * g + m[5] * b + 128) + (255 - a) * *u) / 255;
    *v = (a * (m[6] * r + m[7] * g + m[8] * b + 128) + (255 - a) * *v) / 255;
  } else {
    *y = (a * (0) + (255 - a) * *y) / 255;
    *u = (a * (128) + (255 - a) * *u) / 255;
    *v = (a * (128) + (255 - a) * *v) / 255;
  }
}


x86 assembly (clang, -O0):
<rgb2yuv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
lea    -0x50(%rbp),%rdi
lea    0xeca(%rip),%rsi
mov    $0x24,%edx
call   1030 <memcpy@plt>
cmpl   $0x0,-0x2c(%rbp)
je     12a3 <rgb2yuv+0x193>
movss  -0x10(%rbp),%xmm0
movss  -0x50(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
movss  -0x4c(%rbp),%xmm2
mulss  -0x8(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
movss  -0x48(%rbp),%xmm2
movss  -0xc(%rbp),%xmm3
mulss  %xmm3,%xmm2
addss  %xmm1,%xmm2
movss  0xe6b(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe4e(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm0
movss  -0x44(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
movss  -0x40(%rbp),%xmm2
mulss  -0x8(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
movss  -0x3c(%rbp),%xmm2
movss  -0xc(%rbp),%xmm3
mulss  %xmm3,%xmm2
addss  %xmm1,%xmm2
movss  0xe0b(%rip),%xmm1
addss  %xmm1,%xmm2
movss  0xdfb(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mulss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xdde(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm0
movss  -0x38(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
movss  -0x34(%rbp),%xmm2
mulss  -0x8(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
movss  -0x30(%rbp),%xmm2
movss  -0xc(%rbp),%xmm3
mulss  %xmm3,%xmm2
addss  %xmm1,%xmm2
movss  0xd9b(%rip),%xmm1
addss  %xmm1,%xmm2
movss  0xd8b(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mulss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xd6e(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1358 <rgb2yuv+0x248>
movss  -0x10(%rbp),%xmm0
movss  0xd50(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  (%rax),%xmm1
xorps  %xmm2,%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xd30(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm0
movss  0xd17(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mulss  (%rax),%xmm1
movss  0xd06(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xcf2(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm0
movss  0xcd9(%rip),%xmm1
subss  -0x10(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mulss  (%rax),%xmm1
movss  0xcc8(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xcb4(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb2yuv>:
test   %ecx,%ecx
je     11e0 <rgb2yuv+0xe0>
movss  0xef0(%rip),%xmm4
mulss  %xmm1,%xmm4
movss  0xee8(%rip),%xmm5
mulss  %xmm0,%xmm5
addss  %xmm4,%xmm5
movss  0xedc(%rip),%xmm6
mulss  %xmm2,%xmm6
addss  %xmm5,%xmm6
movss  0xed0(%rip),%xmm5
movaps %xmm5,%xmm4
subss  %xmm3,%xmm4
movss  (%rdi),%xmm7
mulss  %xmm4,%xmm7
mulss  %xmm3,%xmm6
addss  %xmm7,%xmm6
divss  %xmm5,%xmm6
movss  %xmm6,(%rdi)
movss  0xead(%rip),%xmm6
mulss  %xmm1,%xmm6
movss  0xea5(%rip),%xmm7
mulss  %xmm0,%xmm7
addss  %xmm6,%xmm7
movss  0xe99(%rip),%xmm6
mulss  %xmm2,%xmm6
addss  %xmm7,%xmm6
movss  0xe8c(%rip),%xmm8
addss  %xmm8,%xmm6
movss  (%rsi),%xmm7
mulss  %xmm4,%xmm7
mulss  %xmm3,%xmm6
addss  %xmm7,%xmm6
divss  %xmm5,%xmm6
mulss  0xe6f(%rip),%xmm1
movss  %xmm6,(%rsi)
mulss  0xe67(%rip),%xmm0
addss  %xmm1,%xmm0
mulss  0xe5f(%rip),%xmm2
addss  %xmm0,%xmm2
addss  %xmm8,%xmm2
mulss  (%rdx),%xmm4
mulss  %xmm3,%xmm2
addss  %xmm4,%xmm2
jmp    122e <rgb2yuv+0x12e>
movss  0xe24(%rip),%xmm0
movaps %xmm0,%xmm2
subss  %xmm3,%xmm2
movss  (%rdi),%xmm1
mulss  %xmm2,%xmm1
xorps  %xmm4,%xmm4
mulss  %xmm3,%xmm4
addss  %xmm1,%xmm4
divss  %xmm0,%xmm4
movss  %xmm4,(%rdi)
movss  (%rsi),%xmm1
mulss  %xmm2,%xmm1
mulss  0xe02(%rip),%xmm3
addss  %xmm3,%xmm1
divss  %xmm0,%xmm1
movss  %xmm1,(%rsi)
mulss  (%rdx),%xmm2
addss  %xmm3,%xmm2
divss  0xdd6(%rip),%xmm2
movss  %xmm2,(%rdx)
ret

LLVM IR (-O0):
@__const.rgb2yuv.m = [9 x float] [float 0x3FD322D0E0000000, float 0x3FE2C8B440000000, float 0x3FBD2F1AA0000000, float 0xBFC2D527E0000000, float 0xBFD27CAEA0000000, float 0x3FDBE76C80000000, float 0x3FE3AE1480000000, float 0xBFE07ACC40000000, float 0xBFB99A4160000000]
define void @rgb2yuv(float %0, float %1, float %2, float %3, float* %4, float* %5, float* %6, i32 %7) {
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float*
%14 = alloca float*
%15 = alloca float*
%16 = alloca i32
%17 = alloca [9 x float]
store float %0, float* %9
store float %1, float* %10
store float %2, float* %11
store float %3, float* %12
store float* %4, float** %13
store float* %5, float** %14
store float* %6, float** %15
store i32 %7, i32* %16
%18 = bitcast [9 x float]* %17 to i8*
%19 = load i32, i32* %16
%20 = icmp ne i32 %19, 0
br i1 %20, label %21, label %87
21: ; preds = %8
%22 = load float, float* %12
%23 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 0
%24 = load float, float* %23
%25 = load float, float* %9
%26 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 1
%27 = load float, float* %26
%28 = load float, float* %10
%29 = fmul float %27, %28
%30 = call float @llvm.fmuladd.f32(float %24, float %25, float %29)
%31 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 2
%32 = load float, float* %31
%33 = load float, float* %11
%34 = call float @llvm.fmuladd.f32(float %32, float %33, float %30)
%35 = load float, float* %12
%36 = fsub float 2.550000e+02, %35
%37 = load float*, float** %13
%38 = load float, float* %37
%39 = fmul float %36, %38
%40 = call float @llvm.fmuladd.f32(float %22, float %34, float %39)
%41 = fdiv float %40, 2.550000e+02
%42 = load float*, float** %13
store float %41, float* %42
%43 = load float, float* %12
%44 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 3
%45 = load float, float* %44
%46 = load float, float* %9
%47 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 4
%48 = load float, float* %47
%49 = load float, float* %10
%50 = fmul float %48, %49
%51 = call float @llvm.fmuladd.f32(float %45, float %46, float %50)
%52 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 5
%53 = load float, float* %52
%54 = load float, float* %11
%55 = call float @llvm.fmuladd.f32(float %53, float %54, float %51)
%56 = fadd float %55, 1.280000e+02
%57 = load float, float* %12
%58 = fsub float 2.550000e+02, %57
%59 = load float*, float** %14
%60 = load float, float* %59
%61 = fmul float %58, %60
%62 = call float @llvm.fmuladd.f32(float %43, float %56, float %61)
%63 = fdiv float %62, 2.550000e+02
%64 = load float*, float** %14
store float %63, float* %64
%65 = load float, float* %12
%66 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 6
%67 = load float, float* %66
%68 = load float, float* %9
%69 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 7
%70 = load float, float* %69
%71 = load float, float* %10
%72 = fmul float %70, %71
%73 = call float @llvm.fmuladd.f32(float %67, float %68, float %72)
%74 = getelementptr inbounds [9 x float], [9 x float]* %17, i64 0, i64 8
%75 = load float, float* %74
%76 = load float, float* %11
%77 = call float @llvm.fmuladd.f32(float %75, float %76, float %73)
%78 = fadd float %77, 1.280000e+02
%79 = load float, float* %12
%80 = fsub float 2.550000e+02, %79
%81 = load float*, float** %15
%82 = load float, float* %81
%83 = fmul float %80, %82
%84 = call float @llvm.fmuladd.f32(float %65, float %78, float %83)
%85 = fdiv float %84, 2.550000e+02
%86 = load float*, float** %15
store float %85, float* %86
br label %115
87: ; preds = %8
%88 = load float, float* %12
%89 = load float, float* %12
%90 = fsub float 2.550000e+02, %89
%91 = load float*, float** %13
%92 = load float, float* %91
%93 = fmul float %90, %92
%94 = call float @llvm.fmuladd.f32(float %88, float 0.000000e+00, float %93)
%95 = fdiv float %94, 2.550000e+02
%96 = load float*, float** %13
store float %95, float* %96
%97 = load float, float* %12
%98 = load float, float* %12
%99 = fsub float 2.550000e+02, %98
%100 = load float*, float** %14
%101 = load float, float* %100
%102 = fmul float %99, %101
%103 = call float @llvm.fmuladd.f32(float %97, float 1.280000e+02, float %102)
%104 = fdiv float %103, 2.550000e+02
%105 = load float*, float** %14
store float %104, float* %105
%106 = load float, float* %12
%107 = load float, float* %12
%108 = fsub float 2.550000e+02, %107
%109 = load float*, float** %15
%110 = load float, float* %109
%111 = fmul float %108, %110
%112 = call float @llvm.fmuladd.f32(float %106, float 1.280000e+02, float %111)
%113 = fdiv float %112, 2.550000e+02
%114 = load float*, float** %15
store float %113, float* %114
br label %115
115: ; preds = %87, %21
ret void
}

LLVM IR (-O2):
define void @rgb2yuv(float %0, float %1, float %2, float %3, float* nocapture %4, float* nocapture %5, float* nocapture %6, i32 %7) {
%9 = icmp eq i32 %7, 0
br i1 %9, label %34, label %10
10: ; preds = %8
%11 = fmul float %1, 0x3FE2C8B440000000
%12 = tail call float @llvm.fmuladd.f32(float %0, float 0x3FD322D0E0000000, float %11)
%13 = tail call float @llvm.fmuladd.f32(float %2, float 0x3FBD2F1AA0000000, float %12)
%14 = fsub float 2.550000e+02, %3
%15 = load float, float* %4
%16 = fmul float %14, %15
%17 = tail call float @llvm.fmuladd.f32(float %3, float %13, float %16)
%18 = fdiv float %17, 2.550000e+02
store float %18, float* %4
%19 = fmul float %1, 0xBFD27CAEA0000000
%20 = tail call float @llvm.fmuladd.f32(float %0, float 0xBFC2D527E0000000, float %19)
%21 = tail call float @llvm.fmuladd.f32(float %2, float 0x3FDBE76C80000000, float %20)
%22 = fadd float %21, 1.280000e+02
%23 = load float, float* %5
%24 = fmul float %14, %23
%25 = tail call float @llvm.fmuladd.f32(float %3, float %22, float %24)
%26 = fdiv float %25, 2.550000e+02
store float %26, float* %5
%27 = fmul float %1, 0xBFE07ACC40000000
%28 = tail call float @llvm.fmuladd.f32(float %0, float 0x3FE3AE1480000000, float %27)
%29 = tail call float @llvm.fmuladd.f32(float %2, float 0xBFB99A4160000000, float %28)
%30 = fadd float %29, 1.280000e+02
%31 = load float, float* %6
%32 = fmul float %14, %31
%33 = tail call float @llvm.fmuladd.f32(float %3, float %30, float %32)
br label %47
34: ; preds = %8
%35 = fsub float 2.550000e+02, %3
%36 = load float, float* %4
%37 = fmul float %35, %36
%38 = tail call float @llvm.fmuladd.f32(float %3, float 0.000000e+00, float %37)
%39 = fdiv float %38, 2.550000e+02
store float %39, float* %4
%40 = load float, float* %5
%41 = fmul float %35, %40
%42 = tail call float @llvm.fmuladd.f32(float %3, float 1.280000e+02, float %41)
%43 = fdiv float %42, 2.550000e+02
store float %43, float* %5
%44 = load float, float* %6
%45 = fmul float %35, %44
%46 = tail call float @llvm.fmuladd.f32(float %3, float 1.280000e+02, float %45)
br label %47
47: ; preds = %34, %10
%48 = phi float [ %46, %34 ], [ %33, %10 ]
%49 = fdiv float %48, 2.550000e+02
store float %49, float* %6
ret void
}