user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<my_qs>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %esi,%r15d
  lea    0x1(%rdx),%esi
  cmp    %ecx,%esi
  jge    L95
  mov    %rdi,%rbp
  mov    %edx,%r13d
  mov    %ecx,%r14d
  mov    %r8,%rbx
  lea    0x2(%rdx),%eax
  cmp    %ecx,%eax
  je     L142
  lea    0x3(%rdx),%eax
  cmp    %ecx,%eax
  jne    L2
  movslq %edx,%rax
  shl    $0x2,%rax
  lea    (%r8,%rax,1),%rcx
  mov    (%rcx),%edx
  movslq %edx,%rdi
  movsd  0x0(%rbp,%rdi,8),%xmm2
  lea    0x4(%r8,%rax,1),%r8
  mov    (%r8),%r9d
  movslq %r9d,%rdi
  movsd  0x0(%rbp,%rdi,8),%xmm0
  lea    0x8(%rbx,%rax,1),%rax
  mov    (%rax),%edi
  movslq %edi,%r10
  movsd  0x0(%rbp,%r10,8),%xmm1
  comisd %xmm0,%xmm2
  ja     L221
  comisd %xmm1,%xmm2
  jbe    L53
L221:
  comisd %xmm0,%xmm1
  jbe    L178
  mov    %r9d,(%rcx)
  mov    %edx,(%r8)
  mov    %rbx,%rdx
  mov    %rbp,%rdi
  call   <my_qs_2@plt>
  jmp    L95
L142:
  mov    %r8,%rdx
  mov    %r13d,%esi
  call   <my_qs_2@plt>
  jmp    L95
L178:
  mov    %edi,(%rcx)
  mov    %edx,(%rax)
  mov    %rbx,%rdx
  mov    %rbp,%rdi
  call   <my_qs_2@plt>
  jmp    L95
L53:
  mov    %rbx,%rdx
  mov    %rbp,%rdi
  call   <my_qs_2@plt>
  jmp    L95
L2:
  mov    %ecx,%edi
  sub    %edx,%edi
  call   <int_random@plt>
  add    %r13d,%eax
  cltq
  movslq (%rbx,%rax,4),%rax
  movsd  0x0(%rbp,%rax,8),%xmm0
  mov    %r14d,%r12d
  mov    %r13d,%edi
  mov    %r13d,%ecx
  cmp    %r14d,%r13d
  jl     L327
L294:
  mov    %rbx,%r8
  mov    %r13d,%edx
  mov    %r15d,%esi
  mov    %rbp,%rdi
  call   <my_qs>
  mov    %rbx,%r8
  mov    %r14d,%ecx
  mov    %r12d,%edx
  mov    %r15d,%esi
  mov    %rbp,%rdi
  call   <my_qs>
L95:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L11:
  add    $0x1,%ecx
  add    $0x1,%rdx
  add    $0x4,%rsi
  cmp    %edx,%r12d
  jle    L231
L346:
  mov    %edx,%eax
  mov    (%rbx,%rdx,4),%edi
  movslq %edi,%r8
  comisd 0x0(%rbp,%r8,8),%xmm0
  jbe    L318
  cmp    %edx,%ecx
  jge    L11
  mov    (%rsi),%eax
  mov    %edi,(%rsi)
  mov    %eax,(%rbx,%rdx,4)
  jmp    L11
L318:
  cmp    %eax,%r12d
  jle    L231
  movslq %ecx,%rdx
  lea    (%rbx,%rdx,4),%r8
  cltq
  jmp    L73
L266:
  add    $0x1,%rax
  cmp    %eax,%r12d
  jle    L231
L73:
  mov    %eax,%edi
  mov    (%rbx,%rax,4),%esi
  movslq %esi,%rdx
  ucomisd 0x0(%rbp,%rdx,8),%xmm0
  jp     L263
  jne    L263
  cmp    %eax,%ecx
  jge    L266
  mov    (%r8),%edx
  mov    %esi,(%r8)
  mov    %edx,(%rbx,%rax,4)
  jmp    L266
L263:
  cmp    %edi,%r12d
  jle    L231
L327:
  movslq %edi,%rdx
  lea    (%rbx,%rdx,4),%rsi
  mov    (%rsi),%r8d
  movslq %r8d,%rax
  comisd 0x0(%rbp,%rax,8),%xmm0
  jb     L278
  cmp    %edi,%r12d
  jle    L231
  movslq %ecx,%rax
  lea    (%rbx,%rax,4),%rsi
  jmp    L346
L278:
  cmp    %edi,%r12d
  jle    L170
  movslq %r12d,%rax
  lea    (%rbx,%rax,4),%rax
