void float_to_ibm(long from[], long to[], long n) {
  register long fconv, fmant, ii, t;
  for (ii = 0; ii < n; ++ii) {
    fconv = from[ii];
    if (fconv) {
      fmant = (0x007fffff & fconv) | 0x00800000;
      t = (long)((0x7f800000 & fconv) >> 23) - 126;
      while (t & 0x3) {
        ++t;
        fmant >>= 1;
      }
      fconv = (0x80000000 & fconv) | (((t >> 2) + 64) << 24) | fmant;
    }
    to[ii] = fconv;
  }
  return;
}


x86 assembly (clang, -O0):
<float_to_ibm>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    11e4 <float_to_ibm+0xe4>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     11c3 <float_to_ibm+0xc3>
mov    -0x20(%rbp),%rax
and    $0x7fffff,%rax
or     $0x800000,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
and    $0x7f800000,%rax
sar    $0x17,%rax
sub    $0x7e,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
and    $0x3,%rax
cmp    $0x0,%rax
je     119a <float_to_ibm+0x9a>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rax
sar    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    116b <float_to_ibm+0x6b>
movabs $0x80000000,%rax
and    -0x20(%rbp),%rax
mov    -0x38(%rbp),%rcx
sar    $0x2,%rcx
add    $0x40,%rcx
shl    $0x18,%rcx
or     %rcx,%rax
or     -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1118 <float_to_ibm+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<float_to_ibm>:
test   %rdx,%rdx
jle    11ad <float_to_ibm+0xad>
xor    %eax,%eax
jmp    113c <float_to_ibm+0x3c>
shr    %r8
and    $0x80000000,%r9d
or     %r8,%r9
shl    $0x16,%rcx
add    $0x40000000,%rcx
and    $0xffffffffff000000,%rcx
or     %r9,%rcx
mov    %rcx,(%rsi,%rax,8)
add    $0x1,%rax
cmp    %rax,%rdx
je     11ad <float_to_ibm+0xad>
mov    (%rdi,%rax,8),%r9
test   %r9,%r9
je     1190 <float_to_ibm+0x90>
mov    %r9d,%r8d
and    $0x7fffff,%r8d
or     $0x800000,%r8
mov    %r9d,%ecx
shr    $0x17,%ecx
movzbl %cl,%r10d
lea    -0x7e(%r10),%rcx
test   $0x3,%cl
je     1110 <float_to_ibm+0x10>
lea    -0x7d(%r10),%rcx
test   $0x3,%cl
je     110d <float_to_ibm+0xd>
test   $0x1800000,%r9d
je     1194 <float_to_ibm+0x94>
lea    -0x7b(%r10),%rcx
test   $0x3,%cl
je     11a4 <float_to_ibm+0xa4>
add    $0xffffffffffffff86,%r10
shr    $0x4,%r8
jmp    119c <float_to_ibm+0x9c>
xchg   %ax,%ax
xor    %ecx,%ecx
jmp    112f <float_to_ibm+0x2f>
add    $0xffffffffffffff84,%r10
shr    $0x2,%r8
mov    %r10,%rcx
jmp    1110 <float_to_ibm+0x10>
shr    $0x3,%r8
jmp    1110 <float_to_ibm+0x10>
ret

