void RgbToYuv(unsigned char RGB[3], char YUV[3]) {
  YUV[0] = (0.257 * RGB[0]) + (0.504 * RGB[1]) + (0.098 * RGB[2]) + 16;
  YUV[1] = -(0.148 * RGB[0]) - (0.291 * RGB[1]) + (0.439 * RGB[2]) + 128;
  YUV[2] = (0.439 * RGB[0]) - (0.368 * RGB[1]) - (0.071 * 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
movsd  0xebd(%rip),%xmm1
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,%xmm0
movsd  0xea2(%rip),%xmm1
mulsd  %xmm1,%xmm0
movzbl 0x1(%rax),%ecx
cvtsi2sd %ecx,%xmm1
movsd  0xe96(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movzbl 0x2(%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe86(%rip),%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe7e(%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  0xe5a(%rip),%xmm4
mulsd  %xmm4,%xmm0
mulsd  %xmm3,%xmm2
addsd  %xmm0,%xmm2
movzbl 0x2(%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe46(%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
addsd  %xmm1,%xmm0
mulsd  0xedd(%rip),%xmm2
addsd  %xmm0,%xmm2
addsd  0xed9(%rip),%xmm2
cvttsd2si %xmm2,%eax
mov    %al,(%rsi)
movzbl (%rdi),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xec9(%rip),%xmm0
movzbl 0x1(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0xebe(%rip),%xmm1
addsd  %xmm0,%xmm1
movzbl 0x2(%rdi),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0xeaf(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xea7(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,0x1(%rsi)
movzbl (%rdi),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movzbl 0x1(%rdi),%eax
cvtsi2sd %eax,%xmm3
mulsd  0xe8a(%rip),%xmm3
mulsd  %xmm2,%xmm0
movzbl 0x2(%rdi),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
addsd  %xmm3,%xmm0
mulsd  0xe77(%rip),%xmm2
addsd  %xmm0,%xmm2
addsd  %xmm1,%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.040000e-01, %14
%16 = call double @llvm.fmuladd.f64(double 2.570000e-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 9.800000e-02, double %21, double %16)
%23 = fadd double %22, 1.600000e+01
%24 = fptosi double %23 to i8
%25 = load i8*, i8** %4
%26 = getelementptr inbounds i8, i8* %25, i64 0
store i8 %24, i8* %26
%27 = load i8*, i8** %3
%28 = getelementptr inbounds i8, i8* %27, i64 0
%29 = load i8, i8* %28
%30 = zext i8 %29 to i32
%31 = sitofp i32 %30 to double
%32 = fmul double 1.480000e-01, %31
%33 = fneg double %32
%34 = load i8*, i8** %3
%35 = getelementptr inbounds i8, i8* %34, i64 1
%36 = load i8, i8* %35
%37 = zext i8 %36 to i32
%38 = sitofp i32 %37 to double
%39 = call double @llvm.fmuladd.f64(double -2.910000e-01, double %38, double %33)
%40 = load i8*, i8** %3
%41 = getelementptr inbounds i8, i8* %40, i64 2
%42 = load i8, i8* %41
%43 = zext i8 %42 to i32
%44 = sitofp i32 %43 to double
%45 = call double @llvm.fmuladd.f64(double 4.390000e-01, double %44, double %39)
%46 = fadd double %45, 1.280000e+02
%47 = fptosi double %46 to i8
%48 = load i8*, i8** %4
%49 = getelementptr inbounds i8, i8* %48, i64 1
store i8 %47, i8* %49
%50 = load i8*, i8** %3
%51 = getelementptr inbounds i8, i8* %50, i64 0
%52 = load i8, i8* %51
%53 = zext i8 %52 to i32
%54 = sitofp i32 %53 to double
%55 = load i8*, i8** %3
%56 = getelementptr inbounds i8, i8* %55, i64 1
%57 = load i8, i8* %56
%58 = zext i8 %57 to i32
%59 = sitofp i32 %58 to double
%60 = fmul double 3.680000e-01, %59
%61 = fneg double %60
%62 = call double @llvm.fmuladd.f64(double 4.390000e-01, double %54, double %61)
%63 = load i8*, i8** %3
%64 = getelementptr inbounds i8, i8* %63, i64 2
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = sitofp i32 %66 to double
%68 = call double @llvm.fmuladd.f64(double 0xBFB22D0E56041893, double %67, double %62)
%69 = fadd double %68, 1.280000e+02
%70 = fptosi double %69 to i8
%71 = load i8*, i8** %4
%72 = getelementptr inbounds i8, i8* %71, i64 2
store i8 %70, i8* %72
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.040000e-01
%9 = tail call double @llvm.fmuladd.f64(double %4, double 2.570000e-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 9.800000e-02, double %9)
%14 = fadd double %13, 1.600000e+01
%15 = fptosi double %14 to i8
store i8 %15, i8* %1
%16 = load i8, i8* %0
%17 = uitofp i8 %16 to double
%18 = fmul double %17, -1.480000e-01
%19 = load i8, i8* %5
%20 = uitofp i8 %19 to double
%21 = tail call double @llvm.fmuladd.f64(double %20, double -2.910000e-01, double %18)
%22 = load i8, i8* %10
%23 = uitofp i8 %22 to double
%24 = tail call double @llvm.fmuladd.f64(double %23, double 4.390000e-01, double %21)
%25 = fadd double %24, 1.280000e+02
%26 = fptosi double %25 to i8
%27 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %26, i8* %27
%28 = load i8, i8* %0
%29 = uitofp i8 %28 to double
%30 = load i8, i8* %5
%31 = uitofp i8 %30 to double
%32 = fmul double %31, -3.680000e-01
%33 = tail call double @llvm.fmuladd.f64(double %29, double 4.390000e-01, double %32)
%34 = load i8, i8* %10
%35 = uitofp i8 %34 to double
%36 = tail call double @llvm.fmuladd.f64(double %35, double 0xBFB22D0E56041893, double %33)
%37 = fadd double %36, 1.280000e+02
%38 = fptosi double %37 to i8
%39 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %38, i8* %39
ret void
}