#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
float const FLT_MAX;
unsigned int interp(unsigned int x0, unsigned int y0, unsigned int x1,
                    unsigned int y1, unsigned int x) {
  const float num = (float)y1 - y0;
  const float den = (float)x1 - x0;
  const float m = den == 0 ? FLT_MAX : num / den;
  const float y = (x - x0) * m + y0;
  return (unsigned int)y;
}


x86 assembly (clang, -O0):
<interp>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    -0x10(%rbp),%eax
cvtsi2ss %rax,%xmm0
mov    -0x8(%rbp),%eax
cvtsi2ss %rax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
cvtsi2ss %rax,%xmm0
mov    -0x4(%rbp),%eax
cvtsi2ss %rax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1172 <interp+0x72>
jp     1172 <interp+0x72>
mov    0x2e84(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    1181 <interp+0x81>
movss  -0x18(%rbp),%xmm0
divss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    %ecx,%eax
cvtsi2ss %rax,%xmm0
movss  -0x20(%rbp),%xmm2
mov    -0x8(%rbp),%eax
cvtsi2ss %rax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
cvttss2si -0x24(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<interp>:
mov    %esi,%eax
cvtsi2ss %rax,%xmm0
mov    %edx,%eax
cvtsi2ss %rax,%xmm1
mov    %edi,%eax
cvtsi2ss %rax,%xmm2
subss  %xmm2,%xmm1
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jne    1123 <interp+0x23>
jnp    1135 <interp+0x35>
mov    %ecx,%eax
xorps  %xmm2,%xmm2
cvtsi2ss %rax,%xmm2
subss  %xmm0,%xmm2
divss  %xmm1,%xmm2
sub    %edi,%r8d
xorps  %xmm1,%xmm1
cvtsi2ss %r8,%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
cvttss2si %xmm1,%rax
ret

LLVM IR (-O0):
@FLT_MAX = constant float 0.000000e+00
define i32 @interp(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%15 = load i32, i32* %9
%16 = uitofp i32 %15 to float
%17 = load i32, i32* %7
%18 = uitofp i32 %17 to float
%19 = fsub float %16, %18
store float %19, float* %11
%20 = load i32, i32* %8
%21 = uitofp i32 %20 to float
%22 = load i32, i32* %6
%23 = uitofp i32 %22 to float
%24 = fsub float %21, %23
store float %24, float* %12
%25 = load float, float* %12
%26 = fcmp oeq float %25, 0.000000e+00
br i1 %26, label %27, label %29
27: ; preds = %5
%28 = load float, float* @FLT_MAX
br label %33
29: ; preds = %5
%30 = load float, float* %11
%31 = load float, float* %12
%32 = fdiv float %30, %31
br label %33
33: ; preds = %29, %27
%34 = phi float [ %28, %27 ], [ %32, %29 ]
store float %34, float* %13
%35 = load i32, i32* %10
%36 = load i32, i32* %6
%37 = sub i32 %35, %36
%38 = uitofp i32 %37 to float
%39 = load float, float* %13
%40 = load i32, i32* %7
%41 = uitofp i32 %40 to float
%42 = call float @llvm.fmuladd.f32(float %38, float %39, float %41)
store float %42, float* %14
%43 = load float, float* %14
%44 = fptoui float %43 to i32
ret i32 %44
}

LLVM IR (-O2):
@FLT_MAX = constant float 0.000000e+00
define i32 @interp(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = uitofp i32 %1 to float
%7 = uitofp i32 %2 to float
%8 = uitofp i32 %0 to float
%9 = fsub float %7, %8
%10 = fcmp oeq float %9, 0.000000e+00
br i1 %10, label %15, label %11
11: ; preds = %5
%12 = uitofp i32 %3 to float
%13 = fsub float %12, %6
%14 = fdiv float %13, %9
br label %15
15: ; preds = %5, %11
%16 = phi float [ %14, %11 ], [ 0.000000e+00, %5 ]
%17 = sub i32 %4, %0
%18 = uitofp i32 %17 to float
%19 = tail call float @llvm.fmuladd.f32(float %18, float %16, float %6)
%20 = fptoui float %19 to i32
ret i32 %20
}