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

```asm
<HSBtoRGB>:
  endbr64
  movslq %edx,%rax
  mov    %rcx,%r8
  test   %esi,%esi
  je     L56
  mov    $0xff,%edx
  movslq %edi,%rcx
  mov    %edi,%r9d
  sub    %esi,%edx
  sar    $0x1f,%r9d
  mov    %edx,%esi
  imul   $0xffffffffb60b60b7,%rcx,%rdx
  imul   %eax,%esi
  shr    $0x20,%rdx
  add    %edi,%edx
  sar    $0x8,%esi
  sar    $0x8,%edx
  sub    %r9d,%edx
  mov    %edi,%r9d
  imul   $0x168,%edx,%edx
  sub    %edx,%r9d
  movslq %r9d,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %r9d,%edx
  sar    $0x1f,%r9d
  sar    $0x5,%edx
  sub    %r9d,%edx
  cmp    $0x5,%edx
  ja     1040 <HSBtoRGB.cold>
  lea    D7(%rip),%r9
  movslq (%r9,%rdx,4),%rdx
  add    %r9,%rdx
  notrack jmp *%rdx
  nop
  imul   $0xffffffff88888889,%rcx,%rdx
  mov    %edi,%ecx
  mov    %eax,%r9d
  sar    $0x1f,%ecx
  sub    %esi,%r9d
  shr    $0x20,%rdx
  add    %edi,%edx
  sar    $0x5,%edx
  sub    %ecx,%edx
  imul   $0x3c,%edx,%edx
  sub    %edx,%edi
  movslq %esi,%rdx
  imul   %r9d,%edi
  movslq %edi,%r9
  imul   $0xffffffff88888889,%r9,%r9
  shr    $0x20,%r9
  add    %edi,%r9d
  sar    $0x1f,%edi
  sar    $0x5,%r9d
  sub    %edi,%r9d
  add    %esi,%r9d
  movslq %r9d,%r9
  nopw   0x0(%rax,%rax,1)
L40:
  mov    %r9,(%r8)
  mov    %rdx,0x8(%r8)
  mov    %rax,0x10(%r8)
L56:
  ret
  nopl   0x0(%rax)
  imul   $0xffffffff88888889,%rcx,%rcx
  mov    %edi,%r10d
  movslq %eax,%r9
  sub    %esi,%eax
  sar    $0x1f,%r10d
  movslq %esi,%rdx
  shr    $0x20,%rcx
  add    %edi,%ecx
  sar    $0x5,%ecx
  sub    %r10d,%ecx
  imul   $0x3c,%ecx,%ecx
  sub    %edi,%ecx
  add    $0x3c,%ecx
  imul   %eax,%ecx
  movslq %ecx,%rax
  imul   $0xffffffff88888889,%rax,%rax
  shr    $0x20,%rax
  add    %ecx,%eax
  sar    $0x1f,%ecx
  sar    $0x5,%eax
  sub    %ecx,%eax
  add    %esi,%eax
  cltq
  jmp    L40
  nopl   0x0(%rax,%rax,1)
  movslq %eax,%r9
  sub    %esi,%eax
  imul   %edi,%eax
  movslq %eax,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %eax,%edx
  sar    $0x1f,%eax
  sar    $0x5,%edx
  sub    %eax,%edx
  movslq %esi,%rax
  add    %esi,%edx
  movslq %edx,%rdx
  jmp    L40
  nopl   (%rax)
  imul   $0xffffffff88888889,%rcx,%rdx
  mov    %edi,%ecx
  sar    $0x1f,%ecx
  shr    $0x20,%rdx
  add    %edi,%edx
  sar    $0x5,%edx
  sub    %ecx,%edx
  mov    %eax,%ecx
  imul   $0x3c,%edx,%edx
  sub    %esi,%ecx
  sub    %edi,%edx
  add    $0x3c,%edx
  imul   %ecx,%edx
  movslq %edx,%r9
  imul   $0xffffffff88888889,%r9,%r9
  shr    $0x20,%r9
  add    %edx,%r9d
  sar    $0x1f,%edx
  sar    $0x5,%r9d
  sub    %edx,%r9d
  movslq %eax,%rdx
  movslq %esi,%rax
  add    %esi,%r9d
  movslq %r9d,%r9
  jmp    L40
  nopw   0x0(%rax,%rax,1)
  movslq %eax,%rdx
  sub    %esi,%eax
  movslq %esi,%r9
  mov    %eax,%r10d
  imul   $0xffffffff88888889,%rcx,%rax
  mov    %edi,%ecx
  sar    $0x1f,%ecx
  shr    $0x20,%rax
  add    %edi,%eax
  sar    $0x5,%eax
  sub    %ecx,%eax
  imul   $0x3c,%eax,%eax
  sub    %eax,%edi
  imul   %r10d,%edi
  movslq %edi,%rax
  imul   $0xffffffff88888889,%rax,%rax
  shr    $0x20,%rax
  add    %edi,%eax
  sar    $0x1f,%edi
  sar    $0x5,%eax
  sub    %edi,%eax
  add    %esi,%eax
  cltq
  jmp    L40
  nopl   0x0(%rax)
  imul   $0xffffffff88888889,%rcx,%rdx
  mov    %edi,%ecx
  movslq %esi,%r9
  sar    $0x1f,%ecx
  shr    $0x20,%rdx
  add    %edi,%edx
  sar    $0x5,%edx
  sub    %ecx,%edx
  imul   $0x3c,%edx,%edx
  sub    %edi,%edx
  lea    0x3c(%rdx),%ecx
  mov    %eax,%edx
  sub    %esi,%edx
  imul   %edx,%ecx
  movslq %ecx,%rdx
  imul   $0xffffffff88888889,%rdx,%rdx
  shr    $0x20,%rdx
  add    %ecx,%edx
  sar    $0x1f,%ecx
  sar    $0x5,%edx
  sub    %ecx,%edx
  add    %esi,%edx
  movslq %edx,%rdx
  jmp    L40
```

assistant: ```c
void HSBtoRGB(int32_t hue, int32_t sat, int32_t val, uint8_t out[]) {
  int r = 0, g = 0, b = 0;
  int base;
  if (sat == 0) {
    r = g = b = val;
  } else {
    base = ((255 - sat) * val) >> 8;
    switch ((hue % 360) / 60) {
    case 0:
      r = val;
      g = (((val - base) * hue) / 60) + base;
      b = base;
      break;
    case 1:
      r = (((val - base) * (60 - (hue % 60))) / 60) + base;
      g = val;
      b = base;
      break;
    case 2:
      r = base;
      g = val;
      b = (((val - base) * (hue % 60)) / 60) + base;
      break;
    case 3:
      r = base;
      g = (((val - base) * (60 - (hue % 60))) / 60) + base;
      b = val;
      break;
    case 4:
      r = (((val - base) * (hue % 60)) / 60) + base;
      g = base;
      b = val;
      break;
    case 5:
      r = val;
      g = base;
      b = (((val - base) * (60 - (hue % 60))) / 60) + base;
      break;
    }
    out[0] = (uint8_t)r;
    out[1] = (uint8_t)g;
    out[2] = (uint8_t)b;
  }
}
```