// File: mh0fm4[P]SCDC/src/lib/redirect/redirect/redirect_call.cc
// Function: void consume_output_blocks<float>(_redirect_call_t*, void*, long, long, long)
static void consume_output_blocks(redirect_call_t *rc, void *buf, rdint_t count, rdint_t size, rdint_t stride)
{
  char *src = static_cast<char *>(SCDC_DATASET_INOUT_BUF_PTR(rc->output));
  char *dst = static_cast<char *>(buf);

  rdint_t stride_skip = (stride - size) * sizeof(T);
  rdint_t size_left = size * sizeof(T);

  do
  {
do_block:
    rdint_t t = z_min(size_left, SCDC_DATASET_INOUT_BUF_CURRENT(rc->output) - rc->output_offset);
    if (dst != src + rc->output_offset) memcpy(dst, src + rc->output_offset, t);
    rc->output_offset += t;
    dst += t;
    size_left -= t;

    /* block done? */
    if (size_left <= 0)
    {
      dst += stride_skip;
      size_left = size * sizeof(T);
      --count;
    }

    /* all blocks done? */
    if (count <= 0) break;

    /* data left for next block? */
    if (rc->output_offset < SCDC_DATASET_INOUT_BUF_CURRENT(rc->output)) goto do_block;

    /* have no next or next fails? */
    if (rc->output->next == 0 || rc->output->next(rc->output, 0) != SCDC_SUCCESS) break;

    src = static_cast<char *>(SCDC_DATASET_INOUT_BUF_PTR(rc->output));
    rc->output_offset = 0;

  } while (1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0xb10(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
shlq $0x2, %rax
movq %rax, -0x40(%rbp)
movq -0x20(%rbp), %rax
shlq $0x2, %rax
movq %rax, -0x48(%rbp)
jmp 0x193f5
movq -0x48(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0xb10(%rcx), %rcx
movq 0x20(%rcx), %rcx
movq -0x8(%rbp), %rdx
movslq 0xb04(%rdx), %rdx
subq %rdx, %rcx
cmpq %rcx, %rax
jge 0x19425
movq -0x48(%rbp), %rax
movq %rax, -0x58(%rbp)
jmp 0x19446
movq -0x8(%rbp), %rax
movq 0xb10(%rax), %rax
movq 0x20(%rax), %rax
movq -0x8(%rbp), %rcx
movslq 0xb04(%rcx), %rcx
subq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x38(%rbp), %rax
movq -0x30(%rbp), %rcx
movq -0x8(%rbp), %rdx
movslq 0xb04(%rdx), %rdx
addq %rdx, %rcx
cmpq %rcx, %rax
je 0x19488
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x8(%rbp), %rax
movslq 0xb04(%rax), %rax
addq %rax, %rsi
movq -0x50(%rbp), %rdx
callq 0xc530
movq -0x50(%rbp), %rdx
movq -0x8(%rbp), %rax
movslq 0xb04(%rax), %rcx
addq %rdx, %rcx
movl %ecx, 0xb04(%rax)
movq -0x50(%rbp), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x50(%rbp), %rcx
movq -0x48(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x48(%rbp)
jg 0x194e6
movq -0x40(%rbp), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
shlq $0x2, %rax
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jg 0x194f2
jmp 0x1957a
movq -0x8(%rbp), %rax
movslq 0xb04(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0xb10(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jge 0x19513
jmp 0x193f5
movq -0x8(%rbp), %rax
movq 0xb10(%rax), %rax
cmpq $0x0, 0x38(%rax)
je 0x1954b
movq -0x8(%rbp), %rax
movq 0xb10(%rax), %rax
movq 0x38(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0xb10(%rcx), %rdi
xorl %ecx, %ecx
movl %ecx, %esi
callq *%rax
cmpq $0x1, %rax
je 0x1954d
jmp 0x1957a
movq -0x8(%rbp), %rax
movq 0xb10(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movl $0x0, 0xb04(%rax)
movb $0x1, %al
testb $0x1, %al
jne 0x193f3
jmp 0x1957a
addq $0x60, %rsp
popq %rbp
retq