user: Converte this assembly snippet into its equivalent C code:

```asm
<decode_special_triadic>:
  endbr64
  push   %r15
  mov    %rdi,%rdx
  mov    %rdi,%r15
  mov    %rdi,%r10
  push   %r14
  sar    $0x1a,%rdx
  mov    %rdi,%r14
  mov    %rdi,%r8
  push   %r13
  mov    %rdi,%r13
  sar    $0x10,%r14
  and    $0x3,%edx
  push   %r12
  sar    $0x16,%r13
  sar    $0x13,%r15
  mov    %rdi,%rax
  push   %rbp
  and    $0x1,%r13d
  sar    $0x17,%r10
  and    $0x7,%r14d
  push   %rbx
  sar    $0x8,%r8
  and    $0x7,%r15d
  add    $0x2,%r13
  and    $0x1,%r10d
  lea    D156(%rip),%r12
  lea    D183(%rip),%rsi
  sub    $0x28,%rsp
  cmp    $0x2,%rdx
  je     L58
  lea    D166(%rip),%r12
  cmp    $0x3,%rdx
  je     L58
  cmp    $0x1,%rdx
  lea    D23(%rip),%r12
  lea    D144(%rip),%rdx
  cmove  %rdx,%r12
  lea    D55(%rip),%rsi
L58:
  mov    %rax,%rdx
  mov    %rax,%rbx
  mov    %rax,%r9
  mov    %r10,0x8(%rsp)
  sar    $0x18,%rdx
  sar    $0x3,%rax
  and    $0x7,%r8d
  and    $0x7,%r9d
  and    $0x1f,%eax
  sar    $0xb,%rbx
  and    $0x3,%edx
  mov    %r9,0x18(%rsp)
  mov    %rax,%rbp
  mov    %r8,0x10(%rsp)
  and    $0x1f,%ebx
  xor    %eax,%eax
  lea    D194(%rip),%rdi
  cmp    $0x2,%rdx
  je     L28
  cmp    $0x3,%rdx
  je     L38
  cmp    $0x1,%rdx
  je     L15
  call   <myprint@plt>
  mov    $0xa,%edi
  call   <pad_to@plt>
  mov    0x10(%rsp),%rsi
  mov    $0x1,%edx
  mov    %rbx,%rdi
  call   <decode_indirect_address@plt>
  lea    D17(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    0x18(%rsp),%rsi
  mov    $0x1,%edx
  mov    %rbp,%rdi
  call   <decode_indirect_address@plt>
  mov    0x8(%rsp),%rdi
  call   <_regname@plt>
  lea    D158(%rip),%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  xor    %eax,%eax
  call   <new_line@plt>
  mov    $0x27,%edi
  call   <pad_to@plt>
  mov    %r12,%rsi
  lea    D162(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    $0x31,%edi
  call   <pad_to@plt>
  mov    %r13,%rdi
  call   <_regname@plt>
  mov    %r14,%rdi
  mov    %rax,%r13
  call   <_regname@plt>
  mov    %r15,%rdi
  mov    %rax,%r12
  call   <_regname@plt>
  add    $0x28,%rsp
  mov    %r13,%rcx
  mov    %r12,%rdx
  pop    %rbx
  mov    %rax,%rsi
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  lea    D51(%rip),%rdi
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <myprint@plt>
  xchg   %ax,%ax
L28:
  call   <myprint@plt>
  mov    $0xa,%edi
  call   <pad_to@plt>
  mov    0x8(%rsp),%rdi
  call   <_regname@plt>
  mov    %r14,%rdi
  mov    %rax,0x8(%rsp)
  call   <_regname@plt>
  mov    %r15,%rdi
  mov    %rax,%r14
  call   <_regname@plt>
  mov    0x8(%rsp),%rcx
  mov    %r14,%rdx
  lea    D51(%rip),%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  xor    %eax,%eax
  call   <new_line@plt>
  mov    $0x27,%edi
  call   <pad_to@plt>
  mov    %r12,%rsi
  lea    D177(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    $0x31,%edi
  call   <pad_to@plt>
  mov    0x10(%rsp),%rsi
  mov    %rbx,%rdi
  mov    $0x1,%edx
  call   <decode_indirect_address@plt>
  lea    D17(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
L10:
  mov    0x18(%rsp),%rsi
  mov    %rbp,%rdi
  mov    $0x1,%edx
  call   <decode_indirect_address@plt>
  mov    %r13,%rdi
  call   <_regname@plt>
  add    $0x28,%rsp
  lea    D158(%rip),%rdi
  pop    %rbx
  mov    %rax,%rsi
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <myprint@plt>
  nop
L15:
  call   <myprint@plt>
  mov    $0xa,%edi
  call   <pad_to@plt>
  mov    0x10(%rsp),%rsi
  mov    $0x1,%edx
  mov    %rbx,%rdi
  call   <decode_indirect_address@plt>
  mov    0x8(%rsp),%rdi
  call   <_regname@plt>
  mov    %r15,%rdi
  lea    D134(%rip),%r15
  mov    %rax,%rbx
  call   <_regname@plt>
  mov    %r12,%rcx
  mov    %rbx,%rdx
  mov    %r15,%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  xor    %eax,%eax
  call   <new_line@plt>
  mov    $0x27,%edi
  call   <pad_to@plt>
  mov    %r12,%rsi
  lea    D162(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    $0x31,%edi
  call   <pad_to@plt>
  mov    0x18(%rsp),%rsi
  mov    $0x1,%edx
  mov    %rbp,%rdi
  call   <decode_indirect_address@plt>
  mov    %r13,%rdi
  call   <_regname@plt>
  mov    %r14,%rdi
  mov    %rax,%r12
  call   <_regname@plt>
  add    $0x28,%rsp
  mov    %r12,%rdx
  mov    %r15,%rdi
  pop    %rbx
  mov    %rax,%rsi
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <myprint@plt>
  nop
L38:
  call   <myprint@plt>
  mov    $0xa,%edi
  call   <pad_to@plt>
  mov    0x10(%rsp),%rsi
  mov    $0x1,%edx
  mov    %rbx,%rdi
  call   <decode_indirect_address@plt>
  mov    0x8(%rsp),%rdi
  call   <_regname@plt>
  mov    %r15,%rdi
  mov    %rax,%rbx
  call   <_regname@plt>
  mov    %rbx,%rdx
  lea    D134(%rip),%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  xor    %eax,%eax
  call   <new_line@plt>
  mov    $0x27,%edi
  call   <pad_to@plt>
  mov    %r12,%rsi
  lea    D162(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    $0x31,%edi
  call   <pad_to@plt>
  mov    %r14,%rdi
  call   <_regname@plt>
  lea    D154(%rip),%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  jmp    L10
```

