int divm(a, b)
unsigned short a[], b[];
{
  unsigned short sqr[14 + 2], prod[14 + 2], quot[14 + 2];
  int i, prec, k;
  unsigned short d, qu, *p;
  unsigned long u;
  p = &a[4];
  i = 14 - 4;
  do {
    if (*p++ != 0)
      goto longdiv;
  } while (--i);
  qmov(b, prod);
  prod[14] = 0;
  prod[14 + 1] = 0;
  shdn1(prod);
  shdn1(prod);
  d = a[3];
  u = ((unsigned long)prod[3] << 16) | prod[4];
  for (i = 3; i < 14; i++) {
    qu = u / d;
    prod[i] = qu;
    u = ((u - (unsigned long)d * qu) << 16) | prod[i + 2];
  }
  prod[14] = u / d;
  goto divdon;
longdiv:
  qclear(quot);
  quot[14] = 0;
  qclear(prod);
  qclear(sqr);
  quot[3] = ((unsigned long)0x40000000) / (unsigned long)a[3];
  prec = 2;
  k = 1;
  while (prec < 14 - 2) {
    k = 2 * k;
    if (k > 14 - 2)
      prec = 14 - 2;
    else
      prec = k;
    squarev(quot, sqr, prec);
    mulv(a, sqr, prod, prec);
    subm(prod, quot);
    shup1(quot);
  }
  mulv(quot, b, prod, 14 - 2);
  prod[0] = b[0];
  prod[1] = b[1];
divdon:
  mdnorm(prod);
  qmov(prod, b);
  return 0;
}


