// File: kobanium[P]Ray/src/board/SearchBoard.cpp
// Function: MergeStones(search_game_info_t*, int, int)
static void
MergeStones( search_game_info_t *game, const int id, const int rm_id )
{
  string_t *string = game->string;
  int *string_next = game->string_next;
  int *string_id = game->string_id;
  int dst_pos = string[id].origin, src_pos = string[rm_id].origin;
  int pos;

  // 結合元srcの連の始点が結合先dstの連の始点よりも
  // 前にあるときの特殊処理
  if (dst_pos > src_pos) {
    // srcの次の座標を保持
    pos = string_next[src_pos];
    // 連の繋がりの更新
    string_next[src_pos] = dst_pos;
    // 連のIDの更新
    string_id[src_pos] = id;
    // 連の始点を更新
    string[id].origin = src_pos;
    // 探索開始点を更新
    dst_pos = string[id].origin;
    // 1つ先の座標を代入
    src_pos = pos;
  }

  while (src_pos != STRING_END) {
    string_id[src_pos] = id;
    pos = string_next[src_pos];
    // 該当する場所を見つけるまで進める
    while (string_next[dst_pos] < src_pos) {
      dst_pos = string_next[dst_pos];
    }
    // 呼吸点の座標を挿入する
    string_next[src_pos] = string_next[dst_pos];
    string_next[dst_pos] = src_pos;
    // 次の座標へ移動
    src_pos = pos;
  }

  string[id].size += string[rm_id].size;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
movq -0x8(%rbp), %rax
addq $0x95f0, %rax           # imm = 0x95F0
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
addq $0x961d0, %rax          # imm = 0x961D0
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rax
addq $0x956f0, %rax          # imm = 0x956F0
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movslq -0xc(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %eax
movl %eax, -0x2c(%rbp)
movq -0x18(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %eax
movl %eax, -0x30(%rbp)
movl -0x2c(%rbp), %eax
cmpl -0x30(%rbp), %eax
jle 0x99dec
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movl %eax, -0x34(%rbp)
movl -0x2c(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movl -0xc(%rbp), %edx
movq -0x28(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movl -0x30(%rbp), %ecx
movq -0x18(%rbp), %rax
movslq -0xc(%rbp), %rdx
imulq $0x7c8, %rdx, %rdx      # imm = 0x7C8
addq %rdx, %rax
movl %ecx, 0x7bc(%rax)
movq -0x18(%rbp), %rax
movslq -0xc(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %eax
movl %eax, -0x2c(%rbp)
movl -0x34(%rbp), %eax
movl %eax, -0x30(%rbp)
jmp 0x99dee
cmpl $0x2b7, -0x30(%rbp)     # imm = 0x2B7
je 0x99e5f
movl -0xc(%rbp), %edx
movq -0x28(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movl %eax, -0x34(%rbp)
movq -0x20(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movl (%rax,%rcx,4), %eax
cmpl -0x30(%rbp), %eax
jge 0x99e33
movq -0x20(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movl %eax, -0x2c(%rbp)
jmp 0x99e13
movq -0x20(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movl (%rax,%rcx,4), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movl -0x30(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movl -0x34(%rbp), %eax
movl %eax, -0x30(%rbp)
jmp 0x99dee
movq -0x18(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7c0(%rax), %ecx
movq -0x18(%rbp), %rax
movslq -0xc(%rbp), %rdx
imulq $0x7c8, %rdx, %rdx      # imm = 0x7C8
addq %rdx, %rax
addl 0x7c0(%rax), %ecx
movl %ecx, 0x7c0(%rax)
popq %rbp
retq
nopw (%rax,%rax)