void cookey(register unsigned long *raw1, unsigned long *dough) {
  register unsigned long *cook, *raw0;
  register int i;
  cook = dough;
  for (i = 0; i < 16; i++, raw1++) {
    raw0 = raw1++;
    *cook = (*raw0 & 0x00fc0000L) << 6;
    *cook |= (*raw0 & 0x00000fc0L) << 10;
    *cook |= (*raw1 & 0x00fc0000L) >> 10;
    *cook++ |= (*raw1 & 0x00000fc0L) >> 6;
    *cook = (*raw0 & 0x0003f000L) << 12;
    *cook |= (*raw0 & 0x0000003fL) << 16;
    *cook |= (*raw1 & 0x0003f000L) >> 4;
    *cook++ |= (*raw1 & 0x0000003fL);
  }
  return;
}


x86 assembly (clang, -O0):
<cookey>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x10,-0x24(%rbp)
jge    1238 <cookey+0x138>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
and    $0xfc0000,%rcx
shl    $0x6,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
and    $0xfc0,%rcx
shl    $0xa,%rcx
mov    -0x18(%rbp),%rax
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0xfc0000,%rcx
shr    $0xa,%rcx
mov    -0x18(%rbp),%rax
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0xfc0,%rcx
shr    $0x6,%rcx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x18(%rbp)
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
and    $0x3f000,%rcx
shl    $0xc,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
and    $0x3f,%rcx
shl    $0x10,%rcx
mov    -0x18(%rbp),%rax
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0x3f000,%rcx
shr    $0x4,%rcx
mov    -0x18(%rbp),%rax
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0x3f,%rcx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x18(%rbp)
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x8(%rbp)
jmp    111b <cookey+0x1b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<cookey>:
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    (%rdi,%rax,1),%ecx
shl    $0x6,%ecx
and    $0x3f000000,%ecx
mov    %rcx,(%rsi,%rax,1)
mov    (%rdi,%rax,1),%edx
shl    $0xa,%edx
and    $0x3f0000,%edx
or     %rcx,%rdx
mov    %rdx,(%rsi,%rax,1)
mov    0x8(%rdi,%rax,1),%rcx
shr    $0xa,%rcx
and    $0x3f00,%ecx
or     %rdx,%rcx
mov    %rcx,(%rsi,%rax,1)
mov    0x8(%rdi,%rax,1),%edx
shr    $0x6,%edx
and    $0x3f,%edx
or     %rcx,%rdx
mov    %rdx,(%rsi,%rax,1)
mov    (%rdi,%rax,1),%ecx
shl    $0xc,%ecx
and    $0x3f000000,%ecx
mov    %rcx,0x8(%rsi,%rax,1)
mov    (%rdi,%rax,1),%edx
and    $0x3f,%edx
shl    $0x10,%rdx
or     %rcx,%rdx
mov    %rdx,0x8(%rsi,%rax,1)
mov    0x8(%rdi,%rax,1),%rcx
shr    $0x4,%rcx
and    $0x3f00,%ecx
or     %rdx,%rcx
mov    %rcx,0x8(%rsi,%rax,1)
mov    0x8(%rdi,%rax,1),%rdx
and    $0x3f,%edx
or     %rcx,%rdx
mov    %rdx,0x8(%rsi,%rax,1)
add    $0x10,%rax
cmp    $0x100,%eax
jne    1110 <cookey+0x10>
ret