LLVM IR (-O0):
define void @float_to_ibm(i64* %0, i64* %1, i64 %2) {
%4 = alloca i64*
%5 = alloca i64*
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
store i64* %0, i64** %4
store i64* %1, i64** %5
store i64 %2, i64* %6
store i64 0, i64* %9
br label %11
11: ; preds = %54, %3
%12 = load i64, i64* %9
%13 = load i64, i64* %6
%14 = icmp slt i64 %12, %13
br i1 %14, label %15, label %57
15: ; preds = %11
%16 = load i64*, i64** %4
%17 = load i64, i64* %9
%18 = getelementptr inbounds i64, i64* %16, i64 %17
%19 = load i64, i64* %18
store i64 %19, i64* %7
%20 = load i64, i64* %7
%21 = icmp ne i64 %20, 0
br i1 %21, label %22, label %49
22: ; preds = %15
%23 = load i64, i64* %7
%24 = and i64 8388607, %23
%25 = or i64 %24, 8388608
store i64 %25, i64* %8
%26 = load i64, i64* %7
%27 = and i64 2139095040, %26
%28 = ashr i64 %27, 23
%29 = sub nsw i64 %28, 126
store i64 %29, i64* %10
br label %30
30: ; preds = %34, %22
%31 = load i64, i64* %10
%32 = and i64 %31, 3
%33 = icmp ne i64 %32, 0
br i1 %33, label %34, label %39
34: ; preds = %30
%35 = load i64, i64* %10
%36 = add nsw i64 %35, 1
store i64 %36, i64* %10
%37 = load i64, i64* %8
%38 = ashr i64 %37, 1
store i64 %38, i64* %8
br label %30
39: ; preds = %30
%40 = load i64, i64* %7
%41 = and i64 2147483648, %40
%42 = load i64, i64* %10
%43 = ashr i64 %42, 2
%44 = add nsw i64 %43, 64
%45 = shl i64 %44, 24
%46 = or i64 %41, %45
%47 = load i64, i64* %8
%48 = or i64 %46, %47
store i64 %48, i64* %7
br label %49
49: ; preds = %39, %15
%50 = load i64, i64* %7
%51 = load i64*, i64** %5
%52 = load i64, i64* %9
%53 = getelementptr inbounds i64, i64* %51, i64 %52
store i64 %50, i64* %53
br label %54
54: ; preds = %49
%55 = load i64, i64* %9
%56 = add nsw i64 %55, 1
store i64 %56, i64* %9
br label %11
57: ; preds = %11
ret void
}

LLVM IR (-O2):
define void @float_to_ibm(i64* nocapture %0, i64* nocapture writeonly %1, i64 %2) {
%4 = icmp sgt i64 %2, 0
br i1 %4, label %5, label %50
5: ; preds = %3, %45
%6 = phi i64 [ %48, %45 ], [ 0, %3 ]
%7 = getelementptr inbounds i64, i64* %0, i64 %6
%8 = load i64, i64* %7
%9 = icmp eq i64 %8, 0
br i1 %9, label %45, label %10
10: ; preds = %5
%11 = and i64 %8, 8388607
%12 = or i64 %11, 8388608
%13 = lshr i64 %8, 23
%14 = and i64 %13, 255
%15 = add nsw i64 %14, -126
%16 = and i64 %15, 3
%17 = icmp eq i64 %16, 0
br i1 %17, label %36, label %18
18: ; preds = %10
%19 = add nsw i64 %14, -125
%20 = lshr i64 %12, 1
%21 = and i64 %19, 3
%22 = icmp eq i64 %21, 0
br i1 %22, label %36, label %23
23: ; preds = %18
%24 = add nsw i64 %14, -124
%25 = lshr i64 %12, 2
%26 = and i64 %8, 25165824
%27 = icmp eq i64 %26, 0
br i1 %27, label %36, label %28
28: ; preds = %23
%29 = add nsw i64 %14, -123
%30 = lshr i64 %12, 3
%31 = and i64 %29, 3
%32 = icmp eq i64 %31, 0
br i1 %32, label %36, label %33
33: ; preds = %28
%34 = add nsw i64 %14, -122
%35 = lshr i64 %12, 4
br label %36
36: ; preds = %18, %23, %28, %33, %10
%37 = phi i64 [ %12, %10 ], [ %20, %18 ], [ %25, %23 ], [ %30, %28 ], [ %35, %33 ]
%38 = phi i64 [ %15, %10 ], [ %19, %18 ], [ %24, %23 ], [ %29, %28 ], [ %34, %33 ]
%39 = and i64 %8, 2147483648
%40 = shl nsw i64 %38, 22
%41 = add nsw i64 %40, 1073741824
%42 = and i64 %41, -16777216
%43 = or i64 %37, %39
%44 = or i64 %43, %42
br label %45
45: ; preds = %36, %5
%46 = phi i64 [ %44, %36 ], [ 0, %5 ]
%47 = getelementptr inbounds i64, i64* %1, i64 %6
store i64 %46, i64* %47
%48 = add nuw nsw i64 %6, 1
%49 = icmp eq i64 %48, %2
br i1 %49, label %50, label %5
50: ; preds = %45, %3
ret void
}