user: Translate the below assembly code into C programming language:

```asm
<fosphor_gl_cmap_histogram>:
  endbr64
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  push   %rbx
  mov    %esi,%ebx
  sar    $0x4,%ebx
  sub    $0x10,%rsp
  test   %ebx,%ebx
  jle    L10
  lea    -0x1(%rsi),%eax
  pxor   %xmm5,%xmm5
  mov    %rdi,%r14
  xor    %ebp,%ebp
  cvtsi2ss %eax,%xmm5
  movss  %xmm5,0xc(%rsp)
  nopl   (%rax)
L25:
  pxor   %xmm2,%xmm2
  movss  D70(%rip),%xmm1
  movss  D31(%rip),%xmm0
  mov    %r14,%rdi
  cvtsi2ss %ebp,%xmm2
  divss  0xc(%rsp),%xmm2
  add    $0x1,%ebp
  add    $0x4,%r14
  mulss  D95(%rip),%xmm2
  addss  D69(%rip),%xmm2
  call   <_set_rgba_from_hsv@plt>
  cmp    %ebp,%ebx
  jne    L25
L10:
  cmp    %ebx,%r12d
  jle    L4
  lea    -0x1(%r12),%eax
  pxor   %xmm6,%xmm6
  cvtsi2ss %eax,%xmm6
  movslq %ebx,%rax
  lea    0x0(%r13,%rax,4),%rbp
  movss  %xmm6,0xc(%rsp)
  jmp    L3
  nop
L24:
  movaps %xmm0,%xmm3
  movss  D149(%rip),%xmm1
  mulss  D134(%rip),%xmm0
  subss  %xmm4,%xmm3
  movss  D134(%rip),%xmm4
  mulss  D126(%rip),%xmm3
  subss  %xmm0,%xmm4
  subss  %xmm3,%xmm1
  movaps %xmm4,%xmm0
L23:
  mov    %rbp,%rdi
  add    $0x1,%ebx
  add    $0x4,%rbp
  call   <_set_rgba_from_hsv@plt>
  cmp    %ebx,%r12d
  je     L4
L3:
  movss  D114(%rip),%xmm7
  pxor   %xmm0,%xmm0
  movss  D149(%rip),%xmm2
  cvtsi2ss %ebx,%xmm0
  divss  0xc(%rsp),%xmm0
  comiss %xmm0,%xmm7
  jbe    L0
  movss  D113(%rip),%xmm2
  addss  %xmm0,%xmm2
L0:
  movss  D45(%rip),%xmm4
  comiss %xmm0,%xmm4
  jbe    L24
  mulss  D134(%rip),%xmm0
  movss  D134(%rip),%xmm3
  movss  D149(%rip),%xmm1
  subss  %xmm0,%xmm3
  movaps %xmm3,%xmm0
  jmp    L23
  nopw   0x0(%rax,%rax,1)
L4:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: parse_data
arguments: data_label: D70
type_guessed: byte[4]
name: parse_data
arguments: data_label: D31
type_guessed: byte[4]
name: parse_data
arguments: data_label: D95
type_guessed: byte[4]
name: parse_data
arguments: data_label: D69
type_guessed: byte[4]
name: parse_data
arguments: data_label: D149
type_guessed: f32
name: parse_data
arguments: data_label: D134
type_guessed: byte[4]
name: parse_data
arguments: data_label: D126
type_guessed: byte[4]
name: parse_data
arguments: data_label: D114
type_guessed: byte[4]
name: parse_data
arguments: data_label: D113
type_guessed: byte[4]
name: parse_data
arguments: data_label: D45
type_guessed: byte[4]

tool: {"D70": [0x00,0x00,0x00,0x3f]}

tool: {"D31": [0x66,0x66,0x66,0x3f]}

tool: {"D95": [0x00,0x00,0x80,0x40]}

tool: {"D69": [0x9a,0x99,0x19,0x3e]}

tool: D149: 1

tool: {"D134": [0xcd,0xcc,0x4c,0x3f]}

tool: {"D126": [0x00,0x00,0x40,0x40]}

tool: {"D114": [0xcd,0xcc,0xcc,0x3e]}

tool: {"D113": [0x9a,0x99,0x19,0x3f]}

tool: {"D45": [0x9a,0x99,0x59,0x3f]}

assistant: ```c
void fosphor_gl_cmap_histogram(uint32_t *rgba, int N) {
  int i;
  int m = N >> 4;
  for (i = 0; i < m; i++) {
    float p = (1.0f * i) / (N - 1);
    _set_rgba_from_hsv(&rgba[i], 0.90f, 0.50f, 0.15f + 4.0f * p);
  }
  for (i = m; i < N; i++) {
    float p = (1.0f * i) / (N - 1);
    _set_rgba_from_hsv(&rgba[i], 0.80f - p * 0.80f, 1.00f - ((p < 0.85f) ? 0.0f : ((p - 0.85f) * 3.0f)), 0.60f + ((p < 0.40f) ? p : 0.40f));
  }
}
```