// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/extended/tir_stream.c
// Function: gt_tir_find_best_TSD
static void gt_tir_find_best_TSD(TSDinfo *info, GtTIRStream *tir_stream,
                                 TIRPair *tir_pair)
{
  GtUword tsd_length,
                new_left_tir_start = tir_pair->left_tir_start,
                new_right_tir_end = tir_pair->right_tir_end,
                new_cost_left = 0,
                new_cost_right = 0,
                best_cost = ULONG_MAX,
                new_cost = 0,
                optimal_tsd_length = 0,
                i;

  for (i = 0; i < info->TSDs.nextfreeSeed; i++) {
    Seed *tsd = info->TSDs.spaceSeed + i;

    if (tsd->len < tir_stream->min_TSD_length) continue;
    tsd_length = tsd->len;
    if (tsd_length < tir_stream->max_TSD_length) {
      if (tsd->pos1 + tsd_length - 1 < tir_pair->left_tir_start) {
        new_cost_left = tir_pair->left_tir_start
                          - (tsd->pos1 + tsd_length - 1);
      } else {
        new_cost_left = (tsd->pos1 + tsd_length - 1)
                          - tir_pair->left_tir_start;
      }

      if (tir_pair->right_transformed_end < tsd->pos1 + tsd->offset) {
        new_cost_right = (tsd->pos1 + tsd->offset)
                           - tir_pair->right_transformed_end;
      } else {
        new_cost_right = tir_pair->right_transformed_end
                           - (tsd->pos1 + tsd->offset);
      }
      new_cost = new_cost_left + new_cost_right;

      if (new_cost < best_cost) {
        best_cost = new_cost;
        new_left_tir_start = tsd->pos1 + tsd_length;
        new_right_tir_end = tsd->pos1 + tsd->offset - 1;
        optimal_tsd_length = tsd_length;
      }
    }
  }

  if (info->TSDs.nextfreeSeed >= 1) {
    tir_pair->left_tir_start = new_left_tir_start;
    tir_pair->right_transformed_end = new_right_tir_end;
    tir_pair->tsd_length = optimal_tsd_length;
  } else {
    tir_pair->skip = true;
  }

  /* XXX: if adjustment nullifies short TIRs, skip them */
  if (tir_pair->right_transformed_end <= tir_pair->right_transformed_start)
    tir_pair->skip = true;
  if (tir_pair->left_tir_end <= tir_pair->left_tir_start)
    tir_pair->skip = true;
  if (tir_pair->tsd_length == 0)
    tir_pair->skip = true;
}

// Assembly:
movq %rdi, -0x8(%rsp)
movq %rsi, -0x10(%rsp)
movq %rdx, -0x18(%rsp)
movq -0x18(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rsp)
movq -0x18(%rsp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x30(%rsp)
movq $0x0, -0x38(%rsp)
movq $0x0, -0x40(%rsp)
movq $-0x1, -0x48(%rsp)
movq $0x0, -0x50(%rsp)
movq $0x0, -0x58(%rsp)
movq $0x0, -0x60(%rsp)
movq -0x60(%rsp), %rax
movq -0x8(%rsp), %rcx
cmpq 0x20(%rcx), %rax
jae 0x1f2b50
movq -0x8(%rsp), %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x60(%rsp), %rcx
addq %rcx, %rax
movq %rax, -0x68(%rsp)
movq -0x68(%rsp), %rax
movq 0x18(%rax), %rax
movq -0x10(%rsp), %rcx
cmpq 0x108(%rcx), %rax
jae 0x1f29f8
jmp 0x1f2b3d
movq -0x68(%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x20(%rsp)
movq -0x20(%rsp), %rax
movq -0x10(%rsp), %rcx
cmpq 0x110(%rcx), %rax
jae 0x1f2b3b
movq -0x68(%rsp), %rax
movq (%rax), %rax
addq -0x20(%rsp), %rax
subq $0x1, %rax
movq -0x18(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x1f2a5d
movq -0x18(%rsp), %rax
movq 0x8(%rax), %rax
movq -0x68(%rsp), %rcx
movq (%rcx), %rcx
addq -0x20(%rsp), %rcx
subq $0x1, %rcx
subq %rcx, %rax
movq %rax, -0x38(%rsp)
jmp 0x1f2a7c
movq -0x68(%rsp), %rax
movq (%rax), %rax
addq -0x20(%rsp), %rax
subq $0x1, %rax
movq -0x18(%rsp), %rcx
subq 0x8(%rcx), %rax
movq %rax, -0x38(%rsp)
movq -0x18(%rsp), %rax
movq 0x48(%rax), %rax
movq -0x68(%rsp), %rcx
movq (%rcx), %rcx
movq -0x68(%rsp), %rdx
addq 0x10(%rdx), %rcx
cmpq %rcx, %rax
jae 0x1f2abc
movq -0x68(%rsp), %rax
movq (%rax), %rax
movq -0x68(%rsp), %rcx
addq 0x10(%rcx), %rax
movq -0x18(%rsp), %rcx
subq 0x48(%rcx), %rax
movq %rax, -0x40(%rsp)
jmp 0x1f2ade
movq -0x18(%rsp), %rax
movq 0x48(%rax), %rax
movq -0x68(%rsp), %rcx
movq (%rcx), %rcx
movq -0x68(%rsp), %rdx
addq 0x10(%rdx), %rcx
subq %rcx, %rax
movq %rax, -0x40(%rsp)
movq -0x38(%rsp), %rax
addq -0x40(%rsp), %rax
movq %rax, -0x50(%rsp)
movq -0x50(%rsp), %rax
cmpq -0x48(%rsp), %rax
jae 0x1f2b39
movq -0x50(%rsp), %rax
movq %rax, -0x48(%rsp)
movq -0x68(%rsp), %rax
movq (%rax), %rax
addq -0x20(%rsp), %rax
movq %rax, -0x28(%rsp)
movq -0x68(%rsp), %rax
movq (%rax), %rax
movq -0x68(%rsp), %rcx
addq 0x10(%rcx), %rax
subq $0x1, %rax
movq %rax, -0x30(%rsp)
movq -0x20(%rsp), %rax
movq %rax, -0x58(%rsp)
jmp 0x1f2b3b
jmp 0x1f2b3d
movq -0x60(%rsp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rsp)
jmp 0x1f29b1
movq -0x8(%rsp), %rax
cmpq $0x1, 0x20(%rax)
jb 0x1f2b88
movq -0x28(%rsp), %rcx
movq -0x18(%rsp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rsp), %rcx
movq -0x18(%rsp), %rax
movq %rcx, 0x48(%rax)
movq -0x58(%rsp), %rcx
movq -0x18(%rsp), %rax
movq %rcx, 0x38(%rax)
jmp 0x1f2b91
movq -0x18(%rsp), %rax
movb $0x1, 0x30(%rax)
movq -0x18(%rsp), %rax
movq 0x48(%rax), %rax
movq -0x18(%rsp), %rcx
cmpq 0x40(%rcx), %rax
ja 0x1f2bae
movq -0x18(%rsp), %rax
movb $0x1, 0x30(%rax)
movq -0x18(%rsp), %rax
movq 0x10(%rax), %rax
movq -0x18(%rsp), %rcx
cmpq 0x8(%rcx), %rax
ja 0x1f2bcb
movq -0x18(%rsp), %rax
movb $0x1, 0x30(%rax)
movq -0x18(%rsp), %rax
cmpq $0x0, 0x38(%rax)
jne 0x1f2be0
movq -0x18(%rsp), %rax
movb $0x1, 0x30(%rax)
retq
nopw %cs:(%rax,%rax)