void Lab2xyz(float L, float a, float b, float *x, float *y, float *z) {
  float vY = (L + 16.0) / 116.0;
  float vX = a / 500.0 + vY;
  float vZ = vY - b / 200.0;
  if (vY * vY * vY > 0.008856) {
    vY = vY * vY * vY;
  } else {
    vY = (vY - 16.0 / 116.0) / 7.787;
  }
  if (vX * vX * vX > 0.008856) {
    vX = vX * vX * vX;
  } else {
    vX = (vX - 16.0 / 116.0) / 7.787;
  }
  if (vZ * vZ * vZ > 0.008856) {
    vZ = vZ * vZ * vZ;
  } else {
    vZ = (vZ - 16.0 / 116.0) / 7.787;
  }
  *x = 95.047 * vX;
  *y = 100.000 * vY;
  *z = 108.883 * vZ;
}


x86 assembly (clang, -O0):
<Lab2xyz>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xef0(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xedc(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeb6(%rip),%xmm1
divsd  %xmm1,%xmm0
movss  -0x2c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe7a(%rip),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x2c(%rbp),%xmm0
mulss  -0x2c(%rbp),%xmm0
mulss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe46(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11dd <Lab2xyz+0xdd>
movss  -0x2c(%rbp),%xmm0
mulss  -0x2c(%rbp),%xmm0
mulss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    1207 <Lab2xyz+0x107>
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe42(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe2e(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x30(%rbp),%xmm0
mulss  -0x30(%rbp),%xmm0
mulss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdde(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1245 <Lab2xyz+0x145>
movss  -0x30(%rbp),%xmm0
mulss  -0x30(%rbp),%xmm0
mulss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    126f <Lab2xyz+0x16f>
movss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdda(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xdc6(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x34(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd76(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12ad <Lab2xyz+0x1ad>
movss  -0x34(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
jmp    12d7 <Lab2xyz+0x1d7>
movss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd72(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd5e(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd60(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd37(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd0e(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<Lab2xyz>:
cvtss2sd %xmm0,%xmm0
addsd  0xef4(%rip),%xmm0
divsd  0xef4(%rip),%xmm0
cvtsd2ss %xmm0,%xmm4
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
divsd  0xee9(%rip),%xmm0
cvtss2sd %xmm4,%xmm3
addsd  %xmm3,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
cvtss2sd %xmm2,%xmm2
divsd  0xed6(%rip),%xmm2
addsd  %xmm3,%xmm2
movaps %xmm4,%xmm0
mulss  %xmm4,%xmm0
mulss  %xmm4,%xmm0
xorps  %xmm4,%xmm4
cvtss2sd %xmm0,%xmm4
ucomisd 0xec0(%rip),%xmm4
ja     1179 <Lab2xyz+0x79>
addsd  0xebe(%rip),%xmm3
divsd  0xebe(%rip),%xmm3
xorps  %xmm0,%xmm0
cvtsd2ss %xmm3,%xmm0
xorps  %xmm3,%xmm3
cvtsd2ss %xmm2,%xmm3
movaps %xmm1,%xmm2
mulss  %xmm1,%xmm2
mulss  %xmm1,%xmm2
xorps  %xmm4,%xmm4
cvtss2sd %xmm2,%xmm4
ucomisd 0xe86(%rip),%xmm4
ja     11b7 <Lab2xyz+0xb7>
cvtss2sd %xmm1,%xmm1
addsd  0xe80(%rip),%xmm1
divsd  0xe80(%rip),%xmm1
xorps  %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm2
movaps %xmm3,%xmm1
mulss  %xmm3,%xmm1
mulss  %xmm3,%xmm1
cvtss2sd %xmm1,%xmm1
ucomisd 0xe52(%rip),%xmm1
ja     11ef <Lab2xyz+0xef>
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
addsd  0xe49(%rip),%xmm1
divsd  0xe49(%rip),%xmm1
cvtsd2ss %xmm1,%xmm1
cvtss2sd %xmm1,%xmm1
cvtss2sd %xmm2,%xmm2
mulsd  0xe3d(%rip),%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,(%rdi)
mulss  0xe3d(%rip),%xmm0
mulsd  0xe2d(%rip),%xmm1
movss  %xmm0,(%rsi)
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,(%rdx)
ret

LLVM IR (-O0):
define void @Lab2xyz(float %0, float %1, float %2, float* %3, float* %4, float* %5) {
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca float
%14 = alloca float
%15 = alloca float
store float %0, float* %7
store float %1, float* %8
store float %2, float* %9
store float* %3, float** %10
store float* %4, float** %11
store float* %5, float** %12
%16 = load float, float* %7
%17 = fpext float %16 to double
%18 = fadd double %17, 1.600000e+01
%19 = fdiv double %18, 1.160000e+02
%20 = fptrunc double %19 to float
store float %20, float* %13
%21 = load float, float* %8
%22 = fpext float %21 to double
%23 = fdiv double %22, 5.000000e+02
%24 = load float, float* %13
%25 = fpext float %24 to double
%26 = fadd double %23, %25
%27 = fptrunc double %26 to float
store float %27, float* %14
%28 = load float, float* %13
%29 = fpext float %28 to double
%30 = load float, float* %9
%31 = fpext float %30 to double
%32 = fdiv double %31, 2.000000e+02
%33 = fsub double %29, %32
%34 = fptrunc double %33 to float
store float %34, float* %15
%35 = load float, float* %13
%36 = load float, float* %13
%37 = fmul float %35, %36
%38 = load float, float* %13
%39 = fmul float %37, %38
%40 = fpext float %39 to double
%41 = fcmp ogt double %40, 8.856000e-03
br i1 %41, label %42, label %48
42: ; preds = %6
%43 = load float, float* %13
%44 = load float, float* %13
%45 = fmul float %43, %44
%46 = load float, float* %13
%47 = fmul float %45, %46
store float %47, float* %13
br label %54
48: ; preds = %6
%49 = load float, float* %13
%50 = fpext float %49 to double
%51 = fsub double %50, 0x3FC1A7B9611A7B96
%52 = fdiv double %51, 0x401F25E353F7CED9
%53 = fptrunc double %52 to float
store float %53, float* %13
br label %54
54: ; preds = %48, %42
%55 = load float, float* %14
%56 = load float, float* %14
%57 = fmul float %55, %56
%58 = load float, float* %14
%59 = fmul float %57, %58
%60 = fpext float %59 to double
%61 = fcmp ogt double %60, 8.856000e-03
br i1 %61, label %62, label %68
62: ; preds = %54
%63 = load float, float* %14
%64 = load float, float* %14
%65 = fmul float %63, %64
%66 = load float, float* %14
%67 = fmul float %65, %66
store float %67, float* %14
br label %74
68: ; preds = %54
%69 = load float, float* %14
%70 = fpext float %69 to double
%71 = fsub double %70, 0x3FC1A7B9611A7B96
%72 = fdiv double %71, 0x401F25E353F7CED9
%73 = fptrunc double %72 to float
store float %73, float* %14
br label %74
74: ; preds = %68, %62
%75 = load float, float* %15
%76 = load float, float* %15
%77 = fmul float %75, %76
%78 = load float, float* %15
%79 = fmul float %77, %78
%80 = fpext float %79 to double
%81 = fcmp ogt double %80, 8.856000e-03
br i1 %81, label %82, label %88
82: ; preds = %74
%83 = load float, float* %15
%84 = load float, float* %15
%85 = fmul float %83, %84
%86 = load float, float* %15
%87 = fmul float %85, %86
store float %87, float* %15
br label %94
88: ; preds = %74
%89 = load float, float* %15
%90 = fpext float %89 to double
%91 = fsub double %90, 0x3FC1A7B9611A7B96
%92 = fdiv double %91, 0x401F25E353F7CED9
%93 = fptrunc double %92 to float
store float %93, float* %15
br label %94
94: ; preds = %88, %82
%95 = load float, float* %14
%96 = fpext float %95 to double
%97 = fmul double 0x4057C3020C49BA5E, %96
%98 = fptrunc double %97 to float
%99 = load float*, float** %10
store float %98, float* %99
%100 = load float, float* %13
%101 = fpext float %100 to double
%102 = fmul double 1.000000e+02, %101
%103 = fptrunc double %102 to float
%104 = load float*, float** %11
store float %103, float* %104
%105 = load float, float* %15
%106 = fpext float %105 to double
%107 = fmul double 1.088830e+02, %106
%108 = fptrunc double %107 to float
%109 = load float*, float** %12
store float %108, float* %109
ret void
}

LLVM IR (-O2):
define void @Lab2xyz(float %0, float %1, float %2, float* nocapture writeonly %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = fpext float %0 to double
%8 = fadd double %7, 1.600000e+01
%9 = fdiv double %8, 1.160000e+02
%10 = fptrunc double %9 to float
%11 = fpext float %1 to double
%12 = fdiv double %11, 5.000000e+02
%13 = fpext float %10 to double
%14 = fadd double %12, %13
%15 = fptrunc double %14 to float
%16 = fpext float %2 to double
%17 = fdiv double %16, 2.000000e+02
%18 = fsub double %13, %17
%19 = fptrunc double %18 to float
%20 = fmul float %10, %10
%21 = fmul float %20, %10
%22 = fpext float %21 to double
%23 = fcmp ogt double %22, 8.856000e-03
br i1 %23, label %28, label %24
24: ; preds = %6
%25 = fadd double %13, 0xBFC1A7B9611A7B96
%26 = fdiv double %25, 0x401F25E353F7CED9
%27 = fptrunc double %26 to float
br label %28
28: ; preds = %6, %24
%29 = phi float [ %27, %24 ], [ %21, %6 ]
%30 = fmul float %15, %15
%31 = fmul float %30, %15
%32 = fpext float %31 to double
%33 = fcmp ogt double %32, 8.856000e-03
br i1 %33, label %39, label %34
34: ; preds = %28
%35 = fpext float %15 to double
%36 = fadd double %35, 0xBFC1A7B9611A7B96
%37 = fdiv double %36, 0x401F25E353F7CED9
%38 = fptrunc double %37 to float
br label %39
39: ; preds = %28, %34
%40 = phi float [ %38, %34 ], [ %31, %28 ]
%41 = fmul float %19, %19
%42 = fmul float %41, %19
%43 = fpext float %42 to double
%44 = fcmp ogt double %43, 8.856000e-03
br i1 %44, label %51, label %45
45: ; preds = %39
%46 = fpext float %19 to double
%47 = fadd double %46, 0xBFC1A7B9611A7B96
%48 = fdiv double %47, 0x401F25E353F7CED9
%49 = fptrunc double %48 to float
%50 = fpext float %49 to double
br label %51
51: ; preds = %39, %45
%52 = phi double [ %43, %39 ], [ %50, %45 ]
%53 = fpext float %40 to double
%54 = fmul double %53, 0x4057C3020C49BA5E
%55 = fptrunc double %54 to float
store float %55, float* %3
%56 = fmul float %29, 1.000000e+02
store float %56, float* %4
%57 = fmul double %52, 1.088830e+02
%58 = fptrunc double %57 to float
store float %58, float* %5
ret void
}