long fp16_exp(int x) {
  int t;
  int y = 0x00010000;
  if (x < 0)
    x += 0xb1721, y >>= 16;
  t = x - 0x58b91;
  if (t >= 0)
    x = t, y <<= 8;
  t = x - 0x2c5c8;
  if (t >= 0)
    x = t, y <<= 4;
  t = x - 0x162e4;
  if (t >= 0)
    x = t, y <<= 2;
  t = x - 0x0b172;
  if (t >= 0)
    x = t, y <<= 1;
  t = x - 0x067cd;
  if (t >= 0)
    x = t, y += y >> 1;
  t = x - 0x03920;
  if (t >= 0)
    x = t, y += y >> 2;
  t = x - 0x01e27;
  if (t >= 0)
    x = t, y += y >> 3;
  t = x - 0x00f85;
  if (t >= 0)
    x = t, y += y >> 4;
  t = x - 0x007e1;
  if (t >= 0)
    x = t, y += y >> 5;
  t = x - 0x003f8;
  if (t >= 0)
    x = t, y += y >> 6;
  t = x - 0x001fe;
  if (t >= 0)
    x = t, y += y >> 7;
  y += ((y >> 8) * x) >> 8;
  return y;
}


x86 assembly (clang, -O0):
<fp16_exp>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x10000,-0xc(%rbp)
cmpl   $0x0,-0x4(%rbp)
jge    112c <fp16_exp+0x2c>
mov    -0x4(%rbp),%eax
add    $0xb1721,%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x10,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x58b91,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     1150 <fp16_exp+0x50>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x2c5c8,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     1174 <fp16_exp+0x74>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x162e4,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     1198 <fp16_exp+0x98>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x2,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0xb172,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     11bc <fp16_exp+0xbc>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x67cd,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     11e3 <fp16_exp+0xe3>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x1,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x3920,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     120a <fp16_exp+0x10a>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x2,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x1e27,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     1231 <fp16_exp+0x131>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x3,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0xf85,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     1258 <fp16_exp+0x158>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x4,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x7e1,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     127f <fp16_exp+0x17f>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x5,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x3f8,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     12a6 <fp16_exp+0x1a6>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x6,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x1fe,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     12cd <fp16_exp+0x1cd>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x7,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x8,%eax
imul   -0x4(%rbp),%eax
sar    $0x8,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fp16_exp>:
lea    0xb1721(%rdi),%eax
test   %edi,%edi
cmovns %edi,%eax
mov    $0x1,%ecx
mov    $0x10000,%edx
cmovs  %ecx,%edx
lea    -0x58b91(%rax),%ecx
mov    %edx,%esi
shl    $0x8,%esi
cmp    $0x58b91,%eax
cmovl  %eax,%ecx
cmovl  %edx,%esi
lea    -0x2c5c8(%rcx),%eax
mov    %esi,%edx
shl    $0x4,%edx
cmp    $0x2c5c8,%ecx
cmovl  %ecx,%eax
cmovl  %esi,%edx
lea    -0x162e4(%rax),%ecx
lea    0x0(,%rdx,4),%esi
cmp    $0x162e4,%eax
cmovl  %eax,%ecx
cmovl  %edx,%esi
lea    -0xb172(%rcx),%edx
cmp    $0xb172,%ecx
cmovl  %ecx,%edx
setge  %cl
shl    %cl,%esi
lea    -0x67cd(%rdx),%ecx
mov    %esi,%edi
sar    %edi
xor    %eax,%eax
cmp    $0x67cd,%edx
cmovl  %edx,%ecx
cmovl  %eax,%edi
add    %esi,%edi
lea    -0x3920(%rcx),%edx
mov    %edi,%esi
sar    $0x2,%esi
cmp    $0x3920,%ecx
cmovl  %ecx,%edx
cmovl  %eax,%esi
add    %edi,%esi
lea    -0x1e27(%rdx),%ecx
mov    %esi,%edi
sar    $0x3,%edi
cmp    $0x1e27,%edx
cmovl  %edx,%ecx
cmovl  %eax,%edi
add    %esi,%edi
lea    -0xf85(%rcx),%edx
mov    %edi,%esi
sar    $0x4,%esi
cmp    $0xf85,%ecx
cmovl  %ecx,%edx
cmovl  %eax,%esi
add    %edi,%esi
lea    -0x7e1(%rdx),%ecx
mov    %esi,%edi
sar    $0x5,%edi
cmp    $0x7e1,%edx
cmovl  %edx,%ecx
cmovl  %eax,%edi
add    %esi,%edi
lea    -0x3f8(%rcx),%edx
mov    %edi,%esi
sar    $0x6,%esi
cmp    $0x3f8,%ecx
cmovl  %ecx,%edx
cmovl  %eax,%esi
add    %edi,%esi
lea    -0x1fe(%rdx),%ecx
mov    %esi,%edi
sar    $0x7,%edi
cmp    $0x1fe,%edx
cmovl  %edx,%ecx
cmovl  %eax,%edi
add    %esi,%edi
mov    %edi,%eax
sar    $0x8,%eax
imul   %ecx,%eax
sar    $0x8,%eax
add    %edi,%eax
cltq
ret

