// File: /workspace/github_cpp_makefile_star2_O1/kobanium[P]Ray/src/mcts/UctSearch.cpp
// Function: ParallelUctSearchPondering(thread_arg_t*)
static void
ParallelUctSearchPondering( thread_arg_t *arg )
{
  const thread_arg_t *targ = (thread_arg_t *)arg;
  const int color = targ->color;
  int winner = 0, interval = CRITICALITY_INTERVAL;
  bool enough_size = true;
  bool use_analysis = targ->lz_analysis_cs > 0 ? true : false;
  game_info_t *game = AllocateGame();
  ray_clock::time_point analysis_timer;

  // スレッドIDが0のスレッドだけ別の処理をする
  // 探索回数が閾値を超える, または探索が打ち切られたらループを抜ける
  if (targ->thread_id == 0) {
    analysis_timer = ray_clock::now();
    do {
      // 探索回数を1回増やす
      IncrementPoCount();
      // 盤面のコピー
      CopyGame(game, targ->game);
      // 1回プレイアウトする
      UctSearch(game, color, mt[targ->thread_id], current_root, winner);
      // ハッシュに余裕があるか確認
      enough_size = CheckRemainingHashSize();
      // OwnerとCriticalityを計算する
      if (GetPoCount() > interval) {
        CalculateOwner(color);
        CalculateCriticality(color);
        interval += CRITICALITY_INTERVAL;
      }

      if (use_analysis &&
          static_cast<int>(100 * GetSpendTime(analysis_timer)) > targ->lz_analysis_cs) {
        analysis_timer = ray_clock::now();
        PrintLeelaZeroAnalyze(&uct_node[current_root]);
      }

    } while (!pondering_stop && enough_size);
  } else {
    do {
      // 探索回数を1回増やす
      IncrementPoCount();
      // 盤面のコピー
      CopyGame(game, targ->game);
      // 1回プレイアウトする
      UctSearch(game, color, mt[targ->thread_id], current_root, winner);
      // ハッシュに余裕があるか確認
      enough_size = CheckRemainingHashSize();
    } while (!pondering_stop && enough_size);
  }

  // メモリの解放
  FreeGame(game);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdi, %rbx
movl 0xc(%rdi), %ebp
movl $0x0, 0xc(%rsp)
movl 0x10(%rdi), %r12d
callq 0x53e60
movq %rax, %r14
cmpl $0x0, 0x8(%rbx)
je 0x4b26d
leaq 0x1aa8f724(%rip), %r12  # 0x1aada940
leaq 0xc(%rsp), %r15
callq 0x4d5dd
movq (%rbx), %rsi
movq %r14, %rdi
callq 0x5432c
movslq 0x8(%rbx), %rax
imulq $0x9c8, %rax, %rdx      # imm = 0x9C8
addq %r12, %rdx
movl 0x1aa8f6f3(%rip), %ecx  # 0x1aada938
movq %r14, %rdi
movl %ebp, %esi
movq %r15, %r8
callq 0x4bdbc
callq 0x5630a
testb %al, %al
je 0x4b35b
testb $0x1, 0x1aab9964(%rip)  # 0x1ab04bca
je 0x4b221
jmp 0x4b35b
movl $0x64, %r15d
callq 0x6070
movq %rax, 0x10(%rsp)
callq 0x4d5dd
movq (%rbx), %rsi
movq %r14, %rdi
callq 0x5432c
movslq 0x8(%rbx), %rax
imulq $0x9c8, %rax, %rdx      # imm = 0x9C8
leaq 0x1aa8f6a1(%rip), %rax  # 0x1aada940
addq %rax, %rdx
movl 0x1aa8f690(%rip), %ecx  # 0x1aada938
movq %r14, %rdi
movl %ebp, %esi
leaq 0xc(%rsp), %r8
callq 0x4bdbc
callq 0x5630a
movl %eax, %r13d
callq 0x4d5b2
cmpl %r15d, %eax
jle 0x4b2db
movl %ebp, %edi
callq 0x4c382
movl %ebp, %edi
callq 0x4c436
addl $0x64, %r15d
testl %r12d, %r12d
jle 0x4b34a
callq 0x6070
subq 0x10(%rsp), %rax
movabsq $0x431bde82d7b634db, %rcx # imm = 0x431BDE82D7B634DB
imulq %rcx
movq %rdx, %rax
shrq $0x3f, %rax
sarq $0x12, %rdx
addq %rax, %rdx
xorps %xmm0, %xmm0
cvtsi2sd %rdx, %xmm0
divsd 0x14c5b(%rip), %xmm0    # 0x5ff70
mulsd 0x11cfb(%rip), %xmm0    # 0x5d018
cvttsd2si %xmm0, %eax
cmpl %eax, 0x10(%rbx)
jge 0x4b34a
callq 0x6070
movq %rax, 0x10(%rsp)
movslq 0x1aa8f601(%rip), %rax  # 0x1aada938
imulq $0x4548, %rax, %rdi     # imm = 0x4548
addq 0x1aa8f5eb(%rip), %rdi  # 0x1aada930
callq 0x1efbb
movb 0x1aab987a(%rip), %al   # 0x1ab04bca
xorb $0x1, %al
testb %al, %r13b
jne 0x4b27d
movq %r14, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x53e7b