// File: WojciechMula[P]utf16utf8/benchmarks/linux-perf-events.h
// Function: LinuxEvents<0>::LinuxEvents(std::vector<int, std::allocator<int>>)
explicit LinuxEvents(std::vector<int> config_vec) : fd(0), working(true) {
    memset(&attribs, 0, sizeof(attribs));
    attribs.type = TYPE;
    attribs.size = sizeof(attribs);
    attribs.disabled = 1;
    attribs.exclude_kernel = 1;
    attribs.exclude_hv = 1;

    attribs.sample_period = 0;
    attribs.read_format = PERF_FORMAT_GROUP | PERF_FORMAT_ID;
    const int pid = 0;  // the current process
    const int cpu = -1; // all CPUs
    const unsigned long flags = 0;

    int group = -1; // no group
    num_events = config_vec.size();
    ids.resize(config_vec.size());
    uint32_t i = 0;
    for (auto config : config_vec) {
      attribs.config = config;
      fd = static_cast<int>(syscall(__NR_perf_event_open, &attribs, pid, cpu, group, flags));
      if (fd == -1) {
        report_error("perf_event_open");
      }
      ioctl(fd, PERF_EVENT_IOC_ID, &ids[i++]);
      if (group == -1) {
        group = fd;
      }
    }

    temp_result_vec.resize(num_events * 2 + 1);
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rsi, -0x98(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x90(%rbp)
movl $0x0, (%rax)
movb $0x1, 0x4(%rax)
movl $0x0, 0x8(%rax)
movl $0x0, 0xc(%rax)
movq $0x0, 0x10(%rax)
movq $0x0, 0x18(%rax)
movq $0x0, 0x20(%rax)
movq $0x0, 0x28(%rax)
movb 0x30(%rax), %cl
andb $-0x2, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x3, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x5, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x9, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x11, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x21, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $-0x41, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
andb $0x7f, %cl
movb %cl, 0x30(%rax)
movb 0x31(%rax), %cl
andb $-0x2, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x3, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x5, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x9, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x11, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x21, %cl
movb %cl, 0x31(%rax)
movb 0x31(%rax), %cl
andb $-0x41, %cl
movb %cl, 0x31(%rax)
movq 0x30(%rax), %rcx
andq $-0x18001, %rcx         # imm = 0xFFFE7FFF
movq %rcx, 0x30(%rax)
movb 0x32(%rax), %cl
andb $-0x3, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $-0x5, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $-0x9, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $-0x11, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $-0x21, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $-0x41, %cl
movb %cl, 0x32(%rax)
movb 0x32(%rax), %cl
andb $0x7f, %cl
movb %cl, 0x32(%rax)
movb 0x33(%rax), %cl
andb $-0x2, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x3, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x5, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x9, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x11, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x21, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $-0x41, %cl
movb %cl, 0x33(%rax)
movb 0x33(%rax), %cl
andb $0x7f, %cl
movb %cl, 0x33(%rax)
movb 0x34(%rax), %cl
andb $-0x2, %cl
movb %cl, 0x34(%rax)
movb 0x34(%rax), %cl
andb $-0x3, %cl
movb %cl, 0x34(%rax)
movb 0x34(%rax), %cl
andb $-0x5, %cl
movb %cl, 0x34(%rax)
movb 0x34(%rax), %cl
andb $-0x9, %cl
movb %cl, 0x34(%rax)
movb 0x34(%rax), %cl
andb $-0x11, %cl
movb %cl, 0x34(%rax)
movb 0x34(%rax), %cl
andb $-0x21, %cl
movb %cl, 0x34(%rax)
movl 0x34(%rax), %ecx
andl $0x3f, %ecx
movl %ecx, 0x34(%rax)
movl $0x0, 0x38(%rax)
movl $0x0, 0x3c(%rax)
movq $0x0, 0x40(%rax)
movq $0x0, 0x48(%rax)
movq $0x0, 0x50(%rax)
movq $0x0, 0x58(%rax)
movl $0x0, 0x60(%rax)
movl $0x0, 0x64(%rax)
movq $0x0, 0x68(%rax)
movl $0x0, 0x70(%rax)
movw $0x0, 0x74(%rax)
movw $0x0, 0x76(%rax)
movl $0x0, 0x78(%rax)
movl $0x0, 0x7c(%rax)
movq $0x0, 0x80(%rax)
movq $0x0, 0x88(%rax)
movq %rax, %rdi
addq $0x90, %rdi
movq %rdi, -0xb8(%rbp)
vpxor %xmm0, %xmm0, %xmm0
vmovaps %xmm0, -0xb0(%rbp)
vmovdqu %xmm0, 0x90(%rax)
movq $0x0, 0xa0(%rax)
callq 0x102b0
vmovaps -0xb0(%rbp), %xmm0
movq -0x90(%rbp), %rax
movq %rax, %rdi
addq $0xa8, %rdi
movq %rdi, -0x88(%rbp)
vmovdqu %xmm0, 0xa8(%rax)
movq $0x0, 0xb8(%rax)
callq 0x102b0
movq -0x90(%rbp), %rax
movq -0x98(%rbp), %rdi
vpxor %xmm0, %xmm0, %xmm0
vmovdqu64 %zmm0, 0x48(%rax)
vmovdqu64 %zmm0, 0x8(%rax)
movl $0x0, 0x8(%rax)
movl $0x80, 0xc(%rax)
movb 0x30(%rax), %cl
orb $0x1, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
orb $0x20, %cl
movb %cl, 0x30(%rax)
movb 0x30(%rax), %cl
orb $0x40, %cl
movb %cl, 0x30(%rax)
movq $0x0, 0x18(%rax)
movq $0xc, 0x28(%rax)
movl $0x0, -0x14(%rbp)
movl $0xffffffff, -0x18(%rbp) # imm = 0xFFFFFFFF
movq $0x0, -0x20(%rbp)
movl $0xffffffff, -0x24(%rbp) # imm = 0xFFFFFFFF
vzeroupper
callq 0x102d0
movq -0x98(%rbp), %rdi
movq %rax, %rcx
movq -0x90(%rbp), %rax
movq %rcx, 0x88(%rax)
callq 0x102d0
movq -0x88(%rbp), %rdi
movq %rax, %rsi
callq 0x102f0
jmp 0xef83
movq -0x98(%rbp), %rax
movl $0x0, -0x38(%rbp)
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0x10380
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
callq 0x103b0
movq %rax, -0x50(%rbp)
leaq -0x48(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x103e0
testb $0x1, %al
jne 0xefc5
jmp 0xf109
leaq -0x48(%rbp), %rdi
callq 0x10420
movq -0x90(%rbp), %rsi
movl (%rax), %eax
movl %eax, -0x54(%rbp)
movslq -0x54(%rbp), %rax
movq %rax, 0x10(%rsi)
addq $0x8, %rsi
movl -0x24(%rbp), %r8d
movl $0x12a, %edi            # imm = 0x12A
xorl %edx, %edx
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
xorl %eax, %eax
movl %eax, %r9d
movb $0x0, %al
callq 0x2060
movq %rax, %rcx
movq -0x90(%rbp), %rax
movl %ecx, (%rax)
cmpl $-0x1, (%rax)
jne 0xf0a8
leaq -0x79(%rbp), %rdi
movq %rdi, -0xc0(%rbp)
callq 0x22f0
movq -0xc0(%rbp), %rdx
leaq 0xa4ea(%rip), %rsi      # 0x1951f
leaq -0x78(%rbp), %rdi
callq 0x2220
jmp 0xf040
movq -0x90(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x10440
jmp 0xf052
leaq -0x78(%rbp), %rdi
callq 0x2120
leaq -0x79(%rbp), %rdi
callq 0x21f0
jmp 0xf0a8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0xf136
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0xf09a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x2120
leaq -0x79(%rbp), %rdi
callq 0x21f0
jmp 0xf136
movq -0x90(%rbp), %rdi
movl (%rdi), %eax
movl %eax, -0xc4(%rbp)
addq $0xa8, %rdi
movl -0x38(%rbp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, -0x38(%rbp)
movl %eax, %eax
movl %eax, %esi
callq 0x105a0
movl -0xc4(%rbp), %edi
movq %rax, %rdx
movl $0x80082407, %esi       # imm = 0x80082407
movb $0x0, %al
callq 0x2240
cmpl $-0x1, -0x24(%rbp)
jne 0xf0f9
movq -0x90(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x24(%rbp)
jmp 0xf0fb
leaq -0x48(%rbp), %rdi
callq 0x105c0
jmp 0xefaf
movq -0x90(%rbp), %rax
movq %rax, %rdi
addq $0x90, %rdi
movq 0x88(%rax), %rax
leaq 0x1(%rax,%rax), %rsi
callq 0x102f0
jmp 0xf12d
addq $0xd0, %rsp
popq %rbp
retq
movq -0x88(%rbp), %rdi
callq 0xd230
movq -0xb8(%rbp), %rdi
callq 0xd230
movq -0x30(%rbp), %rdi
callq 0x22e0
nopw (%rax,%rax)