L166:
  movslq -0x4(%rax),%rdx
  movsd  0x0(%rbp,%rdx,8),%xmm1
  comisd %xmm0,%xmm1
  jbe    L59
  sub    $0x1,%r12d
  sub    $0x4,%rax
  cmp    %edi,%r12d
  jne    L166
L281:
  mov    %edi,%r12d
  jmp    L294
L59:
  cmp    %r12d,%edi
  jge    L294
  movslq %r12d,%rax
  shl    $0x2,%rax
  lea    -0x4(%rbx,%rax,1),%r9
  mov    (%r9),%r10d
  movslq %r10d,%rdx
  ucomisd 0x0(%rbp,%rdx,8),%xmm0
  jp     L427
  jne    L427
  mov    %r10d,(%rsi)
  mov    %r8d,(%r9)
  add    $0x1,%edi
  cmp    %r12d,%edi
  jge    L294
  sub    $0x1,%r12d
L55:
  cmp    %edi,%r12d
  jg     L327
  jmp    L294
L427:
  cmp    %edi,%ecx
  je     L188
  lea    -0x4(%rbx,%rax,1),%rax
  mov    (%rax),%edx
  mov    %edx,(%rsi)
  mov    %r8d,(%rax)
  movslq %ecx,%rax
  lea    (%rbx,%rax,4),%rax
  mov    (%rax),%edx
  mov    (%rsi),%r8d
  mov    %r8d,(%rax)
  mov    %edx,(%rsi)
  add    $0x1,%ecx
  add    $0x1,%edi
  cmp    %r12d,%edi
  jge    L294
  sub    $0x1,%r12d
  jmp    L55
L188:
  movslq %ecx,%rdx
  lea    (%rbx,%rdx,4),%rdx
  mov    (%rdx),%esi
  lea    -0x4(%rbx,%rax,1),%rax
  mov    (%rax),%r8d
  mov    %r8d,(%rdx)
  mov    %esi,(%rax)
  add    $0x1,%ecx
  add    $0x1,%edi
  cmp    %r12d,%edi
  jge    L294
  sub    $0x1,%r12d
  jmp    L55
L170:
  mov    %r12d,%edi
  jmp    L281
L231:
  mov    %r12d,%edi
  jmp    L281
```

assistant: ```c
void my_qs(double *farr, int size, int start, int end, int *indices) {
  if (end <= start + 1) {
  } else if (end == start + 2) {
    my_qs_2(farr, start, indices);
  } else if (end == start + 3) {
    double x0 = farr[indices[start + 0]];
    double x1 = farr[indices[start + 1]];
    double x2 = farr[indices[start + 2]];
    if (x0 > x1 || x0 > x2) {
      if (x1 < x2) {
        {
          int temp = indices[start];
          indices[start] = indices[start + 1];
          indices[start + 1] = temp;
        };
        my_qs_2(farr, start + 1, indices);
      } else {
        {
          int temp = indices[start];
          indices[start] = indices[start + 2];
          indices[start + 2] = temp;
        };
        my_qs_2(farr, start + 1, indices);
      }
    } else
      my_qs_2(farr, start + 1, indices);
  } else {
    int pivot_index = start + int_random(end - start);
    double pivot_value = farr[indices[pivot_index]];
    int i = start;
    int j = start;
    int k = end;
    while (j < k) {
      while (j < k && farr[indices[j]] <= pivot_value) {
        while (j < k && farr[indices[j]] < pivot_value) {
          if (i < j) {
            int temp = indices[i];
            indices[i] = indices[j];
            indices[j] = temp;
          };
          i += 1;
          j += 1;
        }
        while (j < k && farr[indices[j]] == pivot_value) {
          if (i < j) {
            int temp = indices[i];
            indices[i] = indices[j];
            indices[j] = temp;
          };
          j += 1;
        }
      }
      while (j < k && farr[indices[k - 1]] > pivot_value)
        k -= 1;
      if (j < k && farr[indices[k - 1]] == pivot_value) {
        {
          int temp = indices[j];
          indices[j] = indices[k - 1];
          indices[k - 1] = temp;
        };
        j += 1;
        if (j < k)
          k -= 1;
      } else if (j < k) {
        if (i == j) {
          {
            int temp = indices[i];
            indices[i] = indices[k - 1];
            indices[k - 1] = temp;
          };
          i += 1;
          j += 1;
          if (j < k)
            k -= 1;
        } else {
          {
            int temp = indices[j];
            indices[j] = indices[k - 1];
            indices[k - 1] = temp;
          };
          {
            int temp = indices[i];
            indices[i] = indices[j];
            indices[j] = temp;
          };
          i += 1;
          j += 1;
          if (j < k)
            k -= 1;
        }
      }
    }
    my_qs(farr, size, start, i, indices);
    my_qs(farr, size, k, end, indices);
  }
}
```