LLVM IR (-O0):
define i64 @fp16_exp(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
store i32 65536, i32* %4
%5 = load i32, i32* %2
%6 = icmp slt i32 %5, 0
br i1 %6, label %7, label %12
7: ; preds = %1
%8 = load i32, i32* %2
%9 = add nsw i32 %8, 726817
store i32 %9, i32* %2
%10 = load i32, i32* %4
%11 = ashr i32 %10, 16
store i32 %11, i32* %4
br label %12
12: ; preds = %7, %1
%13 = load i32, i32* %2
%14 = sub nsw i32 %13, 363409
store i32 %14, i32* %3
%15 = load i32, i32* %3
%16 = icmp sge i32 %15, 0
br i1 %16, label %17, label %21
17: ; preds = %12
%18 = load i32, i32* %3
store i32 %18, i32* %2
%19 = load i32, i32* %4
%20 = shl i32 %19, 8
store i32 %20, i32* %4
br label %21
21: ; preds = %17, %12
%22 = load i32, i32* %2
%23 = sub nsw i32 %22, 181704
store i32 %23, i32* %3
%24 = load i32, i32* %3
%25 = icmp sge i32 %24, 0
br i1 %25, label %26, label %30
26: ; preds = %21
%27 = load i32, i32* %3
store i32 %27, i32* %2
%28 = load i32, i32* %4
%29 = shl i32 %28, 4
store i32 %29, i32* %4
br label %30
30: ; preds = %26, %21
%31 = load i32, i32* %2
%32 = sub nsw i32 %31, 90852
store i32 %32, i32* %3
%33 = load i32, i32* %3
%34 = icmp sge i32 %33, 0
br i1 %34, label %35, label %39
35: ; preds = %30
%36 = load i32, i32* %3
store i32 %36, i32* %2
%37 = load i32, i32* %4
%38 = shl i32 %37, 2
store i32 %38, i32* %4
br label %39
39: ; preds = %35, %30
%40 = load i32, i32* %2
%41 = sub nsw i32 %40, 45426
store i32 %41, i32* %3
%42 = load i32, i32* %3
%43 = icmp sge i32 %42, 0
br i1 %43, label %44, label %48
44: ; preds = %39
%45 = load i32, i32* %3
store i32 %45, i32* %2
%46 = load i32, i32* %4
%47 = shl i32 %46, 1
store i32 %47, i32* %4
br label %48
48: ; preds = %44, %39
%49 = load i32, i32* %2
%50 = sub nsw i32 %49, 26573
store i32 %50, i32* %3
%51 = load i32, i32* %3
%52 = icmp sge i32 %51, 0
br i1 %52, label %53, label %59
53: ; preds = %48
%54 = load i32, i32* %3
store i32 %54, i32* %2
%55 = load i32, i32* %4
%56 = ashr i32 %55, 1
%57 = load i32, i32* %4
%58 = add nsw i32 %57, %56
store i32 %58, i32* %4
br label %59
59: ; preds = %53, %48
%60 = load i32, i32* %2
%61 = sub nsw i32 %60, 14624
store i32 %61, i32* %3
%62 = load i32, i32* %3
%63 = icmp sge i32 %62, 0
br i1 %63, label %64, label %70
64: ; preds = %59
%65 = load i32, i32* %3
store i32 %65, i32* %2
%66 = load i32, i32* %4
%67 = ashr i32 %66, 2
%68 = load i32, i32* %4
%69 = add nsw i32 %68, %67
store i32 %69, i32* %4
br label %70
70: ; preds = %64, %59
%71 = load i32, i32* %2
%72 = sub nsw i32 %71, 7719
store i32 %72, i32* %3
%73 = load i32, i32* %3
%74 = icmp sge i32 %73, 0
br i1 %74, label %75, label %81
75: ; preds = %70
%76 = load i32, i32* %3
store i32 %76, i32* %2
%77 = load i32, i32* %4
%78 = ashr i32 %77, 3
%79 = load i32, i32* %4
%80 = add nsw i32 %79, %78
store i32 %80, i32* %4
br label %81
81: ; preds = %75, %70
%82 = load i32, i32* %2
%83 = sub nsw i32 %82, 3973
store i32 %83, i32* %3
%84 = load i32, i32* %3
%85 = icmp sge i32 %84, 0
br i1 %85, label %86, label %92
86: ; preds = %81
%87 = load i32, i32* %3
store i32 %87, i32* %2
%88 = load i32, i32* %4
%89 = ashr i32 %88, 4
%90 = load i32, i32* %4
%91 = add nsw i32 %90, %89
store i32 %91, i32* %4
br label %92
92: ; preds = %86, %81
%93 = load i32, i32* %2
%94 = sub nsw i32 %93, 2017
store i32 %94, i32* %3
%95 = load i32, i32* %3
%96 = icmp sge i32 %95, 0
br i1 %96, label %97, label %103
97: ; preds = %92
%98 = load i32, i32* %3
store i32 %98, i32* %2
%99 = load i32, i32* %4
%100 = ashr i32 %99, 5
%101 = load i32, i32* %4
%102 = add nsw i32 %101, %100
store i32 %102, i32* %4
br label %103
103: ; preds = %97, %92
%104 = load i32, i32* %2
%105 = sub nsw i32 %104, 1016
store i32 %105, i32* %3
%106 = load i32, i32* %3
%107 = icmp sge i32 %106, 0
br i1 %107, label %108, label %114
108: ; preds = %103
%109 = load i32, i32* %3
store i32 %109, i32* %2
%110 = load i32, i32* %4
%111 = ashr i32 %110, 6
%112 = load i32, i32* %4
%113 = add nsw i32 %112, %111
store i32 %113, i32* %4
br label %114
114: ; preds = %108, %103
%115 = load i32, i32* %2
%116 = sub nsw i32 %115, 510
store i32 %116, i32* %3
%117 = load i32, i32* %3
%118 = icmp sge i32 %117, 0
br i1 %118, label %119, label %125
119: ; preds = %114
%120 = load i32, i32* %3
store i32 %120, i32* %2
%121 = load i32, i32* %4
%122 = ashr i32 %121, 7
%123 = load i32, i32* %4
%124 = add nsw i32 %123, %122
store i32 %124, i32* %4
br label %125
125: ; preds = %119, %114
%126 = load i32, i32* %4
%127 = ashr i32 %126, 8
%128 = load i32, i32* %2
%129 = mul nsw i32 %127, %128
%130 = ashr i32 %129, 8
%131 = load i32, i32* %4
%132 = add nsw i32 %131, %130
store i32 %132, i32* %4
%133 = load i32, i32* %4
%134 = sext i32 %133 to i64
ret i64 %134
}

