void e53toe(pe, y) unsigned short *pe, *y;
{
  register unsigned short r;
  register unsigned short *p, *e;
  unsigned short yy[(6 + 3)];
  int denorm, k;
  e = pe;
  denorm = 0;
  ecleaz(yy);
  e += 3;
  r = *e;
  yy[0] = 0;
  if (r & 0x8000)
    yy[0] = 0xffff;
  yy[2] = (r & 0x0f) | 0x10;
  r &= ~0x800f;
  if (r == 0x7ff0) {
    if (((pe[3] & 0xf) != 0) || (pe[2] != 0) || (pe[1] != 0) || (pe[0] != 0)) {
      enan(y, (((6 + 3) - 4) * 16));
      return;
    }
    eclear(y);
    einfin(y);
    if (yy[0])
      eneg(y);
    return;
  }
  r >>= 4;
  if (r == 0) {
    denorm = 1;
    yy[2] &= ~0x10;
  }
  r += (0x3fff) - 01777;
  yy[1] = r;
  p = &yy[2 + 1];
  *p++ = *(--e);
  *p++ = *(--e);
  *p++ = *(--e);
  (void)eshift(yy, -5);
  if (denorm) {
    if ((k = enormlz(yy)) > (((6 + 3) - 4) * 16))
      ecleazs(yy);
    else
      yy[1] -= (unsigned short)(k - 1);
  }
  emovo(yy, y);
}


