void xyz_to_rgb_floats(float *rgb, float *xyz) {
  rgb[0] = 0.41847 * xyz[0] - 0.15866 * xyz[1] - 0.082835 * xyz[2];
  rgb[1] = -0.091169 * xyz[0] + 0.25243 * xyz[1] + 0.015708 * xyz[2];
  rgb[2] = 0.00092090 * xyz[0] - 0.0025498 * xyz[1] + 0.1786 * xyz[2];
}


x86 assembly (clang, -O0):
<xyz_to_rgb_floats>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xf13(%rip),%xmm0
mulsd  %xmm2,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xee8(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec3(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xe86(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  0xe72(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4d(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xe0f(%rip),%xmm0
mulsd  %xmm2,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xde4(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdbf(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<xyz_to_rgb_floats>:
movss  (%rsi),%xmm0
movss  0x4(%rsi),%xmm1
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
mulsd  0xee7(%rip),%xmm1
mulsd  0xee7(%rip),%xmm0
movss  0x8(%rsi),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  0xede(%rip),%xmm2
addsd  %xmm1,%xmm0
addsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
movss  %xmm0,(%rdi)
movss  (%rsi),%xmm0
movss  0x4(%rsi),%xmm1
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
mulsd  0xeba(%rip),%xmm1
mulsd  0xeba(%rip),%xmm0
addsd  %xmm1,%xmm0
movss  0x8(%rsi),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xead(%rip),%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,0x4(%rdi)
movss  (%rsi),%xmm0
movss  0x4(%rsi),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xe90(%rip),%xmm1
cvtss2sd %xmm0,%xmm0
mulsd  0xe8c(%rip),%xmm0
addsd  %xmm1,%xmm0
movss  0x8(%rsi),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  0xe7f(%rip),%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,0x8(%rdi)
ret

LLVM IR (-O0):
define void @xyz_to_rgb_floats(float* %0, float* %1) {
%3 = alloca float*
%4 = alloca float*
store float* %0, float** %3
store float* %1, float** %4
%5 = load float*, float** %4
%6 = getelementptr inbounds float, float* %5, i64 0
%7 = load float, float* %6
%8 = fpext float %7 to double
%9 = load float*, float** %4
%10 = getelementptr inbounds float, float* %9, i64 1
%11 = load float, float* %10
%12 = fpext float %11 to double
%13 = fmul double 1.586600e-01, %12
%14 = fneg double %13
%15 = call double @llvm.fmuladd.f64(double 4.184700e-01, double %8, double %14)
%16 = load float*, float** %4
%17 = getelementptr inbounds float, float* %16, i64 2
%18 = load float, float* %17
%19 = fpext float %18 to double
%20 = call double @llvm.fmuladd.f64(double -8.283500e-02, double %19, double %15)
%21 = fptrunc double %20 to float
%22 = load float*, float** %3
%23 = getelementptr inbounds float, float* %22, i64 0
store float %21, float* %23
%24 = load float*, float** %4
%25 = getelementptr inbounds float, float* %24, i64 0
%26 = load float, float* %25
%27 = fpext float %26 to double
%28 = load float*, float** %4
%29 = getelementptr inbounds float, float* %28, i64 1
%30 = load float, float* %29
%31 = fpext float %30 to double
%32 = fmul double 2.524300e-01, %31
%33 = call double @llvm.fmuladd.f64(double -9.116900e-02, double %27, double %32)
%34 = load float*, float** %4
%35 = getelementptr inbounds float, float* %34, i64 2
%36 = load float, float* %35
%37 = fpext float %36 to double
%38 = call double @llvm.fmuladd.f64(double 1.570800e-02, double %37, double %33)
%39 = fptrunc double %38 to float
%40 = load float*, float** %3
%41 = getelementptr inbounds float, float* %40, i64 1
store float %39, float* %41
%42 = load float*, float** %4
%43 = getelementptr inbounds float, float* %42, i64 0
%44 = load float, float* %43
%45 = fpext float %44 to double
%46 = load float*, float** %4
%47 = getelementptr inbounds float, float* %46, i64 1
%48 = load float, float* %47
%49 = fpext float %48 to double
%50 = fmul double 2.549800e-03, %49
%51 = fneg double %50
%52 = call double @llvm.fmuladd.f64(double 0x3F4E2D11B1026BEB, double %45, double %51)
%53 = load float*, float** %4
%54 = getelementptr inbounds float, float* %53, i64 2
%55 = load float, float* %54
%56 = fpext float %55 to double
%57 = call double @llvm.fmuladd.f64(double 1.786000e-01, double %56, double %52)
%58 = fptrunc double %57 to float
%59 = load float*, float** %3
%60 = getelementptr inbounds float, float* %59, i64 2
store float %58, float* %60
ret void
}

LLVM IR (-O2):
define void @xyz_to_rgb_floats(float* nocapture writeonly %0, float* nocapture %1) {
%3 = load float, float* %1
%4 = fpext float %3 to double
%5 = getelementptr inbounds float, float* %1, i64 1
%6 = load float, float* %5
%7 = fpext float %6 to double
%8 = fmul double %7, -1.586600e-01
%9 = tail call double @llvm.fmuladd.f64(double %4, double 4.184700e-01, double %8)
%10 = getelementptr inbounds float, float* %1, i64 2
%11 = load float, float* %10
%12 = fpext float %11 to double
%13 = tail call double @llvm.fmuladd.f64(double %12, double -8.283500e-02, double %9)
%14 = fptrunc double %13 to float
store float %14, float* %0
%15 = load float, float* %1
%16 = fpext float %15 to double
%17 = load float, float* %5
%18 = fpext float %17 to double
%19 = fmul double %18, 2.524300e-01
%20 = tail call double @llvm.fmuladd.f64(double %16, double -9.116900e-02, double %19)
%21 = load float, float* %10
%22 = fpext float %21 to double
%23 = tail call double @llvm.fmuladd.f64(double %22, double 1.570800e-02, double %20)
%24 = fptrunc double %23 to float
%25 = getelementptr inbounds float, float* %0, i64 1
store float %24, float* %25
%26 = load float, float* %1
%27 = fpext float %26 to double
%28 = load float, float* %5
%29 = fpext float %28 to double
%30 = fmul double %29, -2.549800e-03
%31 = tail call double @llvm.fmuladd.f64(double %27, double 0x3F4E2D11B1026BEB, double %30)
%32 = load float, float* %10
%33 = fpext float %32 to double
%34 = tail call double @llvm.fmuladd.f64(double %33, double 1.786000e-01, double %31)
%35 = fptrunc double %34 to float
%36 = getelementptr inbounds float, float* %0, i64 2
store float %35, float* %36
ret void
}