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

```asm
<gaisler_device_str>:
  endbr64
  cmp    $0x61,%edi
  jg     L22
  cmp    $0x2,%edi
  jle    L19
  sub    $0x3,%edi
  cmp    $0x5e,%edi
  ja     L17
  mov    %edi,%edi
  lea    D89(%rip),%rdx
  movslq (%rdx,%rdi,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D50(%rip),%rax
  ret
L17:
  mov    $0x0,%eax
  ret
L22:
  lea    D178(%rip),%rax
  cmp    $0xffe,%edi
  je     L33
  cmp    $0xfff,%edi
  jne    L35
  lea    D187(%rip),%rax
L33:
  ret
L35:
  cmp    $0xffd,%edi
  lea    D139(%rip),%rax
  mov    $0x0,%edx
  cmovne %rdx,%rax
  ret
  lea    D147(%rip),%rax
  ret
  lea    D33(%rip),%rax
  ret
  lea    D171(%rip),%rax
  ret
  lea    D84(%rip),%rax
  ret
  lea    D227(%rip),%rax
  ret
  lea    D109(%rip),%rax
  ret
  lea    D1(%rip),%rax
  ret
  lea    D70(%rip),%rax
  ret
  lea    D188(%rip),%rax
  ret
  lea    D102(%rip),%rax
  ret
  lea    D155(%rip),%rax
  ret
  lea    D81(%rip),%rax
  ret
  lea    D19(%rip),%rax
  ret
  lea    D135(%rip),%rax
  ret
  lea    D3(%rip),%rax
  ret
  lea    D257(%rip),%rax
  ret
  lea    D142(%rip),%rax
  ret
  lea    D115(%rip),%rax
  ret
  lea    D216(%rip),%rax
  ret
  lea    D165(%rip),%rax
  ret
L19:
  mov    $0x0,%eax
  ret
  lea    D212(%rip),%rax
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D50
datatype: string
name: extract_symbolic_data
arguments: label: D178
datatype: string
name: extract_symbolic_data
arguments: label: D187
datatype: string
name: extract_symbolic_data
arguments: label: D139
datatype: string
name: extract_symbolic_data
arguments: label: D147
datatype: string
name: extract_symbolic_data
arguments: label: D33
datatype: string
name: extract_symbolic_data
arguments: label: D171
datatype: string
name: extract_symbolic_data
arguments: label: D84
datatype: string
name: extract_symbolic_data
arguments: label: D227
datatype: string
name: extract_symbolic_data
arguments: label: D109
datatype: string
name: extract_symbolic_data
arguments: label: D1
datatype: string
name: extract_symbolic_data
arguments: label: D70
datatype: string
name: extract_symbolic_data
arguments: label: D188
datatype: string
name: extract_symbolic_data
arguments: label: D102
datatype: string
name: extract_symbolic_data
arguments: label: D155
datatype: string
name: extract_symbolic_data
arguments: label: D81
datatype: string
name: extract_symbolic_data
arguments: label: D19
datatype: string
name: extract_symbolic_data
arguments: label: D135
datatype: string
name: extract_symbolic_data
arguments: label: D3
datatype: string
name: extract_symbolic_data
arguments: label: D257
datatype: string
name: extract_symbolic_data
arguments: label: D142
datatype: string
name: extract_symbolic_data
arguments: label: D115
datatype: string
name: extract_symbolic_data
arguments: label: D216
datatype: string
name: extract_symbolic_data
arguments: label: D165
datatype: string
name: extract_symbolic_data
arguments: label: D212
datatype: string

tool: D50: GAISLER_LEON3DSU

tool: D178: GAISLER_L2C

tool: D187: GAISLER_PLUGPLAY

tool: D139: GAISLER_L2TIME

tool: D147: GAISLER_ETHAHB

tool: D33: GAISLER_ETHMAC

tool: D171: GAISLER_APBMST

tool: D84: GAISLER_AHBUART

tool: D227: GAISLER_SRCTRL

tool: D109: GAISLER_SDCTRL

tool: D1: GAISLER_APBUART

tool: D70: GAISLER_IRQMP

tool: D188: GAISLER_AHBRAM

tool: D102: GAISLER_GPTIMER

tool: D155: GAISLER_PCITRG

tool: D81: GAISLER_PCISBRG

tool: D19: GAISLER_PCIFBRG

tool: D135: GAISLER_PCITRACE

tool: D3: GAISLER_AHBTRACE

tool: D257: GAISLER_ETHDSU

tool: D142: GAISLER_PIOPORT

tool: D115: GAISLER_AHBJTAG

tool: D216: GAISLER_VGA

tool: D165: GAISLER_KBD

tool: D212: GAISLER_LEON3

assistant: ```c
extern char *gaisler_device_str(int id) {
  switch (id) {
  case 0x003:
    return "GAISLER_LEON3";
  case 0x004:
    return "GAISLER_LEON3DSU";
  case 0x005:
    return "GAISLER_ETHAHB";
  case 0x01D:
    return "GAISLER_ETHMAC";
  case 0x006:
    return "GAISLER_APBMST";
  case 0x007:
    return "GAISLER_AHBUART";
  case 0x008:
    return "GAISLER_SRCTRL";
  case 0x009:
    return "GAISLER_SDCTRL";
  case 0x00C:
    return "GAISLER_APBUART";
  case 0x00D:
    return "GAISLER_IRQMP";
  case 0x00E:
    return "GAISLER_AHBRAM";
  case 0x011:
    return "GAISLER_GPTIMER";
  case 0x012:
    return "GAISLER_PCITRG";
  case 0x013:
    return "GAISLER_PCISBRG";
  case 0x014:
    return "GAISLER_PCIFBRG";
  case 0x015:
    return "GAISLER_PCITRACE";
  case 0x017:
    return "GAISLER_AHBTRACE";
  case 0x018:
    return "GAISLER_ETHDSU";
  case 0x01A:
    return "GAISLER_PIOPORT";
  case 0x01c:
    return "GAISLER_AHBJTAG";
  case 0x061:
    return "GAISLER_VGA";
  case 0X060:
    return "GAISLER_KBD";
  case 0xffd:
    return "GAISLER_L2TIME";
  case 0xffe:
    return "GAISLER_L2C";
  case 0xfff:
    return "GAISLER_PLUGPLAY";
  default:
    break;
  }
  return 0;
}
```