int ntruenc_encode_msg(unsigned char *data, int len, int n, short *m) {
  int ret = 0;
  int i, j;
  unsigned char *l = (unsigned char *)&len;
  int zlen;
  if ((len + 2) * 8 > n) {
    ret = 3;
    goto end;
  }
  zlen = (n - ((len + 2) * 8)) / 8;
  for (i = 0; i < 2; i++) {
    for (j = 0; j < 8; j++)
      m[i * 8 + j] = (((l[i] >> j) & 1) << 1) - 1;
  }
  m += 2 * 8;
  for (i = 0; i < len; i++) {
    for (j = 0; j < 8; j++)
      m[i * 8 + j] = (((data[i] >> j) & 1) << 1) - 1;
  }
  m += len * 8;
  for (i = 0; i < zlen; i++) {
    for (j = 0; j < 8; j++)
      m[i * 8 + j] = 0;
  }
  m += zlen * 8;
  switch ((n - ((len + 2) * 8)) & 7) {
  case 7:
    m[6] = 0;
  case 6:
    m[5] = 0;
  case 5:
    m[4] = 0;
  case 4:
    m[3] = 0;
  case 3:
    m[2] = 0;
  case 2:
    m[1] = 0;
  case 1:
    m[0] = 0;
  default:
    break;
  }
end:
  return ret;
}


