double int16(xc, yc, xp, yp, dx, z00, z01, z02, z03, z10, z11, z12, z13, z20,
             z21, z22, z23, z30, z31, z32, z33)
double xc, yc, xp, yp, dx, z00, z01, z02, z03, z10, z11, z12, z13, z20, z21,
    z22, z23, z30, z31, z32, z33;
{
  double z1, z2, z3, z4, zz1, zz2, zz3, zz4, int4();
  z1 = z00;
  z2 = z01;
  z3 = z02, z4 = z03;
  zz1 = int4(yc, dx, z1, z2, z3, z4, yp);
  z1 = z10;
  z2 = z11;
  z3 = z12, z4 = z13;
  zz2 = int4(yc, dx, z1, z2, z3, z4, yp);
  z1 = z20;
  z2 = z21;
  z3 = z22, z4 = z23;
  zz3 = int4(yc, dx, z1, z2, z3, z4, yp);
  z1 = z30;
  z2 = z31;
  z3 = z32, z4 = z33;
  zz4 = int4(yc, dx, z1, z2, z3, z4, yp);
  return int4(xc, dx, zz1, zz2, zz2, zz3, xp);
}


x86 assembly (clang, -O0):
<int16>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movsd  0x70(%rbp),%xmm8
movsd  0x68(%rbp),%xmm8
movsd  0x60(%rbp),%xmm8
movsd  0x58(%rbp),%xmm8
movsd  0x50(%rbp),%xmm8
movsd  0x48(%rbp),%xmm8
movsd  0x40(%rbp),%xmm8
movsd  0x38(%rbp),%xmm8
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0x10(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm4
movsd  -0x60(%rbp),%xmm5
movsd  -0x20(%rbp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,-0x68(%rbp)
movsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0x20(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0x28(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0x30(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm4
movsd  -0x60(%rbp),%xmm5
movsd  -0x20(%rbp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  0x38(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0x40(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0x48(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm4
movsd  -0x60(%rbp),%xmm5
movsd  -0x20(%rbp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,-0x78(%rbp)
movsd  0x58(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0x60(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0x68(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0x70(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm4
movsd  -0x60(%rbp),%xmm5
movsd  -0x20(%rbp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,-0x80(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
movsd  -0x70(%rbp),%xmm4
movsd  -0x78(%rbp),%xmm5
movsd  -0x18(%rbp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<int16>:
sub    $0x98,%rsp
movaps %xmm7,%xmm8
movaps %xmm6,%xmm9
movaps %xmm5,%xmm7
movsd  %xmm4,0x8(%rsp)
movaps %xmm3,%xmm6
movsd  %xmm3,0x28(%rsp)
movsd  %xmm2,0x90(%rsp)
movsd  %xmm1,0x20(%rsp)
movsd  %xmm0,0x88(%rsp)
movsd  0xe8(%rsp),%xmm0
movsd  %xmm0,0x80(%rsp)
movsd  0xf0(%rsp),%xmm0
movsd  %xmm0,0x78(%rsp)
movsd  0xf8(%rsp),%xmm0
movsd  %xmm0,0x70(%rsp)
movsd  0x100(%rsp),%xmm0
movsd  %xmm0,0x68(%rsp)
movsd  0xc8(%rsp),%xmm0
movsd  %xmm0,0x18(%rsp)
movsd  0xd0(%rsp),%xmm0
movsd  %xmm0,0x58(%rsp)
movsd  0xd8(%rsp),%xmm0
movsd  %xmm0,0x50(%rsp)
movsd  0xe0(%rsp),%xmm0
movsd  %xmm0,0x48(%rsp)
movsd  0xa8(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0xb0(%rsp),%xmm0
movsd  %xmm0,0x40(%rsp)
movsd  0xb8(%rsp),%xmm0
movsd  %xmm0,0x38(%rsp)
movsd  0xc0(%rsp),%xmm0
movsd  %xmm0,0x30(%rsp)
movsd  0xa0(%rsp),%xmm5
movaps %xmm1,%xmm0
movaps %xmm4,%xmm1
movaps %xmm7,%xmm2
movaps %xmm9,%xmm3
movaps %xmm8,%xmm4
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,0x60(%rsp)
movsd  0x20(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm2
movsd  0x40(%rsp),%xmm3
movsd  0x38(%rsp),%xmm4
movsd  0x30(%rsp),%xmm5
movsd  0x28(%rsp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,0x10(%rsp)
movsd  0x20(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
movsd  0x18(%rsp),%xmm2
movsd  0x58(%rsp),%xmm3
movsd  0x50(%rsp),%xmm4
movsd  0x48(%rsp),%xmm5
movsd  0x28(%rsp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  %xmm0,0x18(%rsp)
movsd  0x20(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
movsd  0x80(%rsp),%xmm2
movsd  0x78(%rsp),%xmm3
movsd  0x70(%rsp),%xmm4
movsd  0x68(%rsp),%xmm5
movsd  0x28(%rsp),%xmm6
mov    $0x7,%al
call   1030 <int4@plt>
movsd  0x88(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
movsd  0x60(%rsp),%xmm2
movsd  0x10(%rsp),%xmm3
movaps %xmm3,%xmm4
movsd  0x18(%rsp),%xmm5
movsd  0x90(%rsp),%xmm6
mov    $0x7,%al
add    $0x98,%rsp
jmp    1030 <int4@plt>

LLVM IR (-O0):
define double @int16(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18, double %19, double %20) {
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
%41 = alloca double
%42 = alloca double
%43 = alloca double
%44 = alloca double
%45 = alloca double
%46 = alloca double
%47 = alloca double
%48 = alloca double
%49 = alloca double
%50 = alloca double
store double %0, double* %22
store double %1, double* %23
store double %2, double* %24
store double %3, double* %25
store double %4, double* %26
store double %5, double* %27
store double %6, double* %28
store double %7, double* %29
store double %8, double* %30
store double %9, double* %31
store double %10, double* %32
store double %11, double* %33
store double %12, double* %34
store double %13, double* %35
store double %14, double* %36
store double %15, double* %37
store double %16, double* %38
store double %17, double* %39
store double %18, double* %40
store double %19, double* %41
store double %20, double* %42
%51 = load double, double* %27
store double %51, double* %43
%52 = load double, double* %28
store double %52, double* %44
%53 = load double, double* %29
store double %53, double* %45
%54 = load double, double* %30
store double %54, double* %46
%55 = load double, double* %23
%56 = load double, double* %26
%57 = load double, double* %43
%58 = load double, double* %44
%59 = load double, double* %45
%60 = load double, double* %46
%61 = load double, double* %25
%62 = call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %55, double %56, double %57, double %58, double %59, double %60, double %61)
store double %62, double* %47
%63 = load double, double* %31
store double %63, double* %43
%64 = load double, double* %32
store double %64, double* %44
%65 = load double, double* %33
store double %65, double* %45
%66 = load double, double* %34
store double %66, double* %46
%67 = load double, double* %23
%68 = load double, double* %26
%69 = load double, double* %43
%70 = load double, double* %44
%71 = load double, double* %45
%72 = load double, double* %46
%73 = load double, double* %25
%74 = call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %67, double %68, double %69, double %70, double %71, double %72, double %73)
store double %74, double* %48
%75 = load double, double* %35
store double %75, double* %43
%76 = load double, double* %36
store double %76, double* %44
%77 = load double, double* %37
store double %77, double* %45
%78 = load double, double* %38
store double %78, double* %46
%79 = load double, double* %23
%80 = load double, double* %26
%81 = load double, double* %43
%82 = load double, double* %44
%83 = load double, double* %45
%84 = load double, double* %46
%85 = load double, double* %25
%86 = call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %79, double %80, double %81, double %82, double %83, double %84, double %85)
store double %86, double* %49
%87 = load double, double* %39
store double %87, double* %43
%88 = load double, double* %40
store double %88, double* %44
%89 = load double, double* %41
store double %89, double* %45
%90 = load double, double* %42
store double %90, double* %46
%91 = load double, double* %23
%92 = load double, double* %26
%93 = load double, double* %43
%94 = load double, double* %44
%95 = load double, double* %45
%96 = load double, double* %46
%97 = load double, double* %25
%98 = call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %91, double %92, double %93, double %94, double %95, double %96, double %97)
store double %98, double* %50
%99 = load double, double* %22
%100 = load double, double* %26
%101 = load double, double* %47
%102 = load double, double* %48
%103 = load double, double* %48
%104 = load double, double* %49
%105 = load double, double* %24
%106 = call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %99, double %100, double %101, double %102, double %103, double %104, double %105)
ret double %106
}

LLVM IR (-O2):
define double @int16(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18, double %19, double %20) {
%22 = tail call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %1, double %4, double %5, double %6, double %7, double %8, double %3)
%23 = tail call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %1, double %4, double %9, double %10, double %11, double %12, double %3)
%24 = tail call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %1, double %4, double %13, double %14, double %15, double %16, double %3)
%25 = tail call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %1, double %4, double %17, double %18, double %19, double %20, double %3)
%26 = tail call double (double, double, double, double, double, double, double, ...) bitcast (double (...)* @int4 to double (double, double, double, double, double, double, double, ...)*)(double %0, double %4, double %22, double %23, double %23, double %24, double %2)
ret double %26
}