user: 请将以下的汇编代码转换成C语言代码:

```asm
<cookey>:
  endbr64
  mov    %rdi,%rax
  sub    $0x98,%rsp
  mov    %rsi,%rdi
  movdqa D15(%rip),%xmm6
  movdqu (%rax),%xmm2
  movdqu 0x10(%rax),%xmm3
  mov    %rsp,%rsi
  movdqa D0(%rip),%xmm7
  movdqa D3(%rip),%xmm4
  mov    %fs:0x28,%rdx
  mov    %rdx,0x88(%rsp)
  xor    %edx,%edx
  movdqa %xmm2,%xmm5
  shufps $0xdd,%xmm3,%xmm2
  movdqa %xmm2,%xmm8
  shufps $0x88,%xmm3,%xmm5
  movdqa %xmm5,%xmm0
  movdqa %xmm5,%xmm1
  movdqa D12(%rip),%xmm3
  pslld  $0x6,%xmm0
  pslld  $0xa,%xmm1
  mov    $0x80,%edx
  pand   %xmm7,%xmm1
  psrad  $0x6,%xmm8
  pand   %xmm6,%xmm0
  por    %xmm1,%xmm0
  movdqa %xmm2,%xmm1
  pand   %xmm3,%xmm8
  psrad  $0xa,%xmm1
  pand   %xmm4,%xmm1
  por    %xmm8,%xmm1
  por    %xmm1,%xmm0
  movdqa %xmm5,%xmm1
  pslld  $0xc,%xmm1
  pslld  $0x10,%xmm5
  pand   %xmm7,%xmm5
  pand   %xmm6,%xmm1
  por    %xmm5,%xmm1
  movdqa %xmm2,%xmm5
  pand   %xmm3,%xmm2
  psrad  $0x4,%xmm5
  pand   %xmm4,%xmm5
  por    %xmm5,%xmm2
  por    %xmm1,%xmm2
  movdqa %xmm0,%xmm1
  punpckldq %xmm2,%xmm1
  punpckhdq %xmm2,%xmm0
  movdqu 0x20(%rax),%xmm2
  movaps %xmm0,0x10(%rsp)
  movdqu 0x30(%rax),%xmm0
  movdqa %xmm2,%xmm5
  movaps %xmm1,(%rsp)
  shufps $0xdd,%xmm0,%xmm2
  shufps $0x88,%xmm0,%xmm5
  movdqa %xmm5,%xmm0
  movdqa %xmm5,%xmm1
  pslld  $0x6,%xmm0
  pslld  $0xa,%xmm1
  movdqa %xmm2,%xmm8
  pand   %xmm7,%xmm1
  psrad  $0x6,%xmm8
  pand   %xmm6,%xmm0
  por    %xmm1,%xmm0
  movdqa %xmm2,%xmm1
  pand   %xmm3,%xmm8
  psrad  $0xa,%xmm1
  pand   %xmm4,%xmm1
  por    %xmm8,%xmm1
  por    %xmm1,%xmm0
  movdqa %xmm5,%xmm1
  pslld  $0xc,%xmm1
  pslld  $0x10,%xmm5
  pand   %xmm7,%xmm5
  pand   %xmm6,%xmm1
  por    %xmm5,%xmm1
  movdqa %xmm2,%xmm5
  pand   %xmm3,%xmm2
  psrad  $0x4,%xmm5
  pand   %xmm4,%xmm5
  por    %xmm5,%xmm2
  por    %xmm1,%xmm2
  movdqa %xmm0,%xmm1
  punpckldq %xmm2,%xmm1
  punpckhdq %xmm2,%xmm0
  movdqu 0x40(%rax),%xmm2
  movaps %xmm0,0x30(%rsp)
  movdqu 0x50(%rax),%xmm0
  movdqa %xmm2,%xmm5
  movaps %xmm1,0x20(%rsp)
  shufps $0xdd,%xmm0,%xmm2
  shufps $0x88,%xmm0,%xmm5
  movdqa %xmm5,%xmm0
  movdqa %xmm5,%xmm1
  pslld  $0x6,%xmm0
  pslld  $0xa,%xmm1
  movdqa %xmm2,%xmm8
  pand   %xmm7,%xmm1
  psrad  $0x6,%xmm8
  pand   %xmm6,%xmm0
  por    %xmm1,%xmm0
  movdqa %xmm2,%xmm1
  pand   %xmm3,%xmm8
  psrad  $0xa,%xmm1
  pand   %xmm4,%xmm1
  por    %xmm8,%xmm1
  por    %xmm1,%xmm0
  movdqa %xmm5,%xmm1
  pslld  $0xc,%xmm1
  pslld  $0x10,%xmm5
  pand   %xmm7,%xmm5
  pand   %xmm6,%xmm1
  por    %xmm5,%xmm1
  movdqa %xmm2,%xmm5
  pand   %xmm3,%xmm2
  psrad  $0x4,%xmm5
  pand   %xmm4,%xmm5
  por    %xmm5,%xmm2
  por    %xmm1,%xmm2
  movdqa %xmm0,%xmm1
  punpckldq %xmm2,%xmm1
  punpckhdq %xmm2,%xmm0
  movaps %xmm1,0x40(%rsp)
  movdqu 0x60(%rax),%xmm1
  movaps %xmm0,0x50(%rsp)
  movdqu 0x70(%rax),%xmm0
  movdqa %xmm1,%xmm5
  shufps $0x88,%xmm0,%xmm5
  shufps $0xdd,%xmm0,%xmm1
  movdqa %xmm1,%xmm0
  movdqa %xmm1,%xmm2
  psrad  $0x6,%xmm0
  psrad  $0xa,%xmm2
  movdqa %xmm5,%xmm8
  pand   %xmm4,%xmm2
  pslld  $0x6,%xmm8
  pand   %xmm3,%xmm0
  por    %xmm2,%xmm0
  movdqa %xmm5,%xmm2
  pand   %xmm6,%xmm8
  pslld  $0xa,%xmm2
  pand   %xmm7,%xmm2
  por    %xmm8,%xmm2
  por    %xmm2,%xmm0
  movdqa %xmm5,%xmm2
  pslld  $0x10,%xmm2
  pslld  $0xc,%xmm5
  pand   %xmm6,%xmm5
  pand   %xmm7,%xmm2
  por    %xmm5,%xmm2
  movdqa %xmm1,%xmm5
  pand   %xmm3,%xmm1
  psrad  $0x4,%xmm5
  pand   %xmm5,%xmm4
  por    %xmm4,%xmm1
  por    %xmm2,%xmm1
  movdqa %xmm0,%xmm2
  punpckldq %xmm1,%xmm2
  punpckhdq %xmm1,%xmm0
  movaps %xmm2,0x60(%rsp)
  movaps %xmm0,0x70(%rsp)
  call   <memcpy@plt>
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x98,%rsp
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D15
type: byte[16]
name: parse_data
arguments: label: D0
type: byte[16]
name: parse_data
arguments: label: D3
type: byte[16]
name: parse_data
arguments: label: D12
type: byte[16]

tool: {"D15": [0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f]}

tool: {"D0": [0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00]}

tool: {"D3": [0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00]}

tool: {"D12": [0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00]}

assistant: ```c
void cookey(const uint32_t *raw1, uint32_t *keyout) {
  uint32_t *cook;
  const uint32_t *raw0;
  uint32_t dough[32];
  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);
  }
  memcpy(keyout, dough, sizeof(dough));
}
```