void index2rgb(float *colorMap, int index, float *r, float *g, float *b) {
  if (index & (0x40000000)) {
    *r = (((0x00FF0000) & index) >> 16) / 255.;
    *g = (((0x0000FF00) & index) >> 8) / 255.;
    *b = (((0x000000FF) & index)) / 255.;
  } else {
    *r = colorMap[3 * index];
    *g = colorMap[3 * index + 1];
    *b = colorMap[3 * index + 2];
  }
  return;
}


x86 assembly (clang, -O0):
<index2rgb>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0xc(%rbp),%eax
and    $0x40000000,%eax
cmp    $0x0,%eax
je     119f <index2rgb+0x9f>
mov    -0xc(%rbp),%eax
and    $0xff0000,%eax
sar    $0x10,%eax
cvtsi2sd %eax,%xmm0
movsd  0xec1(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0xc(%rbp),%eax
and    $0xff00,%eax
sar    $0x8,%eax
cvtsi2sd %eax,%xmm0
movsd  0xe9a(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0xc(%rbp),%eax
and    $0xff,%eax
cvtsi2sd %eax,%xmm0
movsd  0xe76(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    11ed <index2rgb+0xed>
mov    -0x8(%rbp),%rax
imul   $0x3,-0xc(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
imul   $0x3,-0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
imul   $0x3,-0xc(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<index2rgb>:
mov    %esi,%eax
test   $0x40000000,%esi
jne    112e <index2rgb+0x2e>
lea    (%rax,%rax,2),%eax
cltq
movss  (%rdi,%rax,4),%xmm0
movss  %xmm0,(%rdx)
movss  0x4(%rdi,%rax,4),%xmm0
movss  %xmm0,(%rcx)
movss  0x8(%rdi,%rax,4),%xmm0
movss  %xmm0,(%r8)
ret
mov    %eax,%esi
shr    $0x10,%esi
movzbl %sil,%esi
cvtsi2sd %esi,%xmm0
movsd  0xebd(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movzbl %ah,%esi
cvtsi2sd %esi,%xmm2
divsd  %xmm1,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm0,(%rdx)
movzbl %al,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movss  %xmm2,(%rcx)
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r8)
ret

LLVM IR (-O0):
define void @index2rgb(float* %0, i32 %1, float* %2, float* %3, float* %4) {
%6 = alloca float*
%7 = alloca i32
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
store float* %0, float** %6
store i32 %1, i32* %7
store float* %2, float** %8
store float* %3, float** %9
store float* %4, float** %10
%11 = load i32, i32* %7
%12 = and i32 %11, 1073741824
%13 = icmp ne i32 %12, 0
br i1 %13, label %14, label %35
14: ; preds = %5
%15 = load i32, i32* %7
%16 = and i32 16711680, %15
%17 = ashr i32 %16, 16
%18 = sitofp i32 %17 to double
%19 = fdiv double %18, 2.550000e+02
%20 = fptrunc double %19 to float
%21 = load float*, float** %8
store float %20, float* %21
%22 = load i32, i32* %7
%23 = and i32 65280, %22
%24 = ashr i32 %23, 8
%25 = sitofp i32 %24 to double
%26 = fdiv double %25, 2.550000e+02
%27 = fptrunc double %26 to float
%28 = load float*, float** %9
store float %27, float* %28
%29 = load i32, i32* %7
%30 = and i32 255, %29
%31 = sitofp i32 %30 to double
%32 = fdiv double %31, 2.550000e+02
%33 = fptrunc double %32 to float
%34 = load float*, float** %10
store float %33, float* %34
br label %59
35: ; preds = %5
%36 = load float*, float** %6
%37 = load i32, i32* %7
%38 = mul nsw i32 3, %37
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds float, float* %36, i64 %39
%41 = load float, float* %40
%42 = load float*, float** %8
store float %41, float* %42
%43 = load float*, float** %6
%44 = load i32, i32* %7
%45 = mul nsw i32 3, %44
%46 = add nsw i32 %45, 1
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds float, float* %43, i64 %47
%49 = load float, float* %48
%50 = load float*, float** %9
store float %49, float* %50
%51 = load float*, float** %6
%52 = load i32, i32* %7
%53 = mul nsw i32 3, %52
%54 = add nsw i32 %53, 2
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds float, float* %51, i64 %55
%57 = load float, float* %56
%58 = load float*, float** %10
store float %57, float* %58
br label %59
59: ; preds = %35, %14
ret void
}

LLVM IR (-O2):
define void @index2rgb(float* nocapture %0, i32 %1, float* nocapture writeonly %2, float* nocapture writeonly %3, float* nocapture writeonly %4) {
%6 = and i32 %1, 1073741824
%7 = icmp eq i32 %6, 0
br i1 %7, label %23, label %8
8: ; preds = %5
%9 = lshr i32 %1, 16
%10 = and i32 %9, 255
%11 = sitofp i32 %10 to double
%12 = fdiv double %11, 2.550000e+02
%13 = fptrunc double %12 to float
store float %13, float* %2
%14 = lshr i32 %1, 8
%15 = and i32 %14, 255
%16 = sitofp i32 %15 to double
%17 = fdiv double %16, 2.550000e+02
%18 = fptrunc double %17 to float
store float %18, float* %3
%19 = and i32 %1, 255
%20 = sitofp i32 %19 to double
%21 = fdiv double %20, 2.550000e+02
%22 = fptrunc double %21 to float
br label %36
23: ; preds = %5
%24 = mul nsw i32 %1, 3
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds float, float* %0, i64 %25
%27 = load float, float* %26
store float %27, float* %2
%28 = add nsw i32 %24, 1
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds float, float* %0, i64 %29
%31 = load float, float* %30
store float %31, float* %3
%32 = add nsw i32 %24, 2
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds float, float* %0, i64 %33
%35 = load float, float* %34
br label %36
36: ; preds = %23, %8
%37 = phi float [ %35, %23 ], [ %22, %8 ]
store float %37, float* %4
ret void
}