double ll_sp_value(unsigned long long value1, unsigned long long value2,
                   unsigned long long itv) {
  if ((value2 < value1) && (value1 <= 0xffffffff))
    return ((double)((value2 - value1) & 0xffffffff)) / itv * 100;
  else
    return (((double)((value2) - (value1))) / (itv)*100);
}


x86 assembly (clang, -O0):
<ll_sp_value>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    117b <ll_sp_value+0x7b>
mov    $0xffffffff,%eax
cmp    %rax,-0x10(%rbp)
ja     117b <ll_sp_value+0x7b>
mov    -0x18(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    %ecx,%eax
cvtsi2sd %rax,%xmm0
movaps 0xecf(%rip),%xmm2
movq   -0x20(%rbp),%xmm1
punpckldq %xmm2,%xmm1
movapd 0xece(%rip),%xmm2
subpd  %xmm2,%xmm1
movaps %xmm1,%xmm2
unpckhpd %xmm1,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  0xe93(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    11da <ll_sp_value+0xda>
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
movq   %rax,%xmm0
movaps 0xe7e(%rip),%xmm3
punpckldq %xmm3,%xmm0
movapd 0xe82(%rip),%xmm2
subpd  %xmm2,%xmm0
movaps %xmm0,%xmm1
unpckhpd %xmm0,%xmm0
addsd  %xmm1,%xmm0
movq   -0x20(%rbp),%xmm1
punpckldq %xmm3,%xmm1
subpd  %xmm2,%xmm1
movaps %xmm1,%xmm2
unpckhpd %xmm1,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  0xe2f(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ll_sp_value>:
mov    %rdi,%rax
shr    $0x20,%rax
sub    %rdi,%rsi
mov    %esi,%ecx
cmovae %rsi,%rcx
test   %rax,%rax
cmovne %rsi,%rcx
movq   %rcx,%xmm1
movdqa 0xedc(%rip),%xmm2
punpckldq %xmm2,%xmm1
movapd 0xee0(%rip),%xmm3
subpd  %xmm3,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
addsd  %xmm1,%xmm0
movq   %rdx,%xmm1
punpckldq %xmm2,%xmm1
subpd  %xmm3,%xmm1
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
addsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
mulsd  0xebb(%rip),%xmm0
ret

LLVM IR (-O0):
define double @ll_sp_value(i64 %0, i64 %1, i64 %2) {
%4 = alloca double
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
store i64 %0, i64* %5
store i64 %1, i64* %6
store i64 %2, i64* %7
%8 = load i64, i64* %6
%9 = load i64, i64* %5
%10 = icmp ult i64 %8, %9
br i1 %10, label %11, label %24
11: ; preds = %3
%12 = load i64, i64* %5
%13 = icmp ule i64 %12, 4294967295
br i1 %13, label %14, label %24
14: ; preds = %11
%15 = load i64, i64* %6
%16 = load i64, i64* %5
%17 = sub i64 %15, %16
%18 = and i64 %17, 4294967295
%19 = uitofp i64 %18 to double
%20 = load i64, i64* %7
%21 = uitofp i64 %20 to double
%22 = fdiv double %19, %21
%23 = fmul double %22, 1.000000e+02
store double %23, double* %4
br label %33
24: ; preds = %11, %3
%25 = load i64, i64* %6
%26 = load i64, i64* %5
%27 = sub i64 %25, %26
%28 = uitofp i64 %27 to double
%29 = load i64, i64* %7
%30 = uitofp i64 %29 to double
%31 = fdiv double %28, %30
%32 = fmul double %31, 1.000000e+02
store double %32, double* %4
br label %33
33: ; preds = %24, %14
%34 = load double, double* %4
ret double %34
}

LLVM IR (-O2):
define double @ll_sp_value(i64 %0, i64 %1, i64 %2) {
%4 = icmp ult i64 %1, %0
%5 = icmp ult i64 %0, 4294967296
%6 = and i1 %5, %4
%7 = sub i64 %1, %0
%8 = and i64 %7, 4294967295
%9 = select i1 %6, i64 %8, i64 %7
%10 = uitofp i64 %9 to double
%11 = uitofp i64 %2 to double
%12 = fdiv double %10, %11
%13 = fmul double %12, 1.000000e+02
ret double %13
}