float kernel_value_LUT(float v, float *LUT, int sizeLUT, float _1overCutoff2) {
  unsigned int k0;
  float v0;
  v *= (float)sizeLUT;
  k0 = (unsigned int)(v * _1overCutoff2);
  v0 = ((float)k0) / _1overCutoff2;
  return LUT[k0] + ((v - v0) * (LUT[k0 + 1] - LUT[k0]) / _1overCutoff2);
}


x86 assembly (clang, -O0):
<kernel_value_LUT>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
cvtsi2ssl -0x14(%rbp),%xmm1
movss  -0x4(%rbp),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x18(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%rax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cvtsi2ss %rax,%xmm0
divss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
movss  -0x4(%rbp),%xmm1
subss  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
subss  (%rax,%rcx,4),%xmm2
mulss  %xmm2,%xmm1
divss  -0x18(%rbp),%xmm1
addss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_value_LUT>:
cvtsi2ss %esi,%xmm2
mulss  %xmm2,%xmm0
movaps %xmm0,%xmm2
mulss  %xmm1,%xmm2
cvttss2si %xmm2,%rax
mov    %eax,%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %rcx,%xmm2
divss  %xmm1,%xmm2
movss  (%rdi,%rcx,4),%xmm3
subss  %xmm2,%xmm0
add    $0x1,%eax
movss  (%rdi,%rax,4),%xmm2
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
divss  %xmm1,%xmm0
addss  %xmm3,%xmm0
ret

LLVM IR (-O0):
define float @kernel_value_LUT(float %0, float* %1, i32 %2, float %3) {
%5 = alloca float
%6 = alloca float*
%7 = alloca i32
%8 = alloca float
%9 = alloca i32
%10 = alloca float
store float %0, float* %5
store float* %1, float** %6
store i32 %2, i32* %7
store float %3, float* %8
%11 = load i32, i32* %7
%12 = sitofp i32 %11 to float
%13 = load float, float* %5
%14 = fmul float %13, %12
store float %14, float* %5
%15 = load float, float* %5
%16 = load float, float* %8
%17 = fmul float %15, %16
%18 = fptoui float %17 to i32
store i32 %18, i32* %9
%19 = load i32, i32* %9
%20 = uitofp i32 %19 to float
%21 = load float, float* %8
%22 = fdiv float %20, %21
store float %22, float* %10
%23 = load float*, float** %6
%24 = load i32, i32* %9
%25 = zext i32 %24 to i64
%26 = getelementptr inbounds float, float* %23, i64 %25
%27 = load float, float* %26
%28 = load float, float* %5
%29 = load float, float* %10
%30 = fsub float %28, %29
%31 = load float*, float** %6
%32 = load i32, i32* %9
%33 = add i32 %32, 1
%34 = zext i32 %33 to i64
%35 = getelementptr inbounds float, float* %31, i64 %34
%36 = load float, float* %35
%37 = load float*, float** %6
%38 = load i32, i32* %9
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds float, float* %37, i64 %39
%41 = load float, float* %40
%42 = fsub float %36, %41
%43 = fmul float %30, %42
%44 = load float, float* %8
%45 = fdiv float %43, %44
%46 = fadd float %27, %45
ret float %46
}

LLVM IR (-O2):
define float @kernel_value_LUT(float %0, float* nocapture %1, i32 %2, float %3) {
%5 = sitofp i32 %2 to float
%6 = fmul float %5, %0
%7 = fmul float %6, %3
%8 = fptoui float %7 to i32
%9 = uitofp i32 %8 to float
%10 = fdiv float %9, %3
%11 = zext i32 %8 to i64
%12 = getelementptr inbounds float, float* %1, i64 %11
%13 = load float, float* %12
%14 = fsub float %6, %10
%15 = add i32 %8, 1
%16 = zext i32 %15 to i64
%17 = getelementptr inbounds float, float* %1, i64 %16
%18 = load float, float* %17
%19 = fsub float %18, %13
%20 = fmul float %14, %19
%21 = fdiv float %20, %3
%22 = fadd float %13, %21
ret float %22
}