user: 请从给定的汇编指令推导出C源代码：

```asm
<us2si>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  cmp    $0x3,%ecx
  je     L28
  jg     L26
  cmp    $0x1,%ecx
  je     L50
  cmp    $0x2,%ecx
  jne    L171
  test   %edx,%edx
  jle    L171
  mov    D10(%rip),%rcx
  movslq %edx,%rax
  lea    (%rsi,%rax,4),%rax
  cmp    %rcx,%rax
  lea    0x4(%rcx),%rdx
  setbe  %al
  cmp    %rdx,%rsi
  setae  %dl
  or     %dl,%al
  je     L178
  lea    -0x1(%r12),%eax
  cmp    $0x2,%eax
  jbe    L178
  movd   (%rcx),%xmm7
  mov    %r12d,%edx
  xor    %eax,%eax
  shr    $0x2,%edx
  pshufd $0x0,%xmm7,%xmm1
  shl    $0x4,%rdx
  nopl   (%rax)
L42:
  movdqu (%rbx,%rax,2),%xmm0
  movdqu 0x10(%rbx,%rax,2),%xmm4
  shufps $0x88,%xmm4,%xmm0
  paddd  %xmm1,%xmm0
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L42
  mov    %r12d,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%r12b
  je     L171
  mov    %eax,%edx
  mov    (%rcx),%esi
  add    (%rbx,%rdx,8),%esi
  lea    0x0(,%rdx,8),%r8
  lea    0x0(,%rdx,4),%rdi
  mov    %esi,0x0(%rbp,%rdx,4)
  lea    0x1(%rax),%edx
  cmp    %edx,%r12d
  jle    L171
  mov    (%rcx),%edx
  add    $0x2,%eax
  add    0x8(%rbx,%r8,1),%edx
  mov    %edx,0x4(%rbp,%rdi,1)
  cmp    %eax,%r12d
  jg     L277
L171:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
L26:
  cmp    $0x4,%ecx
  jne    L171
  test   %edx,%edx
  jle    L171
  mov    D30(%rip),%rax
  mov    (%rax),%rcx
  lea    -0x1(%rdx),%eax
  cmp    $0x2,%eax
  jbe    L128
  movd   %ecx,%xmm5
  shr    $0x2,%edx
  xor    %eax,%eax
  pshufd $0x0,%xmm5,%xmm1
  shl    $0x4,%rdx
  nopl   0x0(%rax)
L146:
  movdqu (%rbx,%rax,2),%xmm0
  movdqu 0x10(%rbx,%rax,2),%xmm2
  shufps $0x88,%xmm2,%xmm0
  paddd  %xmm1,%xmm0
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L146
  mov    %r12d,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%r12b
  je     L171
L30:
  movslq %eax,%rdx
  mov    (%rbx,%rdx,8),%r8d
  lea    0x0(,%rdx,8),%rdi
  lea    0x0(,%rdx,4),%rsi
  add    %ecx,%r8d
  mov    %r8d,0x0(%rbp,%rdx,4)
  lea    0x1(%rax),%edx
  cmp    %edx,%r12d
  jle    L171
  mov    0x8(%rbx,%rdi,1),%edx
  add    $0x2,%eax
  add    %ecx,%edx
  mov    %edx,0x4(%rbp,%rsi,1)
  cmp    %eax,%r12d
  jle    L171
  add    0x10(%rbx,%rdi,1),%ecx
  mov    %ecx,0x8(%rbp,%rsi,1)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L50:
  test   %edx,%edx
  jle    L171
  mov    D25(%rip),%rcx
  movslq %edx,%rax
  lea    (%rsi,%rax,4),%rax
  cmp    %rcx,%rax
  lea    0x4(%rcx),%rdx
  setbe  %al
  cmp    %rdx,%rsi
  setae  %dl
  or     %dl,%al
  je     L313
  lea    -0x1(%r12),%eax
  cmp    $0x2,%eax
  jbe    L313
  movd   (%rcx),%xmm6
  mov    %r12d,%edx
  xor    %eax,%eax
  shr    $0x2,%edx
  pshufd $0x0,%xmm6,%xmm1
  shl    $0x4,%rdx
  nopl   0x0(%rax)
L304:
  movdqu (%rbx,%rax,2),%xmm0
  movdqu 0x10(%rbx,%rax,2),%xmm3
  shufps $0x88,%xmm3,%xmm0
  paddd  %xmm1,%xmm0
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rdx
  jne    L304
  mov    %r12d,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%r12b
  je     L171
  mov    %eax,%edx
  mov    (%rcx),%esi
  add    (%rbx,%rdx,8),%esi
  lea    0x0(,%rdx,8),%r8
  lea    0x0(,%rdx,4),%rdi
  mov    %esi,0x0(%rbp,%rdx,4)
  lea    0x1(%rax),%edx
  cmp    %r12d,%edx
  jge    L171
  mov    (%rcx),%edx
  add    $0x2,%eax
  add    0x8(%rbx,%r8,1),%edx
  mov    %edx,0x4(%rbp,%rdi,1)
  cmp    %r12d,%eax
  jge    L171
L277:
  mov    (%rcx),%eax
  add    0x10(%rbx,%r8,1),%eax
  mov    %eax,0x8(%rbp,%rdi,1)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L28:
  test   %edx,%edx
  jle    L171
  mov    D30(%rip),%r14
  xor    %r13d,%r13d
  nopw   0x0(%rax,%rax,1)
L35:
  mov    %r13d,%esi
  mov    (%r14),%r15
  mov    %rbx,%rdi
  call   <load24bit@plt>
  mov    %r13d,%esi
  mov    %rbp,%rdi
  add    $0x1,%r13d
  lea    (%rax,%r15,1),%edx
  call   <store24bit@plt>
  cmp    %r13d,%r12d
  jne    L35
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L313:
  mov    %r12d,%r12d
  xor    %eax,%eax
  nopl   (%rax)
L187:
  mov    (%rcx),%edx
  add    (%rbx,%rax,8),%edx
  mov    %edx,0x0(%rbp,%rax,4)
  add    $0x1,%rax
  cmp    %rax,%r12
  jne    L187
  jmp    L171
  nopw   0x0(%rax,%rax,1)
L178:
  mov    %r12d,%r12d
  xor    %eax,%eax
  nopl   (%rax)
L261:
  mov    (%rcx),%edx
  add    (%rbx,%rax,8),%edx
  mov    %edx,0x0(%rbp,%rax,4)
  add    $0x1,%rax
  cmp    %r12,%rax
  jne    L261
  jmp    L171
L128:
  xor    %eax,%eax
  jmp    L30
```

assistant: ```c
void us2si(void *in, void *out, int len, int bps) {
  register int i;
  switch (bps) {
  case (1):
    for (i = 0; i < len; i++)
      ((int8_t *)out)[i] = (int8_t)(SCHAR_MIN + ((int)((uint8_t *)in)[i]));
    break;
  case (2):
    for (i = 0; i < len; i++)
      ((int16_t *)out)[i] = (int16_t)(SHRT_MIN + ((int)((uint16_t *)in)[i]));
    break;
  case (3):
    for (i = 0; i < len; i++)
      store24bit(out, i, (int32_t)(INT_MIN + (uint32_t)load24bit(in, i)));
    break;
  case (4):
    for (i = 0; i < len; i++)
      ((int32_t *)out)[i] = (int32_t)(INT_MIN + ((uint32_t *)in)[i]);
    break;
  }
}
```