// File: /workspace/github_c_makefile_star2_O2/genometools[P]genometools/src/mgth/mg_compute_gene_prediction.c
// Function: merge_array
static void merge_array(RegionStruct **regionmatrix,
                        GtArray * real_from_ar,
                        GtArray * real_to_ar,
                        GtArray * real_fromtmp,
                        GtArray * real_totmp,
                        GtUword real_index,
                        GtUword tmp_index,
                        short real_frame, unsigned short row_index)
{
  GtUword real_from,
    real_to,
    tmp_from,
    tmp_to;

  /* Fall 1: Eintraege im GtArray des realen Frames sind abgearbeitet,
     Eintraege im tmp-Array noch nicht */
  if (!(real_index < gt_array_size(regionmatrix[real_frame][0].from))
      && tmp_index < gt_array_size(real_fromtmp))
  {
    /* Bereichsgrenzen des Realtmp-Arrays - from/to-Werte */
    real_from = *(GtUword *) gt_array_get(real_fromtmp, tmp_index);
    real_to = *(GtUword *) gt_array_get(real_totmp, tmp_index);

    /* solange sich noch Eintraege im realtmp-Array befinden */
    while (tmp_index < gt_array_size(real_fromtmp))
    {
      /* hinzufuegen der Bereichsgrenzen */
      gt_array_add(real_from_ar, real_from);
      gt_array_add(real_to_ar, real_to);

      tmp_index++;

      /* nur wenn noch weitere Eintraege vorhanden sind, werden die
         naechsten Bereichsgrenzen ausgelesen */
      if (tmp_index < gt_array_size(real_fromtmp))
      {
        real_from = *(GtUword *) gt_array_get(real_fromtmp, tmp_index);
        real_to = *(GtUword *) gt_array_get(real_totmp, tmp_index);
      }
    }
  }
  /* Fall 2: Eintraege im GtArray des realen Frames sind noch nicht
     abgearbeitet, Eintraege im tmp-Array abgearbeitet */
  else if (!(tmp_index < gt_array_size(real_fromtmp))
           && real_index < gt_array_size(regionmatrix[real_frame][0].from))
  {
    /* Bereichsgrenzen des Real-Arrays - from/to-Werte */
    tmp_from =
      *(GtUword *) gt_array_get(regionmatrix[real_frame][0].from,
                                   real_index);
    tmp_to =
      *(GtUword *) gt_array_get(regionmatrix[real_frame][0].to,
                                   real_index);

    /* solange sich noch Eintraege im real-Array befinden */
    while (real_index < gt_array_size(regionmatrix[real_frame][0].from))
    {
      /* hinzufuegen der Bereichsgrenzen */
      gt_array_add(real_from_ar, tmp_from);
      gt_array_add(real_to_ar, tmp_to);

      real_index++;

      /* nur wenn noch weitere Eintraege vorhanden sind, werden die
         naechsten Bereichsgrenzen ausgelesen */
      if (real_index < gt_array_size(regionmatrix[real_frame][0].from))
      {
        tmp_from =
          *(GtUword *) gt_array_get(regionmatrix[real_frame][0].from,
                                       real_index);
        tmp_to =
          *(GtUword *) gt_array_get(regionmatrix[real_frame][0].to,
                                       real_index);
      }
    }
  }
  /* Fall 3: Es sind noch Eintraege in beiden GtArrays vorhanden */
  else if ((tmp_index < gt_array_size(real_fromtmp))
           && real_index < gt_array_size(regionmatrix[real_frame][0].from))
  {
    /* Bereichsgrenzen des Realtmp- und des real-Arrays - from/to-Werte */
    tmp_from =
      *(GtUword *) gt_array_get(regionmatrix[real_frame][0].from,
                                   real_index);
    tmp_to =
      *(GtUword *) gt_array_get(regionmatrix[real_frame][0].to,
                                   real_index);
    real_from = *(GtUword *) gt_array_get(real_fromtmp, tmp_index);
    real_to = *(GtUword *) gt_array_get(real_totmp, tmp_index);

    /* Fall: realtmp-Abschnitt liegt vor dem real_frame Abschnitt */
    if (real_from < tmp_from)
    {
      /* solange es noch Eintraege gibt, die vor dem real_frame-Abschnitt
         liegen... */
      while (tmp_index < gt_array_size(real_fromtmp) && real_from < tmp_from)
      {
        /* ... werden die bereichsgrenzen Eingetragen... */
        gt_array_add(real_from_ar, real_from);
        gt_array_add(real_to_ar, real_to);

        tmp_index++;

        /* und der naechste realtmp-Eintrag eingelesen */
        if (tmp_index < gt_array_size(real_fromtmp))
        {
          real_from =
            *(GtUword *) gt_array_get(real_fromtmp, tmp_index);
          real_to = *(GtUword *) gt_array_get(real_totmp, tmp_index);
        }
      }
      /* rekursiver Aufruf der Sortierfunktion unter Beruecksichtigung der
         neu Eingetragenen Abschnitte */
      merge_array(regionmatrix,
                  real_from_ar,
                  real_to_ar,
                  real_fromtmp,
                  real_totmp,
                  real_index, tmp_index, real_frame, row_index);
    }
    /* real_frame- vor dem realtmp-Abschnitt */
    else if (tmp_from < real_from)
    {
      /* solange es noch Eintraege gibt, die vor dem realtmp-Abschnitt
         liegen... */
      while (real_index < gt_array_size(regionmatrix[real_frame][0].from)
             && tmp_from < real_from)
      {
        /* ... werden die bereichsgrenzen Eingetragen... */
        gt_array_add(real_from_ar, tmp_from);
        gt_array_add(real_to_ar, tmp_to);

        real_index++;

        /* und der naechste real_frame-Eintrag eingelesen */
        if (real_index < gt_array_size(regionmatrix[real_frame][0].from))
        {
          tmp_from =
            *(GtUword *) gt_array_get(regionmatrix[real_frame][0].from,
                                         real_index);
          tmp_to =
            *(GtUword *) gt_array_get(regionmatrix[real_frame][0].to,
                                         real_index);
        }
      }
      /* rekursiver Aufruf der Sortierfunktion unter Beruecksichtigung der
         neu Eingetragenen Abschnitte */
      merge_array(regionmatrix,
                  real_from_ar,
                  real_to_ar,
                  real_fromtmp,
                  real_totmp,
                  real_index, tmp_index, real_frame, row_index);
    }
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %r9, %r15
movq %r8, 0x8(%rsp)
movq %rcx, %rbp
movq %rdx, 0x10(%rsp)
movq %rsi, %r14
movq %rdi, %r13
movq 0x80(%rsp), %r12
movswq 0x88(%rsp), %rbx
movq (%rdi,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %r15, %rax
ja 0x2d0908
movq %rbp, %rdi
callq 0x586a4
cmpq %r12, %rax
jbe 0x2d0908
movq %rbp, %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
leaq 0x18(%rsp), %r15
movq %rax, (%r15)
movq 0x8(%rsp), %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
leaq 0x28(%rsp), %r13
movq %rax, (%r13)
pushq $0x8
popq %rbx
movq %rbp, %rdi
callq 0x586a4
cmpq %rax, %r12
jae 0x2d0bbb
movq %r14, %rdi
movq %r15, %rsi
movq %rbx, %rdx
callq 0x5851d
movq 0x10(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0x5851d
incq %r12
movq %rbp, %rdi
callq 0x586a4
cmpq %rax, %r12
jae 0x2d089f
movq %rbp, %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x8(%rsp), %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x2d089f
movq %rbp, %rdi
callq 0x586a4
cmpq %r12, %rax
ja 0x2d09e4
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %r15, %rax
jbe 0x2d09e4
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rsp, %rcx
movq %rax, (%rcx)
movq (%r13,%rbx,8), %rax
movq 0x8(%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
leaq 0x20(%rsp), %rbp
movq %rax, (%rbp)
pushq $0x8
popq %r12
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %rax, %r15
jae 0x2d0bbb
movq %r14, %rdi
movq %rsp, %rsi
movq %r12, %rdx
callq 0x5851d
movq 0x10(%rsp), %rdi
movq %rbp, %rsi
movq %r12, %rdx
callq 0x5851d
incq %r15
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %rax, %r15
jae 0x2d0969
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, (%rsp)
movq (%r13,%rbx,8), %rax
movq 0x8(%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x20(%rsp)
jmp 0x2d0969
movq %rbp, %rdi
callq 0x586a4
cmpq %r12, %rax
jbe 0x2d0bbb
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %r15, %rax
jbe 0x2d0bbb
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x38(%rsp)
movq %rax, (%rsp)
movq (%r13,%rbx,8), %rax
movq 0x8(%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq %rbp, %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x30(%rsp)
movq %rax, 0x18(%rsp)
movq 0x8(%rsp), %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x30(%rsp), %rax
cmpq 0x38(%rsp), %rax
jae 0x2d0af8
pushq $0x8
popq %rbx
movq %rbp, %rdi
callq 0x586a4
cmpq %rax, %r12
jae 0x2d0b93
movq (%rsp), %rax
cmpq %rax, 0x18(%rsp)
jae 0x2d0b93
movq %r14, %rdi
leaq 0x18(%rsp), %rsi
movq %rbx, %rdx
callq 0x5851d
movq 0x10(%rsp), %rdi
leaq 0x28(%rsp), %rsi
movq %rbx, %rdx
callq 0x5851d
incq %r12
movq %rbp, %rdi
callq 0x586a4
cmpq %rax, %r12
jae 0x2d0a7c
movq %rbp, %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x8(%rsp), %rdi
movq %r12, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x28(%rsp)
jmp 0x2d0a7c
jbe 0x2d0bbb
movq %r14, 0x40(%rsp)
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %rax, %r15
jae 0x2d0b93
movq 0x18(%rsp), %rax
cmpq %rax, (%rsp)
jae 0x2d0b93
movq %r14, %rdi
movq %rsp, %rsi
pushq $0x8
popq %r14
movq %r14, %rdx
callq 0x5851d
movq 0x10(%rsp), %rdi
leaq 0x20(%rsp), %rsi
movq %r14, %rdx
callq 0x5851d
incq %r15
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
callq 0x586a4
cmpq %rax, %r15
jae 0x2d0b89
movq (%r13,%rbx,8), %rax
movq (%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, (%rsp)
movq (%r13,%rbx,8), %rax
movq 0x8(%rax), %rdi
movq %r15, %rsi
callq 0x581aa
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x40(%rsp), %r14
jmp 0x2d0b03
movswl 0x88(%rsp), %eax
movq %r13, %rdi
movq %r14, %rsi
movq 0x10(%rsp), %rdx
movq %rbp, %rcx
movq 0x8(%rsp), %r8
movq %r15, %r9
pushq %rax
pushq %r12
callq 0x2d0812
popq %rax
popq %rcx
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop