float __rinff(float x) {
  union {
    float f;
    int i;
    struct {
      int i1;
    };
  } u = {x};
  int exp = ((u.i1 >> 23) & 0xFF) - 127;
  if (exp >= 24 || exp == -127)
    return x;
  if (exp < 0)
    return u.i1 & 0x80000000 ? -1.0f : 1.0f;
  int mask = 0x007FFFFF >> exp;
  if (u.i & mask) {
    u.i &= ~mask;
    u.i += mask + 1;
  }
  return u.f;
}


x86 assembly (clang, -O0):
<__rinff>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x17,%eax
and    $0xff,%eax
sub    $0x7f,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x18,-0x14(%rbp)
jge    1138 <__rinff+0x38>
cmpl   $0xffffff81,-0x14(%rbp)
jne    1147 <__rinff+0x47>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11d3 <__rinff+0xd3>
cmpl   $0x0,-0x14(%rbp)
jge    1195 <__rinff+0x95>
mov    -0x10(%rbp),%eax
and    $0x80000000,%eax
movss  0xe9f(%rip),%xmm0
movss  0xe9b(%rip),%xmm1
movss  %xmm1,-0x20(%rbp)
cmp    $0x0,%eax
movss  %xmm0,-0x1c(%rbp)
jne    1186 <__rinff+0x86>
movss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11d3 <__rinff+0xd3>
mov    -0x14(%rbp),%ecx
mov    $0x7fffff,%eax
sar    %cl,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%eax
and    -0x18(%rbp),%eax
cmp    $0x0,%eax
je     11c9 <__rinff+0xc9>
mov    -0x18(%rbp),%eax
xor    $0xffffffff,%eax
and    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<__rinff>:
movd   %xmm0,%eax
mov    %eax,%ecx
shr    $0x17,%ecx
movzbl %cl,%ecx
lea    -0x97(%rcx),%edx
cmp    $0xffffff6a,%edx
jb     1151 <__rinff+0x51>
cmp    $0x7e,%ecx
ja     1130 <__rinff+0x30>
pand   0xed9(%rip),%xmm0
por    0xee1(%rip),%xmm0
ret
add    $0xffffff81,%ecx
mov    $0x7fffff,%edx
shr    %cl,%edx
test   %eax,%edx
je     1151 <__rinff+0x51>
mov    $0xff800000,%esi
sar    %cl,%esi
and    %eax,%esi
lea    (%rdx,%rsi,1),%eax
add    $0x1,%eax
movd   %eax,%xmm0
ret

LLVM IR (-O0):
%union.anon = type { float }
%struct.anon = type { i32 }
define float @__rinff(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca %union.anon
%5 = alloca i32
%6 = alloca i32
store float %0, float* %3
%7 = bitcast %union.anon* %4 to float*
%8 = load float, float* %3
store float %8, float* %7
%9 = bitcast %union.anon* %4 to %struct.anon*
%10 = getelementptr inbounds %struct.anon, %struct.anon* %9, i32 0, i32 0
%11 = load i32, i32* %10
%12 = ashr i32 %11, 23
%13 = and i32 %12, 255
%14 = sub nsw i32 %13, 127
store i32 %14, i32* %5
%15 = load i32, i32* %5
%16 = icmp sge i32 %15, 24
br i1 %16, label %20, label %17
17: ; preds = %1
%18 = load i32, i32* %5
%19 = icmp eq i32 %18, -127
br i1 %19, label %20, label %22
20: ; preds = %17, %1
%21 = load float, float* %3
store float %21, float* %2
br label %55
22: ; preds = %17
%23 = load i32, i32* %5
%24 = icmp slt i32 %23, 0
br i1 %24, label %25, label %33
25: ; preds = %22
%26 = bitcast %union.anon* %4 to %struct.anon*
%27 = getelementptr inbounds %struct.anon, %struct.anon* %26, i32 0, i32 0
%28 = load i32, i32* %27
%29 = and i32 %28, -2147483648
%30 = icmp ne i32 %29, 0
%31 = zext i1 %30 to i64
%32 = select i1 %30, float -1.000000e+00, float 1.000000e+00
store float %32, float* %2
br label %55
33: ; preds = %22
%34 = load i32, i32* %5
%35 = ashr i32 8388607, %34
store i32 %35, i32* %6
%36 = bitcast %union.anon* %4 to i32*
%37 = load i32, i32* %36
%38 = load i32, i32* %6
%39 = and i32 %37, %38
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %52
41: ; preds = %33
%42 = load i32, i32* %6
%43 = xor i32 %42, -1
%44 = bitcast %union.anon* %4 to i32*
%45 = load i32, i32* %44
%46 = and i32 %45, %43
store i32 %46, i32* %44
%47 = load i32, i32* %6
%48 = add nsw i32 %47, 1
%49 = bitcast %union.anon* %4 to i32*
%50 = load i32, i32* %49
%51 = add nsw i32 %50, %48
store i32 %51, i32* %49
br label %52
52: ; preds = %41, %33
%53 = bitcast %union.anon* %4 to float*
%54 = load float, float* %53
store float %54, float* %2
br label %55
55: ; preds = %52, %25, %20
%56 = load float, float* %2
ret float %56
}

LLVM IR (-O2):
define float @__rinff(float %0) {
%2 = bitcast float %0 to i32
%3 = lshr i32 %2, 23
%4 = and i32 %3, 255
%5 = add nsw i32 %4, -127
%6 = add nsw i32 %4, -151
%7 = icmp ult i32 %6, -150
br i1 %7, label %22, label %8
8: ; preds = %1
%9 = icmp ult i32 %4, 127
br i1 %9, label %10, label %12
10: ; preds = %8
%11 = tail call float @llvm.copysign.f32(float 1.000000e+00, float %0)
br label %22
12: ; preds = %8
%13 = lshr i32 8388607, %5
%14 = and i32 %13, %2
%15 = icmp eq i32 %14, 0
br i1 %15, label %22, label %16
16: ; preds = %12
%17 = ashr i32 -8388608, %5
%18 = and i32 %17, %2
%19 = add nuw nsw i32 %13, 1
%20 = add nsw i32 %19, %18
%21 = bitcast i32 %20 to float
br label %22
22: ; preds = %12, %16, %1, %10
%23 = phi float [ %11, %10 ], [ %0, %1 ], [ %21, %16 ], [ %0, %12 ]
ret float %23
}