#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ __eclear(unsigned short *);
scalar_t__ __eiiszero(unsigned short const *);
int /*<<< orphan*/ __einfin(unsigned short *);
scalar_t__ __eisinf(unsigned short const *);
scalar_t__ __eisnan(unsigned short const *);
int __eisneg(unsigned short const *);
int /*<<< orphan*/ __emdnorm(unsigned short *, int, int /*<<< orphan*/, long,
                             int, int);
int /*<<< orphan*/ __emov(unsigned short const *, unsigned short *);
int /*<<< orphan*/ __emovi(unsigned short const *, unsigned short *);
int /*<<< orphan*/ __emovo(unsigned short *, unsigned short *);
int __emulm(unsigned short *, unsigned short *);
int /*<<< orphan*/ __enan_NBITS(unsigned short *);
scalar_t__ __enormlz(unsigned short *);
void __emul(const short unsigned int *a, const short unsigned int *b,
            short unsigned int *c) {
  unsigned short ai[(6 + 3)], bi[(6 + 3)];
  int i, j;
  long lt, lta, ltb;
  if (__eisnan(a)) {
    __emov(a, c);
    return;
  }
  if (__eisnan(b)) {
    __emov(b, c);
    return;
  }
  if ((__eisinf(a) && __eiiszero(b)) || (__eisinf(b) && __eiiszero(a))) {
    ;
    __enan_NBITS(c);
    return;
  }
  if (__eisinf(a) || __eisinf(b)) {
    if (__eisneg(a) ^ __eisneg(b))
      *(c + (6 - 1)) = 0x8000;
    else
      *(c + (6 - 1)) = 0;
    __einfin(c);
    return;
  }
  __emovi(a, ai);
  __emovi(b, bi);
  lta = ai[1];
  ltb = bi[1];
  if (ai[1] == 0) {
    for (i = 1; i < (6 + 3) - 1; i++) {
      if (ai[i] != 0) {
        lta -= __enormlz(ai);
        goto mnzer1;
      }
    }
    __eclear(c);
    return;
  }
mnzer1:
  if (bi[1] == 0) {
    for (i = 1; i < (6 + 3) - 1; i++) {
      if (bi[i] != 0) {
        ltb -= __enormlz(bi);
        goto mnzer2;
      }
    }
    __eclear(c);
    return;
  }
mnzer2:
  j = __emulm(ai, bi);
  lt = lta + ltb - ((0x3fff) - 1);
  __emdnorm(bi, j, 0, lt, 64, (((6 + 3) - 4) * 16));
  if (ai[0] == bi[0])
    bi[0] = 0;
  else
    bi[0] = 0xffff;
  __emovo(bi, c);
}


