#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*/ memmove(unsigned short *, unsigned short *, long);
long mp_rshift(unsigned short *rop, unsigned short *op, unsigned long len,
               long shift) {
  int adj = 0;
  long i, size;
  unsigned long words, bits;
  words = shift / 16;
  bits = shift % 16;
  size = len - words;
  if (bits) {
    unsigned short hi, lo;
    unsigned long carry;
    for (i = 0, carry = 0x10000 >> 1; carry; i++, carry >>= 1)
      if (op[len - 1] & carry)
        break;
    adj = (bits + i) / 16;
    if (size - adj == 0) {
      rop[0] = 0;
      return (1);
    }
    hi = lo = op[words + size - 1];
    rop[size - 1] = hi >> bits;
    for (i = size - 2; i >= 0; i--) {
      lo = op[words + i];
      rop[i] = (lo >> bits) | (hi << (16 - bits));
      hi = lo;
    }
    if (adj)
      rop[0] |= lo << (16 - bits);
  } else
    memmove(rop, op + len - size, size * sizeof(unsigned short));
  return (size - adj);
}


x86 assembly (clang, -O0):
<mp_rshift>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
mov    $0x10,%ecx
cqto
idiv   %rcx
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rax
mov    $0x10,%ecx
cqto
idiv   %rcx
mov    %rdx,-0x50(%rbp)
mov    -0x20(%rbp),%rax
sub    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x50(%rbp)
je     12d9 <mp_rshift+0x1c9>
movq   $0x0,-0x38(%rbp)
movq   $0x8000,-0x60(%rbp)
cmpq   $0x0,-0x60(%rbp)
je     11ca <mp_rshift+0xba>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x1,%rcx
movzwl (%rax,%rcx,2),%eax
and    -0x60(%rbp),%rax
cmp    $0x0,%rax
je     11a8 <mp_rshift+0x98>
jmp    11ca <mp_rshift+0xba>
jmp    11ad <mp_rshift+0x9d>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x60(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x60(%rbp)
jmp    117a <mp_rshift+0x6a>
mov    -0x50(%rbp),%rax
add    -0x38(%rbp),%rax
shr    $0x4,%rax
mov    %eax,-0x2c(%rbp)
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x0,%rax
jne    1204 <mp_rshift+0xf4>
mov    -0x10(%rbp),%rax
movw   $0x0,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    1315 <mp_rshift+0x205>
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x40(%rbp),%rcx
sub    $0x1,%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x54(%rbp)
mov    %ax,-0x52(%rbp)
movzwl -0x52(%rbp),%eax
mov    -0x50(%rbp),%rcx
sar    %cl,%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
sub    $0x1,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x40(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jl     12ad <mp_rshift+0x19d>
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x38(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x54(%rbp)
movzwl -0x54(%rbp),%eax
mov    -0x50(%rbp),%rcx
sar    %cl,%eax
movzwl -0x52(%rbp),%edx
mov    $0x10,%ecx
sub    -0x50(%rbp),%rcx
shl    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x54(%rbp),%ax
mov    %ax,-0x52(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    1249 <mp_rshift+0x139>
cmpl   $0x0,-0x2c(%rbp)
je     12d4 <mp_rshift+0x1c4>
movzwl -0x54(%rbp),%edx
mov    $0x10,%eax
sub    -0x50(%rbp),%rax
mov    %eax,%ecx
shl    %cl,%edx
mov    -0x10(%rbp),%rax
movzwl (%rax),%ecx
or     %edx,%ecx
mov    %cx,(%rax)
jmp    1306 <mp_rshift+0x1f6>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rax
shl    $0x1,%rax
add    %rax,%rsi
xor    %eax,%eax
sub    -0x40(%rbp),%rax
shl    $0x1,%rax
add    %rax,%rsi
mov    -0x40(%rbp),%rdx
shl    $0x1,%rdx
call   1030 <memmove@plt>
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mp_rshift>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rcx,%r12
add    $0xf,%rcx
test   %r12,%r12
cmovns %r12,%rcx
mov    %rcx,%r9
sar    $0x4,%r9
and    $0xfffffffffffffff0,%rcx
mov    %rdx,%r14
sub    %r9,%r14
sub    %rcx,%r12
je     1230 <mp_rshift+0x120>
movzwl -0x2(%rsi,%rdx,2),%r10d
movzwl %r10w,%ebx
test   $0x8000,%ebx
jne    1248 <mp_rshift+0x138>
mov    $0x1,%r8d
test   $0x4000,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x2,%r8d
test   $0x2000,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x3,%r8d
test   $0x1000,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x4,%r8d
test   $0x800,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x5,%r8d
test   $0x400,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x6,%r8d
test   $0x200,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x7,%r8d
test   $0x100,%ebx
jne    124b <mp_rshift+0x13b>
mov    $0x8,%r8d
test   $0x80,%bl
jne    124b <mp_rshift+0x13b>
mov    $0x9,%r8d
test   $0x40,%bl
jne    124b <mp_rshift+0x13b>
mov    $0xa,%r8d
test   $0x20,%bl
jne    124b <mp_rshift+0x13b>
mov    $0xb,%r8d
test   $0x10,%bl
jne    124b <mp_rshift+0x13b>
mov    $0xc,%r8d
test   $0x8,%bl
jne    124b <mp_rshift+0x13b>
mov    $0xd,%r8d
test   $0x4,%bl
jne    124b <mp_rshift+0x13b>
mov    $0xe,%r8d
test   $0x2,%bl
jne    124b <mp_rshift+0x13b>
mov    %ebx,%ecx
and    $0x1,%ecx
mov    $0x10,%r8d
sub    %rcx,%r8
jmp    124b <mp_rshift+0x13b>
lea    (%rsi,%rdx,2),%rsi
lea    (%r14,%r14,1),%rdx
sub    %rdx,%rsi
call   1030 <memmove@plt>
xor    %r8d,%r8d
jmp    145d <mp_rshift+0x34d>
xor    %r8d,%r8d
add    %r12,%r8
shr    $0x4,%r8
movslq %r8d,%rcx
cmp    %rcx,%r14
jne    126a <mp_rshift+0x15a>
movw   $0x0,(%rdi)
mov    $0x1,%r14d
jmp    1463 <mp_rshift+0x353>
mov    %r12d,%ecx
shr    %cl,%ebx
mov    %bx,-0x2(%rdi,%r14,2)
cmp    $0x2,%r14
jl     13f7 <mp_rshift+0x2e7>
lea    -0x2(%r14),%rbp
mov    $0x10,%r11d
sub    %r12d,%r11d
mov    %r9,%rax
not    %rax
add    %rdx,%rax
cmp    $0x8,%rax
jb     13c2 <mp_rshift+0x2b2>
lea    (%rsi,%rdx,2),%rcx
add    $0xfffffffffffffffe,%rcx
cmp    %rdi,%rcx
jbe    12c4 <mp_rshift+0x1b4>
lea    -0x1(%rdx),%rcx
sub    %r9,%rcx
lea    (%rdi,%rcx,2),%rcx
lea    (%rsi,%r9,2),%rbx
cmp    %rcx,%rbx
jb     13c2 <mp_rshift+0x2b2>
mov    %rax,%r15
and    $0xfffffffffffffff8,%r15
sub    %r15,%rbp
movd   %r10d,%xmm0
pslldq $0xe,%xmm0
movd   %r12d,%xmm3
movd   %r11d,%xmm4
mov    %r15,%rcx
neg    %rcx
mov    %r9,%rbx
neg    %rbx
add    %rdx,%rbx
add    $0xfffffffffffffff7,%rbx
lea    (%rdi,%rbx,2),%r10
lea    (%rsi,%rdx,2),%r13
add    $0xffffffffffffffee,%r13
xor    %edx,%edx
pxor   %xmm8,%xmm8
xorps  %xmm2,%xmm2
movss  %xmm3,%xmm2
xorps  %xmm3,%xmm3
movss  %xmm4,%xmm3
cs nopw 0x0(%rax,%rax,1)
movdqu 0x0(%r13,%rdx,2),%xmm4
pshufd $0x4e,%xmm4,%xmm5
pshuflw $0x1b,%xmm5,%xmm7
pshufhw $0x1b,%xmm7,%xmm1
movdqa %xmm1,%xmm6
pslldq $0x2,%xmm6
psrldq $0xe,%xmm0
por    %xmm6,%xmm0
punpcklwd %xmm8,%xmm7
movdqa %xmm1,%xmm5
punpckhwd %xmm8,%xmm5
psrld  %xmm2,%xmm5
psrld  %xmm2,%xmm7
punpcklwd %xmm8,%xmm0
punpckhwd %xmm8,%xmm6
pslld  %xmm3,%xmm6
pslld  %xmm3,%xmm0
por    %xmm5,%xmm6
por    %xmm7,%xmm0
pslld  $0x10,%xmm6
psrad  $0x10,%xmm6
pslld  $0x10,%xmm0
psrad  $0x10,%xmm0
packssdw %xmm0,%xmm6
pshuflw $0x1b,%xmm6,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
movdqu %xmm0,(%r10,%rdx,2)
add    $0xfffffffffffffff8,%rdx
movdqa %xmm1,%xmm0
cmp    %rdx,%rcx
jne    1320 <mp_rshift+0x210>
movd   %xmm4,%r10d
mov    %r10d,%edx
cmp    %r15,%rax
je     144b <mp_rshift+0x33b>
test   $0x1,%bpl
jne    13fc <mp_rshift+0x2ec>
lea    (%r9,%rbp,1),%rcx
movzwl (%rsi,%rcx,2),%edx
mov    %edx,%r15d
mov    %r12d,%ecx
shr    %cl,%r15d
movzwl %r10w,%ebx
mov    %r11d,%ecx
shl    %cl,%ebx
or     %r15d,%ebx
mov    %bx,(%rdi,%rbp,2)
lea    -0x1(%rbp),%rbx
mov    %edx,%r10d
test   %rbp,%rbp
jne    1404 <mp_rshift+0x2f4>
jmp    144b <mp_rshift+0x33b>
mov    %r10d,%edx
jmp    144b <mp_rshift+0x33b>
mov    %rbp,%rbx
test   %rbp,%rbp
je     144b <mp_rshift+0x33b>
lea    (%rsi,%r9,2),%rsi
mov    %r10d,%edx
nopl   0x0(%rax,%rax,1)
movzwl (%rsi,%rbx,2),%ebp
mov    %ebp,%eax
mov    %r12d,%ecx
shr    %cl,%eax
movzwl %dx,%edx
mov    %r11d,%ecx
shl    %cl,%edx
or     %eax,%edx
mov    %dx,(%rdi,%rbx,2)
movzwl -0x2(%rsi,%rbx,2),%edx
mov    %edx,%eax
mov    %r12d,%ecx
shr    %cl,%eax
mov    %r11d,%ecx
shl    %cl,%ebp
or     %eax,%ebp
mov    %bp,-0x2(%rdi,%rbx,2)
add    $0xfffffffffffffffe,%rbx
cmp    $0xffffffffffffffff,%rbx
jne    1410 <mp_rshift+0x300>
test   %r8d,%r8d
je     145d <mp_rshift+0x34d>
movzwl %dx,%eax
mov    $0x10,%cl
sub    %r12b,%cl
shl    %cl,%eax
or     %ax,(%rdi)
movslq %r8d,%rax
sub    %rax,%r14
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i64 @mp_rshift(i16* %0, i16* %1, i64 %2, i64 %3) {
%5 = sdiv i64 %3, 16
%6 = srem i64 %3, 16
%7 = sub i64 %2, %5
%8 = icmp eq i64 %6, 0
br i1 %8, label %187, label %9
9: ; preds = %4
%10 = add i64 %2, -1
%11 = getelementptr inbounds i16, i16* %1, i64 %10
%12 = load i16, i16* %11
%13 = zext i16 %12 to i64
%14 = and i64 %13, 32768
%15 = icmp eq i64 %14, 0
br i1 %15, label %16, label %62
16: ; preds = %9
%17 = and i64 %13, 16384
%18 = icmp eq i64 %17, 0
br i1 %18, label %19, label %62
19: ; preds = %16
%20 = and i64 %13, 8192
%21 = icmp eq i64 %20, 0
br i1 %21, label %22, label %62
22: ; preds = %19
%23 = and i64 %13, 4096
%24 = icmp eq i64 %23, 0
br i1 %24, label %25, label %62
25: ; preds = %22
%26 = and i64 %13, 2048
%27 = icmp eq i64 %26, 0
br i1 %27, label %28, label %62
28: ; preds = %25
%29 = and i64 %13, 1024
%30 = icmp eq i64 %29, 0
br i1 %30, label %31, label %62
31: ; preds = %28
%32 = and i64 %13, 512
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %62
34: ; preds = %31
%35 = and i64 %13, 256
%36 = icmp eq i64 %35, 0
br i1 %36, label %37, label %62
37: ; preds = %34
%38 = and i64 %13, 128
%39 = icmp eq i64 %38, 0
br i1 %39, label %40, label %62
40: ; preds = %37
%41 = and i64 %13, 64
%42 = icmp eq i64 %41, 0
br i1 %42, label %43, label %62
43: ; preds = %40
%44 = and i64 %13, 32
%45 = icmp eq i64 %44, 0
br i1 %45, label %46, label %62
46: ; preds = %43
%47 = and i64 %13, 16
%48 = icmp eq i64 %47, 0
br i1 %48, label %49, label %62
49: ; preds = %46
%50 = and i64 %13, 8
%51 = icmp eq i64 %50, 0
br i1 %51, label %52, label %62
52: ; preds = %49
%53 = and i64 %13, 4
%54 = icmp eq i64 %53, 0
br i1 %54, label %55, label %62
55: ; preds = %52
%56 = and i64 %13, 2
%57 = icmp eq i64 %56, 0
br i1 %57, label %58, label %62
58: ; preds = %55
%59 = and i64 %13, 1
%60 = icmp eq i64 %59, 0
%61 = select i1 %60, i64 16, i64 15
br label %62
62: ; preds = %58, %55, %52, %49, %46, %43, %40, %37, %34, %31, %28, %25, %22, %19, %16, %9
%63 = phi i64 [ 0, %9 ], [ 1, %16 ], [ 2, %19 ], [ 3, %22 ], [ 4, %25 ], [ 5, %28 ], [ 6, %31 ], [ 7, %34 ], [ 8, %37 ], [ 9, %40 ], [ 10, %43 ], [ 11, %46 ], [ 12, %49 ], [ 13, %52 ], [ 14, %55 ], [ %61, %58 ]
%64 = add nsw i64 %63, %6
%65 = lshr i64 %64, 4
%66 = trunc i64 %65 to i32
%67 = shl i64 %65, 32
%68 = ashr exact i64 %67, 32
%69 = icmp eq i64 %7, %68
br i1 %69, label %70, label %71
70: ; preds = %62
store i16 0, i16* %0
br label %198
71: ; preds = %62
%72 = zext i16 %12 to i32
%73 = trunc i64 %6 to i32
%74 = lshr i32 %72, %73
%75 = trunc i32 %74 to i16
%76 = add nsw i64 %7, -1
%77 = getelementptr inbounds i16, i16* %0, i64 %76
store i16 %75, i16* %77
%78 = icmp sgt i64 %7, 1
br i1 %78, label %79, label %177
79: ; preds = %71
%80 = add nsw i64 %7, -2
%81 = sub nsw i32 16, %73
%82 = xor i64 %5, -1
%83 = add i64 %82, %2
%84 = icmp ult i64 %83, 8
br i1 %84, label %129, label %85
85: ; preds = %79
%86 = add i64 %2, -1
%87 = sub i64 %86, %5
%88 = getelementptr i16, i16* %0, i64 %87
%89 = getelementptr i16, i16* %1, i64 %5
%90 = getelementptr i16, i16* %1, i64 %86
%91 = icmp ugt i16* %90, %0
%92 = icmp ult i16* %89, %88
%93 = and i1 %91, %92
br i1 %93, label %129, label %94
94: ; preds = %85
%95 = and i64 %83, -8
%96 = sub i64 %80, %95
%97 = insertelement <8 x i16> poison, i16 %12, i64 7
%98 = insertelement <8 x i32> poison, i32 %73, i64 0
%99 = shufflevector <8 x i32> %98, <8 x i32> poison, <8 x i32> zeroinitializer
%100 = insertelement <8 x i32> poison, i32 %81, i64 0
%101 = shufflevector <8 x i32> %100, <8 x i32> poison, <8 x i32> zeroinitializer
%102 = getelementptr inbounds i16, i16* %1, i64 -7
%103 = getelementptr inbounds i16, i16* %0, i64 -7
br label %104
104: ; preds = %104, %94
%105 = phi i64 [ 0, %94 ], [ %123, %104 ]
%106 = phi <8 x i16> [ %97, %94 ], [ %112, %104 ]
%107 = sub i64 %80, %105
%108 = add i64 %107, %5
%109 = getelementptr inbounds i16, i16* %102, i64 %108
%110 = bitcast i16* %109 to <8 x i16>*
%111 = load <8 x i16>, <8 x i16>* %110
%112 = shufflevector <8 x i16> %111, <8 x i16> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%113 = shufflevector <8 x i16> %106, <8 x i16> %112, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
%114 = zext <8 x i16> %112 to <8 x i32>
%115 = lshr <8 x i32> %114, %99
%116 = zext <8 x i16> %113 to <8 x i32>
%117 = shl <8 x i32> %116, %101
%118 = or <8 x i32> %115, %117
%119 = trunc <8 x i32> %118 to <8 x i16>
%120 = shufflevector <8 x i16> %119, <8 x i16> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%121 = getelementptr inbounds i16, i16* %103, i64 %107
%122 = bitcast i16* %121 to <8 x i16>*
store <8 x i16> %120, <8 x i16>* %122
%123 = add nuw i64 %105, 8
%124 = icmp eq i64 %123, %95
br i1 %124, label %125, label %104
125: ; preds = %104
%126 = icmp eq i64 %83, %95
%127 = extractelement <8 x i16> %111, i64 0
%128 = extractelement <8 x i16> %111, i64 0
br i1 %126, label %177, label %129
129: ; preds = %85, %79, %125
%130 = phi i16 [ %127, %125 ], [ %12, %79 ], [ %12, %85 ]
%131 = phi i64 [ %96, %125 ], [ %80, %79 ], [ %80, %85 ]
%132 = and i64 %131, 1
%133 = icmp eq i64 %132, 0
br i1 %133, label %134, label %146
134: ; preds = %129
%135 = add i64 %131, %5
%136 = getelementptr inbounds i16, i16* %1, i64 %135
%137 = load i16, i16* %136
%138 = zext i16 %137 to i32
%139 = lshr i32 %138, %73
%140 = zext i16 %130 to i32
%141 = shl i32 %140, %81
%142 = or i32 %139, %141
%143 = trunc i32 %142 to i16
%144 = getelementptr inbounds i16, i16* %0, i64 %131
store i16 %143, i16* %144
%145 = add nsw i64 %131, -1
br label %146
146: ; preds = %134, %129
%147 = phi i16 [ undef, %129 ], [ %137, %134 ]
%148 = phi i16 [ %130, %129 ], [ %137, %134 ]
%149 = phi i64 [ %131, %129 ], [ %145, %134 ]
%150 = icmp eq i64 %131, 0
br i1 %150, label %177, label %151
151: ; preds = %146, %151
%152 = phi i16 [ %167, %151 ], [ %148, %146 ]
%153 = phi i64 [ %175, %151 ], [ %149, %146 ]
%154 = add i64 %153, %5
%155 = getelementptr inbounds i16, i16* %1, i64 %154
%156 = load i16, i16* %155
%157 = zext i16 %156 to i32
%158 = lshr i32 %157, %73
%159 = zext i16 %152 to i32
%160 = shl i32 %159, %81
%161 = or i32 %158, %160
%162 = trunc i32 %161 to i16
%163 = getelementptr inbounds i16, i16* %0, i64 %153
store i16 %162, i16* %163
%164 = add nsw i64 %153, -1
%165 = add i64 %164, %5
%166 = getelementptr inbounds i16, i16* %1, i64 %165
%167 = load i16, i16* %166
%168 = zext i16 %167 to i32
%169 = lshr i32 %168, %73
%170 = zext i16 %156 to i32
%171 = shl i32 %170, %81
%172 = or i32 %169, %171
%173 = trunc i32 %172 to i16
%174 = getelementptr inbounds i16, i16* %0, i64 %164
store i16 %173, i16* %174
%175 = add nsw i64 %153, -2
%176 = icmp eq i64 %164, 0
br i1 %176, label %177, label %151
177: ; preds = %146, %151, %125, %71
%178 = phi i16 [ %12, %71 ], [ %128, %125 ], [ %147, %146 ], [ %167, %151 ]
%179 = icmp eq i32 %66, 0
br i1 %179, label %193, label %180
180: ; preds = %177
%181 = zext i16 %178 to i32
%182 = sub i32 16, %73
%183 = shl i32 %181, %182
%184 = load i16, i16* %0
%185 = trunc i32 %183 to i16
%186 = or i16 %184, %185
store i16 %186, i16* %0
br label %193
187: ; preds = %4
%188 = getelementptr inbounds i16, i16* %1, i64 %2
%189 = sub i64 0, %7
%190 = getelementptr inbounds i16, i16* %188, i64 %189
%191 = shl i64 %7, 1
%192 = tail call i32 @memmove(i16* %0, i16* %190, i64 %191)
br label %193
193: ; preds = %180, %177, %187
%194 = phi i64 [ 0, %187 ], [ %65, %177 ], [ %65, %180 ]
%195 = shl i64 %194, 32
%196 = ashr exact i64 %195, 32
%197 = sub nsw i64 %7, %196
br label %198
198: ; preds = %70, %193
%199 = phi i64 [ %197, %193 ], [ 1, %70 ]
ret i64 %199
}