void _ITH64I(unsigned long datum, long *lp) {
  unsigned long exp, man, nbit, sign;
  nbit = 1 << 47;
  sign = (datum >> 31) << 63;
  man = nbit | ((datum << 41) >> 17);
  exp = (datum << 33) >> 56;
  if (exp == 255) {
    exp = 24576;
    if (man != nbit)
      man = nbit | 0x3C4E614E3E;
  } else if (exp == 0) {
    man = 0;
    sign = 0;
  } else
    exp = exp + (16384 - 127 + 1);
  exp = exp << 48;
  *lp = sign | (exp + man);
  return;
}


x86 assembly (clang, -O0):
<_ITH64I>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
shr    $0x1f,%rax
shl    $0x3f,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x8(%rbp),%rcx
shl    $0x29,%rcx
shr    $0x11,%rcx
or     %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x21,%rax
shr    $0x38,%rax
mov    %rax,-0x18(%rbp)
cmpq   $0xff,-0x18(%rbp)
jne    1182 <_ITH64I+0x82>
movq   $0x6000,-0x18(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
je     117d <_ITH64I+0x7d>
movabs $0x3c4e614e3e,%rax
or     -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11b5 <_ITH64I+0xb5>
cmpq   $0x0,-0x18(%rbp)
jne    11a2 <_ITH64I+0xa2>
movq   $0x0,-0x20(%rbp)
movq   $0x0,-0x30(%rbp)
jmp    11b0 <_ITH64I+0xb0>
mov    -0x18(%rbp),%rax
add    $0x3f82,%rax
mov    %rax,-0x18(%rbp)
jmp    11b5 <_ITH64I+0xb5>
mov    -0x18(%rbp),%rax
shl    $0x30,%rax
mov    %rax,-0x18(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
or     %rax,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_ITH64I>:
mov    %edi,%eax
and    $0x80000000,%eax
shl    $0x20,%rax
shr    $0x17,%rdi
cmp    $0xff,%dil
je     1120 <_ITH64I+0x20>
test   %dil,%dil
jne    112c <_ITH64I+0x2c>
xor    %ecx,%ecx
xor    %eax,%eax
jmp    1141 <_ITH64I+0x41>
movabs $0x6000000000000000,%rcx
jmp    1141 <_ITH64I+0x41>
movzbl %dil,%edx
shl    $0x30,%rdx
movabs $0x3f82000000000000,%rcx
add    %rdx,%rcx
or     %rax,%rcx
mov    %rcx,(%rsi)
ret

LLVM IR (-O0):
define void @_ITH64I(i64 %0, i64* %1) {
%3 = alloca i64
%4 = alloca i64*
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
store i64 %0, i64* %3
store i64* %1, i64** %4
store i64 poison, i64* %7
%9 = load i64, i64* %3
%10 = lshr i64 %9, 31
%11 = shl i64 %10, 63
store i64 %11, i64* %8
%12 = load i64, i64* %7
%13 = load i64, i64* %3
%14 = shl i64 %13, 41
%15 = lshr i64 %14, 17
%16 = or i64 %12, %15
store i64 %16, i64* %6
%17 = load i64, i64* %3
%18 = shl i64 %17, 33
%19 = lshr i64 %18, 56
store i64 %19, i64* %5
%20 = load i64, i64* %5
%21 = icmp eq i64 %20, 255
br i1 %21, label %22, label %30
22: ; preds = %2
store i64 24576, i64* %5
%23 = load i64, i64* %6
%24 = load i64, i64* %7
%25 = icmp ne i64 %23, %24
br i1 %25, label %26, label %29
26: ; preds = %22
%27 = load i64, i64* %7
%28 = or i64 %27, 259013037630
store i64 %28, i64* %6
br label %29
29: ; preds = %26, %22
br label %38
30: ; preds = %2
%31 = load i64, i64* %5
%32 = icmp eq i64 %31, 0
br i1 %32, label %33, label %34
33: ; preds = %30
store i64 0, i64* %6
store i64 0, i64* %8
br label %37
34: ; preds = %30
%35 = load i64, i64* %5
%36 = add i64 %35, 16258
store i64 %36, i64* %5
br label %37
37: ; preds = %34, %33
br label %38
38: ; preds = %37, %29
%39 = load i64, i64* %5
%40 = shl i64 %39, 48
store i64 %40, i64* %5
%41 = load i64, i64* %8
%42 = load i64, i64* %5
%43 = load i64, i64* %6
%44 = add i64 %42, %43
%45 = or i64 %41, %44
%46 = load i64*, i64** %4
store i64 %45, i64* %46
ret void
}

LLVM IR (-O2):
define void @_ITH64I(i64 %0, i64* nocapture writeonly %1) {
%3 = shl i64 %0, 32
%4 = and i64 %3, -9223372036854775808
%5 = lshr i64 %0, 23
%6 = trunc i64 %5 to i8
switch i8 %6, label %8 [
i8 -1, label %12
i8 0, label %7
]
7: ; preds = %2
br label %12
8: ; preds = %2
%9 = shl i64 %5, 48
%10 = and i64 %9, 71776119061217280
%11 = add nuw nsw i64 %10, 4576220171361845248
br label %12
12: ; preds = %2, %7, %8
%13 = phi i64 [ 0, %7 ], [ %11, %8 ], [ 6917529027641081856, %2 ]
%14 = phi i64 [ 0, %7 ], [ %4, %8 ], [ %4, %2 ]
%15 = or i64 %14, %13
store i64 %15, i64* %1
ret void
}