void perminit(unsigned char *perm, unsigned char *p) {
  unsigned char *pointer1;
  unsigned int c1;
  for (c1 = 0; c1 <= 0xF; c1++) {
    pointer1 = &perm[c1 * 128];
    int c2;
    for (c2 = 0; c2 <= 0xF; c2++) {
      int c3;
      int offset = 0;
      for (c3 = 8; c3 > 0; c3--) {
        pointer1[offset] = 0;
        offset++;
      }
      pointer1 = &(pointer1[8]);
    }
  }
  unsigned short *spointer1;
  unsigned char *spointer2;
  spointer1 = (unsigned short *)0x2c358;
  spointer2 = (unsigned char *)0x2c338;
  for (c1 = 0; c1 <= 0xF; c1++) {
    unsigned int c2;
    for (c2 = 0; c2 <= 0x10; c2++) {
      unsigned int offset = 0;
      unsigned int c3;
      for (c3 = 0x40; c3 > 0; c3--) {
        char short_loop = p[offset] - 1;
        unsigned char *short_loop_p;
        if ((short_loop / 4) == c1) {
          unsigned int offset2 = (short_loop * 4) & 0xC;
          short_loop = c2 & spointer1[offset2 / sizeof(short)];
          if (short_loop != 0) {
            unsigned int r9 = offset / 8;
            short_loop_p = &spointer2[offset << 2 & 0x1C];
            unsigned char r0 = perm[c1 * 128 + r9];
            r9[c1 * 128 + perm] = short_loop_p[3] | r0;
          }
        }
        offset++;
      }
    }
  }
  return;
}


