// File: /workspace/github_cpp_makefile_star2_O1/patmorin[P]rotate/jain.cpp
// Function: main
int main(int argc, char *argv[]) {
	std::uint64_t n;
    if (argc != 2) usage(argv[0]);
	{
	    std::istringstream is_n(argv[1]);
	    is_n >> n;
	}

	const unsigned BLOCK=96;

	std::cout << "Building and filling...";
	std::cout.flush();
	auto *a = new std::uint32_t[n];

	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_inshuffle()...";
	std::cout.flush();
	print_array(a, n);
	auto start = std::chrono::high_resolution_clock::now();
	jain_inshuffle(a, n);
	auto stop =  std::chrono::high_resolution_clock::now();
	std::chrono::duration<double> elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_inshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_inshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_inshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	jain_inshuffle_pf(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_inshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_inshuffle_pf(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_inshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using prime_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	prime_outshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_outshuffle<BLOCK>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_outshuffle_pf()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_outshuffle<BLOCK,true>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using jain_outshuffle()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	jain_outshuffle(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	check_outshuffle_output(a, n);

	std::cout << "Refilling...";
	std::cout.flush();
	std::iota(a, a+n, 0);
	std::cout << "done" << std::endl;

	std::cout << "Permuting using blocked_eytzinger()...";
	std::cout.flush();
	print_array(a, n);
	start = std::chrono::high_resolution_clock::now();
	blocked_eytzinger<BLOCK,true>(a, n);
	stop =  std::chrono::high_resolution_clock::now();
	elapsed = stop - start;
	std::cout << "done (" << elapsed.count() << "s)" << std::endl;
	print_array(a, n);
	// TODO: Check correctness of Eytzinger permutation

}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x1b8, %rsp            # imm = 0x1B8
cmpl $0x2, %edi
jne 0x22e7
movq 0x8(%rsi), %rsi
leaq 0x18(%rsp), %rdi
leaq 0x17(%rsp), %rdx
callq 0x1070
leaq 0x38(%rsp), %rdi
leaq 0x18(%rsp), %rsi
movl $0x8, %edx
callq 0x1170
leaq 0x28(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1358
movq 0x28(%rsp), %rsi
incq %rsi
callq 0x1100
leaq 0x38(%rsp), %rdi
movq %rsp, %rsi
callq 0x1090
movabsq $0x3fffffffffffffff, %r12 # imm = 0x3FFFFFFFFFFFFFFF
movq 0x4c52(%rip), %rsi      # 0x5fc8
leaq 0x38(%rsp), %rdi
callq 0x1130
leaq 0xb0(%rsp), %rdi
callq 0x1060
movq 0x4c3c(%rip), %r14      # 0x5fd0
leaq 0x2da2(%rip), %rsi      # 0x413d
movl $0x17, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %r15
movq %r15, %rax
shrq $0x3e, %rax
leaq (,%r15,4), %rcx
negq %rax
sbbq %rdi, %rdi
orq %rcx, %rdi
callq 0x1030
movq %rax, %rbx
testq %r15, %r15
je 0x1458
addq %r12, %r15
movq %r15, %rcx
andq %r12, %rcx
andl $0xf, %r15d
negq %r15
leaq 0x10(%rcx,%r15), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2d22(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x2d06(%rip), %zmm2 # 0x4110
vpmovsxbq 0x2d04(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2ce2(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x141e
leaq 0x2cf6(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x2cbd(%rip), %rsi      # 0x415a
movl $0x23, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x23de
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2c21(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x2c8a(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x2c6c(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2499
leaq 0x2c1c(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x1608
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2b72(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x2b56(%rip), %zmm2 # 0x4110
vpmovsxbq 0x2b54(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2b32(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x15ce
leaq 0x2b46(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x2b48(%rip), %rsi      # 0x4195
movl $0x24, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x24f3
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2a71(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x2ada(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x2abc(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2499
leaq 0x2a6c(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x17b8
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x29c2(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x29a6(%rip), %zmm2 # 0x4110
vpmovsxbq 0x29a4(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2982(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x177e
leaq 0x2996(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x29bd(%rip), %rsi      # 0x41ba
movl $0x26, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x259e
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x28c1(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x292a(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x290c(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2499
leaq 0x28bc(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x1968
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2812(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x27f6(%rip), %zmm2 # 0x4110
vpmovsxbq 0x27f4(%rip), %zmm3 # 0x4118
vpbroadcastd 0x27d2(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x192e
leaq 0x27e6(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x2834(%rip), %rsi      # 0x41e1
movl $0x27, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x26d3
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2711(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x277a(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x275c(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2499
leaq 0x270c(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x1b18
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2662(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x2646(%rip), %zmm2 # 0x4110
vpmovsxbq 0x2644(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2622(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x1ade
leaq 0x2636(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x26ac(%rip), %rsi      # 0x4209
movl $0x25, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x27fd
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2561(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x25ca(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x25ac(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x289f
leaq 0x255c(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x1cc8
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x24b2(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x2496(%rip), %zmm2 # 0x4110
vpmovsxbq 0x2494(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2472(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x1c8e
leaq 0x2486(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x2522(%rip), %rsi      # 0x422f
movl $0x27, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2904
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x23b1(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x241a(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x23fc(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x289f
leaq 0x23ac(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x1e78
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2302(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x22e6(%rip), %zmm2 # 0x4110
vpmovsxbq 0x22e4(%rip), %zmm3 # 0x4118
vpbroadcastd 0x22c2(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x1e3e
leaq 0x22d6(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x239a(%rip), %rsi      # 0x4257
movl $0x2a, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x29f8
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2201(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x226a(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x224c(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x289f
leaq 0x21fc(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x2028
addq %r12, %rax
movq %rax, %rcx
andq %r12, %rcx
andl $0xf, %eax
negq %rax
leaq 0x10(%rcx,%rax), %rax
vpbroadcastq %rcx, %zmm0
vpmovsxbd 0x2152(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x2136(%rip), %zmm2 # 0x4110
vpmovsxbq 0x2134(%rip), %zmm3 # 0x4118
vpbroadcastd 0x2112(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x1fee
leaq 0x2126(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x2215(%rip), %rsi      # 0x4282
movl $0x24, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2aec
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x2051(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x20ba(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovq 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r15
leaq 0x209c(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r15, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x289f
leaq 0x204c(%rip), %rsi      # 0x4188
movl $0xc, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rax
testq %rax, %rax
je 0x21d5
addq %r12, %rax
andq %rax, %r12
andl $0xf, %eax
negq %rax
leaq 0x10(%r12,%rax), %rax
vpbroadcastq %r12, %zmm0
vpmovsxbd 0x1fa5(%rip), %zmm1 # 0x4120
xorl %ecx, %ecx
vpmovsxbq 0x1f89(%rip), %zmm2 # 0x4110
vpmovsxbq 0x1f87(%rip), %zmm3 # 0x4118
vpbroadcastd 0x1f65(%rip), %zmm4 # 0x4100
vpbroadcastq %rcx, %zmm5
vporq %zmm2, %zmm5, %zmm6
vporq %zmm3, %zmm5, %zmm5
vpcmpleuq %zmm0, %zmm5, %k0
vpcmpleuq %zmm0, %zmm6, %k1
kunpckbw %k0, %k1, %k1
vmovdqu32 %zmm1, (%rbx,%rcx,4) {%k1}
addq $0x10, %rcx
vpaddd %zmm4, %zmm1, %zmm1
cmpq %rcx, %rax
jne 0x219b
leaq 0x1f79(%rip), %rsi      # 0x4155
movl $0x4, %edx
movq %r14, %rdi
vzeroupper
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
leaq 0x208d(%rip), %rsi      # 0x42a7
movl $0x26, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
callq 0x1050
movq %rax, %r15
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x2ba5
callq 0x1050
subq %r15, %rax
vcvtsi2sd %rax, %xmm7, %xmm0
vdivsd 0x1ea4(%rip), %xmm0, %xmm0 # 0x4108
vmovsd %xmm0, 0x8(%rsp)
leaq 0x1f0d(%rip), %rsi      # 0x417e
movl $0x6, %edx
movq %r14, %rdi
callq 0x1110
movq %r14, %rdi
vmovsd 0x8(%rsp), %xmm0
callq 0x1150
movq %rax, %r14
leaq 0x1eef(%rip), %rsi      # 0x4185
movl $0x2, %edx
movq %rax, %rdi
callq 0x1110
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x10e0
movsbl %al, %esi
movq %r14, %rdi
callq 0x1040
movq %rax, %rdi
callq 0x10b0
movq (%rsp), %rsi
movq %rbx, %rdi
callq 0x233d
xorl %eax, %eax
addq $0x1b8, %rsp            # imm = 0x1B8
popq %rbx
popq %r12
popq %r14
popq %r15
retq
movq (%rsi), %rdi
callq 0x12bc
movq %rax, %rbx
movq 0x3ccf(%rip), %rsi      # 0x5fc8
leaq 0x38(%rsp), %rdi
callq 0x1130
leaq 0xb0(%rsp), %rdi
callq 0x1060
jmp 0x2335
movq %rax, %rbx
leaq 0x28(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x2335
movq 0x28(%rsp), %rsi
incq %rsi
callq 0x1100
jmp 0x2335
movq %rax, %rbx
movq %rbx, %rdi
callq 0x1180