user: What would the C source look like for the assembly code provided here?

```asm
<unpack20>:
  endbr64
  mov    %rsi,%rdx
  mov    %rdi,%rax
  lea    0x200(%rdi),%rsi
L8:
  mov    (%rdx),%ecx
  shr    $0xc,%ecx
  mov    %ecx,(%rax)
  mov    (%rdx),%ecx
  shl    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x4(%rax)
  movzbl 0x7(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x4(%rax)
  mov    0x4(%rdx),%ecx
  shr    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x8(%rax)
  mov    0x4(%rdx),%ecx
  shl    $0x10,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0xc(%rax)
  movzwl 0xa(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0xc(%rax)
  mov    0x8(%rdx),%ecx
  shl    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x10(%rax)
  mov    0xc(%rdx),%edi
  shr    $0x1c,%edi
  or     %edi,%ecx
  mov    %ecx,0x10(%rax)
  mov    0xc(%rdx),%ecx
  shr    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x14(%rax)
  mov    0xc(%rdx),%ecx
  shl    $0xc,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x18(%rax)
  mov    0x10(%rdx),%edi
  shr    $0x14,%edi
  or     %edi,%ecx
  mov    %ecx,0x18(%rax)
  mov    0x10(%rdx),%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x1c(%rax)
  mov    0x14(%rdx),%ecx
  shr    $0xc,%ecx
  mov    %ecx,0x20(%rax)
  mov    0x14(%rdx),%ecx
  shl    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x24(%rax)
  movzbl 0x1b(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x24(%rax)
  mov    0x18(%rdx),%ecx
  shr    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x28(%rax)
  mov    0x18(%rdx),%ecx
  shl    $0x10,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x2c(%rax)
  movzwl 0x1e(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x2c(%rax)
  mov    0x1c(%rdx),%ecx
  shl    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x30(%rax)
  mov    0x20(%rdx),%edi
  shr    $0x1c,%edi
  or     %edi,%ecx
  mov    %ecx,0x30(%rax)
  mov    0x20(%rdx),%ecx
  shr    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x34(%rax)
  mov    0x20(%rdx),%ecx
  shl    $0xc,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x38(%rax)
  mov    0x24(%rdx),%edi
  shr    $0x14,%edi
  or     %edi,%ecx
  mov    %ecx,0x38(%rax)
  mov    0x24(%rdx),%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x3c(%rax)
  mov    0x28(%rdx),%ecx
  shr    $0xc,%ecx
  mov    %ecx,0x40(%rax)
  mov    0x28(%rdx),%ecx
  shl    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x44(%rax)
  movzbl 0x2f(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x44(%rax)
  mov    0x2c(%rdx),%ecx
  shr    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x48(%rax)
  mov    0x2c(%rdx),%ecx
  shl    $0x10,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x4c(%rax)
  movzwl 0x32(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x4c(%rax)
  mov    0x30(%rdx),%ecx
  shl    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x50(%rax)
  mov    0x34(%rdx),%edi
  shr    $0x1c,%edi
  or     %edi,%ecx
  mov    %ecx,0x50(%rax)
  mov    0x34(%rdx),%ecx
  shr    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x54(%rax)
  mov    0x34(%rdx),%ecx
  shl    $0xc,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x58(%rax)
  mov    0x38(%rdx),%edi
  shr    $0x14,%edi
  or     %edi,%ecx
  mov    %ecx,0x58(%rax)
  mov    0x38(%rdx),%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x5c(%rax)
  mov    0x3c(%rdx),%ecx
  shr    $0xc,%ecx
  mov    %ecx,0x60(%rax)
  mov    0x3c(%rdx),%ecx
  shl    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,0x64(%rax)
  movzbl 0x43(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,0x64(%rax)
  mov    0x40(%rdx),%ecx
  shr    $0x4,%ecx
  sub    $0xffffffffffffff80,%rax
  add    $0x50,%rdx
  and    $0xfffff,%ecx
  mov    %ecx,-0x18(%rax)
  mov    -0x10(%rdx),%ecx
  shl    $0x10,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,-0x14(%rax)
  movzwl -0xa(%rdx),%edi
  or     %edi,%ecx
  mov    %ecx,-0x14(%rax)
  mov    -0xc(%rdx),%ecx
  shl    $0x4,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,-0x10(%rax)
  mov    -0x8(%rdx),%edi
  shr    $0x1c,%edi
  or     %edi,%ecx
  mov    %ecx,-0x10(%rax)
  mov    -0x8(%rdx),%ecx
  shr    $0x8,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,-0xc(%rax)
  mov    -0x8(%rdx),%ecx
  shl    $0xc,%ecx
  and    $0xfffff,%ecx
  mov    %ecx,-0x8(%rax)
  mov    -0x4(%rdx),%edi
  shr    $0x14,%edi
  or     %edi,%ecx
  mov    %ecx,-0x8(%rax)
  mov    -0x4(%rdx),%ecx
  and    $0xfffff,%ecx
  mov    %ecx,-0x4(%rax)
  cmp    %rax,%rsi
  jne    L8
  ret
```

