// File: /workspace/github_cpp_makefile_star2_O3/sid1607[P]avx2-merge-sort/merge_sort.cpp
// Function: merge_sort(int*, int*, unsigned long)
std::pair<int *, int *> merge_sort(int *a, int *b, size_t len) {
    __m256i rows[SIMD_SIZE];
  // if (len%64!=0) {
  //   // add padding
  //   auto i = a.size();
  //   auto end = ((i+64)/64)*64;
  //   while (i<end) {
  //     a.push_back(INT_MAX);
  //     i++;
  //   }
  //   // adjust b's size as well
  //   b.resize(a.size());
  // }

  assert(len%64 == 0);
  // assert(b.size() == a.size());

  for (size_t i=0; i < len; i+=SORT_SIZE) {
    for (int j=0; j<SORT_SIZE/SIMD_SIZE; j++) {
      rows[j] = load_reg256(&a[i+j*SIMD_SIZE]);
    }
    sort64(rows);
    for (int j=0; j<SORT_SIZE/SIMD_SIZE; j++) {
      store_reg256(&a[i+j*SIMD_SIZE], rows[j]);
    }
  }

  return merge(a, b, len);
}

// Assembly:
pushq %rax
testb $0x3f, %dl
jne 0x2aab
testq %rdx, %rdx
je 0x2aa2
leaq -0x1(%rdx), %rax
shrq $0x6, %rax
incq %rax
leaq 0xe0(%rdi), %rcx
vmovdqa -0xe0(%rcx), %ymm0
vmovdqa -0xc0(%rcx), %ymm1
vmovdqa -0xa0(%rcx), %ymm2
vmovdqa -0x80(%rcx), %ymm3
vmovdqa -0x60(%rcx), %ymm4
vmovdqa -0x40(%rcx), %ymm5
vmovdqa -0x20(%rcx), %ymm6
vmovdqa (%rcx), %ymm7
vpminsd %ymm1, %ymm0, %ymm8
vpmaxsd %ymm1, %ymm0, %ymm0
vpminsd %ymm3, %ymm2, %ymm1
vpmaxsd %ymm3, %ymm2, %ymm2
vpminsd %ymm5, %ymm4, %ymm3
vpmaxsd %ymm5, %ymm4, %ymm4
vpminsd %ymm7, %ymm6, %ymm5
vpmaxsd %ymm7, %ymm6, %ymm6
vpminsd %ymm1, %ymm8, %ymm7
vpmaxsd %ymm1, %ymm8, %ymm1
vpminsd %ymm2, %ymm0, %ymm8
vpmaxsd %ymm2, %ymm0, %ymm0
vpminsd %ymm5, %ymm3, %ymm2
vpmaxsd %ymm5, %ymm3, %ymm3
vpminsd %ymm6, %ymm4, %ymm5
vpmaxsd %ymm6, %ymm4, %ymm4
vpminsd %ymm1, %ymm8, %ymm6
vpmaxsd %ymm1, %ymm8, %ymm1
vpminsd %ymm2, %ymm7, %ymm8
vpmaxsd %ymm2, %ymm7, %ymm2
vpminsd %ymm3, %ymm5, %ymm7
vpmaxsd %ymm3, %ymm5, %ymm3
vpminsd %ymm4, %ymm0, %ymm5
vpmaxsd %ymm4, %ymm0, %ymm0
vpminsd %ymm7, %ymm6, %ymm4
vpmaxsd %ymm7, %ymm6, %ymm6
vpminsd %ymm3, %ymm1, %ymm7
vpmaxsd %ymm3, %ymm1, %ymm1
vpminsd %ymm2, %ymm4, %ymm3
vpmaxsd %ymm2, %ymm4, %ymm2
vpminsd %ymm1, %ymm5, %ymm4
vpmaxsd %ymm1, %ymm5, %ymm1
vpminsd %ymm2, %ymm7, %ymm5
vpmaxsd %ymm2, %ymm7, %ymm2
vpminsd %ymm6, %ymm4, %ymm7
vpmaxsd %ymm6, %ymm4, %ymm4
vpminsd %ymm2, %ymm7, %ymm6
vpmaxsd %ymm2, %ymm7, %ymm2
vpunpckldq %ymm3, %ymm8, %ymm7 # ymm7 = ymm8[0],ymm3[0],ymm8[1],ymm3[1],ymm8[4],ymm3[4],ymm8[5],ymm3[5]
vpunpckhdq %ymm3, %ymm8, %ymm3 # ymm3 = ymm8[2],ymm3[2],ymm8[3],ymm3[3],ymm8[6],ymm3[6],ymm8[7],ymm3[7]
vpunpckldq %ymm6, %ymm5, %ymm8 # ymm8 = ymm5[0],ymm6[0],ymm5[1],ymm6[1],ymm5[4],ymm6[4],ymm5[5],ymm6[5]
vpunpckhdq %ymm6, %ymm5, %ymm5 # ymm5 = ymm5[2],ymm6[2],ymm5[3],ymm6[3],ymm5[6],ymm6[6],ymm5[7],ymm6[7]
vpunpckldq %ymm4, %ymm2, %ymm6 # ymm6 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[4],ymm4[4],ymm2[5],ymm4[5]
vpunpckhdq %ymm4, %ymm2, %ymm2 # ymm2 = ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[6],ymm4[6],ymm2[7],ymm4[7]
vpunpckldq %ymm0, %ymm1, %ymm4 # ymm4 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
vpunpckhdq %ymm0, %ymm1, %ymm0 # ymm0 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
vpunpcklqdq %ymm8, %ymm7, %ymm1 # ymm1 = ymm7[0],ymm8[0],ymm7[2],ymm8[2]
vpunpckhqdq %ymm8, %ymm7, %ymm7 # ymm7 = ymm7[1],ymm8[1],ymm7[3],ymm8[3]
vpunpcklqdq %ymm5, %ymm3, %ymm8 # ymm8 = ymm3[0],ymm5[0],ymm3[2],ymm5[2]
vpunpckhqdq %ymm5, %ymm3, %ymm3 # ymm3 = ymm3[1],ymm5[1],ymm3[3],ymm5[3]
vpunpcklqdq %ymm4, %ymm6, %ymm5 # ymm5 = ymm6[0],ymm4[0],ymm6[2],ymm4[2]
vpunpckhqdq %ymm4, %ymm6, %ymm4 # ymm4 = ymm6[1],ymm4[1],ymm6[3],ymm4[3]
vpunpcklqdq %ymm0, %ymm2, %ymm6 # ymm6 = ymm2[0],ymm0[0],ymm2[2],ymm0[2]
vpunpckhqdq %ymm0, %ymm2, %ymm0 # ymm0 = ymm2[1],ymm0[1],ymm2[3],ymm0[3]
vinserti128 $0x1, %xmm5, %ymm1, %ymm2
vinserti128 $0x1, %xmm4, %ymm7, %ymm9
vinserti128 $0x1, %xmm6, %ymm8, %ymm10
vinserti128 $0x1, %xmm0, %ymm3, %ymm11
vperm2i128 $0x31, %ymm5, %ymm1, %ymm1 # ymm1 = ymm1[2,3],ymm5[2,3]
vperm2i128 $0x31, %ymm4, %ymm7, %ymm4 # ymm4 = ymm7[2,3],ymm4[2,3]
vperm2i128 $0x31, %ymm6, %ymm8, %ymm5 # ymm5 = ymm8[2,3],ymm6[2,3]
vperm2i128 $0x31, %ymm0, %ymm3, %ymm0 # ymm0 = ymm3[2,3],ymm0[2,3]
vmovdqa %ymm2, -0xe0(%rcx)
vmovdqa %ymm9, -0xc0(%rcx)
vmovdqa %ymm10, -0xa0(%rcx)
vmovdqa %ymm11, -0x80(%rcx)
vmovdqa %ymm1, -0x60(%rcx)
vmovdqa %ymm4, -0x40(%rcx)
vmovdqa %ymm5, -0x20(%rcx)
vmovdqa %ymm0, (%rcx)
addq $0x100, %rcx            # imm = 0x100
decq %rax
jne 0x2902
popq %rax
vzeroupper
jmp 0x286b
leaq 0x15ae(%rip), %rdi      # 0x4060
leaq 0x15b3(%rip), %rsi      # 0x406c
leaq 0x15bb(%rip), %rcx      # 0x407b
movl $0x128, %edx            # imm = 0x128
callq 0x20a0
nop