double wstf(int words, int shortwords, int longwords, int bigwords,
            int sentences) {
  return 0.1935 * ((double)bigwords) / words +
         0.1672 * ((double)words) / sentences -
         0.1297 * ((double)longwords) / words -
         0.0327 * ((double)shortwords) / words - 0.875;
}


x86 assembly (clang, -O0):
<wstf>:
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)
cvtsi2sdl -0x10(%rbp),%xmm1
movsd  0xeff(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm2
movsd  0xedd(%rip),%xmm1
mulsd  %xmm2,%xmm1
cvtsi2sdl -0x14(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm2
movsd  0xeb7(%rip),%xmm1
mulsd  %xmm2,%xmm1
cvtsi2sdl -0x4(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm2
movsd  0xe91(%rip),%xmm1
mulsd  %xmm2,%xmm1
cvtsi2sdl -0x4(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  0xe70(%rip),%xmm1
subsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<wstf>:
movd   %edi,%xmm0
movd   %ecx,%xmm1
punpckldq %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
movapd %xmm0,%xmm2
shufpd $0x1,%xmm1,%xmm2
movd   %esi,%xmm1
movd   %edx,%xmm3
punpckldq %xmm1,%xmm3
movapd 0xecb(%rip),%xmm1
mulpd  %xmm0,%xmm1
cvtdq2pd %xmm3,%xmm3
divpd  %xmm2,%xmm1
mulpd  0xec7(%rip),%xmm3
unpckhpd %xmm0,%xmm0
divpd  %xmm0,%xmm3
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
addsd  %xmm1,%xmm0
subsd  %xmm3,%xmm0
unpckhpd %xmm3,%xmm3
subsd  %xmm3,%xmm0
addsd  0xeaf(%rip),%xmm0
ret

LLVM IR (-O0):
define double @wstf(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
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
%11 = load i32, i32* %9
%12 = sitofp i32 %11 to double
%13 = fmul double 1.935000e-01, %12
%14 = load i32, i32* %6
%15 = sitofp i32 %14 to double
%16 = fdiv double %13, %15
%17 = load i32, i32* %6
%18 = sitofp i32 %17 to double
%19 = fmul double 1.672000e-01, %18
%20 = load i32, i32* %10
%21 = sitofp i32 %20 to double
%22 = fdiv double %19, %21
%23 = fadd double %16, %22
%24 = load i32, i32* %8
%25 = sitofp i32 %24 to double
%26 = fmul double 1.297000e-01, %25
%27 = load i32, i32* %6
%28 = sitofp i32 %27 to double
%29 = fdiv double %26, %28
%30 = fsub double %23, %29
%31 = load i32, i32* %7
%32 = sitofp i32 %31 to double
%33 = fmul double 3.270000e-02, %32
%34 = load i32, i32* %6
%35 = sitofp i32 %34 to double
%36 = fdiv double %33, %35
%37 = fsub double %30, %36
%38 = fsub double %37, 8.750000e-01
ret double %38
}

LLVM IR (-O2):
define double @wstf(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = insertelement <2 x i32> poison, i32 %3, i64 0
%7 = insertelement <2 x i32> %6, i32 %0, i64 1
%8 = sitofp <2 x i32> %7 to <2 x double>
%9 = fmul <2 x double> %8, <double 1.935000e-01, double 1.672000e-01>
%10 = sitofp i32 %4 to double
%11 = shufflevector <2 x double> %8, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%12 = insertelement <2 x double> %11, double %10, i64 1
%13 = fdiv <2 x double> %9, %12
%14 = shufflevector <2 x double> %13, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%15 = fadd <2 x double> %13, %14
%16 = insertelement <2 x i32> poison, i32 %2, i64 0
%17 = insertelement <2 x i32> %16, i32 %1, i64 1
%18 = sitofp <2 x i32> %17 to <2 x double>
%19 = fmul <2 x double> %18, <double 1.297000e-01, double 3.270000e-02>
%20 = shufflevector <2 x double> %8, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%21 = fdiv <2 x double> %19, %20
%22 = fsub <2 x double> %15, %21
%23 = shufflevector <2 x double> %21, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%24 = fsub <2 x double> %22, %23
%25 = extractelement <2 x double> %24, i64 0
%26 = fadd double %25, -8.750000e-01
ret double %26
}