x86 assembly (clang, -O0):
<__emul>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <__eisnan@plt>
cmp    $0x0,%rax
je     120c <__emul+0x3c>
mov    -0x8(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1070 <__emov@plt>
jmp    1479 <__emul+0x2a9>
mov    -0x10(%rbp),%rdi
call   1040 <__eisnan@plt>
cmp    $0x0,%rax
je     1231 <__emul+0x61>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1070 <__emov@plt>
jmp    1479 <__emul+0x2a9>
mov    -0x8(%rbp),%rdi
call   1050 <__eisinf@plt>
cmp    $0x0,%rax
je     1257 <__emul+0x87>
mov    -0x10(%rbp),%rdi
call   1030 <__eiiszero@plt>
cmp    $0x0,%rax
jne    127d <__emul+0xad>
mov    -0x10(%rbp),%rdi
call   1050 <__eisinf@plt>
cmp    $0x0,%rax
je     128b <__emul+0xbb>
mov    -0x8(%rbp),%rdi
call   1030 <__eiiszero@plt>
cmp    $0x0,%rax
je     128b <__emul+0xbb>
mov    -0x18(%rbp),%rdi
call   1090 <__enan_NBITS@plt>
jmp    1479 <__emul+0x2a9>
mov    -0x8(%rbp),%rdi
call   1050 <__eisinf@plt>
cmp    $0x0,%rax
jne    12b1 <__emul+0xe1>
mov    -0x10(%rbp),%rdi
call   1050 <__eisinf@plt>
cmp    $0x0,%rax
je     12fd <__emul+0x12d>
mov    -0x8(%rbp),%rdi
call   1080 <__eisneg@plt>
mov    %eax,-0x74(%rbp)
mov    -0x10(%rbp),%rdi
call   1080 <__eisneg@plt>
mov    %eax,%ecx
mov    -0x74(%rbp),%eax
xor    %ecx,%eax
cmp    $0x0,%eax
je     12e5 <__emul+0x115>
mov    -0x18(%rbp),%rax
movw   $0x8000,0xa(%rax)
jmp    12ef <__emul+0x11f>
mov    -0x18(%rbp),%rax
movw   $0x0,0xa(%rax)
mov    -0x18(%rbp),%rdi
call   10e0 <__einfin@plt>
jmp    1479 <__emul+0x2a9>
mov    -0x8(%rbp),%rdi
lea    -0x30(%rbp),%rsi
call   10c0 <__emovi@plt>
mov    -0x10(%rbp),%rdi
lea    -0x50(%rbp),%rsi
call   10c0 <__emovi@plt>
movzwl -0x2e(%rbp),%eax
mov    %rax,-0x68(%rbp)
movzwl -0x4e(%rbp),%eax
mov    %rax,-0x70(%rbp)
movzwl -0x2e(%rbp),%eax
cmp    $0x0,%eax
jne    1394 <__emul+0x1c4>
movl   $0x1,-0x54(%rbp)
cmpl   $0x8,-0x54(%rbp)
jge    1386 <__emul+0x1b6>
movslq -0x54(%rbp),%rax
movzwl -0x30(%rbp,%rax,2),%eax
cmp    $0x0,%eax
je     1373 <__emul+0x1a3>
lea    -0x30(%rbp),%rdi
call   10d0 <__enormlz@plt>
mov    %rax,%rcx
mov    -0x68(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x68(%rbp)
jmp    1399 <__emul+0x1c9>
jmp    1378 <__emul+0x1a8>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    133b <__emul+0x16b>
mov    -0x18(%rbp),%rdi
call   10a0 <__eclear@plt>
jmp    1479 <__emul+0x2a9>
jmp    1399 <__emul+0x1c9>
movzwl -0x4e(%rbp),%eax
cmp    $0x0,%eax
jne    1406 <__emul+0x236>
movl   $0x1,-0x54(%rbp)
cmpl   $0x8,-0x54(%rbp)
jge    13f8 <__emul+0x228>
movslq -0x54(%rbp),%rax
movzwl -0x50(%rbp,%rax,2),%eax
cmp    $0x0,%eax
je     13e5 <__emul+0x215>
lea    -0x50(%rbp),%rdi
call   10d0 <__enormlz@plt>
mov    %rax,%rcx
mov    -0x70(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x70(%rbp)
jmp    140b <__emul+0x23b>
jmp    13ea <__emul+0x21a>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    13ad <__emul+0x1dd>
mov    -0x18(%rbp),%rdi
call   10a0 <__eclear@plt>
jmp    1479 <__emul+0x2a9>
jmp    140b <__emul+0x23b>
lea    -0x30(%rbp),%rdi
lea    -0x50(%rbp),%rsi
call   1060 <__emulm@plt>
mov    %eax,-0x58(%rbp)
mov    -0x68(%rbp),%rax
add    -0x70(%rbp),%rax
sub    $0x3ffe,%rax
mov    %rax,-0x60(%rbp)
lea    -0x50(%rbp),%rdi
mov    -0x58(%rbp),%esi
mov    -0x60(%rbp),%rcx
xor    %edx,%edx
mov    $0x40,%r8d
mov    $0x50,%r9d
call   10b0 <__emdnorm@plt>
movzwl -0x30(%rbp),%eax
movzwl -0x50(%rbp),%ecx
cmp    %ecx,%eax
jne    1466 <__emul+0x296>
movw   $0x0,-0x50(%rbp)
jmp    146c <__emul+0x29c>
movw   $0xffff,-0x50(%rbp)
lea    -0x50(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   10f0 <__emovo@plt>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__emul>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x40,%rsp
mov    %rdx,%r14
mov    %rsi,%r15
mov    %rdi,%rbx
call   1040 <__eisnan@plt>
test   %rax,%rax
je     11f4 <__emul+0x24>
mov    %rbx,%rdi
jmp    1204 <__emul+0x34>
mov    %r15,%rdi
call   1040 <__eisnan@plt>
test   %rax,%rax
je     1218 <__emul+0x48>
mov    %r15,%rdi
mov    %r14,%rsi
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1070 <__emov@plt>
mov    %rbx,%rdi
call   1050 <__eisinf@plt>
test   %rax,%rax
je     1232 <__emul+0x62>
mov    %r15,%rdi
call   1030 <__eiiszero@plt>
test   %rax,%rax
jne    124c <__emul+0x7c>
mov    %r15,%rdi
call   1050 <__eisinf@plt>
test   %rax,%rax
je     1260 <__emul+0x90>
mov    %rbx,%rdi
call   1030 <__eiiszero@plt>
test   %rax,%rax
je     1260 <__emul+0x90>
mov    %r14,%rdi
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1090 <__enan_NBITS@plt>
mov    %rbx,%rdi
call   1050 <__eisinf@plt>
test   %rax,%rax
jne    127a <__emul+0xaa>
mov    %r15,%rdi
call   1050 <__eisinf@plt>
test   %rax,%rax
je     12af <__emul+0xdf>
mov    %rbx,%rdi
call   1080 <__eisneg@plt>
mov    %eax,%ebx
mov    %r15,%rdi
call   1080 <__eisneg@plt>
xor    %ecx,%ecx
cmp    %eax,%ebx
setne  %cl
shl    $0xf,%ecx
mov    %cx,0xa(%r14)
mov    %r14,%rdi
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    10e0 <__einfin@plt>
lea    0x20(%rsp),%rsi
mov    %rbx,%rdi
call   10c0 <__emovi@plt>
mov    %rsp,%rsi
mov    %r15,%rdi
call   10c0 <__emovi@plt>
movzwl 0x22(%rsp),%ebx
movzwl 0x2(%rsp),%ebp
test   %rbx,%rbx
je     12da <__emul+0x10a>
mov    %ebp,%eax
jmp    130c <__emul+0x13c>
movq   0x24(%rsp),%xmm0
movq   %xmm0,%rax
test   %rax,%rax
jne    12fa <__emul+0x12a>
cmpw   $0x0,0x2c(%rsp)
jne    12fa <__emul+0x12a>
cmpw   $0x0,0x2e(%rsp)
je     1335 <__emul+0x165>
lea    0x20(%rsp),%rdi
call   10d0 <__enormlz@plt>
sub    %rax,%rbx
movzwl 0x2(%rsp),%eax
movzwl %bp,%r12d
test   %ax,%ax
jne    134a <__emul+0x17a>
movq   0x4(%rsp),%xmm0
movq   %xmm0,%rax
test   %rax,%rax
jne    133f <__emul+0x16f>
cmpw   $0x0,0xc(%rsp)
jne    133f <__emul+0x16f>
cmpw   $0x0,0xe(%rsp)
jne    133f <__emul+0x16f>
mov    %r14,%rdi
call   10a0 <__eclear@plt>
jmp    139c <__emul+0x1cc>
mov    %rsp,%rdi
call   10d0 <__enormlz@plt>
sub    %rax,%r12
lea    0x20(%rsp),%rdi
mov    %rsp,%r15
mov    %r15,%rsi
call   1060 <__emulm@plt>
lea    (%rbx,%r12,1),%rcx
add    $0xffffffffffffc002,%rcx
mov    %r15,%rdi
mov    %eax,%esi
xor    %edx,%edx
mov    $0x40,%r8d
mov    $0x50,%r9d
call   10b0 <__emdnorm@plt>
movzwl 0x20(%rsp),%eax
xor    %ecx,%ecx
cmp    (%rsp),%ax
setne  %cl
neg    %ecx
mov    %cx,(%rsp)
mov    %r15,%rdi
mov    %r14,%rsi
call   10f0 <__emovo@plt>
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @__emul(i16* %0, i16* %1, i16* %2) {
%4 = alloca i16*
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca [9 x i16]
%8 = alloca [9 x i16]
%9 = alloca i32
%10 = alloca i32
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
store i16* %0, i16** %4
store i16* %1, i16** %5
store i16* %2, i16** %6
%14 = load i16*, i16** %4
%15 = call i64 @__eisnan(i16* %14)
%16 = icmp ne i64 %15, 0
br i1 %16, label %17, label %21
17: ; preds = %3
%18 = load i16*, i16** %4
%19 = load i16*, i16** %6
%20 = call i32 @__emov(i16* %18, i16* %19)
br label %169
21: ; preds = %3
%22 = load i16*, i16** %5
%23 = call i64 @__eisnan(i16* %22)
%24 = icmp ne i64 %23, 0
br i1 %24, label %25, label %29
25: ; preds = %21
%26 = load i16*, i16** %5
%27 = load i16*, i16** %6
%28 = call i32 @__emov(i16* %26, i16* %27)
br label %169
29: ; preds = %21
%30 = load i16*, i16** %4
%31 = call i64 @__eisinf(i16* %30)
%32 = icmp ne i64 %31, 0
br i1 %32, label %33, label %37
33: ; preds = %29
%34 = load i16*, i16** %5
%35 = call i64 @__eiiszero(i16* %34)
%36 = icmp ne i64 %35, 0
br i1 %36, label %45, label %37
37: ; preds = %33, %29
%38 = load i16*, i16** %5
%39 = call i64 @__eisinf(i16* %38)
%40 = icmp ne i64 %39, 0
br i1 %40, label %41, label %48
41: ; preds = %37
%42 = load i16*, i16** %4
%43 = call i64 @__eiiszero(i16* %42)
%44 = icmp ne i64 %43, 0
br i1 %44, label %45, label %48
45: ; preds = %41, %33
%46 = load i16*, i16** %6
%47 = call i32 @__enan_NBITS(i16* %46)
br label %169
48: ; preds = %41, %37
%49 = load i16*, i16** %4
%50 = call i64 @__eisinf(i16* %49)
%51 = icmp ne i64 %50, 0
br i1 %51, label %56, label %52
52: ; preds = %48
%53 = load i16*, i16** %5
%54 = call i64 @__eisinf(i16* %53)
%55 = icmp ne i64 %54, 0
br i1 %55, label %56, label %72
56: ; preds = %52, %48
%57 = load i16*, i16** %4
%58 = call i32 @__eisneg(i16* %57)
%59 = load i16*, i16** %5
%60 = call i32 @__eisneg(i16* %59)
%61 = xor i32 %58, %60
%62 = icmp ne i32 %61, 0
br i1 %62, label %63, label %66
63: ; preds = %56
%64 = load i16*, i16** %6
%65 = getelementptr inbounds i16, i16* %64, i64 5
store i16 -32768, i16* %65
br label %69
66: ; preds = %56
%67 = load i16*, i16** %6
%68 = getelementptr inbounds i16, i16* %67, i64 5
store i16 0, i16* %68
br label %69
69: ; preds = %66, %63
%70 = load i16*, i16** %6
%71 = call i32 @__einfin(i16* %70)
br label %169
72: ; preds = %52
%73 = load i16*, i16** %4
%74 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 0
%75 = call i32 @__emovi(i16* %73, i16* %74)
%76 = load i16*, i16** %5
%77 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%78 = call i32 @__emovi(i16* %76, i16* %77)
%79 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 1
%80 = load i16, i16* %79
%81 = zext i16 %80 to i64
store i64 %81, i64* %12
%82 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 1
%83 = load i16, i16* %82
%84 = zext i16 %83 to i64
store i64 %84, i64* %13
%85 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 1
%86 = load i16, i16* %85
%87 = zext i16 %86 to i32
%88 = icmp eq i32 %87, 0
br i1 %88, label %89, label %112
89: ; preds = %72
store i32 1, i32* %9
br label %90
90: ; preds = %106, %89
%91 = load i32, i32* %9
%92 = icmp slt i32 %91, 8
br i1 %92, label %93, label %109
93: ; preds = %90
%94 = load i32, i32* %9
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 %95
%97 = load i16, i16* %96
%98 = zext i16 %97 to i32
%99 = icmp ne i32 %98, 0
br i1 %99, label %100, label %105
100: ; preds = %93
%101 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 0
%102 = call i64 @__enormlz(i16* %101)
%103 = load i64, i64* %12
%104 = sub nsw i64 %103, %102
store i64 %104, i64* %12
br label %113
105: ; preds = %93
br label %106
106: ; preds = %105
%107 = load i32, i32* %9
%108 = add nsw i32 %107, 1
store i32 %108, i32* %9
br label %90
109: ; preds = %90
%110 = load i16*, i16** %6
%111 = call i32 @__eclear(i16* %110)
br label %169
112: ; preds = %72
br label %113
113: ; preds = %112, %100
%114 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 1
%115 = load i16, i16* %114
%116 = zext i16 %115 to i32
%117 = icmp eq i32 %116, 0
br i1 %117, label %118, label %141
118: ; preds = %113
store i32 1, i32* %9
br label %119
119: ; preds = %135, %118
%120 = load i32, i32* %9
%121 = icmp slt i32 %120, 8
br i1 %121, label %122, label %138
122: ; preds = %119
%123 = load i32, i32* %9
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 %124
%126 = load i16, i16* %125
%127 = zext i16 %126 to i32
%128 = icmp ne i32 %127, 0
br i1 %128, label %129, label %134
129: ; preds = %122
%130 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%131 = call i64 @__enormlz(i16* %130)
%132 = load i64, i64* %13
%133 = sub nsw i64 %132, %131
store i64 %133, i64* %13
br label %142
134: ; preds = %122
br label %135
135: ; preds = %134
%136 = load i32, i32* %9
%137 = add nsw i32 %136, 1
store i32 %137, i32* %9
br label %119
138: ; preds = %119
%139 = load i16*, i16** %6
%140 = call i32 @__eclear(i16* %139)
br label %169
141: ; preds = %113
br label %142
142: ; preds = %141, %129
%143 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 0
%144 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%145 = call i32 @__emulm(i16* %143, i16* %144)
store i32 %145, i32* %10
%146 = load i64, i64* %12
%147 = load i64, i64* %13
%148 = add nsw i64 %146, %147
%149 = sub nsw i64 %148, 16382
store i64 %149, i64* %11
%150 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%151 = load i32, i32* %10
%152 = load i64, i64* %11
%153 = call i32 @__emdnorm(i16* %150, i32 %151, i32 0, i64 %152, i32 64, i32 80)
%154 = getelementptr inbounds [9 x i16], [9 x i16]* %7, i64 0, i64 0
%155 = load i16, i16* %154
%156 = zext i16 %155 to i32
%157 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%158 = load i16, i16* %157
%159 = zext i16 %158 to i32
%160 = icmp eq i32 %156, %159
br i1 %160, label %161, label %163
161: ; preds = %142
%162 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
store i16 0, i16* %162
br label %165
163: ; preds = %142
%164 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
store i16 -1, i16* %164
br label %165
165: ; preds = %163, %161
%166 = getelementptr inbounds [9 x i16], [9 x i16]* %8, i64 0, i64 0
%167 = load i16*, i16** %6
%168 = call i32 @__emovo(i16* %166, i16* %167)
br label %169
169: ; preds = %165, %138, %109, %69, %45, %25, %17
ret void
}

LLVM IR (-O2):
define void @__emul(i16* %0, i16* %1, i16* %2) {
%4 = alloca [9 x i16]
%5 = alloca [9 x i16]
%6 = bitcast [9 x i16]* %4 to i8*
%7 = bitcast [9 x i16]* %5 to i8*
%8 = tail call i64 @__eisnan(i16* %0)
%9 = icmp eq i64 %8, 0
br i1 %9, label %12, label %10
10: ; preds = %3
%11 = tail call i32 @__emov(i16* %0, i16* %2)
br label %112
12: ; preds = %3
%13 = tail call i64 @__eisnan(i16* %1)
%14 = icmp eq i64 %13, 0
br i1 %14, label %17, label %15
15: ; preds = %12
%16 = tail call i32 @__emov(i16* %1, i16* %2)
br label %112
17: ; preds = %12
%18 = tail call i64 @__eisinf(i16* %0)
%19 = icmp eq i64 %18, 0
br i1 %19, label %23, label %20
20: ; preds = %17
%21 = tail call i64 @__eiiszero(i16* %1)
%22 = icmp eq i64 %21, 0
br i1 %22, label %23, label %29
23: ; preds = %20, %17
%24 = tail call i64 @__eisinf(i16* %1)
%25 = icmp eq i64 %24, 0
br i1 %25, label %31, label %26
26: ; preds = %23
%27 = tail call i64 @__eiiszero(i16* %0)
%28 = icmp eq i64 %27, 0
br i1 %28, label %31, label %29
29: ; preds = %26, %20
%30 = tail call i32 @__enan_NBITS(i16* %2)
br label %112
31: ; preds = %26, %23
%32 = tail call i64 @__eisinf(i16* %0)
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %37
34: ; preds = %31
%35 = tail call i64 @__eisinf(i16* %1)
%36 = icmp eq i64 %35, 0
br i1 %36, label %44, label %37
37: ; preds = %34, %31
%38 = tail call i32 @__eisneg(i16* %0)
%39 = tail call i32 @__eisneg(i16* %1)
%40 = icmp eq i32 %38, %39
%41 = select i1 %40, i16 0, i16 -32768
%42 = getelementptr inbounds i16, i16* %2, i64 5
store i16 %41, i16* %42
%43 = tail call i32 @__einfin(i16* %2)
br label %112
44: ; preds = %34
%45 = getelementptr inbounds [9 x i16], [9 x i16]* %4, i64 0, i64 0
%46 = call i32 @__emovi(i16* %0, i16* %45)
%47 = getelementptr inbounds [9 x i16], [9 x i16]* %5, i64 0, i64 0
%48 = call i32 @__emovi(i16* %1, i16* %47)
%49 = getelementptr inbounds [9 x i16], [9 x i16]* %4, i64 0, i64 1
%50 = load i16, i16* %49
%51 = zext i16 %50 to i64
%52 = getelementptr inbounds [9 x i16], [9 x i16]* %5, i64 0, i64 1
%53 = load i16, i16* %52
%54 = zext i16 %53 to i64
%55 = icmp eq i16 %50, 0
br i1 %55, label %56, label %77
56: ; preds = %44
%57 = getelementptr inbounds [9 x i16], [9 x i16]* %4, i64 0, i64 2
%58 = bitcast i16* %57 to <4 x i16>*
%59 = load <4 x i16>, <4 x i16>* %58
%60 = freeze <4 x i16> %59
%61 = bitcast <4 x i16> %60 to i64
%62 = icmp eq i64 %61, 0
%63 = getelementptr inbounds [9 x i16], [9 x i16]* %4, i64 0, i64 6
%64 = load i16, i16* %63
%65 = icmp eq i16 %64, 0
%66 = select i1 %62, i1 %65, i1 false
%67 = getelementptr inbounds [9 x i16], [9 x i16]* %4, i64 0, i64 7
%68 = load i16, i16* %67
%69 = icmp eq i16 %68, 0
%70 = select i1 %66, i1 %69, i1 false
br i1 %70, label %71, label %73
71: ; preds = %56
%72 = call i32 @__eclear(i16* %2)
br label %112
73: ; preds = %56
%74 = call i64 @__enormlz(i16* %45)
%75 = sub nsw i64 %51, %74
%76 = load i16, i16* %52
br label %77
77: ; preds = %44, %73
%78 = phi i16 [ %53, %44 ], [ %76, %73 ]
%79 = phi i64 [ %51, %44 ], [ %75, %73 ]
%80 = icmp eq i16 %78, 0
br i1 %80, label %81, label %101
81: ; preds = %77
%82 = getelementptr inbounds [9 x i16], [9 x i16]* %5, i64 0, i64 2
%83 = bitcast i16* %82 to <4 x i16>*
%84 = load <4 x i16>, <4 x i16>* %83
%85 = freeze <4 x i16> %84
%86 = bitcast <4 x i16> %85 to i64
%87 = icmp eq i64 %86, 0
%88 = getelementptr inbounds [9 x i16], [9 x i16]* %5, i64 0, i64 6
%89 = load i16, i16* %88
%90 = icmp eq i16 %89, 0
%91 = select i1 %87, i1 %90, i1 false
%92 = getelementptr inbounds [9 x i16], [9 x i16]* %5, i64 0, i64 7
%93 = load i16, i16* %92
%94 = icmp eq i16 %93, 0
%95 = select i1 %91, i1 %94, i1 false
br i1 %95, label %96, label %98
96: ; preds = %81
%97 = call i32 @__eclear(i16* %2)
br label %112
98: ; preds = %81
%99 = call i64 @__enormlz(i16* %47)
%100 = sub nsw i64 %54, %99
br label %101
101: ; preds = %77, %98
%102 = phi i64 [ %100, %98 ], [ %54, %77 ]
%103 = call i32 @__emulm(i16* %45, i16* %47)
%104 = add i64 %79, -16382
%105 = add i64 %104, %102
%106 = call i32 @__emdnorm(i16* %47, i32 %103, i32 0, i64 %105, i32 64, i32 80)
%107 = load i16, i16* %45
%108 = load i16, i16* %47
%109 = icmp ne i16 %107, %108
%110 = sext i1 %109 to i16
store i16 %110, i16* %47
%111 = call i32 @__emovo(i16* %47, i16* %2)
br label %112
112: ; preds = %101, %96, %71, %37, %29, %15, %10
ret void
}