user: Please show me the C implementation that matches the assembly code listed below:

```asm
<gaisler_device_str>:
  endbr64
  cmp    $0x1f,%edi
  jg     L15
  cmp    $0x2,%edi
  jle    L33
  sub    $0x3,%edi
  cmp    $0x1c,%edi
  ja     L33
  lea    D51(%rip),%rdx
  movslq (%rdx,%rdi,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
L33:
  xor    %eax,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L15:
  lea    D190(%rip),%rax
  cmp    $0xffe,%edi
  je     L38
  cmp    $0xfff,%edi
  jne    L1
  lea    D89(%rip),%rax
L38:
  ret
L1:
  cmp    $0xffd,%edi
  mov    $0x0,%edx
  lea    D154(%rip),%rax
  cmovne %rdx,%rax
  ret
  xchg   %ax,%ax
  lea    D150(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D39(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D28(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D176(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D184(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D83(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D82(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D4(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D10(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D113(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D100(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D17(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D87(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D73(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D127(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D41(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D53(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D86(%rip),%rax
  ret
  nopl   0x0(%rax,%rax,1)
  lea    D103(%rip),%rax
  ret
```

tool_calls: name: retrieve_data
arguments: label: D190
datatype: string
name: retrieve_data
arguments: label: D89
datatype: string
name: retrieve_data
arguments: label: D154
datatype: string
name: retrieve_data
arguments: label: D150
datatype: string
name: retrieve_data
arguments: label: D39
datatype: string
name: retrieve_data
arguments: label: D28
datatype: string
name: retrieve_data
arguments: label: D176
datatype: string
name: retrieve_data
arguments: label: D184
datatype: string
name: retrieve_data
arguments: label: D83
datatype: string
name: retrieve_data
arguments: label: D82
datatype: string
name: retrieve_data
arguments: label: D4
datatype: string
name: retrieve_data
arguments: label: D10
datatype: string
name: retrieve_data
arguments: label: D113
datatype: string
name: retrieve_data
arguments: label: D100
datatype: string
name: retrieve_data
arguments: label: D17
datatype: string
name: retrieve_data
arguments: label: D87
datatype: string
name: retrieve_data
arguments: label: D73
datatype: string
name: retrieve_data
arguments: label: D127
datatype: string
name: retrieve_data
arguments: label: D41
datatype: string
name: retrieve_data
arguments: label: D53
datatype: string
name: retrieve_data
arguments: label: D86
datatype: string
name: retrieve_data
arguments: label: D103
datatype: string

tool: D190: GAISLER_L2C

tool: D89: GAISLER_PLUGPLAY

tool: D154: GAISLER_L2TIME

tool: D150: GAISLER_SPACEWIRE

tool: D39: GAISLER_PIOPORT

tool: D28: GAISLER_ETHDSU

tool: D176: GAISLER_AHBTRACE

tool: D184: GAISLER_PCITRACE

tool: D83: GAISLER_PCIFBRG

tool: D82: GAISLER_PCISBRG

tool: D4: GAISLER_PCITRG

tool: D10: GAISLER_GPTIMER

tool: D113: GAISLER_AHBRAM

tool: D100: GAISLER_IRQMP

tool: D17: GAISLER_APBUART

tool: D87: GAISLER_SDCTRL

tool: D73: GAISLER_SRCTRL

tool: D127: GAISLER_AHBUART

tool: D41: GAISLER_APBMST

tool: D53: GAISLER_ETHAHB

tool: D86: GAISLER_LEON3

tool: D103: GAISLER_LEON3DSU

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 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 0x01f:
    return "GAISLER_SPACEWIRE";
  case 0xffd:
    return "GAISLER_L2TIME";
  case 0xffe:
    return "GAISLER_L2C";
  case 0xfff:
    return "GAISLER_PLUGPLAY";
  default:
    break;
  }
  return 0;
}
```