// File: /workspace/github_c_makefile_star2_O0/richarddurbin[P]hash10x/seqhash.c
// Function: moshRCiterator
SeqhashRCiterator *moshRCiterator (Seqhash *sh, char *s, int len)
{
  assert (s && len >= 0) ;
  SeqhashRCiterator *mi = (SeqhashRCiterator*) mycalloc (sizeof(SeqhashRCiterator), 1) ;
  mi->sh = sh ;
  mi->s = s ; mi->sEnd = s + len ;
  mi->hashBuf = new0 (sh->w, U64) ;
  mi->fBuf = new0 (sh->w, BOOL) ;
  if (len < sh->k) { mi->isDone = TRUE ; return mi ; } /* edge case */

  int i ;			/* preinitialise the hashes for the first kmer */
  for (i = 0 ; i < sh->k ; ++i, ++mi->s)
    { mi->h = (mi->h << 2) | *mi->s ;
      mi->hRC = (mi->hRC >> 2) | sh->patternRC[*(mi->s)] ;
    }
  
  U64 hash = hashRC(mi, mi->fBuf) ;
  while ((hash % sh->w) && mi->s < mi->sEnd)
    { hash = advanceHashRC (mi, mi->fBuf) ; ++mi->iMin ; ++mi->s ; }
  if (!(hash % sh->w)) *mi->hashBuf = hash ;
  else mi->isDone = TRUE ;

  return mi ;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl %edx, -0x1c(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x4c92
cmpl $0x0, -0x1c(%rbp)
jl 0x4c92
jmp 0x4cb1
leaq 0x4dcb(%rip), %rdi      # 0x9a64
leaq 0x4dd2(%rip), %rsi      # 0x9a72
movl $0x9c, %edx
leaq 0x4e58(%rip), %rcx      # 0x9b04
callq 0x10c0
movl $0x48, %edi
movl $0x1, %esi
callq 0x82b0
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x18(%rbp), %rcx
movslq -0x1c(%rbp), %rax
addq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rdi
movl $0x8, %esi
callq 0x82b0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rdi
movl $0x1, %esi
callq 0x82b0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x30(%rax)
movl -0x1c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x4d48
movq -0x28(%rbp), %rax
movb $0x1, 0x44(%rax)
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x4e7d
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x4dc1
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rcx
shlq $0x2, %rcx
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movsbq (%rax), %rax
orq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
shrq $0x2, %rcx
movq -0x10(%rbp), %rax
movq -0x28(%rbp), %rdx
movq 0x8(%rdx), %rdx
movsbq (%rdx), %rdx
orq 0x28(%rax,%rdx,8), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x20(%rax)
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
jmp 0x4d4f
movq -0x28(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rsi
callq 0x4820
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
movslq 0x4(%rcx), %rcx
xorl %edx, %edx
divq %rcx
xorl %eax, %eax
cmpq $0x0, %rdx
movb %al, -0x39(%rbp)
je 0x4e08
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x10(%rcx), %rax
setb %al
movb %al, -0x39(%rbp)
movb -0x39(%rbp), %al
testb $0x1, %al
jne 0x4e11
jmp 0x4e45
movq -0x28(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rsi
callq 0x48a0
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movl 0x40(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x40(%rax)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
jmp 0x4dd6
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
movslq 0x4(%rcx), %rcx
xorl %edx, %edx
divq %rcx
cmpq $0x0, %rdx
jne 0x4e6d
movq -0x38(%rbp), %rcx
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rax
movq %rcx, (%rax)
jmp 0x4e75
movq -0x28(%rbp), %rax
movb $0x1, 0x44(%rax)
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)