int transforme_x(float xLamb, int w, float x1, float x2) {
  float d;
  float e;
  float t;
  int i;
  d = (x2 - x1) / (w - 1);
  t = (xLamb - x1) / d;
  i = 1 + t;
  e = xLamb - (x1 + (i - 1) * d);
  if (e > d / 2)
    i++;
  else if (e < -d / 2)
    i--;
  return (i);
}


x86 assembly (clang, -O0):
<transforme_x>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  0xeb5(%rip),%xmm0
addss  -0x1c(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
movss  -0x14(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
movss  0xe69(%rip),%xmm2
divss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jbe    11b2 <transforme_x+0xb2>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11ec <transforme_x+0xec>
movss  -0x18(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xe2f(%rip),%xmm2
divss  %xmm2,%xmm0
ucomiss %xmm1,%xmm0
jbe    11e7 <transforme_x+0xe7>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    11ec <transforme_x+0xec>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<transforme_x>:
add    $0xffffffff,%edi
cvtsi2ss %edi,%xmm3
subss  %xmm1,%xmm2
divss  %xmm3,%xmm2
movaps %xmm0,%xmm3
subss  %xmm1,%xmm3
divss  %xmm2,%xmm3
addss  0xede(%rip),%xmm3
cvttss2si %xmm3,%eax
lea    -0x1(%rax),%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
mulss  %xmm2,%xmm3
addss  %xmm1,%xmm3
subss  %xmm3,%xmm0
movss  0xec0(%rip),%xmm1
mulss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jbe    1151 <transforme_x+0x51>
add    $0x1,%eax
ret
mulss  0xeaf(%rip),%xmm2
ucomiss %xmm0,%xmm2
jbe    1160 <transforme_x+0x60>
mov    %ecx,%eax
ret

LLVM IR (-O0):
define i32 @transforme_x(float %0, i32 %1, float %2, float %3) {
%5 = alloca float
%6 = alloca i32
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca i32
store float %0, float* %5
store i32 %1, i32* %6
store float %2, float* %7
store float %3, float* %8
%13 = load float, float* %8
%14 = load float, float* %7
%15 = fsub float %13, %14
%16 = load i32, i32* %6
%17 = sub nsw i32 %16, 1
%18 = sitofp i32 %17 to float
%19 = fdiv float %15, %18
store float %19, float* %9
%20 = load float, float* %5
%21 = load float, float* %7
%22 = fsub float %20, %21
%23 = load float, float* %9
%24 = fdiv float %22, %23
store float %24, float* %11
%25 = load float, float* %11
%26 = fadd float 1.000000e+00, %25
%27 = fptosi float %26 to i32
store i32 %27, i32* %12
%28 = load float, float* %5
%29 = load float, float* %7
%30 = load i32, i32* %12
%31 = sub nsw i32 %30, 1
%32 = sitofp i32 %31 to float
%33 = load float, float* %9
%34 = call float @llvm.fmuladd.f32(float %32, float %33, float %29)
%35 = fsub float %28, %34
store float %35, float* %10
%36 = load float, float* %10
%37 = load float, float* %9
%38 = fdiv float %37, 2.000000e+00
%39 = fcmp ogt float %36, %38
br i1 %39, label %40, label %43
40: ; preds = %4
%41 = load i32, i32* %12
%42 = add nsw i32 %41, 1
store i32 %42, i32* %12
br label %53
43: ; preds = %4
%44 = load float, float* %10
%45 = load float, float* %9
%46 = fneg float %45
%47 = fdiv float %46, 2.000000e+00
%48 = fcmp olt float %44, %47
br i1 %48, label %49, label %52
49: ; preds = %43
%50 = load i32, i32* %12
%51 = add nsw i32 %50, -1
store i32 %51, i32* %12
br label %52
52: ; preds = %49, %43
br label %53
53: ; preds = %52, %40
%54 = load i32, i32* %12
ret i32 %54
}

LLVM IR (-O2):
define i32 @transforme_x(float %0, i32 %1, float %2, float %3) {
%5 = fsub float %3, %2
%6 = add nsw i32 %1, -1
%7 = sitofp i32 %6 to float
%8 = fdiv float %5, %7
%9 = fsub float %0, %2
%10 = fdiv float %9, %8
%11 = fadd float %10, 1.000000e+00
%12 = fptosi float %11 to i32
%13 = add nsw i32 %12, -1
%14 = sitofp i32 %13 to float
%15 = tail call float @llvm.fmuladd.f32(float %14, float %8, float %2)
%16 = fsub float %0, %15
%17 = fmul float %8, 5.000000e-01
%18 = fcmp ogt float %16, %17
br i1 %18, label %19, label %21
19: ; preds = %4
%20 = add nsw i32 %12, 1
br label %25
21: ; preds = %4
%22 = fmul float %8, -5.000000e-01
%23 = fcmp olt float %16, %22
br i1 %23, label %24, label %25
24: ; preds = %21
br label %25
25: ; preds = %21, %24, %19
%26 = phi i32 [ %20, %19 ], [ %13, %24 ], [ %12, %21 ]
ret i32 %26
}