x86 assembly (clang, -O0):
<e53toe>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x44(%rbp)
lea    -0x40(%rbp),%rdi
mov    $0x0,%al
call   10b0 <ecleaz@plt>
mov    -0x28(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x40(%rbp)
movzwl -0x12(%rbp),%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     11ef <e53toe+0x5f>
movw   $0xffff,-0x40(%rbp)
movzwl -0x12(%rbp),%eax
and    $0xf,%eax
or     $0x10,%eax
mov    %ax,-0x3c(%rbp)
movzwl -0x12(%rbp),%eax
and    $0xffff7ff0,%eax
mov    %ax,-0x12(%rbp)
movzwl -0x12(%rbp),%eax
cmp    $0x7ff0,%eax
jne    12a5 <e53toe+0x115>
mov    -0x8(%rbp),%rax
movzwl 0x6(%rax),%eax
and    $0xf,%eax
cmp    $0x0,%eax
jne    125f <e53toe+0xcf>
mov    -0x8(%rbp),%rax
movzwl 0x4(%rax),%eax
cmp    $0x0,%eax
jne    125f <e53toe+0xcf>
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    125f <e53toe+0xcf>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0x0,%eax
je     1274 <e53toe+0xe4>
mov    -0x10(%rbp),%rdi
mov    $0x50,%esi
mov    $0x0,%al
call   1090 <enan@plt>
jmp    13c7 <e53toe+0x237>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   10a0 <eclear@plt>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1070 <einfin@plt>
cmpw   $0x0,-0x40(%rbp)
je     12a0 <e53toe+0x110>
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1080 <eneg@plt>
jmp    13c7 <e53toe+0x237>
movzwl -0x12(%rbp),%eax
sar    $0x4,%eax
mov    %ax,-0x12(%rbp)
movzwl -0x12(%rbp),%eax
cmp    $0x0,%eax
jne    12cf <e53toe+0x13f>
movl   $0x1,-0x44(%rbp)
movzwl -0x3c(%rbp),%eax
and    $0xffffffef,%eax
mov    %ax,-0x3c(%rbp)
movzwl -0x12(%rbp),%eax
add    $0x3c00,%eax
mov    %ax,-0x12(%rbp)
mov    -0x12(%rbp),%ax
mov    %ax,-0x3e(%rbp)
lea    -0x40(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x28(%rbp)
mov    -0x2(%rax),%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x28(%rbp)
mov    -0x2(%rax),%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x28(%rbp)
mov    -0x2(%rax),%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
lea    -0x40(%rbp),%rdi
mov    $0xfffffffb,%esi
mov    $0x0,%al
call   1040 <eshift@plt>
cmpl   $0x0,-0x44(%rbp)
je     13b8 <e53toe+0x228>
lea    -0x40(%rbp),%rdi
mov    $0x0,%al
call   1060 <enormlz@plt>
mov    %eax,-0x48(%rbp)
cmp    $0x50,%eax
jle    13a0 <e53toe+0x210>
lea    -0x40(%rbp),%rdi
mov    $0x0,%al
call   1050 <ecleazs@plt>
jmp    13b3 <e53toe+0x223>
mov    -0x48(%rbp),%eax
sub    $0x1,%eax
movzwl %ax,%ecx
movzwl -0x3e(%rbp),%eax
sub    %ecx,%eax
mov    %ax,-0x3e(%rbp)
jmp    13b8 <e53toe+0x228>
lea    -0x40(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    $0x0,%al
call   1030 <emovo@plt>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<e53toe>:
push   %rbp
push   %r14
push   %rbx
sub    $0x20,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
mov    %rsp,%rdi
xor    %eax,%eax
call   10b0 <ecleaz@plt>
movzwl 0x6(%rbx),%ebp
movswl %bp,%eax
shr    $0xf,%eax
mov    %ax,(%rsp)
mov    %ebp,%eax
and    $0xf,%eax
mov    %eax,%ecx
or     $0x10,%ecx
mov    %cx,0x4(%rsp)
and    $0x7ff0,%ebp
cmp    $0x7ff0,%ebp
jne    1204 <e53toe+0x74>
test   %ax,%ax
jne    11f0 <e53toe+0x60>
cmpw   $0x0,0x4(%rbx)
jne    11f0 <e53toe+0x60>
cmpw   $0x0,0x2(%rbx)
jne    11f0 <e53toe+0x60>
cmpw   $0x0,(%rbx)
je     1291 <e53toe+0x101>
mov    %r14,%rdi
mov    $0x50,%esi
xor    %eax,%eax
call   1090 <enan@plt>
jmp    1288 <e53toe+0xf8>
movzwl %bp,%edx
mov    %edx,%ecx
shr    $0x4,%ecx
test   %dx,%dx
jne    1216 <e53toe+0x86>
mov    %ax,0x4(%rsp)
movzwl %cx,%eax
add    $0x3c00,%eax
mov    %ax,0x2(%rsp)
movzwl 0x4(%rbx),%eax
mov    %ax,0x6(%rsp)
movzwl 0x2(%rbx),%eax
mov    %ax,0x8(%rsp)
movzwl (%rbx),%eax
mov    %ax,0xa(%rsp)
mov    %rsp,%rdi
mov    $0xfffffffb,%esi
xor    %eax,%eax
call   1040 <eshift@plt>
test   %bp,%bp
jne    127b <e53toe+0xeb>
mov    %rsp,%rdi
xor    %eax,%eax
call   1060 <enormlz@plt>
cmp    $0x51,%eax
jl     126c <e53toe+0xdc>
mov    %rsp,%rdi
xor    %eax,%eax
call   1050 <ecleazs@plt>
jmp    127b <e53toe+0xeb>
movzwl 0x2(%rsp),%ecx
sub    %eax,%ecx
add    $0x1,%ecx
mov    %cx,0x2(%rsp)
mov    %rsp,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1030 <emovo@plt>
add    $0x20,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    %r14,%rdi
xor    %eax,%eax
call   10a0 <eclear@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1070 <einfin@plt>
cmpw   $0x0,(%rsp)
je     1288 <e53toe+0xf8>
mov    %r14,%rdi
xor    %eax,%eax
call   1080 <eneg@plt>
jmp    1288 <e53toe+0xf8>

LLVM IR (-O0):
define void @e53toe(i16* %0, i16* %1) {
%3 = alloca i16*
%4 = alloca i16*
%5 = alloca i16
%6 = alloca i16*
%7 = alloca i16*
%8 = alloca [9 x i16]
%9 = alloca i32
%10 = alloca i32
store i16* %0, i16** %3
store i16* %1, i16** %4
%11 = load i16*, i16** %3
store i16* %11, i16** %7
store i32 0, i32* %9
%12 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%13 = call i32 (i16*, ...) bitcast (i32 (...)* @ecleaz to i32 (i16*, ...)*)(i16* %12)
%14 = load i16*, i16** %7
%15 = getelementptr inbounds i16, i16* %14, i64 3
store i16* %15, i16** %7
%16 = load i16*, i16** %7
%17 = load i16, i16* %16
store i16 %17, i16* %5
%18 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
store i16 0, i16* %18
%19 = load i16, i16* %5
%20 = zext i16 %19 to i32
%21 = and i32 %20, 32768
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %25
23: ; preds = %2
%24 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
store i16 -1, i16* %24
br label %25
25: ; preds = %23, %2
%26 = load i16, i16* %5
%27 = zext i16 %26 to i32
%28 = and i32 %27, 15
%29 = or i32 %28, 16
%30 = trunc i32 %29 to i16
%31 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 2
store i16 %30, i16* %31
%32 = load i16, i16* %5
%33 = zext i16 %32 to i32
%34 = and i32 %33, -32784
%35 = trunc i32 %34 to i16
store i16 %35, i16* %5
%36 = load i16, i16* %5
%37 = zext i16 %36 to i32
%38 = icmp eq i32 %37, 32752
br i1 %38, label %39, label %79
39: ; preds = %25
%40 = load i16*, i16** %3
%41 = getelementptr inbounds i16, i16* %40, i64 3
%42 = load i16, i16* %41
%43 = zext i16 %42 to i32
%44 = and i32 %43, 15
%45 = icmp ne i32 %44, 0
br i1 %45, label %64, label %46
46: ; preds = %39
%47 = load i16*, i16** %3
%48 = getelementptr inbounds i16, i16* %47, i64 2
%49 = load i16, i16* %48
%50 = zext i16 %49 to i32
%51 = icmp ne i32 %50, 0
br i1 %51, label %64, label %52
52: ; preds = %46
%53 = load i16*, i16** %3
%54 = getelementptr inbounds i16, i16* %53, i64 1
%55 = load i16, i16* %54
%56 = zext i16 %55 to i32
%57 = icmp ne i32 %56, 0
br i1 %57, label %64, label %58
58: ; preds = %52
%59 = load i16*, i16** %3
%60 = getelementptr inbounds i16, i16* %59, i64 0
%61 = load i16, i16* %60
%62 = zext i16 %61 to i32
%63 = icmp ne i32 %62, 0
br i1 %63, label %64, label %67
64: ; preds = %58, %52, %46, %39
%65 = load i16*, i16** %4
%66 = call i32 (i16*, i32, ...) bitcast (i32 (...)* @enan to i32 (i16*, i32, ...)*)(i16* %65, i32 80)
br label %142
67: ; preds = %58
%68 = load i16*, i16** %4
%69 = call i32 (i16*, ...) bitcast (i32 (...)* @eclear to i32 (i16*, ...)*)(i16* %68)
%70 = load i16*, i16** %4
%71 = call i32 (i16*, ...) bitcast (i32 (...)* @einfin to i32 (i16*, ...)*)(i16* %70)
%72 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%73 = load i16, i16* %72
%74 = icmp ne i16 %73, 0
br i1 %74, label %75, label %78
75: ; preds = %67
%76 = load i16*, i16** %4
%77 = call i32 (i16*, ...) bitcast (i32 (...)* @eneg to i32 (i16*, ...)*)(i16* %76)
br label %78
78: ; preds = %75, %67
br label %142
79: ; preds = %25
%80 = load i16, i16* %5
%81 = zext i16 %80 to i32
%82 = ashr i32 %81, 4
%83 = trunc i32 %82 to i16
store i16 %83, i16* %5
%84 = load i16, i16* %5
%85 = zext i16 %84 to i32
%86 = icmp eq i32 %85, 0
br i1 %86, label %87, label %93
87: ; preds = %79
store i32 1, i32* %9
%88 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 2
%89 = load i16, i16* %88
%90 = zext i16 %89 to i32
%91 = and i32 %90, -17
%92 = trunc i32 %91 to i16
store i16 %92, i16* %88
br label %93
93: ; preds = %87, %79
%94 = load i16, i16* %5
%95 = zext i16 %94 to i32
%96 = add nsw i32 %95, 15360
%97 = trunc i32 %96 to i16
store i16 %97, i16* %5
%98 = load i16, i16* %5
%99 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 1
store i16 %98, i16* %99
%100 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 3
store i16* %100, i16** %6
%101 = load i16*, i16** %7
%102 = getelementptr inbounds i16, i16* %101, i32 -1
store i16* %102, i16** %7
%103 = load i16, i16* %102
%104 = load i16*, i16** %6
%105 = getelementptr inbounds i16, i16* %104, i32 1
store i16* %105, i16** %6
store i16 %103, i16* %104
%106 = load i16*, i16** %7
%107 = getelementptr inbounds i16, i16* %106, i32 -1
store i16* %107, i16** %7
%108 = load i16, i16* %107
%109 = load i16*, i16** %6
%110 = getelementptr inbounds i16, i16* %109, i32 1
store i16* %110, i16** %6
store i16 %108, i16* %109
%111 = load i16*, i16** %7
%112 = getelementptr inbounds i16, i16* %111, i32 -1
store i16* %112, i16** %7
%113 = load i16, i16* %112
%114 = load i16*, i16** %6
%115 = getelementptr inbounds i16, i16* %114, i32 1
store i16* %115, i16** %6
store i16 %113, i16* %114
%116 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%117 = call i32 (i16*, i32, ...) bitcast (i32 (...)* @eshift to i32 (i16*, i32, ...)*)(i16* %116, i32 -5)
%118 = load i32, i32* %9
%119 = icmp ne i32 %118, 0
br i1 %119, label %120, label %138
120: ; preds = %93
%121 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%122 = call i32 (i16*, ...) bitcast (i32 (...)* @enormlz to i32 (i16*, ...)*)(i16* %121)
store i32 %122, i32* %10
%123 = icmp sgt i32 %122, 80
br i1 %123, label %124, label %127
124: ; preds = %120
%125 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%126 = call i32 (i16*, ...) bitcast (i32 (...)* @ecleazs to i32 (i16*, ...)*)(i16* %125)
br label %137
127: ; preds = %120
%128 = load i32, i32* %10
%129 = sub nsw i32 %128, 1
%130 = trunc i32 %129 to i16
%131 = zext i16 %130 to i32
%132 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 1
%133 = load i16, i16* %132
%134 = zext i16 %133 to i32
%135 = sub nsw i32 %134, %131
%136 = trunc i32 %135 to i16
store i16 %136, i16* %132
br label %137
137: ; preds = %127, %124
br label %138
138: ; preds = %137, %93
%139 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%140 = load i16*, i16** %4
%141 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @emovo to i32 (i16*, i16*, ...)*)(i16* %139, i16* %140)
br label %142
142: ; preds = %138, %78, %64
ret void
}

LLVM IR (-O2):
define void @e53toe(i16* nocapture %0, i16* %1) {
%3 = alloca [9 x i16]
%4 = bitcast [9 x i16]* %3 to i8*
%5 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 0
%6 = call i32 (i16*, ...) bitcast (i32 (...)* @ecleaz to i32 (i16*, ...)*)(i16* %5)
%7 = getelementptr inbounds i16, i16* %0, i64 3
%8 = load i16, i16* %7
%9 = ashr i16 %8, 15
store i16 %9, i16* %5
%10 = and i16 %8, 15
%11 = or i16 %10, 16
%12 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 2
store i16 %11, i16* %12
%13 = and i16 %8, 32752
%14 = icmp eq i16 %13, 32752
br i1 %14, label %15, label %37
15: ; preds = %2
%16 = icmp eq i16 %10, 0
br i1 %16, label %17, label %28
17: ; preds = %15
%18 = getelementptr inbounds i16, i16* %0, i64 2
%19 = load i16, i16* %18
%20 = icmp eq i16 %19, 0
br i1 %20, label %21, label %28
21: ; preds = %17
%22 = getelementptr inbounds i16, i16* %0, i64 1
%23 = load i16, i16* %22
%24 = icmp eq i16 %23, 0
br i1 %24, label %25, label %28
25: ; preds = %21
%26 = load i16, i16* %0
%27 = icmp eq i16 %26, 0
br i1 %27, label %30, label %28
28: ; preds = %25, %21, %17, %15
%29 = call i32 (i16*, i32, ...) bitcast (i32 (...)* @enan to i32 (i16*, i32, ...)*)(i16* %1, i32 80)
br label %65
30: ; preds = %25
%31 = call i32 (i16*, ...) bitcast (i32 (...)* @eclear to i32 (i16*, ...)*)(i16* %1)
%32 = call i32 (i16*, ...) bitcast (i32 (...)* @einfin to i32 (i16*, ...)*)(i16* %1)
%33 = load i16, i16* %5
%34 = icmp eq i16 %33, 0
br i1 %34, label %65, label %35
35: ; preds = %30
%36 = call i32 (i16*, ...) bitcast (i32 (...)* @eneg to i32 (i16*, ...)*)(i16* %1)
br label %65
37: ; preds = %2
%38 = lshr exact i16 %13, 4
%39 = icmp eq i16 %13, 0
br i1 %39, label %40, label %41
40: ; preds = %37
store i16 %10, i16* %12
br label %41
41: ; preds = %40, %37
%42 = add nuw nsw i16 %38, 15360
%43 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 1
store i16 %42, i16* %43
%44 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 3
%45 = getelementptr inbounds i16, i16* %0, i64 2
%46 = load i16, i16* %45
%47 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 4
store i16 %46, i16* %44
%48 = getelementptr inbounds i16, i16* %0, i64 1
%49 = load i16, i16* %48
%50 = getelementptr inbounds [9 x i16], [9 x i16]* %3, i64 0, i64 5
store i16 %49, i16* %47
%51 = load i16, i16* %0
store i16 %51, i16* %50
%52 = call i32 (i16*, i32, ...) bitcast (i32 (...)* @eshift to i32 (i16*, i32, ...)*)(i16* %5, i32 -5)
br i1 %39, label %53, label %63
53: ; preds = %41
%54 = call i32 (i16*, ...) bitcast (i32 (...)* @enormlz to i32 (i16*, ...)*)(i16* %5)
%55 = icmp sgt i32 %54, 80
br i1 %55, label %56, label %58
56: ; preds = %53
%57 = call i32 (i16*, ...) bitcast (i32 (...)* @ecleazs to i32 (i16*, ...)*)(i16* %5)
br label %63
58: ; preds = %53
%59 = load i16, i16* %43
%60 = trunc i32 %54 to i16
%61 = sub i16 1, %60
%62 = add i16 %61, %59
store i16 %62, i16* %43
br label %63
63: ; preds = %56, %58, %41
%64 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @emovo to i32 (i16*, i16*, ...)*)(i16* %5, i16* %1)
br label %65
65: ; preds = %30, %35, %63, %28
ret void
}