void RgbToYuv(unsigned char RGB[3], unsigned char YUV[3]) {
  YUV[0] = 0.299 * RGB[0] + 0.587 * RGB[1] + 0.114 * RGB[2];
  YUV[1] = -0.1687 * RGB[0] + 0.3313 * RGB[1] + 0.5 * RGB[2] + 128;
  YUV[2] = 0.5 * RGB[0] - 0.4187 * RGB[1] - 0.0813 * RGB[2] + 128;
}


x86 assembly (clang, -O0):
<RgbToYuv>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
cvtsi2sd %ecx,%xmm1
movzbl 0x1(%rax),%ecx
cvtsi2sd %ecx,%xmm0
movsd  0xed9(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xed5(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movzbl 0x2(%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xec5(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
cvtsi2sd %ecx,%xmm1
movzbl 0x1(%rax),%ecx
cvtsi2sd %ecx,%xmm0
movsd  0xe9e(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xe9a(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movzbl 0x2(%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe8a(%rip),%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe82(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x8(%rbp),%rax
movzbl (%rax),%ecx
cvtsi2sd %ecx,%xmm2
movzbl 0x1(%rax),%ecx
cvtsi2sd %ecx,%xmm0
movsd  0xe5e(%rip),%xmm4
mulsd  %xmm4,%xmm0
mulsd  %xmm3,%xmm2
addsd  %xmm0,%xmm2
movzbl 0x2(%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe4a(%rip),%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<RgbToYuv>:
movzbl (%rdi),%eax
cvtsi2sd %eax,%xmm0
movzbl 0x1(%rdi),%eax
cvtsi2sd %eax,%xmm1
mulsd  0xee9(%rip),%xmm1
mulsd  0xee9(%rip),%xmm0
movzbl 0x2(%rdi),%eax
cvtsi2sd %eax,%xmm2
mulsd  0xee1(%rip),%xmm2
addsd  %xmm1,%xmm0
addsd  %xmm0,%xmm2
cvttsd2si %xmm2,%eax
mov    %al,(%rsi)
movzbl (%rdi),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movzbl 0x1(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0xebe(%rip),%xmm1
mulsd  0xebe(%rip),%xmm0
addsd  %xmm1,%xmm0
movzbl 0x2(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0xeaf(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
addsd  %xmm0,%xmm1
cvttsd2si %xmm1,%eax
mov    %al,0x1(%rsi)
movzbl (%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movzbl 0x1(%rdi),%eax
cvtsi2sd %eax,%xmm3
mulsd  0xe8a(%rip),%xmm3
mulsd  %xmm2,%xmm1
movzbl 0x2(%rdi),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
addsd  %xmm3,%xmm1
mulsd  0xe77(%rip),%xmm2
addsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
cvttsd2si %xmm2,%eax
mov    %al,0x2(%rsi)
ret

LLVM IR (-O0):
define void @RgbToYuv(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
store i8* %0, i8** %3
store i8* %1, i8** %4
%5 = load i8*, i8** %3
%6 = getelementptr inbounds i8, i8* %5, i64 0
%7 = load i8, i8* %6
%8 = zext i8 %7 to i32
%9 = sitofp i32 %8 to double
%10 = load i8*, i8** %3
%11 = getelementptr inbounds i8, i8* %10, i64 1
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = sitofp i32 %13 to double
%15 = fmul double 5.870000e-01, %14
%16 = call double @llvm.fmuladd.f64(double 2.990000e-01, double %9, double %15)
%17 = load i8*, i8** %3
%18 = getelementptr inbounds i8, i8* %17, i64 2
%19 = load i8, i8* %18
%20 = zext i8 %19 to i32
%21 = sitofp i32 %20 to double
%22 = call double @llvm.fmuladd.f64(double 1.140000e-01, double %21, double %16)
%23 = fptoui double %22 to i8
%24 = load i8*, i8** %4
%25 = getelementptr inbounds i8, i8* %24, i64 0
store i8 %23, i8* %25
%26 = load i8*, i8** %3
%27 = getelementptr inbounds i8, i8* %26, i64 0
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = sitofp i32 %29 to double
%31 = load i8*, i8** %3
%32 = getelementptr inbounds i8, i8* %31, i64 1
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = sitofp i32 %34 to double
%36 = fmul double 3.313000e-01, %35
%37 = call double @llvm.fmuladd.f64(double -1.687000e-01, double %30, double %36)
%38 = load i8*, i8** %3
%39 = getelementptr inbounds i8, i8* %38, i64 2
%40 = load i8, i8* %39
%41 = zext i8 %40 to i32
%42 = sitofp i32 %41 to double
%43 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %42, double %37)
%44 = fadd double %43, 1.280000e+02
%45 = fptoui double %44 to i8
%46 = load i8*, i8** %4
%47 = getelementptr inbounds i8, i8* %46, i64 1
store i8 %45, i8* %47
%48 = load i8*, i8** %3
%49 = getelementptr inbounds i8, i8* %48, i64 0
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
%52 = sitofp i32 %51 to double
%53 = load i8*, i8** %3
%54 = getelementptr inbounds i8, i8* %53, i64 1
%55 = load i8, i8* %54
%56 = zext i8 %55 to i32
%57 = sitofp i32 %56 to double
%58 = fmul double 4.187000e-01, %57
%59 = fneg double %58
%60 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %52, double %59)
%61 = load i8*, i8** %3
%62 = getelementptr inbounds i8, i8* %61, i64 2
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = sitofp i32 %64 to double
%66 = call double @llvm.fmuladd.f64(double 0xBFB4D013A92A3055, double %65, double %60)
%67 = fadd double %66, 1.280000e+02
%68 = fptoui double %67 to i8
%69 = load i8*, i8** %4
%70 = getelementptr inbounds i8, i8* %69, i64 2
store i8 %68, i8* %70
ret void
}

LLVM IR (-O2):
define void @RgbToYuv(i8* nocapture %0, i8* nocapture writeonly %1) {
%3 = load i8, i8* %0
%4 = uitofp i8 %3 to double
%5 = getelementptr inbounds i8, i8* %0, i64 1
%6 = load i8, i8* %5
%7 = uitofp i8 %6 to double
%8 = fmul double %7, 5.870000e-01
%9 = tail call double @llvm.fmuladd.f64(double %4, double 2.990000e-01, double %8)
%10 = getelementptr inbounds i8, i8* %0, i64 2
%11 = load i8, i8* %10
%12 = uitofp i8 %11 to double
%13 = tail call double @llvm.fmuladd.f64(double %12, double 1.140000e-01, double %9)
%14 = fptoui double %13 to i8
store i8 %14, i8* %1
%15 = load i8, i8* %0
%16 = uitofp i8 %15 to double
%17 = load i8, i8* %5
%18 = uitofp i8 %17 to double
%19 = fmul double %18, 3.313000e-01
%20 = tail call double @llvm.fmuladd.f64(double %16, double -1.687000e-01, double %19)
%21 = load i8, i8* %10
%22 = uitofp i8 %21 to double
%23 = tail call double @llvm.fmuladd.f64(double %22, double 5.000000e-01, double %20)
%24 = fadd double %23, 1.280000e+02
%25 = fptoui double %24 to i8
%26 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %25, i8* %26
%27 = load i8, i8* %0
%28 = uitofp i8 %27 to double
%29 = load i8, i8* %5
%30 = uitofp i8 %29 to double
%31 = fmul double %30, -4.187000e-01
%32 = tail call double @llvm.fmuladd.f64(double %28, double 5.000000e-01, double %31)
%33 = load i8, i8* %10
%34 = uitofp i8 %33 to double
%35 = tail call double @llvm.fmuladd.f64(double %34, double 0xBFB4D013A92A3055, double %32)
%36 = fadd double %35, 1.280000e+02
%37 = fptoui double %36 to i8
%38 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %37, i8* %38
ret void
}