LLVM IR (-O0):
define void @cookey(i64* %0, i64* %1) {
%3 = alloca i64*
%4 = alloca i64*
%5 = alloca i64*
%6 = alloca i64*
%7 = alloca i32
store i64* %0, i64** %3
store i64* %1, i64** %4
%8 = load i64*, i64** %4
store i64* %8, i64** %5
store i32 0, i32* %7
br label %9
9: ; preds = %68, %2
%10 = load i32, i32* %7
%11 = icmp slt i32 %10, 16
br i1 %11, label %12, label %73
12: ; preds = %9
%13 = load i64*, i64** %3
%14 = getelementptr inbounds i64, i64* %13, i32 1
store i64* %14, i64** %3
store i64* %13, i64** %6
%15 = load i64*, i64** %6
%16 = load i64, i64* %15
%17 = and i64 %16, 16515072
%18 = shl i64 %17, 6
%19 = load i64*, i64** %5
store i64 %18, i64* %19
%20 = load i64*, i64** %6
%21 = load i64, i64* %20
%22 = and i64 %21, 4032
%23 = shl i64 %22, 10
%24 = load i64*, i64** %5
%25 = load i64, i64* %24
%26 = or i64 %25, %23
store i64 %26, i64* %24
%27 = load i64*, i64** %3
%28 = load i64, i64* %27
%29 = and i64 %28, 16515072
%30 = lshr i64 %29, 10
%31 = load i64*, i64** %5
%32 = load i64, i64* %31
%33 = or i64 %32, %30
store i64 %33, i64* %31
%34 = load i64*, i64** %3
%35 = load i64, i64* %34
%36 = and i64 %35, 4032
%37 = lshr i64 %36, 6
%38 = load i64*, i64** %5
%39 = getelementptr inbounds i64, i64* %38, i32 1
store i64* %39, i64** %5
%40 = load i64, i64* %38
%41 = or i64 %40, %37
store i64 %41, i64* %38
%42 = load i64*, i64** %6
%43 = load i64, i64* %42
%44 = and i64 %43, 258048
%45 = shl i64 %44, 12
%46 = load i64*, i64** %5
store i64 %45, i64* %46
%47 = load i64*, i64** %6
%48 = load i64, i64* %47
%49 = and i64 %48, 63
%50 = shl i64 %49, 16
%51 = load i64*, i64** %5
%52 = load i64, i64* %51
%53 = or i64 %52, %50
store i64 %53, i64* %51
%54 = load i64*, i64** %3
%55 = load i64, i64* %54
%56 = and i64 %55, 258048
%57 = lshr i64 %56, 4
%58 = load i64*, i64** %5
%59 = load i64, i64* %58
%60 = or i64 %59, %57
store i64 %60, i64* %58
%61 = load i64*, i64** %3
%62 = load i64, i64* %61
%63 = and i64 %62, 63
%64 = load i64*, i64** %5
%65 = getelementptr inbounds i64, i64* %64, i32 1
store i64* %65, i64** %5
%66 = load i64, i64* %64
%67 = or i64 %66, %63
store i64 %67, i64* %64
br label %68
68: ; preds = %12
%69 = load i32, i32* %7
%70 = add nsw i32 %69, 1
store i32 %70, i32* %7
%71 = load i64*, i64** %3
%72 = getelementptr inbounds i64, i64* %71, i32 1
store i64* %72, i64** %3
br label %9
73: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @cookey(i64* nocapture %0, i64* nocapture writeonly %1) {
br label %3
3: ; preds = %2, %3
%4 = phi i32 [ 0, %2 ], [ %39, %3 ]
%5 = phi i64* [ %0, %2 ], [ %40, %3 ]
%6 = phi i64* [ %1, %2 ], [ %37, %3 ]
%7 = getelementptr inbounds i64, i64* %5, i64 1
%8 = load i64, i64* %5
%9 = shl i64 %8, 6
%10 = and i64 %9, 1056964608
store i64 %10, i64* %6
%11 = load i64, i64* %5
%12 = shl i64 %11, 10
%13 = and i64 %12, 4128768
%14 = or i64 %13, %10
store i64 %14, i64* %6
%15 = load i64, i64* %7
%16 = lshr i64 %15, 10
%17 = and i64 %16, 16128
%18 = or i64 %17, %14
store i64 %18, i64* %6
%19 = load i64, i64* %7
%20 = lshr i64 %19, 6
%21 = and i64 %20, 63
%22 = getelementptr inbounds i64, i64* %6, i64 1
%23 = or i64 %21, %18
store i64 %23, i64* %6
%24 = load i64, i64* %5
%25 = shl i64 %24, 12
%26 = and i64 %25, 1056964608
store i64 %26, i64* %22
%27 = load i64, i64* %5
%28 = shl i64 %27, 16
%29 = and i64 %28, 4128768
%30 = or i64 %29, %26
store i64 %30, i64* %22
%31 = load i64, i64* %7
%32 = lshr i64 %31, 4
%33 = and i64 %32, 16128
%34 = or i64 %33, %30
store i64 %34, i64* %22
%35 = load i64, i64* %7
%36 = and i64 %35, 63
%37 = getelementptr inbounds i64, i64* %6, i64 2
%38 = or i64 %34, %36
store i64 %38, i64* %22
%39 = add nuw nsw i32 %4, 1
%40 = getelementptr inbounds i64, i64* %5, i64 2
%41 = icmp eq i32 %39, 16
br i1 %41, label %42, label %3
42: ; preds = %3
ret void
}