assistant: ```c
void unpack20(unsigned int *p, unsigned int *w) {
  int i;
  for (i = 0; i < 128; i += 32, p += 32, w += 20) {
    p[0] = (w[0] >> 12);
    p[1] = (w[0] << 8) & ((1 << 20) - 1);
    p[1] |= (w[1] >> 24);
    p[2] = (w[1] >> 4) & ((1 << 20) - 1);
    p[3] = (w[1] << 16) & ((1 << 20) - 1);
    p[3] |= (w[2] >> 16);
    p[4] = (w[2] << 4) & ((1 << 20) - 1);
    p[4] |= (w[3] >> 28);
    p[5] = (w[3] >> 8) & ((1 << 20) - 1);
    p[6] = (w[3] << 12) & ((1 << 20) - 1);
    p[6] |= (w[4] >> 20);
    p[7] = (w[4]) & ((1 << 20) - 1);
    p[8] = (w[5] >> 12);
    p[9] = (w[5] << 8) & ((1 << 20) - 1);
    p[9] |= (w[6] >> 24);
    p[10] = (w[6] >> 4) & ((1 << 20) - 1);
    p[11] = (w[6] << 16) & ((1 << 20) - 1);
    p[11] |= (w[7] >> 16);
    p[12] = (w[7] << 4) & ((1 << 20) - 1);
    p[12] |= (w[8] >> 28);
    p[13] = (w[8] >> 8) & ((1 << 20) - 1);
    p[14] = (w[8] << 12) & ((1 << 20) - 1);
    p[14] |= (w[9] >> 20);
    p[15] = (w[9]) & ((1 << 20) - 1);
    p[16] = (w[10] >> 12);
    p[17] = (w[10] << 8) & ((1 << 20) - 1);
    p[17] |= (w[11] >> 24);
    p[18] = (w[11] >> 4) & ((1 << 20) - 1);
    p[19] = (w[11] << 16) & ((1 << 20) - 1);
    p[19] |= (w[12] >> 16);
    p[20] = (w[12] << 4) & ((1 << 20) - 1);
    p[20] |= (w[13] >> 28);
    p[21] = (w[13] >> 8) & ((1 << 20) - 1);
    p[22] = (w[13] << 12) & ((1 << 20) - 1);
    p[22] |= (w[14] >> 20);
    p[23] = (w[14]) & ((1 << 20) - 1);
    p[24] = (w[15] >> 12);
    p[25] = (w[15] << 8) & ((1 << 20) - 1);
    p[25] |= (w[16] >> 24);
    p[26] = (w[16] >> 4) & ((1 << 20) - 1);
    p[27] = (w[16] << 16) & ((1 << 20) - 1);
    p[27] |= (w[17] >> 16);
    p[28] = (w[17] << 4) & ((1 << 20) - 1);
    p[28] |= (w[18] >> 28);
    p[29] = (w[18] >> 8) & ((1 << 20) - 1);
    p[30] = (w[18] << 12) & ((1 << 20) - 1);
    p[30] |= (w[19] >> 20);
    p[31] = (w[19]) & ((1 << 20) - 1);
  }
}
```