float SCE_Encode_SetFloatData(unsigned int sign, int ex, float m) {
  float a;
  a = m + (1.0f * (ex != 0));
  if (ex > 0) {
    for (; ex > 0; ex--) {
      a *= 2.0f;
    }
  } else {
    for (; ex < 0; ex++) {
      a /= 2.0f;
    }
  }
  if (sign) {
    a *= -1.0f;
  }
  return a;
}


x86 assembly (clang, -O0):
<SCE_Encode_SetFloatData>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm1
cmpl   $0x0,-0x8(%rbp)
setne  %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2ss %eax,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
cmpl   $0x0,-0x8(%rbp)
jle    116b <SCE_Encode_SetFloatData+0x6b>
jmp    113c <SCE_Encode_SetFloatData+0x3c>
cmpl   $0x0,-0x8(%rbp)
jle    1166 <SCE_Encode_SetFloatData+0x66>
movss  0xeb2(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
jmp    113c <SCE_Encode_SetFloatData+0x3c>
jmp    11a3 <SCE_Encode_SetFloatData+0xa3>
jmp    1170 <SCE_Encode_SetFloatData+0x70>
cmpl   $0x0,-0x8(%rbp)
jge    119e <SCE_Encode_SetFloatData+0x9e>
movss  -0x10(%rbp),%xmm0
movss  0xe79(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1170 <SCE_Encode_SetFloatData+0x70>
jmp    11a3 <SCE_Encode_SetFloatData+0xa3>
cmpl   $0x0,-0x4(%rbp)
je     11bf <SCE_Encode_SetFloatData+0xbf>
movss  0xe4f(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<SCE_Encode_SetFloatData>:
movaps %xmm0,%xmm1
test   %esi,%esi
jne    1156 <SCE_Encode_SetFloatData+0x56>
xorps  %xmm0,%xmm0
addss  %xmm1,%xmm0
jg     1164 <SCE_Encode_SetFloatData+0x64>
test   %esi,%esi
jns    11b8 <SCE_Encode_SetFloatData+0xb8>
mov    %esi,%eax
neg    %eax
and    $0x7,%eax
je     11c4 <SCE_Encode_SetFloatData+0xc4>
neg    %eax
xor    %ecx,%ecx
movss  0xed3(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mulss  %xmm1,%xmm0
add    $0xffffffff,%ecx
cmp    %ecx,%eax
jne    1140 <SCE_Encode_SetFloatData+0x40>
mov    %esi,%eax
sub    %ecx,%eax
cmp    $0xfffffff8,%esi
ja     11b8 <SCE_Encode_SetFloatData+0xb8>
jmp    11cb <SCE_Encode_SetFloatData+0xcb>
movss  0xea2(%rip),%xmm0
addss  %xmm1,%xmm0
jle    1110 <SCE_Encode_SetFloatData+0x10>
lea    -0x1(%rsi),%eax
mov    %esi,%ecx
and    $0x7,%ecx
je     117d <SCE_Encode_SetFloatData+0x7d>
xor    %edx,%edx
addss  %xmm0,%xmm0
add    $0x1,%edx
cmp    %edx,%ecx
jne    1170 <SCE_Encode_SetFloatData+0x70>
sub    %edx,%esi
cmp    $0x7,%eax
jb     11b8 <SCE_Encode_SetFloatData+0xb8>
add    $0xffffffff,%esi
cs nopw 0x0(%rax,%rax,1)
nop
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
addss  %xmm0,%xmm0
add    $0xfffffff8,%esi
cmp    $0xfffffffe,%esi
jb     1190 <SCE_Encode_SetFloatData+0x90>
test   %edi,%edi
je     11c3 <SCE_Encode_SetFloatData+0xc3>
xorps  0xe4d(%rip),%xmm0
ret
mov    %esi,%eax
cmp    $0xfffffff8,%esi
ja     11b8 <SCE_Encode_SetFloatData+0xb8>
movss  0xe31(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
add    $0x8,%eax
jne    11e0 <SCE_Encode_SetFloatData+0xe0>
jmp    11b8 <SCE_Encode_SetFloatData+0xb8>

LLVM IR (-O0):
define float @SCE_Encode_SetFloatData(i32 %0, i32 %1, float %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca float
%7 = alloca float
store i32 %0, i32* %4
store i32 %1, i32* %5
store float %2, float* %6
%8 = load float, float* %6
%9 = load i32, i32* %5
%10 = icmp ne i32 %9, 0
%11 = zext i1 %10 to i32
%12 = sitofp i32 %11 to float
%13 = call float @llvm.fmuladd.f32(float 1.000000e+00, float %12, float %8)
store float %13, float* %7
%14 = load i32, i32* %5
%15 = icmp sgt i32 %14, 0
br i1 %15, label %16, label %27
16: ; preds = %3
br label %17
17: ; preds = %23, %16
%18 = load i32, i32* %5
%19 = icmp sgt i32 %18, 0
br i1 %19, label %20, label %26
20: ; preds = %17
%21 = load float, float* %7
%22 = fmul float %21, 2.000000e+00
store float %22, float* %7
br label %23
23: ; preds = %20
%24 = load i32, i32* %5
%25 = add nsw i32 %24, -1
store i32 %25, i32* %5
br label %17
26: ; preds = %17
br label %38
27: ; preds = %3
br label %28
28: ; preds = %34, %27
%29 = load i32, i32* %5
%30 = icmp slt i32 %29, 0
br i1 %30, label %31, label %37
31: ; preds = %28
%32 = load float, float* %7
%33 = fdiv float %32, 2.000000e+00
store float %33, float* %7
br label %34
34: ; preds = %31
%35 = load i32, i32* %5
%36 = add nsw i32 %35, 1
store i32 %36, i32* %5
br label %28
37: ; preds = %28
br label %38
38: ; preds = %37, %26
%39 = load i32, i32* %4
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %44
41: ; preds = %38
%42 = load float, float* %7
%43 = fmul float %42, -1.000000e+00
store float %43, float* %7
br label %44
44: ; preds = %41, %38
%45 = load float, float* %7
ret float %45
}

LLVM IR (-O2):
define float @SCE_Encode_SetFloatData(i32 %0, i32 %1, float %2) {
%4 = icmp ne i32 %1, 0
%5 = uitofp i1 %4 to float
%6 = fadd float %5, %2
%7 = icmp sgt i32 %1, 0
br i1 %7, label %8, label %25
8: ; preds = %3
%9 = add i32 %1, -1
%10 = and i32 %1, 7
%11 = icmp eq i32 %10, 0
br i1 %11, label %20, label %12
12: ; preds = %8, %12
%13 = phi float [ %16, %12 ], [ %6, %8 ]
%14 = phi i32 [ %17, %12 ], [ %1, %8 ]
%15 = phi i32 [ %18, %12 ], [ 0, %8 ]
%16 = fmul float %13, 2.000000e+00
%17 = add nsw i32 %14, -1
%18 = add i32 %15, 1
%19 = icmp eq i32 %18, %10
br i1 %19, label %20, label %12
20: ; preds = %12, %8
%21 = phi float [ %6, %8 ], [ %16, %12 ]
%22 = phi i32 [ %1, %8 ], [ %17, %12 ]
%23 = phi float [ undef, %8 ], [ %16, %12 ]
%24 = icmp ult i32 %9, 7
br i1 %24, label %71, label %44
25: ; preds = %3
%26 = icmp slt i32 %1, 0
br i1 %26, label %27, label %71
27: ; preds = %25
%28 = sub i32 0, %1
%29 = and i32 %28, 7
%30 = icmp eq i32 %29, 0
br i1 %30, label %39, label %31
31: ; preds = %27, %31
%32 = phi float [ %35, %31 ], [ %6, %27 ]
%33 = phi i32 [ %36, %31 ], [ %1, %27 ]
%34 = phi i32 [ %37, %31 ], [ 0, %27 ]
%35 = fmul float %32, 5.000000e-01
%36 = add i32 %33, 1
%37 = add i32 %34, 1
%38 = icmp eq i32 %37, %29
br i1 %38, label %39, label %31
39: ; preds = %31, %27
%40 = phi float [ undef, %27 ], [ %35, %31 ]
%41 = phi float [ %6, %27 ], [ %35, %31 ]
%42 = phi i32 [ %1, %27 ], [ %36, %31 ]
%43 = icmp ugt i32 %1, -8
br i1 %43, label %71, label %58
44: ; preds = %20, %44
%45 = phi float [ %54, %44 ], [ %21, %20 ]
%46 = phi i32 [ %55, %44 ], [ %22, %20 ]
%47 = fmul float %45, 2.000000e+00
%48 = fmul float %47, 2.000000e+00
%49 = fmul float %48, 2.000000e+00
%50 = fmul float %49, 2.000000e+00
%51 = fmul float %50, 2.000000e+00
%52 = fmul float %51, 2.000000e+00
%53 = fmul float %52, 2.000000e+00
%54 = fmul float %53, 2.000000e+00
%55 = add nsw i32 %46, -8
%56 = add i32 %46, -9
%57 = icmp ult i32 %56, -2
br i1 %57, label %44, label %71
58: ; preds = %39, %58
%59 = phi float [ %68, %58 ], [ %41, %39 ]
%60 = phi i32 [ %69, %58 ], [ %42, %39 ]
%61 = fmul float %59, 5.000000e-01
%62 = fmul float %61, 5.000000e-01
%63 = fmul float %62, 5.000000e-01
%64 = fmul float %63, 5.000000e-01
%65 = fmul float %64, 5.000000e-01
%66 = fmul float %65, 5.000000e-01
%67 = fmul float %66, 5.000000e-01
%68 = fmul float %67, 5.000000e-01
%69 = add i32 %60, 8
%70 = icmp eq i32 %69, 0
br i1 %70, label %71, label %58
71: ; preds = %39, %58, %20, %44, %25
%72 = phi float [ %6, %25 ], [ %23, %20 ], [ %54, %44 ], [ %40, %39 ], [ %68, %58 ]
%73 = icmp eq i32 %0, 0
%74 = fneg float %72
%75 = select i1 %73, float %72, float %74
ret float %75
}