user: What would the C source look like for the assembly code provided here:

```asm
<decode_3d_1c>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %rcx,-0x28(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  sar    $0x13,%eax
  and    $0x1f,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x11,-0x4(%rbp)
  ja     L34
  mov    -0x4(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D79(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D79(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  lea    D8(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    $0x1,%eax
  jmp    L46
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  lea    D31(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    $0x1,%eax
  jmp    L46
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  lea    D75(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    $0x1,%eax
  jmp    L46
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  lea    D22(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    $0x1,%eax
  jmp    L46
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  lea    D7(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    $0x1,%eax
  jmp    L46
L34:
  mov    -0x4(%rbp),%edx
  mov    -0x20(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%r8d
  lea    D76(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <instr_out@plt>
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    $0x1,%eax
L46:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D8
datatype: string
name: disassemble_data
arguments: tag: D31
datatype: string
name: disassemble_data
arguments: tag: D75
datatype: string
name: disassemble_data
arguments: tag: D22
datatype: string
name: disassemble_data
arguments: tag: D7
datatype: string
name: disassemble_data
arguments: tag: D76
datatype: string

tool: D8: 3DSTATE_DEPTH_SUBRECTANGLE_DISABLE


tool: D31: 3DSTATE_SCISSOR_ENABLE


tool: D75: 3DSTATE_MAP_COORD_SET_I830


tool: D22: 3DSTATE_MAP_CUBE_I830


tool: D7: 3DSTATE_MAP_TEX_STREAM_I830


tool: D76: 3D UNKNOWN: 3d_1c opcode = 0x%x


assistant: ```c
int decode_3d_1c(uint32_t *data, int count, uint32_t hw_offset, int *failures) {
  uint32_t opcode;
  opcode = (data[0] & 0x00f80000) >> 19;
  switch (opcode) {
  case 0x11:
    instr_out(data, hw_offset, 0, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n");
    return 1;
  case 0x10:
    instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE\n");
    return 1;
  case 0x01:
    instr_out(data, hw_offset, 0, "3DSTATE_MAP_COORD_SET_I830\n");
    return 1;
  case 0x0a:
    instr_out(data, hw_offset, 0, "3DSTATE_MAP_CUBE_I830\n");
    return 1;
  case 0x05:
    instr_out(data, hw_offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n");
    return 1;
  }
  instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n", opcode);
  (*failures)++;
  return 1;
}
```