float trapmf(int n, int a, int b, int c, int d) {
  float out = 0;
  if (n > a && n < b) {
    float m = (0 - 1) / (a - b);
    out = m * (n - a) + 0;
  } else if (n >= b && n <= c) {
    out = 1;
  } else if (n > c && n < d) {
    float m = (1 - 0) / (c - d);
    out = m * (n - c) + 1;
  } else if (n <= a || n >= d) {
    out = 0;
  }
  return out;
}


x86 assembly (clang, -O0):
<trapmf>:
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)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    116f <trapmf+0x6f>
mov    -0x4(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    116f <trapmf+0x6f>
mov    -0x8(%rbp),%ecx
sub    -0xc(%rbp),%ecx
mov    $0xffffffff,%eax
cltd
idiv   %ecx
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
mov    -0x4(%rbp),%eax
sub    -0x8(%rbp),%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1220 <trapmf+0x120>
mov    -0x4(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     1199 <trapmf+0x99>
mov    -0x4(%rbp),%eax
cmp    -0x10(%rbp),%eax
jg     1199 <trapmf+0x99>
movss  0xe71(%rip),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    121b <trapmf+0x11b>
mov    -0x4(%rbp),%eax
cmp    -0x10(%rbp),%eax
jle    11f1 <trapmf+0xf1>
mov    -0x4(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11f1 <trapmf+0xf1>
mov    -0x10(%rbp),%ecx
sub    -0x14(%rbp),%ecx
mov    $0x1,%eax
cltd
idiv   %ecx
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
mov    -0x4(%rbp),%eax
sub    -0x10(%rbp),%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
movss  0xe1d(%rip),%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1216 <trapmf+0x116>
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1209 <trapmf+0x109>
mov    -0x4(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1211 <trapmf+0x111>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1216 <trapmf+0x116>
jmp    121b <trapmf+0x11b>
jmp    1220 <trapmf+0x120>
movss  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<trapmf>:
mov    %edi,%r9d
sub    %esi,%r9d
jle    112b <trapmf+0x2b>
cmp    %edx,%edi
jge    112b <trapmf+0x2b>
sub    %edx,%esi
mov    $0xffffffff,%eax
cltd
idiv   %esi
cvtsi2ss %eax,%xmm0
cvtsi2ss %r9d,%xmm1
mulss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
addss  %xmm1,%xmm0
ret
cmp    %edx,%edi
jl     113c <trapmf+0x3c>
cmp    %ecx,%edi
jg     113c <trapmf+0x3c>
movss  0xec5(%rip),%xmm0
ret
mov    %edi,%eax
xorps  %xmm0,%xmm0
sub    %ecx,%eax
jle    116f <trapmf+0x6f>
cmp    %r8d,%edi
jge    116f <trapmf+0x6f>
sub    %r8d,%ecx
lea    0x1(%rcx),%edx
xor    %esi,%esi
cmp    $0x3,%edx
cmovb  %ecx,%esi
cvtsi2ss %esi,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
mulss  %xmm1,%xmm0
addss  0xe91(%rip),%xmm0
ret

LLVM IR (-O0):
define float @trapmf(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
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
store float 0.000000e+00, float* %11
%14 = load i32, i32* %6
%15 = load i32, i32* %7
%16 = icmp sgt i32 %14, %15
br i1 %16, label %17, label %33
17: ; preds = %5
%18 = load i32, i32* %6
%19 = load i32, i32* %8
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %33
21: ; preds = %17
%22 = load i32, i32* %7
%23 = load i32, i32* %8
%24 = sub nsw i32 %22, %23
%25 = sdiv i32 -1, %24
%26 = sitofp i32 %25 to float
store float %26, float* %12
%27 = load float, float* %12
%28 = load i32, i32* %6
%29 = load i32, i32* %7
%30 = sub nsw i32 %28, %29
%31 = sitofp i32 %30 to float
%32 = call float @llvm.fmuladd.f32(float %27, float %31, float 0.000000e+00)
store float %32, float* %11
br label %74
33: ; preds = %17, %5
%34 = load i32, i32* %6
%35 = load i32, i32* %8
%36 = icmp sge i32 %34, %35
br i1 %36, label %37, label %42
37: ; preds = %33
%38 = load i32, i32* %6
%39 = load i32, i32* %9
%40 = icmp sle i32 %38, %39
br i1 %40, label %41, label %42
41: ; preds = %37
store float 1.000000e+00, float* %11
br label %73
42: ; preds = %37, %33
%43 = load i32, i32* %6
%44 = load i32, i32* %9
%45 = icmp sgt i32 %43, %44
br i1 %45, label %46, label %62
46: ; preds = %42
%47 = load i32, i32* %6
%48 = load i32, i32* %10
%49 = icmp slt i32 %47, %48
br i1 %49, label %50, label %62
50: ; preds = %46
%51 = load i32, i32* %9
%52 = load i32, i32* %10
%53 = sub nsw i32 %51, %52
%54 = sdiv i32 1, %53
%55 = sitofp i32 %54 to float
store float %55, float* %13
%56 = load float, float* %13
%57 = load i32, i32* %6
%58 = load i32, i32* %9
%59 = sub nsw i32 %57, %58
%60 = sitofp i32 %59 to float
%61 = call float @llvm.fmuladd.f32(float %56, float %60, float 1.000000e+00)
store float %61, float* %11
br label %72
62: ; preds = %46, %42
%63 = load i32, i32* %6
%64 = load i32, i32* %7
%65 = icmp sle i32 %63, %64
br i1 %65, label %70, label %66
66: ; preds = %62
%67 = load i32, i32* %6
%68 = load i32, i32* %10
%69 = icmp sge i32 %67, %68
br i1 %69, label %70, label %71
70: ; preds = %66, %62
store float 0.000000e+00, float* %11
br label %71
71: ; preds = %70, %66
br label %72
72: ; preds = %71, %50
br label %73
73: ; preds = %72, %41
br label %74
74: ; preds = %73, %21
%75 = load float, float* %11
ret float %75
}

LLVM IR (-O2):
define float @trapmf(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = icmp sgt i32 %0, %1
%7 = icmp slt i32 %0, %2
%8 = and i1 %6, %7
br i1 %8, label %9, label %16
9: ; preds = %5
%10 = sub nsw i32 %1, %2
%11 = sdiv i32 -1, %10
%12 = sitofp i32 %11 to float
%13 = sub nsw i32 %0, %1
%14 = sitofp i32 %13 to float
%15 = tail call float @llvm.fmuladd.f32(float %12, float %14, float 0.000000e+00)
br label %31
16: ; preds = %5
%17 = icmp sgt i32 %0, %3
%18 = or i1 %7, %17
br i1 %18, label %19, label %31
19: ; preds = %16
%20 = icmp slt i32 %0, %4
%21 = and i1 %17, %20
br i1 %21, label %22, label %31
22: ; preds = %19
%23 = sub nsw i32 %3, %4
%24 = add i32 %23, 1
%25 = icmp ult i32 %24, 3
%26 = select i1 %25, i32 %23, i32 0
%27 = sitofp i32 %26 to float
%28 = sub nsw i32 %0, %3
%29 = sitofp i32 %28 to float
%30 = tail call float @llvm.fmuladd.f32(float %27, float %29, float 1.000000e+00)
br label %31
31: ; preds = %19, %16, %22, %9
%32 = phi float [ %15, %9 ], [ %30, %22 ], [ 1.000000e+00, %16 ], [ 0.000000e+00, %19 ]
ret float %32
}