user: What is the c source code of the assembly code below:

```asm
<__int32_t_decode_little_endian_array>:
  endbr64
  lea    0x0(,%r8,4),%r11d
  cmp    %edx,%r11d
  jg     L6
  test   %r8d,%r8d
  jle    L9
  lea    -0x1(%r8),%eax
  mov    %rcx,%r10
  cmp    $0x2,%eax
  jbe    L3
  mov    %r8d,%edx
  movslq %esi,%rax
  shr    $0x2,%edx
  lea    (%rdi,%rax,8),%rax
  lea    -0x1(%rdx),%r9d
  lea    0x80(%rax),%rdx
  shl    $0x7,%r9
  add    %rdx,%r9
  jmp    L89
  nop
L23:
  sub    $0xffffffffffffff80,%rdx
L89:
  movdqu 0x20(%rax),%xmm9
  movdqu 0x30(%rax),%xmm2
  add    $0x10,%rcx
  movdqu (%rax),%xmm1
  movdqu 0x10(%rax),%xmm6
  movdqa %xmm9,%xmm7
  movdqu 0x50(%rax),%xmm4
  movdqu 0x60(%rax),%xmm8
  punpckhqdq %xmm2,%xmm9
  punpcklqdq %xmm2,%xmm7
  movdqu 0x40(%rax),%xmm2
  movdqu 0x70(%rax),%xmm0
  movdqa %xmm1,%xmm3
  punpcklqdq %xmm6,%xmm3
  punpckhqdq %xmm6,%xmm1
  movdqa %xmm8,%xmm6
  mov    %rdx,%rax
  movdqa %xmm2,%xmm5
  punpckhqdq %xmm4,%xmm2
  punpcklqdq %xmm0,%xmm6
  punpcklqdq %xmm4,%xmm5
  punpckhqdq %xmm0,%xmm8
  movdqa %xmm2,%xmm4
  movdqa %xmm1,%xmm0
  punpckhqdq %xmm8,%xmm4
  movdqa %xmm5,%xmm10
  punpckhqdq %xmm9,%xmm0
  punpckhqdq %xmm6,%xmm10
  punpcklqdq %xmm9,%xmm1
  shufps $0x88,%xmm4,%xmm0
  movdqa %xmm3,%xmm4
  punpcklqdq %xmm6,%xmm5
  punpcklqdq %xmm7,%xmm3
  punpckhqdq %xmm7,%xmm4
  pslld  $0x18,%xmm0
  punpcklqdq %xmm8,%xmm2
  shufps $0x88,%xmm5,%xmm3
  shufps $0x88,%xmm10,%xmm4
  pslld  $0x10,%xmm4
  shufps $0x88,%xmm2,%xmm1
  pslld  $0x8,%xmm1
  paddd  %xmm4,%xmm0
  paddd  %xmm1,%xmm0
  paddd  %xmm3,%xmm0
  movups %xmm0,-0x10(%rcx)
  cmp    %r9,%rdx
  jne    L23
  mov    %r8d,%ecx
  and    $0xfffffffc,%ecx
  lea    (%rsi,%rcx,4),%esi
  cmp    %r8d,%ecx
  je     L9
L68:
  movslq %esi,%rsi
  push   %rbx
  movslq %ecx,%rbx
  add    $0x3,%rsi
  lea    0x0(,%rbx,4),%r9
  lea    0x0(,%rsi,8),%rax
  mov    (%rdi,%rsi,8),%rsi
  mov    -0x8(%rdi,%rax,1),%edx
  shl    $0x18,%esi
  shl    $0x10,%edx
  add    %esi,%edx
  mov    -0x10(%rdi,%rax,1),%esi
  shl    $0x8,%esi
  add    %esi,%edx
  add    -0x18(%rdi,%rax,1),%edx
  mov    %edx,(%r10,%rbx,4)
  lea    0x1(%rcx),%edx
  cmp    %edx,%r8d
  jle    L38
  mov    0x20(%rdi,%rax,1),%edx
  mov    0x18(%rdi,%rax,1),%esi
  add    $0x2,%ecx
  shl    $0x10,%esi
  shl    $0x18,%edx
  add    %esi,%edx
  mov    0x10(%rdi,%rax,1),%esi
  shl    $0x8,%esi
  add    %esi,%edx
  add    0x8(%rdi,%rax,1),%edx
  mov    %edx,0x4(%r10,%r9,1)
  cmp    %ecx,%r8d
  jle    L38
  mov    0x38(%rdi,%rax,1),%edx
  mov    0x40(%rdi,%rax,1),%ecx
  shl    $0x10,%edx
  shl    $0x18,%ecx
  add    %ecx,%edx
  mov    0x30(%rdi,%rax,1),%ecx
  shl    $0x8,%ecx
  add    %ecx,%edx
  add    0x28(%rdi,%rax,1),%edx
  mov    %edx,0x8(%r10,%r9,1)
L38:
  mov    %r11d,%eax
  pop    %rbx
  ret
L6:
  mov    $0xffffffff,%r11d
L9:
  mov    %r11d,%eax
  ret
L3:
  xor    %ecx,%ecx
  jmp    L68
```

assistant: ```c
int __int32_t_decode_little_endian_array(const void *_buf, uint32_t offset, uint32_t maxlen, int32_t *p, uint32_t elements) {
  uint32_t total_size = (4) * elements;
  uint8_t *buf = (uint8_t *)_buf;
  uint32_t pos = offset;
  uint32_t element;
  if (maxlen < total_size)
    return -1;
  for (element = 0; element < elements; ++element) {
    p[element] = (((uint32_t)buf[pos + 3]) << 24) + (((uint32_t)buf[pos + 2]) << 16) + (((uint32_t)buf[pos + 1]) << 8) + ((uint32_t)buf[pos + 0]);
    pos += 4;
  }
  return total_size;
}
```