user: Demonstrate the C code that generates the assembly output below:

```asm
<bm_get_hsl>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <assert@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <assert@plt>
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <assert@plt>
  lea    -0xc(%rbp),%rcx
  lea    -0xd(%rbp),%rdx
  lea    -0xe(%rbp),%rsi
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <bm_get_rgb@plt>
  movzbl -0xc(%rbp),%edx
  movzbl -0xd(%rbp),%eax
  cmp    %al,%dl
  cmovb  %eax,%edx
  movzbl -0xe(%rbp),%eax
  cmp    %al,%dl
  cmovae %edx,%eax
  mov    %al,-0xb(%rbp)
  movzbl -0xc(%rbp),%edx
  movzbl -0xd(%rbp),%eax
  cmp    %al,%dl
  cmova  %eax,%edx
  movzbl -0xe(%rbp),%eax
  cmp    %al,%dl
  cmovbe %edx,%eax
  mov    %al,-0xa(%rbp)
  movzbl -0xb(%rbp),%eax
  sub    -0xa(%rbp),%al
  mov    %al,-0x9(%rbp)
  cmpb   $0x0,-0x9(%rbp)
  jne    L61
  mov    -0x20(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L20
L61:
  movzbl -0xe(%rbp),%eax
  cmp    %al,-0xb(%rbp)
  jne    L47
  movzbl -0xd(%rbp),%eax
  movzbl %al,%eax
  movzbl -0xc(%rbp),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movzbl -0x9(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  mov    $0x6,%edi
  movq   %rax,%xmm0
  call   <fmod@plt>
  movq   %xmm0,%rax
  mov    -0x20(%rbp),%rdx
  mov    %rax,(%rdx)
  jmp    L20
L47:
  movzbl -0xd(%rbp),%eax
  cmp    %al,-0xb(%rbp)
  jne    L79
  movzbl -0xc(%rbp),%eax
  movzbl %al,%eax
  movzbl -0xe(%rbp),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movzbl -0x9(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D20(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L20
L79:
  movzbl -0xc(%rbp),%eax
  cmp    %al,-0xb(%rbp)
  jne    L20
  movzbl -0xe(%rbp),%eax
  movzbl %al,%eax
  movzbl -0xd(%rbp),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movzbl -0x9(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D92(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movsd  %xmm0,(%rax)
L20:
  mov    -0x20(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D30(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  mov    $0x168,%edi
  movq   %rax,%xmm0
  call   <fmod@plt>
  movq   %xmm0,%rax
  mov    -0x20(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  movsd  (%rax),%xmm1
  pxor   %xmm0,%xmm0
  comisd %xmm1,%xmm0
  jbe    L15
  mov    -0x20(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D79(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x20(%rbp),%rax
  movsd  %xmm0,(%rax)
L15:
  movzbl -0xb(%rbp),%edx
  movzbl -0xa(%rbp),%eax
  add    %edx,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  D4(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D112(%rip),%xmm1
  divsd  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movsd  %xmm0,(%rax)
  cmpb   $0x0,-0x9(%rbp)
  jne    L12
  mov    -0x28(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L42
L12:
  movzbl -0x9(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mov    -0x30(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm0
  movsd  D46(%rip),%xmm2
  subsd  %xmm2,%xmm0
  movq   D102(%rip),%xmm2
  movapd %xmm0,%xmm3
  andpd  %xmm2,%xmm3
  movsd  D46(%rip),%xmm0
  movapd %xmm0,%xmm2
  subsd  %xmm3,%xmm2
  divsd  %xmm2,%xmm1
  movapd %xmm1,%xmm0
  movsd  D112(%rip),%xmm1
  divsd  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movsd  %xmm0,(%rax)
L42:
  mov    -0x30(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D78(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D78(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movsd  %xmm0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L84
  call   <__stack_chk_fail@plt>
L84:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D20
datatype: f64
name: retrieve_data
arguments: label: D92
datatype: f64
name: retrieve_data
arguments: label: D30
datatype: f64
name: retrieve_data
arguments: label: D79
datatype: f64
name: retrieve_data
arguments: label: D4
datatype: f64
name: retrieve_data
arguments: label: D112
datatype: f64
name: retrieve_data
arguments: label: D46
datatype: f64
name: retrieve_data
arguments: label: D102
datatype: qword
name: retrieve_data
arguments: label: D78
datatype: byte[8]

tool: D20: 2

tool: D92: 4

tool: D30: 60

tool: D79: 360

tool: D4: 0.5

tool: D112: 255

tool: D46: 1

tool: D102: 9223372036854775807

tool: {"D78": [0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x40]}

assistant: ```c
void bm_get_hsl(unsigned int col, double *H, double *S, double *L) {
  unsigned char R, G, B, M, m, C;
  assert(H);
  assert(S);
  assert(L);
  bm_get_rgb(col, &R, &G, &B);
  M = (((R) > ((((G) > (B)) ? (G) : (B)))) ? (R) : ((((G) > (B)) ? (G) : (B))));
  m = (((R) < ((((G) < (B)) ? (G) : (B)))) ? (R) : ((((G) < (B)) ? (G) : (B))));
  C = M - m;
  if (C == 0) {
    *H = 0;
  } else if (M == R) {
    *H = fmod((double)(G - B) / C, 6);
  } else if (M == G) {
    *H = (double)(B - R) / C + 2.0;
  } else if (M == B) {
    *H = (double)(R - G) / C + 4.0;
  }
  *H = fmod(*H * 60.0, 360);
  if (*H < 0)
    *H = 360.0 + *H;
  *L = 0.5 * (M + m) / 255.0;
  if (C == 0) {
    *S = 0;
  } else {
    *S = (double)C / (1.0 - fabs(2.0 * *L - 1.0)) / 255.0;
  }
  *L *= 100;
  *S *= 100;
}
```