void gx_cmyk_to_rgb(float *cmyk, float *rgb) {
  float k = 1.0f - cmyk[3];
  rgb[0] = (1.0f - cmyk[0]) * k;
  rgb[1] = (1.0f - cmyk[1]) * k;
  rgb[2] = (1.0f - cmyk[2]) * k;
}


x86 assembly (clang, -O0):
<gx_cmyk_to_rgb>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movss  0xee8(%rip),%xmm0
subss  0xc(%rax),%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movss  0xed2(%rip),%xmm0
subss  (%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0xeb5(%rip),%xmm0
subss  0x4(%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0xe96(%rip),%xmm0
subss  0x8(%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x8(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<gx_cmyk_to_rgb>:
movss  0xef8(%rip),%xmm0
movaps %xmm0,%xmm1
subss  0xc(%rdi),%xmm1
movaps %xmm0,%xmm2
subss  (%rdi),%xmm2
mulss  %xmm1,%xmm2
movss  %xmm2,(%rsi)
movaps %xmm0,%xmm2
subss  0x4(%rdi),%xmm2
mulss  %xmm1,%xmm2
movss  %xmm2,0x4(%rsi)
subss  0x8(%rdi),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0x8(%rsi)
ret

LLVM IR (-O0):
define void @gx_cmyk_to_rgb(float* %0, float* %1) {
%3 = alloca float*
%4 = alloca float*
%5 = alloca float
store float* %0, float** %3
store float* %1, float** %4
%6 = load float*, float** %3
%7 = getelementptr inbounds float, float* %6, i64 3
%8 = load float, float* %7
%9 = fsub float 1.000000e+00, %8
store float %9, float* %5
%10 = load float*, float** %3
%11 = getelementptr inbounds float, float* %10, i64 0
%12 = load float, float* %11
%13 = fsub float 1.000000e+00, %12
%14 = load float, float* %5
%15 = fmul float %13, %14
%16 = load float*, float** %4
%17 = getelementptr inbounds float, float* %16, i64 0
store float %15, float* %17
%18 = load float*, float** %3
%19 = getelementptr inbounds float, float* %18, i64 1
%20 = load float, float* %19
%21 = fsub float 1.000000e+00, %20
%22 = load float, float* %5
%23 = fmul float %21, %22
%24 = load float*, float** %4
%25 = getelementptr inbounds float, float* %24, i64 1
store float %23, float* %25
%26 = load float*, float** %3
%27 = getelementptr inbounds float, float* %26, i64 2
%28 = load float, float* %27
%29 = fsub float 1.000000e+00, %28
%30 = load float, float* %5
%31 = fmul float %29, %30
%32 = load float*, float** %4
%33 = getelementptr inbounds float, float* %32, i64 2
store float %31, float* %33
ret void
}

LLVM IR (-O2):
define void @gx_cmyk_to_rgb(float* nocapture %0, float* nocapture writeonly %1) {
%3 = getelementptr inbounds float, float* %0, i64 3
%4 = load float, float* %3
%5 = fsub float 1.000000e+00, %4
%6 = load float, float* %0
%7 = fsub float 1.000000e+00, %6
%8 = fmul float %5, %7
store float %8, float* %1
%9 = getelementptr inbounds float, float* %0, i64 1
%10 = load float, float* %9
%11 = fsub float 1.000000e+00, %10
%12 = fmul float %5, %11
%13 = getelementptr inbounds float, float* %1, i64 1
store float %12, float* %13
%14 = getelementptr inbounds float, float* %0, i64 2
%15 = load float, float* %14
%16 = fsub float 1.000000e+00, %15
%17 = fmul float %5, %16
%18 = getelementptr inbounds float, float* %1, i64 2
store float %17, float* %18
ret void
}