void hour2hms(double H, int *h, int *m, float *s) {
  *h = (int)H;
  *m = (int)((H - *h) * 60);
  *s = (int)((H - *h) * 3600 - (*m * 60));
}


x86 assembly (clang, -O0):
<hour2hms>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
cvttsd2si -0x8(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x8(%rbp),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl (%rax),%xmm1
subsd  %xmm1,%xmm0
movsd  0xecf(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x8(%rbp),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl (%rax),%xmm1
subsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
imul   $0x3c,(%rax),%eax
cvtsi2sd %eax,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xe7e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
cvtsi2ss %eax,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<hour2hms>:
cvttsd2si %xmm0,%eax
cvttpd2dq %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
mulsd  0xee4(%rip),%xmm2
cvttsd2si %xmm2,%ecx
mov    %eax,(%rdi)
mov    %ecx,(%rsi)
xorps  %xmm1,%xmm1
cvtsi2sdl (%rdi),%xmm1
imul   $0x3c,%ecx,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm0
mulsd  0xec7(%rip),%xmm0
subsd  %xmm2,%xmm0
cvttpd2dq %xmm0,%xmm0
cvtdq2ps %xmm0,%xmm0
movss  %xmm0,(%rdx)
ret

LLVM IR (-O0):
define void @hour2hms(double %0, i32* %1, i32* %2, float* %3) {
%5 = alloca double
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca float*
store double %0, double* %5
store i32* %1, i32** %6
store i32* %2, i32** %7
store float* %3, float** %8
%9 = load double, double* %5
%10 = fptosi double %9 to i32
%11 = load i32*, i32** %6
store i32 %10, i32* %11
%12 = load double, double* %5
%13 = load i32*, i32** %6
%14 = load i32, i32* %13
%15 = sitofp i32 %14 to double
%16 = fsub double %12, %15
%17 = fmul double %16, 6.000000e+01
%18 = fptosi double %17 to i32
%19 = load i32*, i32** %7
store i32 %18, i32* %19
%20 = load double, double* %5
%21 = load i32*, i32** %6
%22 = load i32, i32* %21
%23 = sitofp i32 %22 to double
%24 = fsub double %20, %23
%25 = load i32*, i32** %7
%26 = load i32, i32* %25
%27 = mul nsw i32 %26, 60
%28 = sitofp i32 %27 to double
%29 = fneg double %28
%30 = call double @llvm.fmuladd.f64(double %24, double 3.600000e+03, double %29)
%31 = fptosi double %30 to i32
%32 = sitofp i32 %31 to float
%33 = load float*, float** %8
store float %32, float* %33
ret void
}

LLVM IR (-O2):
define void @hour2hms(double %0, i32* nocapture %1, i32* nocapture writeonly %2, float* nocapture writeonly %3) {
%5 = fptosi double %0 to i32
store i32 %5, i32* %1
%6 = sitofp i32 %5 to double
%7 = fsub double %0, %6
%8 = fmul double %7, 6.000000e+01
%9 = fptosi double %8 to i32
store i32 %9, i32* %2
%10 = load i32, i32* %1
%11 = sitofp i32 %10 to double
%12 = fsub double %0, %11
%13 = mul nsw i32 %9, 60
%14 = sitofp i32 %13 to double
%15 = fneg double %14
%16 = tail call double @llvm.fmuladd.f64(double %12, double 3.600000e+03, double %15)
%17 = fptosi double %16 to i32
%18 = sitofp i32 %17 to float
store float %18, float* %3
ret void
}