float midpnt(float (*func)(float), float a, float b, int n) {
  float x, tnm, sum, del, ddel;
  static float s;
  int it, j;
  if (n == 1) {
    return (s = (b - a) * ((*func)(0.5 * (a + b))));
  } else {
    for (it = 1, j = 1; j < n - 1; j++)
      it *= 3;
    tnm = it;
    del = (b - a) / (3.0 * tnm);
    ddel = del + del;
    x = a + 0.5 * del;
    sum = 0.0;
    for (j = 1; j <= it; j++) {
      sum += ((*func)(x));
      x += ddel;
      sum += ((*func)(x));
      x += del;
    }
    s = (s + (b - a) * sum / tnm) / 3.0;
    return s;
  }
}


x86 assembly (clang, -O0):
<midpnt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
mov    %esi,-0x1c(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jne    1174 <midpnt+0x74>
movss  -0x18(%rbp),%xmm0
subss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  -0x14(%rbp),%xmm0
addss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xeb4(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
call   *%rax
movaps %xmm0,%xmm1
movss  -0x3c(%rbp),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0x2eba(%rip)
movss  %xmm0,-0x4(%rbp)
jmp    12d6 <midpnt+0x1d6>
movl   $0x1,-0x34(%rbp)
movl   $0x1,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11a8 <midpnt+0xa8>
imul   $0x3,-0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1182 <midpnt+0x82>
cvtsi2ssl -0x34(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
subss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe37(%rip),%xmm1
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdf5(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
movl   $0x1,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jg     128d <midpnt+0x18d>
mov    -0x10(%rbp),%rax
movss  -0x20(%rbp),%xmm0
call   *%rax
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x30(%rbp),%xmm0
addss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movss  -0x20(%rbp),%xmm0
call   *%rax
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x2c(%rbp),%xmm0
addss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    122b <midpnt+0x12b>
movss  0x2d8f(%rip),%xmm0
movss  -0x18(%rbp),%xmm1
subss  -0x14(%rbp),%xmm1
mulss  -0x28(%rbp),%xmm1
divss  -0x24(%rbp),%xmm1
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd4f(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x2d5b(%rip)
movss  0x2d53(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<midpnt>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
mov    %rdi,%rbx
cmp    $0x1,%esi
jne    1132 <midpnt+0x32>
movaps %xmm1,%xmm2
subss  %xmm0,%xmm2
movss  %xmm2,(%rsp)
addss  %xmm1,%xmm0
mulss  0xf0e(%rip),%xmm0
call   *%rbx
mulss  (%rsp),%xmm0
jmp    132e <midpnt+0x22e>
mov    $0x1,%ebp
mov    $0x1,%edx
cmp    $0x3,%esi
jl     1248 <midpnt+0x148>
lea    -0x2(%rsi),%r8d
mov    $0x1,%eax
mov    $0x1,%edx
cmp    $0x8,%r8d
jb     1231 <midpnt+0x131>
mov    %r8d,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%ecx
mov    %ecx,%edi
shr    $0x3,%edi
add    $0x1,%edi
mov    %edi,%edx
and    $0x7,%edx
cmp    $0x38,%ecx
jae    1186 <midpnt+0x86>
movdqa 0xe80(%rip),%xmm5
movdqa %xmm5,%xmm2
jmp    11db <midpnt+0xdb>
and    $0xfffffff8,%edi
movdqa 0xe6f(%rip),%xmm5
movdqa 0xe77(%rip),%xmm3
movdqa %xmm5,%xmm2
nopl   (%rax)
pshufd $0xf5,%xmm5,%xmm4
pmuludq %xmm3,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm5
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm3,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm2
add    $0xfffffff8,%edi
jne    11a0 <midpnt+0xa0>
test   %edx,%edx
je     11fd <midpnt+0xfd>
nop
movdqa %xmm5,%xmm3
paddd  %xmm5,%xmm3
paddd  %xmm3,%xmm5
movdqa %xmm2,%xmm3
paddd  %xmm2,%xmm3
paddd  %xmm3,%xmm2
add    $0xffffffff,%edx
jne    11e0 <midpnt+0xe0>
pshufd $0xf5,%xmm5,%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm3,%xmm4
pmuludq %xmm5,%xmm2
pshufd $0xee,%xmm2,%xmm3
pmuludq %xmm2,%xmm3
pshufd $0xaa,%xmm4,%xmm2
pmuludq %xmm4,%xmm2
pmuludq %xmm3,%xmm2
movd   %xmm2,%edx
cmp    %eax,%r8d
je     1248 <midpnt+0x148>
or     $0x1,%eax
not    %eax
add    %esi,%eax
cs nopw 0x0(%rax,%rax,1)
nop
lea    (%rdx,%rdx,2),%edx
add    $0xffffffff,%eax
jne    1240 <midpnt+0x140>
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
subss  %xmm0,%xmm1
movss  %xmm2,0x8(%rsp)
xorps  %xmm3,%xmm3
cvtss2sd %xmm2,%xmm3
mulsd  0xdb8(%rip),%xmm3
movss  %xmm1,0xc(%rsp)
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
divsd  %xmm3,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
movaps %xmm1,%xmm2
addss  %xmm1,%xmm2
movss  %xmm2,0x10(%rsp)
movss  %xmm1,0x14(%rsp)
cvtss2sd %xmm1,%xmm1
mulsd  0xd89(%rip),%xmm1
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
cmp    $0x2,%edx
cmovae %edx,%ebp
xorps  %xmm1,%xmm1
nopw   0x0(%rax,%rax,1)
movss  %xmm1,0x4(%rsp)
movss  %xmm0,(%rsp)
movss  (%rsp),%xmm0
call   *%rbx
addss  0x4(%rsp),%xmm0
movss  %xmm0,0x4(%rsp)
movss  (%rsp),%xmm0
addss  0x10(%rsp),%xmm0
movss  %xmm0,(%rsp)
movss  (%rsp),%xmm0
call   *%rbx
movaps %xmm0,%xmm1
movss  (%rsp),%xmm0
addss  0x4(%rsp),%xmm1
addss  0x14(%rsp),%xmm0
add    $0xffffffff,%ebp
jne    12c0 <midpnt+0x1c0>
movss  0xc(%rsp),%xmm0
mulss  %xmm1,%xmm0
divss  0x8(%rsp),%xmm0
addss  0x2cfe(%rip),%xmm0
divss  0xd02(%rip),%xmm0
movss  %xmm0,0x2cee(%rip)
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@midpnt.s = internal global float 0.000000e+00
define float @midpnt(float (float)* %0, float %1, float %2, i32 %3) {
%5 = alloca float
%6 = alloca float (float)*
%7 = alloca float
%8 = alloca float
%9 = alloca i32
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca i32
%16 = alloca i32
store float (float)* %0, float (float)** %6
store float %1, float* %7
store float %2, float* %8
store i32 %3, i32* %9
%17 = load i32, i32* %9
%18 = icmp eq i32 %17, 1
br i1 %18, label %19, label %32
19: ; preds = %4
%20 = load float, float* %8
%21 = load float, float* %7
%22 = fsub float %20, %21
%23 = load float (float)*, float (float)** %6
%24 = load float, float* %7
%25 = load float, float* %8
%26 = fadd float %24, %25
%27 = fpext float %26 to double
%28 = fmul double 5.000000e-01, %27
%29 = fptrunc double %28 to float
%30 = call float %23(float %29)
%31 = fmul float %22, %30
store float %31, float* @midpnt.s
store float %31, float* %5
br label %103
32: ; preds = %4
store i32 1, i32* %15
store i32 1, i32* %16
br label %33
33: ; preds = %41, %32
%34 = load i32, i32* %16
%35 = load i32, i32* %9
%36 = sub nsw i32 %35, 1
%37 = icmp slt i32 %34, %36
br i1 %37, label %38, label %44
38: ; preds = %33
%39 = load i32, i32* %15
%40 = mul nsw i32 %39, 3
store i32 %40, i32* %15
br label %41
41: ; preds = %38
%42 = load i32, i32* %16
%43 = add nsw i32 %42, 1
store i32 %43, i32* %16
br label %33
44: ; preds = %33
%45 = load i32, i32* %15
%46 = sitofp i32 %45 to float
store float %46, float* %11
%47 = load float, float* %8
%48 = load float, float* %7
%49 = fsub float %47, %48
%50 = fpext float %49 to double
%51 = load float, float* %11
%52 = fpext float %51 to double
%53 = fmul double 3.000000e+00, %52
%54 = fdiv double %50, %53
%55 = fptrunc double %54 to float
store float %55, float* %13
%56 = load float, float* %13
%57 = load float, float* %13
%58 = fadd float %56, %57
store float %58, float* %14
%59 = load float, float* %7
%60 = fpext float %59 to double
%61 = load float, float* %13
%62 = fpext float %61 to double
%63 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %62, double %60)
%64 = fptrunc double %63 to float
store float %64, float* %10
store float 0.000000e+00, float* %12
store i32 1, i32* %16
br label %65
65: ; preds = %86, %44
%66 = load i32, i32* %16
%67 = load i32, i32* %15
%68 = icmp sle i32 %66, %67
br i1 %68, label %69, label %89
69: ; preds = %65
%70 = load float (float)*, float (float)** %6
%71 = load float, float* %10
%72 = call float %70(float %71)
%73 = load float, float* %12
%74 = fadd float %73, %72
store float %74, float* %12
%75 = load float, float* %14
%76 = load float, float* %10
%77 = fadd float %76, %75
store float %77, float* %10
%78 = load float (float)*, float (float)** %6
%79 = load float, float* %10
%80 = call float %78(float %79)
%81 = load float, float* %12
%82 = fadd float %81, %80
store float %82, float* %12
%83 = load float, float* %13
%84 = load float, float* %10
%85 = fadd float %84, %83
store float %85, float* %10
br label %86
86: ; preds = %69
%87 = load i32, i32* %16
%88 = add nsw i32 %87, 1
store i32 %88, i32* %16
br label %65
89: ; preds = %65
%90 = load float, float* @midpnt.s
%91 = load float, float* %8
%92 = load float, float* %7
%93 = fsub float %91, %92
%94 = load float, float* %12
%95 = fmul float %93, %94
%96 = load float, float* %11
%97 = fdiv float %95, %96
%98 = fadd float %90, %97
%99 = fpext float %98 to double
%100 = fdiv double %99, 3.000000e+00
%101 = fptrunc double %100 to float
store float %101, float* @midpnt.s
%102 = load float, float* @midpnt.s
store float %102, float* %5
br label %103
103: ; preds = %89, %19
%104 = load float, float* %5
ret float %104
}

LLVM IR (-O2):
@midpnt.s = internal unnamed_addr global float 0.000000e+00
define float @midpnt(float (float)* nocapture %0, float %1, float %2, i32 %3) {
%5 = icmp eq i32 %3, 1
br i1 %5, label %53, label %6
6: ; preds = %4
%7 = add i32 %3, -1
%8 = icmp sgt i32 %3, 2
br i1 %8, label %9, label %65
9: ; preds = %6
%10 = add i32 %3, -2
%11 = icmp ult i32 %10, 8
br i1 %11, label %50, label %12
12: ; preds = %9
%13 = and i32 %10, -8
%14 = or i32 %13, 1
%15 = add i32 %13, -8
%16 = lshr exact i32 %15, 3
%17 = add nuw nsw i32 %16, 1
%18 = and i32 %17, 7
%19 = icmp ult i32 %15, 56
br i1 %19, label %30, label %20
20: ; preds = %12
%21 = and i32 %17, 1073741816
br label %22
22: ; preds = %22, %20
%23 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %20 ], [ %26, %22 ]
%24 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %20 ], [ %27, %22 ]
%25 = phi i32 [ 0, %20 ], [ %28, %22 ]
%26 = mul <4 x i32> %23, <i32 6561, i32 6561, i32 6561, i32 6561>
%27 = mul <4 x i32> %24, <i32 6561, i32 6561, i32 6561, i32 6561>
%28 = add nuw i32 %25, 8
%29 = icmp eq i32 %28, %21
br i1 %29, label %30, label %22
30: ; preds = %22, %12
%31 = phi <4 x i32> [ undef, %12 ], [ %26, %22 ]
%32 = phi <4 x i32> [ undef, %12 ], [ %27, %22 ]
%33 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %12 ], [ %26, %22 ]
%34 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %12 ], [ %27, %22 ]
%35 = icmp eq i32 %18, 0
br i1 %35, label %44, label %36
36: ; preds = %30, %36
%37 = phi <4 x i32> [ %40, %36 ], [ %33, %30 ]
%38 = phi <4 x i32> [ %41, %36 ], [ %34, %30 ]
%39 = phi i32 [ %42, %36 ], [ 0, %30 ]
%40 = mul <4 x i32> %37, <i32 3, i32 3, i32 3, i32 3>
%41 = mul <4 x i32> %38, <i32 3, i32 3, i32 3, i32 3>
%42 = add i32 %39, 1
%43 = icmp eq i32 %42, %18
br i1 %43, label %44, label %36
44: ; preds = %36, %30
%45 = phi <4 x i32> [ %31, %30 ], [ %40, %36 ]
%46 = phi <4 x i32> [ %32, %30 ], [ %41, %36 ]
%47 = mul <4 x i32> %46, %45
%48 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %47)
%49 = icmp eq i32 %10, %13
br i1 %49, label %65, label %50
50: ; preds = %9, %44
%51 = phi i32 [ 1, %9 ], [ %14, %44 ]
%52 = phi i32 [ 1, %9 ], [ %48, %44 ]
br label %59
53: ; preds = %4
%54 = fsub float %2, %1
%55 = fadd float %1, %2
%56 = fmul float %55, 5.000000e-01
%57 = tail call float %0(float %56)
%58 = fmul float %54, %57
br label %98
59: ; preds = %50, %59
%60 = phi i32 [ %63, %59 ], [ %51, %50 ]
%61 = phi i32 [ %62, %59 ], [ %52, %50 ]
%62 = mul nsw i32 %61, 3
%63 = add nuw nsw i32 %60, 1
%64 = icmp eq i32 %63, %7
br i1 %64, label %65, label %59
65: ; preds = %59, %44, %6
%66 = phi i32 [ 1, %6 ], [ %48, %44 ], [ %62, %59 ]
%67 = sitofp i32 %66 to float
%68 = fsub float %2, %1
%69 = fpext float %68 to double
%70 = fpext float %67 to double
%71 = fmul double %70, 3.000000e+00
%72 = fdiv double %69, %71
%73 = fptrunc double %72 to float
%74 = fadd float %73, %73
%75 = fpext float %73 to double
%76 = fpext float %1 to double
%77 = tail call double @llvm.fmuladd.f64(double %75, double 5.000000e-01, double %76)
%78 = fptrunc double %77 to float
%79 = call i32 @llvm.umax.i32(i32 %66, i32 1)
br label %80
80: ; preds = %65, %80
%81 = phi i32 [ %90, %80 ], [ 1, %65 ]
%82 = phi float [ %89, %80 ], [ %78, %65 ]
%83 = phi float [ %88, %80 ], [ 0.000000e+00, %65 ]
%84 = tail call float %0(float %82)
%85 = fadd float %83, %84
%86 = fadd float %74, %82
%87 = tail call float %0(float %86)
%88 = fadd float %85, %87
%89 = fadd float %86, %73
%90 = add nuw i32 %81, 1
%91 = icmp eq i32 %81, %79
br i1 %91, label %92, label %80
92: ; preds = %80
%93 = load float, float* @midpnt.s
%94 = fmul float %68, %88
%95 = fdiv float %94, %67
%96 = fadd float %95, %93
%97 = fdiv float %96, 3.000000e+00
br label %98
98: ; preds = %92, %53
%99 = phi float [ %97, %92 ], [ %58, %53 ]
store float %99, float* @midpnt.s
ret float %99
}