tool_calls: name: retrieve_data
arguments: tag: D156
type: string
name: retrieve_data
arguments: tag: D183
type: string
name: retrieve_data
arguments: tag: D166
type: string
name: retrieve_data
arguments: tag: D23
type: string
name: retrieve_data
arguments: tag: D144
type: string
name: retrieve_data
arguments: tag: D55
type: string
name: retrieve_data
arguments: tag: D194
type: string
name: retrieve_data
arguments: tag: D17
type: string
name: retrieve_data
arguments: tag: D158
type: string
name: retrieve_data
arguments: tag: D162
type: string
name: retrieve_data
arguments: tag: D51
type: string
name: retrieve_data
arguments: tag: D177
type: string
name: retrieve_data
arguments: tag: D134
type: string
name: retrieve_data
arguments: tag: D154
type: string

tool: D156: ADDI3

tool: D183: MPYI3

tool: D166: SUBI3

tool: D23: ADDF3

tool: D144: SUBF3

tool: D55: MPYF3

tool: D194: %s

tool: D17: , 

tool: D158: , %s

tool: D162: || %s

tool: D51: %s, %s, %s

tool: D177: || %s 

tool: D134: , %s, %s

tool: D154: %s, 

assistant: ```c
void decode_special_triadic(long int op_code) {
  char *op1;
  char *op2;
  long int src1;
  long int src2;
  long int src3;
  long int src4;
  long int dst1;
  long int dst2;
  src4 = op_code & 0xff;
  src3 = (op_code >> 8) & 0xff;
  src2 = (op_code >> 16) & 0x7;
  src1 = (op_code >> 19) & 0x7;
  dst2 = ((op_code >> 22) & 0x1) + 2;
  dst1 = (op_code >> 23) & 0x1;
  switch ((op_code >> 26) & 0x3) {
  default:
  case 0x00L:
    op1 = "MPYF3";
    op2 = "ADDF3";
    break;
  case 0x01L:
    op1 = "MPYF3";
    op2 = "SUBF3";
    break;
  case 0x02L:
    op1 = "MPYI3";
    op2 = "ADDI3";
    break;
  case 0x03L:
    op1 = "MPYI3";
    op2 = "SUBI3";
    break;
  }
  switch ((op_code >> 24) & 0x3) {
  case 0x00L:
    myprint("%s", op1);
    pad_to(10);
    decode_indirect_address(src3 >> 3, src3 & 7, 1);
    myprint(", ");
    decode_indirect_address(src4 >> 3, src4 & 7, 1);
    myprint(", %s", _regname(dst1));
    new_line();
    pad_to(39);
    myprint("|| %s", op2);
    pad_to(39 + 10);
    myprint("%s, %s, %s", _regname(src1), _regname(src2), _regname(dst2));
    break;
  case 0x01L:
    myprint("%s", op1);
    pad_to(10);
    decode_indirect_address(src3 >> 3, src3 & 7, 1);
    myprint(", %s, %s", _regname(src1), _regname(dst1), op2);
    new_line();
    pad_to(39);
    myprint("|| %s", op2);
    pad_to(39 + 10);
    decode_indirect_address(src4 >> 3, src4 & 7, 1);
    myprint(", %s, %s", _regname(src2), _regname(dst2));
    break;
  case 0x02L:
    myprint("%s", op1);
    pad_to(10);
    myprint("%s, %s, %s", _regname(src1), _regname(src2), _regname(dst1));
    new_line();
    pad_to(39);
    myprint("|| %s ", op2);
    pad_to(39 + 10);
    decode_indirect_address(src3 >> 3, src3 & 7, 1);
    myprint(", ");
    decode_indirect_address(src4 >> 3, src4 & 7, 1);
    myprint(", %s", _regname(dst2));
    break;
  case 0x03L:
    myprint("%s", op1);
    pad_to(10);
    decode_indirect_address(src3 >> 3, src3 & 7, 1);
    myprint(", %s, %s", _regname(src1), _regname(dst1));
    new_line();
    pad_to(39);
    myprint("|| %s", op2);
    pad_to(39 + 10);
    myprint("%s, ", _regname(src2));
    decode_indirect_address(src4 >> 3, src4 & 7, 1);
    myprint(", %s", _regname(dst2));
    break;
  }
  return;
}
```