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

```asm
<ironlake_debug_rawclk_freq>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %ecx,-0x24(%rbp)
  mov    %r8d,-0x28(%rbp)
  movq   $0x0,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x24(%rbp),%eax
  and    $0x3000,%eax
  cmp    $0x3000,%eax
  je     L178
  cmp    $0x3000,%eax
  jg     L28
  cmp    $0x2000,%eax
  je     L109
  cmp    $0x2000,%eax
  jg     L28
  test   %eax,%eax
  je     L33
  cmp    $0x1000,%eax
  je     L63
  jmp    L28
L33:
  lea    D26(%rip),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L28
L63:
  lea    D42(%rip),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L28
L109:
  lea    D57(%rip),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L28
L178:
  lea    D24(%rip),%rax
  mov    %rax,-0x10(%rbp)
  nop
L28:
  mov    -0x24(%rbp),%eax
  and    $0xc00,%eax
  cmp    $0xc00,%eax
  je     L129
  cmp    $0xc00,%eax
  jg     L119
  cmp    $0x800,%eax
  je     L102
  cmp    $0x800,%eax
  jg     L119
  test   %eax,%eax
  je     L12
  cmp    $0x400,%eax
  je     L149
  jmp    L119
L12:
  lea    D63(%rip),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L119
L149:
  lea    D23(%rip),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L119
L102:
  lea    D47(%rip),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L119
L129:
  lea    D11(%rip),%rax
  mov    %rax,-0x8(%rbp)
  nop
L119:
  mov    -0x24(%rbp),%eax
  and    $0x3ff,%eax
  mov    %eax,%edi
  mov    -0x8(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edi,%r9d
  mov    %rcx,%r8
  mov    %rdx,%rcx
  lea    D53(%rip),%rdx
  mov    %rax,%rdi
  call   <snprintf@plt>
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D26
data_type: string
name: parse_data
arguments: data_label: D42
data_type: string
name: parse_data
arguments: data_label: D57
data_type: string
name: parse_data
arguments: data_label: D24
data_type: string
name: parse_data
arguments: data_label: D63
data_type: string
name: parse_data
arguments: data_label: D23
data_type: string
name: parse_data
arguments: data_label: D47
data_type: string
name: parse_data
arguments: data_label: D11
data_type: string
name: parse_data
arguments: data_label: D53
data_type: string

tool: D26: 0.5us

tool: D42: 1.0us

tool: D57: 2.0us

tool: D24: 4.0us

tool: D63: 1.5us

tool: D23: 3.0us

tool: D47: 6.0us

tool: D11: 12.0us

tool: D53: FDL_TP1 timer %s, FDL_TP2 timer %s, freq %d

assistant: ```c
void ironlake_debug_rawclk_freq(char *result, int len, int reg, uint32_t val, uint32_t devid) {
  const char *tp1 = NULL, *tp2 = NULL;
  switch (val & (3 << 12)) {
  case 0:
    tp1 = "0.5us";
    break;
  case (1 << 12):
    tp1 = "1.0us";
    break;
  case (2 << 12):
    tp1 = "2.0us";
    break;
  case (3 << 12):
    tp1 = "4.0us";
    break;
  }
  switch (val & (3 << 10)) {
  case 0:
    tp2 = "1.5us";
    break;
  case (1 << 10):
    tp2 = "3.0us";
    break;
  case (2 << 10):
    tp2 = "6.0us";
    break;
  case (3 << 10):
    tp2 = "12.0us";
    break;
  }
  snprintf(result, len, "FDL_TP1 timer %s, FDL_TP2 timer %s, freq %d", tp1, tp2, val & 0x3ff);
}
```