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

```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    D36(%rip),%r12
  lea    D34(%rip),%rsi
  sub    $0x28,%rsp
  cmp    $0x2,%rdx
  je     L36
  lea    D198(%rip),%r12
  cmp    $0x3,%rdx
  je     L36
  cmp    $0x1,%rdx
  lea    D43(%rip),%r12
  lea    D143(%rip),%rdx
  cmove  %rdx,%r12
  lea    D108(%rip),%rsi
L36:
  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    D88(%rip),%rdi
  cmp    $0x2,%rdx
  je     L12
  cmp    $0x3,%rdx
  je     L8
  cmp    $0x1,%rdx
  je     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>
  lea    D24(%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    D166(%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    D172(%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    D164(%rip),%rdi
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <myprint@plt>
  xchg   %ax,%ax
L12:
  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    D164(%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    D39(%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    D24(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
L32:
  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    D166(%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
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
  lea    D81(%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    D172(%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
L8:
  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    D81(%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    D172(%rip),%rdi
  xor    %eax,%eax
  call   <myprint@plt>
  mov    $0x31,%edi
  call   <pad_to@plt>
  mov    %r14,%rdi
  call   <_regname@plt>
  lea    D53(%rip),%rdi
  mov    %rax,%rsi
  xor    %eax,%eax
  call   <myprint@plt>
  jmp    L32
```

tool_calls: name: unpack_data
arguments: tag: D36
datatype: string
name: unpack_data
arguments: tag: D34
datatype: string
name: unpack_data
arguments: tag: D198
datatype: string
name: unpack_data
arguments: tag: D43
datatype: string
name: unpack_data
arguments: tag: D143
datatype: string
name: unpack_data
arguments: tag: D108
datatype: string
name: unpack_data
arguments: tag: D88
datatype: string
name: unpack_data
arguments: tag: D24
datatype: string
name: unpack_data
arguments: tag: D166
datatype: string
name: unpack_data
arguments: tag: D172
datatype: string
name: unpack_data
arguments: tag: D164
datatype: string
name: unpack_data
arguments: tag: D39
datatype: string
name: unpack_data
arguments: tag: D81
datatype: string
name: unpack_data
arguments: tag: D53
datatype: string

tool: D36: ADDI3

tool: D34: MPYI3

tool: D198: SUBI3

tool: D43: ADDF3

tool: D143: SUBF3

tool: D108: MPYF3

tool: D88: %s

tool: D24: , 

tool: D166: , %s

tool: D172: || %s

tool: D164: %s, %s, %s

tool: D39: || %s 

tool: D81: , %s, %s

tool: D53: %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;
}
```