user: 下面的汇编指令对应的C源代码是什么：

```asm
<gen_mask>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rsi,%r15
  mov    %rdx,%rbx
  mov    %rdx,0x8(%rsp)
  mov    %ecx,%r13d
  lea    D110(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r13d,%ecx
  mov    %r13d,%edx
  mov    %rbx,%rsi
  lea    D26(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  test   %r13d,%r13d
  jle    L82
  mov    $0x0,%r12d
  mov    $0x1,%r14d
  mov    %r15,(%rsp)
  mov    %rbx,%r15
  jmp    L135
L89:
  mov    $0x0,%eax
  mov    $0x0,%ebp
L265:
  mov    $0x0,%r8d
  lea    -0x1(%r13),%r9d
  jmp    L279
L206:
  mov    $0x0,%eax
  mov    $0x0,%ebp
  jmp    L265
L15:
  mov    %r9d,%ecx
  sub    %eax,%ecx
  mov    %r14,%rdx
  shl    %cl,%rdx
L71:
  or     %rdx,%rbp
  add    $0x1,%eax
  cmp    %eax,%r13d
  je     L180
L279:
  test   %esi,%esi
  jne    L126
  cmp    %eax,%r12d
  setle  %cl
  cmp    %eax,%ebx
  setge  %dil
  test   %cl,%cl
  je     L56
  test   %dil,%dil
  jne    L15
L56:
  mov    %r8,%rdx
  cmp    %ebx,%r12d
  jle    L71
  test   %cl,%cl
  jne    L15
  test   %dil,%dil
  je     L71
  jmp    L15
L126:
  cmp    %eax,%r12d
  setge  %cl
  cmp    %eax,%ebx
  setle  %dil
  test   %cl,%cl
  je     L104
  test   %dil,%dil
  je     L104
L233:
  mov    %r14,%rdx
  mov    %eax,%ecx
  shl    %cl,%rdx
  jmp    L71
L104:
  mov    %r8,%rdx
  cmp    %ebx,%r12d
  jge    L71
  test   %cl,%cl
  jne    L233
  test   %dil,%dil
  je     L71
  jmp    L233
L180:
  mov    %ebx,%edx
  mov    %r12d,%esi
  lea    D36(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebx,%r8d
  mov    %r12d,%ecx
  mov    %r15,%rdx
  mov    (%rsp),%rsi
  lea    D64(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rsi
  shr    $0x20,%rsi
  mov    %rbp,%rdx
  lea    D119(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L166:
  lea    D116(%rip),%rdi
  call   <puts@plt>
  lea    0x1(%rbx),%eax
  cmp    %eax,%r13d
  je     L52
  mov    %eax,%ebx
L138:
  lea    D105(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D24(%rip),%rsi
  mov    (%rsp),%rdi
  call   <strcmp@plt>
  mov    %eax,%esi
  cmp    %ebx,%r12d
  jg     L119
  test   %eax,%eax
  je     L89
L119:
  cmp    %ebx,%r12d
  jl     L4
  test   %esi,%esi
  jne    L206
L4:
  mov    $0x0,%eax
  mov    $0x0,%ebp
  cmpb   $0x0,(%r15)
  je     L265
  lea    D72(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L166
L52:
  lea    D75(%rip),%rdi
  call   <puts@plt>
  lea    0x1(%r12),%eax
  cmp    %ebx,%r12d
  je     L149
  mov    %eax,%r12d
L135:
  lea    D84(%rip),%rdi
  call   <puts@plt>
  mov    $0x0,%ebx
  jmp    L138
L149:
  mov    (%rsp),%r15
L82:
  lea    D19(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  sub    $0x8,%rsp
  mov    0x10(%rsp),%rsi
  push   %rsi
  mov    %r13d,%r9d
  mov    %r13d,%r8d
  mov    %rsi,%rcx
  mov    %r15,%rdx
  lea    D49(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: unpack_data
arguments: label: D110
type_infered: string
name: unpack_data
arguments: label: D26
type_infered: string
name: unpack_data
arguments: label: D36
type_infered: string
name: unpack_data
arguments: label: D64
type_infered: string
name: unpack_data
arguments: label: D119
type_infered: string
name: unpack_data
arguments: label: D116
type_infered: string
name: unpack_data
arguments: label: D105
type_infered: string
name: unpack_data
arguments: label: D24
type_infered: string
name: unpack_data
arguments: label: D72
type_infered: string
name: unpack_data
arguments: label: D75
type_infered: string
name: unpack_data
arguments: label: D84
type_infered: string
name: unpack_data
arguments: label: D19
type_infered: string
name: unpack_data
arguments: label: D49
type_infered: string

tool: D110: 
/* Test the %s%s macro */


tool: D26: test_tuples %s_tuples[%d][%d] = {


tool: D36: %d, %d, 

tool: D64: %s%s (%2d, %2d), 

tool: D119: UNSIGNED64 (0x%08lx%08lx), 

tool: D116: },

tool: D105:     { __LINE__, 

tool: D24: MS

tool: D72: -1, -1, 

tool: D75:   },

tool: D84:   {

tool: D19: };

tool: D49: test_spec %s_test = { __FILE__, "%s%s", %d, %d, &%s_tuples[0][0], };


assistant: ```c
void gen_mask(int bitsize, const char *msb, const char *macro, int nr_bits) {
  int l;
  int h;
  printf("\n/* Test the %s%s macro */\n", msb, macro);
  printf("test_tuples %s_tuples[%d][%d] = {\n", macro, nr_bits, nr_bits);
  for (l = 0; l < nr_bits; l++) {
    printf("  {\n");
    for (h = 0; h < nr_bits; h++) {
      printf("    { __LINE__, ");
      if ((strcmp(msb, "MS") == 0 && l <= h) || (strcmp(msb, "MS") != 0 && l >= h) || (strcmp(macro, "") == 0)) {
        unsigned long long mask = 0;
        int b;
        for (b = 0; b < nr_bits; b++) {
          unsigned long long bit = 1;
          if (strcmp(msb, "MS") == 0) {
            if ((l <= b && b <= h) || (h < l && (b <= h || b >= l)))
              bit <<= (nr_bits - b - 1);
            else
              bit = 0;
          } else {
            if ((l >= b && b >= h) || (h > l && (b >= h || b <= l)))
              bit <<= b;
            else
              bit = 0;
          }
          mask |= bit;
        }
        if (bitsize == 32)
          mask = (unsigned long)mask;
        printf("%d, %d, ", l, h);
        printf("%s%s (%2d, %2d), ", msb, macro, l, h);
        printf("UNSIGNED64 (0x%08lx%08lx), ", (long)(mask >> 32), (long)mask);
      } else
        printf("-1, -1, ");
      printf("},\n");
    }
    printf("  },\n");
  }
  printf("};\n");
  printf("\n");
  printf("test_spec %s_test = { __FILE__, \"%s%s\", %d, %d, &%s_tuples[0][0], };\n", macro, msb, macro, nr_bits, nr_bits, macro);
  printf("\n");
}
```