x86 assembly (clang, -O0):
<ntruenc_encode_msg>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
lea    -0xc(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
shl    $0x3,%eax
cmp    -0x10(%rbp),%eax
jle    113f <ntruenc_encode_msg+0x3f>
movl   $0x3,-0x1c(%rbp)
jmp    1351 <ntruenc_encode_msg+0x251>
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    $0x2,%ecx
shl    $0x3,%ecx
sub    %ecx,%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    11cc <ntruenc_encode_msg+0xcc>
movl   $0x0,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jge    11b9 <ntruenc_encode_msg+0xb9>
mov    -0x30(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x24(%rbp),%ecx
sar    %cl,%eax
and    $0x1,%eax
shl    $0x1,%eax
sub    $0x1,%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1170 <ntruenc_encode_msg+0x70>
jmp    11be <ntruenc_encode_msg+0xbe>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    115f <ntruenc_encode_msg+0x5f>
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    124e <ntruenc_encode_msg+0x14e>
movl   $0x0,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jge    123b <ntruenc_encode_msg+0x13b>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x24(%rbp),%ecx
sar    %cl,%eax
and    $0x1,%eax
shl    $0x1,%eax
sub    $0x1,%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11f2 <ntruenc_encode_msg+0xf2>
jmp    1240 <ntruenc_encode_msg+0x140>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11df <ntruenc_encode_msg+0xdf>
mov    -0xc(%rbp),%ecx
shl    $0x3,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    12c1 <ntruenc_encode_msg+0x1c1>
movl   $0x0,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jge    12ae <ntruenc_encode_msg+0x1ae>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movw   $0x0,(%rax,%rcx,2)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1280 <ntruenc_encode_msg+0x180>
jmp    12b3 <ntruenc_encode_msg+0x1b3>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    126d <ntruenc_encode_msg+0x16d>
mov    -0x34(%rbp),%ecx
shl    $0x3,%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
lea    (%rax,%rcx,2),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%eax
and    $0x7,%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x40(%rbp)
sub    $0x6,%eax
ja     1347 <ntruenc_encode_msg+0x247>
mov    -0x40(%rbp),%rax
lea    0xd07(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rax
movw   $0x0,0xc(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,0xa(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,0x8(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,0x6(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,0x4(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,0x2(%rax)
mov    -0x18(%rbp),%rax
movw   $0x0,(%rax)
jmp    134c <ntruenc_encode_msg+0x24c>
jmp    1351 <ntruenc_encode_msg+0x251>
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ntruenc_encode_msg>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r14d
lea    0x10(,%rsi,8),%edx
mov    $0x3,%eax
cmp    %r14d,%edx
jg     13c1 <ntruenc_encode_msg+0x2b1>
lea    0x0(,%rsi,8),%r8d
mov    %esi,%r11d
shr    $0x8,%r11d
mov    %r14d,%r9d
sub    %edx,%r9d
movzwl %si,%edx
lea    (%rsi,%rsi,1),%r10d
mov    %edx,%r15d
shr    %r15d
mov    %edx,%r12d
shr    $0x2,%r12d
mov    %edx,%ebp
shr    $0x3,%ebp
mov    %edx,%ebx
shr    $0x4,%ebx
mov    %edx,%eax
shr    $0x5,%eax
shr    $0x6,%edx
movd   %edx,%xmm0
movd   %eax,%xmm1
punpcklwd %xmm0,%xmm1
movd   %ebx,%xmm0
movd   %ebp,%xmm2
punpcklwd %xmm0,%xmm2
punpckldq %xmm1,%xmm2
movd   %esi,%xmm0
movd   %r10d,%xmm1
punpcklwd %xmm0,%xmm1
movd   %r12d,%xmm0
movd   %r15d,%xmm3
punpcklwd %xmm0,%xmm3
punpckldq %xmm3,%xmm1
punpcklqdq %xmm2,%xmm1
movdqa 0xe4e(%rip),%xmm5
pand   %xmm5,%xmm1
pcmpeqd %xmm0,%xmm0
paddw  %xmm0,%xmm1
movdqu %xmm1,(%rcx)
lea    (%r11,%r11,1),%r10d
mov    %esi,%r15d
shr    $0x9,%r15d
and    $0x7fff,%r15d
mov    %esi,%r12d
shr    $0xa,%r12d
and    $0x3fff,%r12d
mov    %esi,%ebp
shr    $0xb,%ebp
and    $0x1fff,%ebp
mov    %esi,%edx
shr    $0xc,%edx
and    $0xfff,%edx
mov    %esi,%ebx
shr    $0xd,%ebx
and    $0x7ff,%ebx
mov    %esi,%eax
shr    $0xe,%eax
and    $0x3ff,%eax
movd   %eax,%xmm1
movd   %ebx,%xmm2
punpcklwd %xmm1,%xmm2
movd   %edx,%xmm1
movd   %ebp,%xmm3
punpcklwd %xmm1,%xmm3
punpckldq %xmm2,%xmm3
movd   %r12d,%xmm1
movd   %r15d,%xmm2
punpcklwd %xmm1,%xmm2
movd   %r11d,%xmm1
movd   %r10d,%xmm4
punpcklwd %xmm1,%xmm4
punpckldq %xmm2,%xmm4
punpcklqdq %xmm3,%xmm4
pand   %xmm5,%xmm4
paddw  %xmm0,%xmm4
movdqu %xmm4,0x10(%rcx)
lea    0x7(%r9),%r15d
test   %r9d,%r9d
cmovns %r9d,%r15d
lea    0x20(%rcx),%rbx
test   %esi,%esi
jle    1343 <ntruenc_encode_msg+0x233>
mov    %esi,%r11d
cmp    $0x8,%esi
jb     129e <ntruenc_encode_msg+0x18e>
mov    %r11,%r10
shl    $0x4,%r10
lea    (%rdi,%r11,1),%rax
cmp    %rbx,%rax
jbe    13ca <ntruenc_encode_msg+0x2ba>
lea    (%r10,%rcx,1),%rax
add    $0x20,%rax
cmp    %rdi,%rax
jbe    13ca <ntruenc_encode_msg+0x2ba>
xor    %esi,%esi
mov    %rsi,%rax
shl    $0x4,%rax
add    %rcx,%rax
add    $0x2e,%rax
xchg   %ax,%ax
movzbl (%rdi,%rsi,1),%ecx
and    $0x1,%ecx
add    %ecx,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0xe(%rax)
movzbl (%rdi,%rsi,1),%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0xc(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    %ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0xa(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    $0x2,%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0x8(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    $0x3,%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0x6(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    $0x4,%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0x4(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    $0x5,%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,-0x2(%rax)
movzbl (%rdi,%rsi,1),%ecx
shr    $0x6,%ecx
and    $0x2,%ecx
add    $0xffffffff,%ecx
mov    %cx,(%rax)
add    $0x1,%rsi
add    $0x10,%rax
cmp    %rsi,%r11
jne    12b0 <ntruenc_encode_msg+0x1a0>
sar    $0x3,%r15d
movslq %r8d,%rax
lea    (%rbx,%rax,2),%rbx
cmp    $0x8,%r9d
jl     136a <ntruenc_encode_msg+0x25a>
lea    -0x1(%r15),%edx
shl    $0x4,%rdx
add    $0x10,%rdx
mov    %rbx,%rdi
xor    %esi,%esi
call   1030 <memset@plt>
and    $0x7,%r14d
xor    %eax,%eax
add    $0xffffffff,%r14d
cmp    $0x6,%r14d
ja     13c1 <ntruenc_encode_msg+0x2b1>
shl    $0x3,%r15d
movslq %r15d,%rcx
lea    0xc98(%rip),%rdx
movslq (%rdx,%r14,4),%rsi
add    %rdx,%rsi
jmp    *%rsi
movw   $0x0,0xc(%rbx,%rcx,2)
movw   $0x0,0xa(%rbx,%rcx,2)
movw   $0x0,0x8(%rbx,%rcx,2)
movw   $0x0,0x6(%rbx,%rcx,2)
movw   $0x0,0x4(%rbx,%rcx,2)
movw   $0x0,0x2(%rbx,%rcx,2)
movw   $0x0,(%rbx,%rcx,2)
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r11d,%esi
and    $0xfffffff8,%esi
and    $0xffffffffffffff80,%r10
xor    %edx,%edx
mov    %rdi,%rax
nopl   0x0(%rax)
movq   (%rax),%xmm4
movdqa %xmm4,%xmm9
punpcklbw %xmm9,%xmm9
paddw  %xmm9,%xmm9
pand   %xmm5,%xmm9
pcmpeqd %xmm0,%xmm0
paddw  %xmm0,%xmm9
movdqa %xmm4,%xmm15
movdqa 0xc02(%rip),%xmm2
pand   %xmm2,%xmm15
pxor   %xmm5,%xmm5
punpcklbw %xmm5,%xmm15
paddw  %xmm0,%xmm15
movdqa %xmm4,%xmm8
psrlw  $0x1,%xmm8
pand   %xmm2,%xmm8
punpcklbw %xmm5,%xmm8
paddw  %xmm0,%xmm8
movdqa %xmm4,%xmm3
psrlw  $0x2,%xmm3
pand   %xmm2,%xmm3
punpcklbw %xmm5,%xmm3
paddw  %xmm0,%xmm3
movdqa %xmm4,%xmm11
psrlw  $0x3,%xmm11
pand   %xmm2,%xmm11
punpcklbw %xmm5,%xmm11
paddw  %xmm0,%xmm11
movdqa %xmm4,%xmm1
psrlw  $0x4,%xmm1
pand   %xmm2,%xmm1
punpcklbw %xmm5,%xmm1
paddw  %xmm0,%xmm1
movdqa %xmm4,%xmm7
psrlw  $0x5,%xmm7
pand   %xmm2,%xmm7
punpcklbw %xmm5,%xmm7
paddw  %xmm0,%xmm7
psrlw  $0x6,%xmm4
pand   %xmm2,%xmm4
punpcklbw %xmm5,%xmm4
paddw  %xmm0,%xmm4
movdqa %xmm8,%xmm5
punpcklwd %xmm3,%xmm5
movdqa %xmm9,%xmm2
punpcklwd %xmm15,%xmm2
movdqa %xmm2,%xmm0
punpckldq %xmm5,%xmm0
movdqa %xmm7,%xmm10
punpcklwd %xmm4,%xmm10
pshufd $0x0,%xmm10,%xmm13
movdqa %xmm11,%xmm6
punpcklwd %xmm1,%xmm6
pshufd $0x0,%xmm6,%xmm12
punpckhdq %xmm13,%xmm12
movsd  %xmm0,%xmm12
movdqa %xmm6,%xmm0
punpckldq %xmm10,%xmm0
pshufd $0x55,%xmm5,%xmm14
pshufd $0x55,%xmm2,%xmm13
punpckldq %xmm14,%xmm13
shufps $0xe4,%xmm0,%xmm13
pshufd $0xaa,%xmm10,%xmm0
pshufd $0xaa,%xmm6,%xmm14
punpckhdq %xmm0,%xmm14
pshufd $0xff,%xmm2,%xmm0
punpckhdq %xmm5,%xmm2
movsd  %xmm2,%xmm14
punpckhdq %xmm10,%xmm6
pshufd $0xff,%xmm5,%xmm2
punpckldq %xmm2,%xmm0
shufps $0xe4,%xmm6,%xmm0
punpckhwd %xmm3,%xmm8
punpckhwd %xmm15,%xmm9
movdqa %xmm9,%xmm2
punpckldq %xmm8,%xmm2
punpckhwd %xmm4,%xmm7
pshufd $0x0,%xmm7,%xmm3
punpckhwd %xmm1,%xmm11
pshufd $0x0,%xmm11,%xmm1
punpckhdq %xmm3,%xmm1
movsd  %xmm2,%xmm1
movdqa %xmm11,%xmm2
punpckldq %xmm7,%xmm2
pshufd $0x55,%xmm8,%xmm3
pshufd $0x55,%xmm9,%xmm4
punpckldq %xmm3,%xmm4
shufps $0xe4,%xmm2,%xmm4
pshufd $0xaa,%xmm7,%xmm2
pshufd $0xaa,%xmm11,%xmm3
punpckhdq %xmm2,%xmm3
pshufd $0xff,%xmm9,%xmm2
punpckhdq %xmm8,%xmm9
movsd  %xmm9,%xmm3
punpckhdq %xmm7,%xmm11
pshufd $0xff,%xmm8,%xmm5
punpckldq %xmm5,%xmm2
movdqa 0xa44(%rip),%xmm5
shufps $0xe4,%xmm11,%xmm2
movups %xmm2,0x70(%rbx,%rdx,1)
movupd %xmm3,0x60(%rbx,%rdx,1)
movups %xmm4,0x50(%rbx,%rdx,1)
movupd %xmm1,0x40(%rbx,%rdx,1)
movups %xmm0,0x30(%rbx,%rdx,1)
movupd %xmm14,0x20(%rbx,%rdx,1)
movups %xmm13,0x10(%rbx,%rdx,1)
movupd %xmm12,(%rbx,%rdx,1)
add    $0x8,%rax
sub    $0xffffffffffffff80,%rdx
cmp    %rdx,%r10
jne    13e0 <ntruenc_encode_msg+0x2d0>
cmp    %r11,%rsi
je     1343 <ntruenc_encode_msg+0x233>
jmp    12a0 <ntruenc_encode_msg+0x190>

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

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