x86 assembly (clang, -O0):
<divm>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x88(%rbp)
movl   $0xa,-0x74(%rbp)
mov    -0x88(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x88(%rbp)
movzwl (%rax),%eax
cmp    $0x0,%eax
je     11cf <divm+0x4f>
jmp    12c4 <divm+0x144>
jmp    11d4 <divm+0x54>
mov    -0x74(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x74(%rbp)
cmp    $0x0,%eax
jne    11a9 <divm+0x29>
mov    -0x10(%rbp),%rdi
lea    -0x50(%rbp),%rsi
mov    $0x0,%al
call   1070 <qmov@plt>
movw   $0x0,-0x34(%rbp)
movw   $0x0,-0x32(%rbp)
lea    -0x50(%rbp),%rdi
mov    $0x0,%al
call   1040 <shdn1@plt>
lea    -0x50(%rbp),%rdi
mov    $0x0,%al
call   1040 <shdn1@plt>
mov    -0x8(%rbp),%rax
mov    0x6(%rax),%ax
mov    %ax,-0x7e(%rbp)
movzwl -0x4a(%rbp),%eax
shl    $0x10,%rax
movzwl -0x48(%rbp),%ecx
or     %rcx,%rax
mov    %rax,-0x90(%rbp)
movl   $0x3,-0x74(%rbp)
cmpl   $0xe,-0x74(%rbp)
jge    12ab <divm+0x12b>
mov    -0x90(%rbp),%rax
movzwl -0x7e(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %ax,-0x80(%rbp)
mov    -0x80(%rbp),%cx
movslq -0x74(%rbp),%rax
mov    %cx,-0x50(%rbp,%rax,2)
mov    -0x90(%rbp),%rax
movzwl -0x7e(%rbp),%ecx
movzwl -0x80(%rbp),%edx
imul   %rdx,%rcx
sub    %rcx,%rax
shl    $0x10,%rax
mov    -0x74(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movzwl -0x50(%rbp,%rcx,2),%ecx
or     %rcx,%rax
mov    %rax,-0x90(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1240 <divm+0xc0>
mov    -0x90(%rbp),%rax
movzwl -0x7e(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %ax,-0x34(%rbp)
jmp    13b6 <divm+0x236>
lea    -0x70(%rbp),%rdi
mov    $0x0,%al
call   1080 <qclear@plt>
movw   $0x0,-0x54(%rbp)
lea    -0x50(%rbp),%rdi
mov    $0x0,%al
call   1080 <qclear@plt>
lea    -0x30(%rbp),%rdi
mov    $0x0,%al
call   1080 <qclear@plt>
mov    -0x8(%rbp),%rax
movzwl 0x6(%rax),%eax
mov    %eax,%ecx
mov    $0x40000000,%eax
xor    %edx,%edx
div    %rcx
mov    %ax,-0x6a(%rbp)
movl   $0x2,-0x78(%rbp)
movl   $0x1,-0x7c(%rbp)
cmpl   $0xc,-0x78(%rbp)
jge    1387 <divm+0x207>
mov    -0x7c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x7c(%rbp)
cmpl   $0xc,-0x7c(%rbp)
jle    133a <divm+0x1ba>
movl   $0xc,-0x78(%rbp)
jmp    1340 <divm+0x1c0>
mov    -0x7c(%rbp),%eax
mov    %eax,-0x78(%rbp)
lea    -0x70(%rbp),%rdi
lea    -0x30(%rbp),%rsi
mov    -0x78(%rbp),%edx
mov    $0x0,%al
call   1030 <squarev@plt>
mov    -0x8(%rbp),%rdi
lea    -0x30(%rbp),%rsi
lea    -0x50(%rbp),%rdx
mov    -0x78(%rbp),%ecx
mov    $0x0,%al
call   10a0 <mulv@plt>
lea    -0x50(%rbp),%rdi
lea    -0x70(%rbp),%rsi
mov    $0x0,%al
call   1090 <subm@plt>
lea    -0x70(%rbp),%rdi
mov    $0x0,%al
call   1060 <shup1@plt>
jmp    1311 <divm+0x191>
lea    -0x70(%rbp),%rdi
mov    -0x10(%rbp),%rsi
lea    -0x50(%rbp),%rdx
mov    $0xc,%ecx
mov    $0x0,%al
call   10a0 <mulv@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    0x2(%rax),%ax
mov    %ax,-0x4e(%rbp)
lea    -0x50(%rbp),%rdi
mov    $0x0,%al
call   1050 <mdnorm@plt>
lea    -0x50(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    $0x0,%al
call   1070 <qmov@plt>
xor    %eax,%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<divm>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x60,%rsp
mov    %rsi,%r14
mov    %rdi,%r15
cmpw   $0x0,0x8(%rdi)
jne    11e6 <divm+0x66>
cmpw   $0x0,0xa(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0xc(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0xe(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x10(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x12(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x14(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x16(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x18(%r15)
jne    11e6 <divm+0x66>
cmpw   $0x0,0x1a(%r15)
je     1374 <divm+0x1f4>
lea    0x20(%rsp),%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1080 <qclear@plt>
movw   $0x0,0x3c(%rsp)
mov    %rsp,%r12
mov    %r12,%rdi
xor    %eax,%eax
call   1080 <qclear@plt>
lea    0x40(%rsp),%r13
mov    %r13,%rdi
xor    %eax,%eax
call   1080 <qclear@plt>
movzwl 0x6(%r15),%ecx
mov    $0x40000000,%eax
xor    %edx,%edx
div    %ecx
mov    %ax,0x26(%rsp)
mov    %rbx,%rdi
mov    %r13,%rsi
mov    $0x2,%edx
xor    %eax,%eax
call   1030 <squarev@plt>
mov    %r15,%rdi
mov    %r13,%rsi
mov    %r12,%rdx
mov    $0x2,%ecx
xor    %eax,%eax
call   10a0 <mulv@plt>
mov    %r12,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1090 <subm@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <shup1@plt>
mov    %rbx,%rdi
mov    %r13,%rsi
mov    $0x4,%edx
xor    %eax,%eax
call   1030 <squarev@plt>
mov    %r15,%rdi
mov    %r13,%rsi
mov    %r12,%rdx
mov    $0x4,%ecx
xor    %eax,%eax
call   10a0 <mulv@plt>
mov    %r12,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1090 <subm@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <shup1@plt>
mov    %rbx,%rdi
mov    %r13,%rsi
mov    $0x8,%edx
xor    %eax,%eax
call   1030 <squarev@plt>
mov    %r15,%rdi
mov    %r13,%rsi
mov    %r12,%rdx
mov    $0x8,%ecx
xor    %eax,%eax
call   10a0 <mulv@plt>
mov    %r12,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1090 <subm@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <shup1@plt>
mov    %rbx,%rdi
mov    %r13,%rsi
mov    $0xc,%edx
xor    %eax,%eax
call   1030 <squarev@plt>
mov    %r15,%rdi
mov    %r13,%rsi
mov    %r12,%rdx
mov    $0xc,%ecx
xor    %eax,%eax
call   10a0 <mulv@plt>
mov    %r12,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1090 <subm@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <shup1@plt>
mov    %rbx,%rdi
mov    %r14,%rsi
mov    %r12,%rdx
mov    $0xc,%ecx
xor    %eax,%eax
call   10a0 <mulv@plt>
movzwl (%r14),%eax
mov    %ax,(%rsp)
movzwl 0x2(%r14),%eax
mov    %ax,0x2(%rsp)
mov    %rsp,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <mdnorm@plt>
mov    %rbx,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1070 <qmov@plt>
xor    %eax,%eax
add    $0x60,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
mov    %rsp,%rbx
mov    %r14,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1070 <qmov@plt>
movl   $0x0,0x1c(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <shdn1@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <shdn1@plt>
movzwl 0x6(%r15),%esi
movzwl 0x6(%rsp),%eax
shl    $0x10,%rax
movzwl 0x8(%rsp),%ecx
or     %rax,%rcx
mov    $0x5,%edi
jmp    13ec <divm+0x26c>
mov    %rcx,%rax
xor    %edx,%edx
div    %rsi
mov    %ax,-0x4(%rsp,%rdi,2)
movzwl %ax,%eax
imul   %rsi,%rax
sub    %rax,%rcx
mov    %rcx,%rax
shl    $0x10,%rax
movzwl (%rsp,%rdi,2),%ecx
or     %rax,%rcx
add    $0x1,%rdi
cmp    $0x10,%rdi
je     13fd <divm+0x27d>
mov    %rcx,%rax
shr    $0x20,%rax
jne    13bd <divm+0x23d>
mov    %ecx,%eax
xor    %edx,%edx
div    %esi
jmp    13c5 <divm+0x245>
mov    %rcx,%rax
shr    $0x20,%rax
je     1418 <divm+0x298>
mov    %rcx,%rax
xor    %edx,%edx
div    %rsi
mov    %ax,0x1c(%rsp)
jmp    134a <divm+0x1ca>
mov    %ecx,%eax
xor    %edx,%edx
div    %esi
mov    %ax,0x1c(%rsp)
jmp    134a <divm+0x1ca>

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

LLVM IR (-O2):
define i32 @divm(i16* %0, i16* %1) {
%3 = alloca [16 x i16]
%4 = alloca [16 x i16]
%5 = alloca [16 x i16]
%6 = bitcast [16 x i16]* %3 to i8*
%7 = bitcast [16 x i16]* %4 to i8*
%8 = bitcast [16 x i16]* %5 to i8*
%9 = getelementptr inbounds i16, i16* %0, i64 4
%10 = load i16, i16* %9
%11 = icmp eq i16 %10, 0
br i1 %11, label %12, label %86
12: ; preds = %2
%13 = getelementptr inbounds i16, i16* %0, i64 5
%14 = load i16, i16* %13
%15 = icmp eq i16 %14, 0
br i1 %15, label %16, label %86
16: ; preds = %12
%17 = getelementptr inbounds i16, i16* %0, i64 6
%18 = load i16, i16* %17
%19 = icmp eq i16 %18, 0
br i1 %19, label %20, label %86
20: ; preds = %16
%21 = getelementptr inbounds i16, i16* %0, i64 7
%22 = load i16, i16* %21
%23 = icmp eq i16 %22, 0
br i1 %23, label %24, label %86
24: ; preds = %20
%25 = getelementptr inbounds i16, i16* %0, i64 8
%26 = load i16, i16* %25
%27 = icmp eq i16 %26, 0
br i1 %27, label %28, label %86
28: ; preds = %24
%29 = getelementptr inbounds i16, i16* %0, i64 9
%30 = load i16, i16* %29
%31 = icmp eq i16 %30, 0
br i1 %31, label %32, label %86
32: ; preds = %28
%33 = getelementptr inbounds i16, i16* %0, i64 10
%34 = load i16, i16* %33
%35 = icmp eq i16 %34, 0
br i1 %35, label %36, label %86
36: ; preds = %32
%37 = getelementptr inbounds i16, i16* %0, i64 11
%38 = load i16, i16* %37
%39 = icmp eq i16 %38, 0
br i1 %39, label %40, label %86
40: ; preds = %36
%41 = getelementptr inbounds i16, i16* %0, i64 12
%42 = load i16, i16* %41
%43 = icmp eq i16 %42, 0
br i1 %43, label %44, label %86
44: ; preds = %40
%45 = getelementptr inbounds i16, i16* %0, i64 13
%46 = load i16, i16* %45
%47 = icmp eq i16 %46, 0
br i1 %47, label %48, label %86
48: ; preds = %44
%49 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 0
%50 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @qmov to i32 (i16*, i16*, ...)*)(i16* %1, i16* %49)
%51 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 14
store i16 0, i16* %51
%52 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 15
store i16 0, i16* %52
%53 = call i32 (i16*, ...) bitcast (i32 (...)* @shdn1 to i32 (i16*, ...)*)(i16* %49)
%54 = call i32 (i16*, ...) bitcast (i32 (...)* @shdn1 to i32 (i16*, ...)*)(i16* %49)
%55 = getelementptr inbounds i16, i16* %0, i64 3
%56 = load i16, i16* %55
%57 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 3
%58 = load i16, i16* %57
%59 = zext i16 %58 to i64
%60 = shl nuw nsw i64 %59, 16
%61 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 4
%62 = load i16, i16* %61
%63 = zext i16 %62 to i64
%64 = or i64 %60, %63
%65 = zext i16 %56 to i64
br label %66
66: ; preds = %48, %66
%67 = phi i64 [ 3, %48 ], [ %81, %66 ]
%68 = phi i64 [ %64, %48 ], [ %80, %66 ]
%69 = udiv i64 %68, %65
%70 = trunc i64 %69 to i16
%71 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 %67
store i16 %70, i16* %71
%72 = and i64 %69, 65535
%73 = mul nuw nsw i64 %72, %65
%74 = sub i64 %68, %73
%75 = shl i64 %74, 16
%76 = add nuw nsw i64 %67, 2
%77 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 %76
%78 = load i16, i16* %77
%79 = zext i16 %78 to i64
%80 = or i64 %75, %79
%81 = add nuw nsw i64 %67, 1
%82 = icmp eq i64 %81, 14
br i1 %82, label %83, label %66
83: ; preds = %66
%84 = udiv i64 %80, %65
%85 = trunc i64 %84 to i16
store i16 %85, i16* %51
br label %121
86: ; preds = %44, %40, %36, %32, %28, %24, %20, %16, %12, %2
%87 = getelementptr inbounds [16 x i16], [16 x i16]* %5, i64 0, i64 0
%88 = call i32 (i16*, ...) bitcast (i32 (...)* @qclear to i32 (i16*, ...)*)(i16* %87)
%89 = getelementptr inbounds [16 x i16], [16 x i16]* %5, i64 0, i64 14
store i16 0, i16* %89
%90 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 0
%91 = call i32 (i16*, ...) bitcast (i32 (...)* @qclear to i32 (i16*, ...)*)(i16* %90)
%92 = getelementptr inbounds [16 x i16], [16 x i16]* %3, i64 0, i64 0
%93 = call i32 (i16*, ...) bitcast (i32 (...)* @qclear to i32 (i16*, ...)*)(i16* %92)
%94 = getelementptr inbounds i16, i16* %0, i64 3
%95 = load i16, i16* %94
%96 = zext i16 %95 to i32
%97 = udiv i32 1073741824, %96
%98 = trunc i32 %97 to i16
%99 = getelementptr inbounds [16 x i16], [16 x i16]* %5, i64 0, i64 3
store i16 %98, i16* %99
%100 = call i32 (i16*, i16*, i32, ...) bitcast (i32 (...)* @squarev to i32 (i16*, i16*, i32, ...)*)(i16* %87, i16* %92, i32 2)
%101 = call i32 (i16*, i16*, i16*, i32, ...) bitcast (i32 (...)* @mulv to i32 (i16*, i16*, i16*, i32, ...)*)(i16* %0, i16* %92, i16* %90, i32 2)
%102 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @subm to i32 (i16*, i16*, ...)*)(i16* %90, i16* %87)
%103 = call i32 (i16*, ...) bitcast (i32 (...)* @shup1 to i32 (i16*, ...)*)(i16* %87)
%104 = call i32 (i16*, i16*, i32, ...) bitcast (i32 (...)* @squarev to i32 (i16*, i16*, i32, ...)*)(i16* %87, i16* %92, i32 4)
%105 = call i32 (i16*, i16*, i16*, i32, ...) bitcast (i32 (...)* @mulv to i32 (i16*, i16*, i16*, i32, ...)*)(i16* %0, i16* %92, i16* %90, i32 4)
%106 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @subm to i32 (i16*, i16*, ...)*)(i16* %90, i16* %87)
%107 = call i32 (i16*, ...) bitcast (i32 (...)* @shup1 to i32 (i16*, ...)*)(i16* %87)
%108 = call i32 (i16*, i16*, i32, ...) bitcast (i32 (...)* @squarev to i32 (i16*, i16*, i32, ...)*)(i16* %87, i16* %92, i32 8)
%109 = call i32 (i16*, i16*, i16*, i32, ...) bitcast (i32 (...)* @mulv to i32 (i16*, i16*, i16*, i32, ...)*)(i16* %0, i16* %92, i16* %90, i32 8)
%110 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @subm to i32 (i16*, i16*, ...)*)(i16* %90, i16* %87)
%111 = call i32 (i16*, ...) bitcast (i32 (...)* @shup1 to i32 (i16*, ...)*)(i16* %87)
%112 = call i32 (i16*, i16*, i32, ...) bitcast (i32 (...)* @squarev to i32 (i16*, i16*, i32, ...)*)(i16* %87, i16* %92, i32 12)
%113 = call i32 (i16*, i16*, i16*, i32, ...) bitcast (i32 (...)* @mulv to i32 (i16*, i16*, i16*, i32, ...)*)(i16* %0, i16* %92, i16* %90, i32 12)
%114 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @subm to i32 (i16*, i16*, ...)*)(i16* %90, i16* %87)
%115 = call i32 (i16*, ...) bitcast (i32 (...)* @shup1 to i32 (i16*, ...)*)(i16* %87)
%116 = call i32 (i16*, i16*, i16*, i32, ...) bitcast (i32 (...)* @mulv to i32 (i16*, i16*, i16*, i32, ...)*)(i16* %87, i16* %1, i16* %90, i32 12)
%117 = load i16, i16* %1
store i16 %117, i16* %90
%118 = getelementptr inbounds i16, i16* %1, i64 1
%119 = load i16, i16* %118
%120 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 1
store i16 %119, i16* %120
br label %121
121: ; preds = %86, %83
%122 = getelementptr inbounds [16 x i16], [16 x i16]* %4, i64 0, i64 0
%123 = call i32 (i16*, ...) bitcast (i32 (...)* @mdnorm to i32 (i16*, ...)*)(i16* %122)
%124 = call i32 (i16*, i16*, ...) bitcast (i32 (...)* @qmov to i32 (i16*, i16*, ...)*)(i16* %122, i16* %1)
ret i32 0
}