float rtcmix_table(long nsample, double *array, float *tab) {
  register int loc = ((float)(nsample) / (*tab)) * *(tab + 1);
  if (loc < 0)
    return (array[0]);
  if (loc >= *(tab + 1))
    loc = *(tab + 1);
  return (*(array + loc));
}


x86 assembly (clang, -O0):
<rtcmix_table>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
cvtsi2ssq -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
divss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
mulss  0x4(%rax),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    114e <rtcmix_table+0x4e>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1183 <rtcmix_table+0x83>
cvtsi2ssl -0x24(%rbp),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
jb     116d <rtcmix_table+0x6d>
mov    -0x20(%rbp),%rax
cvttss2si 0x4(%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rtcmix_table>:
cvtsi2ss %rdi,%xmm1
divss  (%rdx),%xmm1
movss  0x4(%rdx),%xmm0
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%eax
test   %eax,%eax
js     1132 <rtcmix_table+0x32>
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
ucomiss %xmm0,%xmm1
cvttss2si %xmm0,%ecx
cmovb  %eax,%ecx
movslq %ecx,%rax
lea    (%rsi,%rax,8),%rsi
movsd  (%rsi),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @rtcmix_table(i64 %0, double* %1, float* %2) {
%4 = alloca float
%5 = alloca i64
%6 = alloca double*
%7 = alloca float*
%8 = alloca i32
store i64 %0, i64* %5
store double* %1, double** %6
store float* %2, float** %7
%9 = load i64, i64* %5
%10 = sitofp i64 %9 to float
%11 = load float*, float** %7
%12 = load float, float* %11
%13 = fdiv float %10, %12
%14 = load float*, float** %7
%15 = getelementptr inbounds float, float* %14, i64 1
%16 = load float, float* %15
%17 = fmul float %13, %16
%18 = fptosi float %17 to i32
store i32 %18, i32* %8
%19 = load i32, i32* %8
%20 = icmp slt i32 %19, 0
br i1 %20, label %21, label %26
21: ; preds = %3
%22 = load double*, double** %6
%23 = getelementptr inbounds double, double* %22, i64 0
%24 = load double, double* %23
%25 = fptrunc double %24 to float
store float %25, float* %4
br label %45
26: ; preds = %3
%27 = load i32, i32* %8
%28 = sitofp i32 %27 to float
%29 = load float*, float** %7
%30 = getelementptr inbounds float, float* %29, i64 1
%31 = load float, float* %30
%32 = fcmp oge float %28, %31
br i1 %32, label %33, label %38
33: ; preds = %26
%34 = load float*, float** %7
%35 = getelementptr inbounds float, float* %34, i64 1
%36 = load float, float* %35
%37 = fptosi float %36 to i32
store i32 %37, i32* %8
br label %38
38: ; preds = %33, %26
%39 = load double*, double** %6
%40 = load i32, i32* %8
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds double, double* %39, i64 %41
%43 = load double, double* %42
%44 = fptrunc double %43 to float
store float %44, float* %4
br label %45
45: ; preds = %38, %21
%46 = load float, float* %4
ret float %46
}

LLVM IR (-O2):
define float @rtcmix_table(i64 %0, double* nocapture %1, float* nocapture %2) {
%4 = sitofp i64 %0 to float
%5 = load float, float* %2
%6 = fdiv float %4, %5
%7 = getelementptr inbounds float, float* %2, i64 1
%8 = load float, float* %7
%9 = fmul float %6, %8
%10 = fptosi float %9 to i32
%11 = icmp slt i32 %10, 0
br i1 %11, label %19, label %12
12: ; preds = %3
%13 = sitofp i32 %10 to float
%14 = fcmp ugt float %8, %13
%15 = fptosi float %8 to i32
%16 = select i1 %14, i32 %10, i32 %15
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds double, double* %1, i64 %17
br label %19
19: ; preds = %3, %12
%20 = phi double* [ %18, %12 ], [ %1, %3 ]
%21 = load double, double* %20
%22 = fptrunc double %21 to float
ret float %22
}