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

```asm
<convert_units_from_THz>:
  endbr64
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  mov    %rsi,%rbp
  lea    D23(%rip),%rsi
  push   %rbx
  mov    %rdi,%rbx
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L90
L94:
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L90:
  lea    D9(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L197
  mov    %r12d,%eax
  movsd  D162(%rip),%xmm0
  divsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L197:
  lea    D121(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L73
  mov    %r12d,%eax
  movsd  D82(%rip),%xmm0
  divsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L73:
  lea    D55(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L110
  movsd  D137(%rip),%xmm0
  divsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
  nopl   0x0(%rax)
L110:
  lea    D140(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L64
  movsd  D31(%rip),%xmm0
  divsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
L64:
  lea    D35(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L158
  movsd  D197(%rip),%xmm0
  divsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
L158:
  lea    D43(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L139
  movsd  D2(%rip),%xmm0
  mulsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
L139:
  lea    D132(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L106
  movsd  D127(%rip),%xmm0
  mulsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
L106:
  lea    D15(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L25
  movsd  D120(%rip),%xmm0
  mulsd  (%rbx),%xmm0
  movsd  %xmm0,(%rbx)
  jmp    L94
L25:
  lea    D145(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L150
  movsd  D172(%rip),%xmm0
  mulsd  (%rbx),%xmm0
  xor    %r12d,%r12d
  movsd  %xmm0,(%rbx)
  jmp    L94
L150:
  lea    D59(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L2
  movsd  D58(%rip),%xmm0
  mulsd  (%rbx),%xmm0
  xor    %r12d,%r12d
  movsd  %xmm0,(%rbx)
  jmp    L94
L2:
  mov    $0x2,%r12d
  jmp    L94
```

tool_calls: name: parse_data
arguments: label: D23
data_type: string
name: parse_data
arguments: label: D9
data_type: string
name: parse_data
arguments: label: D162
data_type: f64
name: parse_data
arguments: label: D121
data_type: string
name: parse_data
arguments: label: D82
data_type: f64
name: parse_data
arguments: label: D55
data_type: string
name: parse_data
arguments: label: D137
data_type: byte[8]
name: parse_data
arguments: label: D140
data_type: string
name: parse_data
arguments: label: D31
data_type: byte[8]
name: parse_data
arguments: label: D35
data_type: string
name: parse_data
arguments: label: D197
data_type: byte[8]
name: parse_data
arguments: label: D43
data_type: string
name: parse_data
arguments: label: D2
data_type: f64
name: parse_data
arguments: label: D132
data_type: string
name: parse_data
arguments: label: D127
data_type: byte[8]
name: parse_data
arguments: label: D15
data_type: string
name: parse_data
arguments: label: D120
data_type: f64
name: parse_data
arguments: label: D145
data_type: string
name: parse_data
arguments: label: D172
data_type: f64
name: parse_data
arguments: label: D59
data_type: string
name: parse_data
arguments: label: D58
data_type: f64

tool: D23: THz

tool: D9: um

tool: D162: 299.792458

tool: D121: nm

tool: D82: 299792.458

tool: D55: m

tool: {"D137": [0x90,0x94,0x7d,0xcd,0xae,0xa5,0x33,0x3f]}

tool: D140: cm

tool: {"D31": [0x20,0x38,0x14,0x21,0xe1,0xb2,0x9e,0x3f]}

tool: D35: mm

tool: {"D197": [0x14,0xa3,0xac,0xb4,0xcc,0x2f,0xd3,0x3f]}

tool: D43: eV

tool: D2: 0.004135665157613982

tool: D132: J

tool: {"D127": [0x81,0x02,0xb7,0x36,0x57,0x08,0x89,0x3b]}

tool: D15: GHz

tool: D120: 1000

tool: D145: Hz

tool: D172: 1000000000000

tool: D59: rad/s

tool: D58: 6283185307179.586

assistant: ```c
int convert_units_from_THz(double *value, const char *to_units) {
  if (0 == strcmp(to_units, "THz")) {
    return 0;
  } else if (0 == strcmp(to_units, "um")) {
    *value = 2.99792458e2 / *value;
  } else if (0 == strcmp(to_units, "nm")) {
    *value = 2.99792458e5 / *value;
  } else if (0 == strcmp(to_units, "m")) {
    *value = 2.99792458e-4 / *value;
  } else if (0 == strcmp(to_units, "cm")) {
    *value = 2.99792458e-2 / *value;
  } else if (0 == strcmp(to_units, "mm")) {
    *value = 2.99792458e-1 / *value;
  } else if (0 == strcmp(to_units, "eV")) {
    *value *= 0.004135665157613982;
  } else if (0 == strcmp(to_units, "J")) {
    *value *= 6.6260689599999995e-22;
  } else if (0 == strcmp(to_units, "GHz")) {
    *value *= 1e3;
  } else if (0 == strcmp(to_units, "Hz")) {
    *value *= 1e12;
  } else if (0 == strcmp(to_units, "rad/s")) {
    *value *= 6.283185307179586e12;
  } else {
    return 2;
  }
  return 0;
}
```