int projtraj(x, vx, x0, coef, ncoef, dlong, dshort)
float *x, *vx, x0, coef[], dlong, dshort;
int ncoef;
{
  float dt;
  float dts;
  float xc, xs;
  dt = dlong / dshort;
  dts = dlong;
  xs = sin(coef[5] * dt);
  xc = cos(coef[1] * dt + coef[4] * xs);
  xs = sin(coef[1] * dt + coef[4] * xs);
  dts = cos(coef[5] * dt);
  *vx = -coef[2] * (coef[1] + coef[4] * coef[5] * dts) * xs +
        coef[3] * (coef[1] + coef[4] * coef[5] * dts) * xc;
  *vx = *vx / (dshort * 1.414213562373095);
  *x = coef[0] + (coef[2] * xc + coef[3] * xs) / 1.414213562373095;
}


x86 assembly (clang, -O0):
<projtraj>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm2,-0x50(%rbp)
movaps %xmm0,%xmm2
movsd  -0x50(%rbp),%xmm0
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movss  %xmm2,-0x1c(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
movss  %xmm1,-0x30(%rbp)
movss  %xmm0,-0x34(%rbp)
movss  -0x30(%rbp),%xmm0
divss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x28(%rbp),%rax
movss  0x14(%rax),%xmm0
mulss  -0x38(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x28(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movss  0x10(%rax),%xmm1
mulss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <cos@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movss  0x10(%rax),%xmm1
mulss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x28(%rbp),%rax
movss  0x14(%rax),%xmm0
mulss  -0x38(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <cos@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x28(%rbp),%rax
movss  0x8(%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x28(%rbp),%rax
movss  0x4(%rax),%xmm2
mov    -0x28(%rbp),%rax
movss  0x10(%rax),%xmm1
mov    -0x28(%rbp),%rax
mulss  0x14(%rax),%xmm1
movss  -0x3c(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  -0x44(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movss  0xc(%rax),%xmm1
mov    -0x28(%rbp),%rax
movss  0x4(%rax),%xmm4
mov    -0x28(%rbp),%rax
movss  0x10(%rax),%xmm3
mov    -0x28(%rbp),%rax
mulss  0x14(%rax),%xmm3
movss  -0x3c(%rbp),%xmm5
mulss  %xmm5,%xmm3
addss  %xmm4,%xmm3
mulss  %xmm3,%xmm1
mulss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x34(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd2e(%rip),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  0x8(%rax),%xmm1
movss  -0x40(%rbp),%xmm3
mov    -0x28(%rbp),%rax
movss  0xc(%rax),%xmm2
mulss  -0x44(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xcde(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<projtraj>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rdx,%rbx
mov    %rsi,%r15
mov    %rdi,%r14
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm0
movss  %xmm0,0xc(%rsp)
divss  %xmm0,%xmm1
movss  %xmm1,0x4(%rsp)
movss  0x14(%rdx),%xmm0
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <sin@plt>
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movss  %xmm1,(%rsp)
movss  0x10(%rbx),%xmm0
mulss  %xmm1,%xmm0
movss  0x4(%rbx),%xmm1
mulss  0x4(%rsp),%xmm1
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
call   1040 <cos@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x8(%rsp)
movss  (%rsp),%xmm1
mulss  0x10(%rbx),%xmm1
movss  0x4(%rbx),%xmm0
mulss  0x4(%rsp),%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rsp)
movss  0x4(%rsp),%xmm0
mulss  0x14(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <cos@plt>
cvtsd2ss %xmm0,%xmm0
movss  0x10(%rbx),%xmm1
mulss  0x14(%rbx),%xmm1
mulss  %xmm0,%xmm1
addss  0x4(%rbx),%xmm1
movss  0x8(%rbx),%xmm0
mulss  %xmm1,%xmm0
mulss  0xc(%rbx),%xmm1
movss  0x8(%rsp),%xmm3
mulss  %xmm3,%xmm1
movss  (%rsp),%xmm4
mulss  %xmm4,%xmm0
subss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
movss  0xc(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xdd6(%rip),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r15)
movss  (%rbx),%xmm0
mulss  0xc(%rbx),%xmm4
movaps %xmm3,%xmm1
mulss  0x8(%rbx),%xmm1
cvtss2sd %xmm0,%xmm0
addss  %xmm4,%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,(%r14)
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @projtraj(float* %0, float* %1, double %2, float* %3, i32 %4, double %5, double %6) {
%8 = alloca i32
%9 = alloca float*
%10 = alloca float*
%11 = alloca float
%12 = alloca float*
%13 = alloca i32
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = fptrunc double %2 to float
%21 = fptrunc double %5 to float
%22 = fptrunc double %6 to float
store float* %0, float** %9
store float* %1, float** %10
store float %20, float* %11
store float* %3, float** %12
store i32 %4, i32* %13
store float %21, float* %14
store float %22, float* %15
%23 = load float, float* %14
%24 = load float, float* %15
%25 = fdiv float %23, %24
store float %25, float* %16
%26 = load float, float* %14
store float %26, float* %17
%27 = load float*, float** %12
%28 = getelementptr inbounds float, float* %27, i64 5
%29 = load float, float* %28
%30 = load float, float* %16
%31 = fmul float %29, %30
%32 = fpext float %31 to double
%33 = call double @sin(double %32)
%34 = fptrunc double %33 to float
store float %34, float* %19
%35 = load float*, float** %12
%36 = getelementptr inbounds float, float* %35, i64 1
%37 = load float, float* %36
%38 = load float, float* %16
%39 = load float*, float** %12
%40 = getelementptr inbounds float, float* %39, i64 4
%41 = load float, float* %40
%42 = load float, float* %19
%43 = fmul float %41, %42
%44 = call float @llvm.fmuladd.f32(float %37, float %38, float %43)
%45 = fpext float %44 to double
%46 = call double @cos(double %45)
%47 = fptrunc double %46 to float
store float %47, float* %18
%48 = load float*, float** %12
%49 = getelementptr inbounds float, float* %48, i64 1
%50 = load float, float* %49
%51 = load float, float* %16
%52 = load float*, float** %12
%53 = getelementptr inbounds float, float* %52, i64 4
%54 = load float, float* %53
%55 = load float, float* %19
%56 = fmul float %54, %55
%57 = call float @llvm.fmuladd.f32(float %50, float %51, float %56)
%58 = fpext float %57 to double
%59 = call double @sin(double %58)
%60 = fptrunc double %59 to float
store float %60, float* %19
%61 = load float*, float** %12
%62 = getelementptr inbounds float, float* %61, i64 5
%63 = load float, float* %62
%64 = load float, float* %16
%65 = fmul float %63, %64
%66 = fpext float %65 to double
%67 = call double @cos(double %66)
%68 = fptrunc double %67 to float
store float %68, float* %17
%69 = load float*, float** %12
%70 = getelementptr inbounds float, float* %69, i64 2
%71 = load float, float* %70
%72 = fneg float %71
%73 = load float*, float** %12
%74 = getelementptr inbounds float, float* %73, i64 1
%75 = load float, float* %74
%76 = load float*, float** %12
%77 = getelementptr inbounds float, float* %76, i64 4
%78 = load float, float* %77
%79 = load float*, float** %12
%80 = getelementptr inbounds float, float* %79, i64 5
%81 = load float, float* %80
%82 = fmul float %78, %81
%83 = load float, float* %17
%84 = call float @llvm.fmuladd.f32(float %82, float %83, float %75)
%85 = fmul float %72, %84
%86 = load float, float* %19
%87 = load float*, float** %12
%88 = getelementptr inbounds float, float* %87, i64 3
%89 = load float, float* %88
%90 = load float*, float** %12
%91 = getelementptr inbounds float, float* %90, i64 1
%92 = load float, float* %91
%93 = load float*, float** %12
%94 = getelementptr inbounds float, float* %93, i64 4
%95 = load float, float* %94
%96 = load float*, float** %12
%97 = getelementptr inbounds float, float* %96, i64 5
%98 = load float, float* %97
%99 = fmul float %95, %98
%100 = load float, float* %17
%101 = call float @llvm.fmuladd.f32(float %99, float %100, float %92)
%102 = fmul float %89, %101
%103 = load float, float* %18
%104 = fmul float %102, %103
%105 = call float @llvm.fmuladd.f32(float %85, float %86, float %104)
%106 = load float*, float** %10
store float %105, float* %106
%107 = load float*, float** %10
%108 = load float, float* %107
%109 = fpext float %108 to double
%110 = load float, float* %15
%111 = fpext float %110 to double
%112 = fmul double %111, 0x3FF6A09E667F3BCC
%113 = fdiv double %109, %112
%114 = fptrunc double %113 to float
%115 = load float*, float** %10
store float %114, float* %115
%116 = load float*, float** %12
%117 = getelementptr inbounds float, float* %116, i64 0
%118 = load float, float* %117
%119 = fpext float %118 to double
%120 = load float*, float** %12
%121 = getelementptr inbounds float, float* %120, i64 2
%122 = load float, float* %121
%123 = load float, float* %18
%124 = load float*, float** %12
%125 = getelementptr inbounds float, float* %124, i64 3
%126 = load float, float* %125
%127 = load float, float* %19
%128 = fmul float %126, %127
%129 = call float @llvm.fmuladd.f32(float %122, float %123, float %128)
%130 = fpext float %129 to double
%131 = fdiv double %130, 0x3FF6A09E667F3BCC
%132 = fadd double %119, %131
%133 = fptrunc double %132 to float
%134 = load float*, float** %9
store float %133, float* %134
%135 = load i32, i32* %8
ret i32 %135
}

LLVM IR (-O2):
define i32 @projtraj(float* nocapture writeonly %0, float* nocapture writeonly %1, double %2, float* nocapture %3, i32 %4, double %5, double %6) {
%8 = fptrunc double %5 to float
%9 = fptrunc double %6 to float
%10 = fdiv float %8, %9
%11 = getelementptr inbounds float, float* %3, i64 5
%12 = load float, float* %11
%13 = fmul float %10, %12
%14 = fpext float %13 to double
%15 = tail call double @sin(double %14)
%16 = fptrunc double %15 to float
%17 = getelementptr inbounds float, float* %3, i64 1
%18 = load float, float* %17
%19 = getelementptr inbounds float, float* %3, i64 4
%20 = load float, float* %19
%21 = fmul float %20, %16
%22 = tail call float @llvm.fmuladd.f32(float %18, float %10, float %21)
%23 = fpext float %22 to double
%24 = tail call double @cos(double %23)
%25 = fptrunc double %24 to float
%26 = load float, float* %17
%27 = load float, float* %19
%28 = fmul float %27, %16
%29 = tail call float @llvm.fmuladd.f32(float %26, float %10, float %28)
%30 = fpext float %29 to double
%31 = tail call double @sin(double %30)
%32 = fptrunc double %31 to float
%33 = load float, float* %11
%34 = fmul float %10, %33
%35 = fpext float %34 to double
%36 = tail call double @cos(double %35)
%37 = fptrunc double %36 to float
%38 = getelementptr inbounds float, float* %3, i64 2
%39 = load float, float* %38
%40 = fneg float %39
%41 = load float, float* %17
%42 = load float, float* %19
%43 = load float, float* %11
%44 = fmul float %42, %43
%45 = tail call float @llvm.fmuladd.f32(float %44, float %37, float %41)
%46 = fmul float %45, %40
%47 = getelementptr inbounds float, float* %3, i64 3
%48 = load float, float* %47
%49 = fmul float %48, %45
%50 = fmul float %49, %25
%51 = tail call float @llvm.fmuladd.f32(float %46, float %32, float %50)
%52 = fpext float %51 to double
%53 = fpext float %9 to double
%54 = fmul double %53, 0x3FF6A09E667F3BCC
%55 = fdiv double %52, %54
%56 = fptrunc double %55 to float
store float %56, float* %1
%57 = load float, float* %3
%58 = fpext float %57 to double
%59 = load float, float* %38
%60 = load float, float* %47
%61 = fmul float %60, %32
%62 = tail call float @llvm.fmuladd.f32(float %59, float %25, float %61)
%63 = fpext float %62 to double
%64 = fdiv double %63, 0x3FF6A09E667F3BCC
%65 = fadd double %64, %58
%66 = fptrunc double %65 to float
store float %66, float* %0
ret i32 undef
}