LLVM IR (-O2):
define i64 @fp16_exp(i32 %0) {
%2 = icmp slt i32 %0, 0
%3 = add nsw i32 %0, 726817
%4 = select i1 %2, i32 %3, i32 %0
%5 = select i1 %2, i32 1, i32 65536
%6 = icmp sgt i32 %4, 363408
%7 = add nsw i32 %4, -363409
%8 = shl nuw nsw i32 %5, 8
%9 = select i1 %6, i32 %7, i32 %4
%10 = select i1 %6, i32 %8, i32 %5
%11 = icmp sgt i32 %9, 181703
%12 = add nsw i32 %9, -181704
%13 = shl nuw nsw i32 %10, 4
%14 = select i1 %11, i32 %12, i32 %9
%15 = select i1 %11, i32 %13, i32 %10
%16 = icmp sgt i32 %14, 90851
%17 = add nsw i32 %14, -90852
%18 = shl nuw nsw i32 %15, 2
%19 = select i1 %16, i32 %17, i32 %14
%20 = select i1 %16, i32 %18, i32 %15
%21 = icmp sgt i32 %19, 45425
%22 = add nsw i32 %19, -45426
%23 = select i1 %21, i32 %22, i32 %19
%24 = zext i1 %21 to i32
%25 = shl nuw i32 %20, %24
%26 = icmp sgt i32 %23, 26572
%27 = add nsw i32 %23, -26573
%28 = ashr i32 %25, 1
%29 = select i1 %26, i32 %27, i32 %23
%30 = select i1 %26, i32 %28, i32 0
%31 = add nsw i32 %30, %25
%32 = icmp sgt i32 %29, 14623
%33 = add nsw i32 %29, -14624
%34 = ashr i32 %31, 2
%35 = select i1 %32, i32 %33, i32 %29
%36 = select i1 %32, i32 %34, i32 0
%37 = add nsw i32 %36, %31
%38 = icmp sgt i32 %35, 7718
%39 = add nsw i32 %35, -7719
%40 = ashr i32 %37, 3
%41 = select i1 %38, i32 %39, i32 %35
%42 = select i1 %38, i32 %40, i32 0
%43 = add nsw i32 %42, %37
%44 = icmp sgt i32 %41, 3972
%45 = add nsw i32 %41, -3973
%46 = ashr i32 %43, 4
%47 = select i1 %44, i32 %45, i32 %41
%48 = select i1 %44, i32 %46, i32 0
%49 = add nsw i32 %48, %43
%50 = icmp sgt i32 %47, 2016
%51 = add nsw i32 %47, -2017
%52 = ashr i32 %49, 5
%53 = select i1 %50, i32 %51, i32 %47
%54 = select i1 %50, i32 %52, i32 0
%55 = add nsw i32 %54, %49
%56 = icmp sgt i32 %53, 1015
%57 = add nsw i32 %53, -1016
%58 = ashr i32 %55, 6
%59 = select i1 %56, i32 %57, i32 %53
%60 = select i1 %56, i32 %58, i32 0
%61 = add nsw i32 %60, %55
%62 = icmp sgt i32 %59, 509
%63 = add nsw i32 %59, -510
%64 = ashr i32 %61, 7
%65 = select i1 %62, i32 %63, i32 %59
%66 = select i1 %62, i32 %64, i32 0
%67 = add nsw i32 %66, %61
%68 = ashr i32 %67, 8
%69 = mul nsw i32 %68, %65
%70 = ashr i32 %69, 8
%71 = add nsw i32 %70, %67
%72 = sext i32 %71 to i64
ret i64 %72
}