x86 assembly (clang, -O0):
<perminit>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0xf,-0x1c(%rbp)
ja     11a9 <perminit+0xa9>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x7,%ecx
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0xf,-0x20(%rbp)
jg     1196 <perminit+0x96>
movl   $0x0,-0x28(%rbp)
movl   $0x8,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    117c <perminit+0x7c>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    114f <perminit+0x4f>
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1137 <perminit+0x37>
jmp    119b <perminit+0x9b>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1113 <perminit+0x13>
mov    $0x2c358,%eax
mov    %rax,-0x30(%rbp)
mov    $0x2c338,%eax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0xf,-0x1c(%rbp)
ja     12e9 <perminit+0x1e9>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x10,-0x3c(%rbp)
ja     12d6 <perminit+0x1d6>
movl   $0x0,-0x40(%rbp)
movl   $0x40,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
jbe    12c3 <perminit+0x1c3>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
sub    $0x1,%eax
mov    %al,-0x45(%rbp)
movsbl -0x45(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    -0x1c(%rbp),%eax
jne    12ac <perminit+0x1ac>
movsbl -0x45(%rbp),%eax
shl    $0x2,%eax
and    $0xc,%eax
mov    %eax,-0x54(%rbp)
mov    -0x3c(%rbp),%eax
mov    -0x30(%rbp),%rcx
mov    -0x54(%rbp),%edx
shr    $0x1,%rdx
movzwl (%rcx,%rdx,2),%ecx
and    %ecx,%eax
mov    %al,-0x45(%rbp)
movsbl -0x45(%rbp),%eax
cmp    $0x0,%eax
je     12a7 <perminit+0x1a7>
mov    -0x40(%rbp),%eax
shr    $0x3,%eax
mov    %eax,-0x58(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%ecx
shl    $0x2,%ecx
and    $0x1c,%ecx
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x7,%ecx
add    -0x58(%rbp),%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%al
mov    %al,-0x59(%rbp)
mov    -0x50(%rbp),%rax
movzbl 0x3(%rax),%eax
movzbl -0x59(%rbp),%ecx
or     %ecx,%eax
mov    %al,%dl
mov    -0x58(%rbp),%ecx
mov    -0x1c(%rbp),%esi
shl    $0x7,%esi
mov    -0x8(%rbp),%rax
mov    %esi,%esi
add    %rsi,%rax
mov    %ecx,%ecx
mov    %dl,(%rax,%rcx,1)
jmp    12ac <perminit+0x1ac>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x44(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x44(%rbp)
jmp    11eb <perminit+0xeb>
jmp    12c8 <perminit+0x1c8>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11d3 <perminit+0xd3>
jmp    12db <perminit+0x1db>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11c2 <perminit+0xc2>
pop    %rbp
ret

x86 assembly (clang, -O2):
<perminit>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r12
mov    %rdi,%r14
mov    $0x2c33b,%r15d
xor    %ebx,%ebx
mov    $0x800,%edx
xor    %esi,%esi
call   1030 <memset@plt>
jmp    114e <perminit+0x3e>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rbx
cmp    $0x10,%rbx
je     11ce <perminit+0xbe>
mov    %rbx,%r8
shl    $0x7,%r8
lea    (%r14,%r8,1),%r9
xor    %r10d,%r10d
jmp    116a <perminit+0x5a>
xchg   %ax,%ax
add    $0x1,%r10d
cmp    $0x11,%r10d
je     1140 <perminit+0x30>
xor    %esi,%esi
xor    %edi,%edi
jmp    117d <perminit+0x6d>
add    $0x1,%rdi
add    $0x4,%rsi
cmp    $0x40,%edi
je     1160 <perminit+0x50>
movzbl (%r12,%rdi,1),%ecx
add    $0xff,%cl
mov    %ecx,%eax
sar    $0x7,%al
shr    $0x6,%al
add    %cl,%al
sar    $0x2,%al
movsbq %al,%rax
mov    %eax,%eax
cmp    %rax,%rbx
jne    1170 <perminit+0x60>
movzbl %cl,%eax
add    %eax,%eax
and    $0x6,%eax
movzwl 0x1d(%r15,%rax,2),%eax
test   %eax,%r10d
je     1170 <perminit+0x60>
mov    %edi,%edx
shr    $0x3,%edx
mov    %esi,%ecx
and    $0x1c,%ecx
mov    %edx,%eax
add    %r8d,%eax
movzbl (%r15,%rcx,1),%ecx
or     (%r14,%rax,1),%cl
mov    %cl,(%r9,%rdx,1)
jmp    1170 <perminit+0x60>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define void @perminit(i8* nocapture %0, i8* nocapture %1) {
br label %3
3: ; preds = %2, %50
%4 = phi i64 [ 0, %2 ], [ %51, %50 ]
%5 = shl i64 %4, 7
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = trunc i64 %5 to i32
br label %8
8: ; preds = %3, %47
%9 = phi i32 [ 0, %3 ], [ %48, %47 ]
br label %10
10: ; preds = %8, %43
%11 = phi i64 [ 0, %8 ], [ %44, %43 ]
%12 = phi i32 [ 64, %8 ], [ %45, %43 ]
%13 = getelementptr inbounds i8, i8* %1, i64 %11
%14 = load i8, i8* %13
%15 = add i8 %14, -1
%16 = sdiv i8 %15, 4
%17 = sext i8 %16 to i64
%18 = and i64 %17, 4294967295
%19 = icmp eq i64 %4, %18
br i1 %19, label %20, label %43
20: ; preds = %10
%21 = sext i8 %15 to i64
%22 = shl nsw i64 %21, 1
%23 = and i64 %22, 6
%24 = getelementptr inbounds i16, i16* inttoptr (i64 181080 to i16*), i64 %23
%25 = load i16, i16* %24
%26 = zext i16 %25 to i32
%27 = and i32 %9, %26
%28 = icmp eq i32 %27, 0
br i1 %28, label %43, label %29
29: ; preds = %20
%30 = trunc i64 %11 to i32
%31 = lshr i32 %30, 3
%32 = shl i64 %11, 2
%33 = and i64 %32, 28
%34 = add i32 %31, %7
%35 = zext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %0, i64 %35
%37 = load i8, i8* %36
%38 = getelementptr inbounds i8, i8* inttoptr (i64 181051 to i8*), i64 %33
%39 = load i8, i8* %38
%40 = or i8 %39, %37
%41 = zext i32 %31 to i64
%42 = getelementptr inbounds i8, i8* %6, i64 %41
store i8 %40, i8* %42
br label %43
43: ; preds = %20, %29, %10
%44 = add nuw nsw i64 %11, 1
%45 = add nsw i32 %12, -1
%46 = icmp eq i32 %45, 0
br i1 %46, label %47, label %10
47: ; preds = %43
%48 = add nuw nsw i32 %9, 1
%49 = icmp eq i32 %48, 17
br i1 %49, label %50, label %8
50: ; preds = %47
%51 = add nuw nsw i64 %4, 1
%52 = icmp eq i64 %51, 16
br i1 %52, label %53, label %3
53: ; preds = %50
ret void
}