double sqrt_multis(jj, ii)
int ii, jj;
{
  int i;
  double sqrt_multisa;
  sqrt_multisa = 1.0;
  if (jj > ii)
    for (i = jj; i > ii; i--)
      sqrt_multisa *= 1.0 / sqrt((double)i);
  return sqrt_multisa;
}


x86 assembly (clang, -O0):
<sqrt_multis>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movsd  0xeda(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    117f <sqrt_multis+0x6f>
mov    -0x4(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    117a <sqrt_multis+0x6a>
cvtsi2sdl -0xc(%rbp),%xmm0
call   1030 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  0xea2(%rip),%xmm0
divsd  %xmm1,%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    113d <sqrt_multis+0x2d>
jmp    117f <sqrt_multis+0x6f>
movsd  -0x18(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt_multis>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %edi,%eax
sub    %esi,%eax
jle    1141 <sqrt_multis+0x31>
mov    %esi,%ebx
mov    %edi,%r14d
mov    %esi,%r15d
not    %r15d
test   $0x1,%al
jne    1158 <sqrt_multis+0x48>
movsd  0xec9(%rip),%xmm2
mov    %r14d,%ebp
add    %r14d,%r15d
je     1149 <sqrt_multis+0x39>
jmp    1187 <sqrt_multis+0x77>
movsd  0xeb7(%rip),%xmm2
movapd %xmm2,%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
cvtsi2sd %r14d,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     116d <sqrt_multis+0x5d>
sqrtsd %xmm0,%xmm0
jmp    1172 <sqrt_multis+0x62>
call   1030 <sqrt@plt>
movsd  0xe86(%rip),%xmm2
divsd  %xmm0,%xmm2
lea    -0x1(%r14),%ebp
add    %r14d,%r15d
je     1149 <sqrt_multis+0x39>
xorpd  %xmm3,%xmm3
jmp    11d6 <sqrt_multis+0xc6>
nopl   (%rax)
movsd  %xmm5,0x10(%rsp)
call   1030 <sqrt@plt>
movsd  0x10(%rsp),%xmm5
xorpd  %xmm3,%xmm3
movsd  0x8(%rsp),%xmm2
movsd  0xe4d(%rip),%xmm4
movapd %xmm4,%xmm1
divsd  %xmm5,%xmm1
mulsd  %xmm1,%xmm2
movapd %xmm4,%xmm1
divsd  %xmm0,%xmm1
mulsd  %xmm1,%xmm2
add    $0xffffffff,%ebp
cmp    %ebx,%ebp
jle    1149 <sqrt_multis+0x39>
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
ucomisd %xmm3,%xmm0
movsd  %xmm2,0x8(%rsp)
jb     1200 <sqrt_multis+0xf0>
xorps  %xmm5,%xmm5
sqrtsd %xmm0,%xmm5
jmp    120d <sqrt_multis+0xfd>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
call   1030 <sqrt@plt>
xorpd  %xmm3,%xmm3
movapd %xmm0,%xmm5
add    $0xffffffff,%ebp
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
ucomisd %xmm3,%xmm0
jb     1190 <sqrt_multis+0x80>
sqrtsd %xmm0,%xmm0
jmp    11a5 <sqrt_multis+0x95>

LLVM IR (-O0):
define double @sqrt_multis(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca double
store i32 %0, i32* %3
store i32 %1, i32* %4
store double 1.000000e+00, double* %6
%7 = load i32, i32* %3
%8 = load i32, i32* %4
%9 = icmp sgt i32 %7, %8
br i1 %9, label %10, label %27
10: ; preds = %2
%11 = load i32, i32* %3
store i32 %11, i32* %5
br label %12
12: ; preds = %23, %10
%13 = load i32, i32* %5
%14 = load i32, i32* %4
%15 = icmp sgt i32 %13, %14
br i1 %15, label %16, label %26
16: ; preds = %12
%17 = load i32, i32* %5
%18 = sitofp i32 %17 to double
%19 = call double @sqrt(double %18)
%20 = fdiv double 1.000000e+00, %19
%21 = load double, double* %6
%22 = fmul double %21, %20
store double %22, double* %6
br label %23
23: ; preds = %16
%24 = load i32, i32* %5
%25 = add nsw i32 %24, -1
store i32 %25, i32* %5
br label %12
26: ; preds = %12
br label %27
27: ; preds = %26, %2
%28 = load double, double* %6
ret double %28
}

LLVM IR (-O2):
define double @sqrt_multis(i32 %0, i32 %1) {
%3 = icmp sgt i32 %0, %1
br i1 %3, label %4, label %34
4: ; preds = %2
%5 = sub i32 %0, %1
%6 = xor i32 %1, -1
%7 = and i32 %5, 1
%8 = icmp eq i32 %7, 0
br i1 %8, label %14, label %9
9: ; preds = %4
%10 = sitofp i32 %0 to double
%11 = tail call double @sqrt(double %10)
%12 = fdiv double 1.000000e+00, %11
%13 = add nsw i32 %0, -1
br label %14
14: ; preds = %9, %4
%15 = phi double [ 1.000000e+00, %4 ], [ %12, %9 ]
%16 = phi i32 [ %0, %4 ], [ %13, %9 ]
%17 = phi double [ undef, %4 ], [ %12, %9 ]
%18 = sub i32 0, %0
%19 = icmp eq i32 %6, %18
br i1 %19, label %34, label %20
20: ; preds = %14, %20
%21 = phi double [ %31, %20 ], [ %15, %14 ]
%22 = phi i32 [ %32, %20 ], [ %16, %14 ]
%23 = sitofp i32 %22 to double
%24 = tail call double @sqrt(double %23)
%25 = fdiv double 1.000000e+00, %24
%26 = fmul double %21, %25
%27 = add nsw i32 %22, -1
%28 = sitofp i32 %27 to double
%29 = tail call double @sqrt(double %28)
%30 = fdiv double 1.000000e+00, %29
%31 = fmul double %26, %30
%32 = add nsw i32 %22, -2
%33 = icmp sgt i32 %32, %1
br i1 %33, label %20, label %34
34: ; preds = %14, %20, %2
%35 = phi double [ 1.000000e+00, %2 ], [ %17, %14 ], [ %31, %20 ]
ret double %35
}