// File: /workspace/github_c_makefile_star2_O0/wuxb45[P]SLB/ibkvser.c
// Function: batch_process
static u64
batch_process(u8 * const rbuf, u8 * const sbuf, const u64 bufsize, struct kvmap_api * const api)
{
  u8 * rp = rbuf;
  u8 * sp = sbuf;
  u8 * rprefetch = rp;
  u8 * sprefetch = sp;
  u64 batch = 0;
  while (rp[0] != '\0') {
    while ((rp + 64) < rprefetch) {
      __builtin_prefetch(rprefetch, 0, 0);
      rprefetch += 64;
    }
    while ((sp + 64) < sprefetch) {
      __builtin_prefetch(sprefetch, 1, 0);
      sprefetch += 64;
    }
    batch++;
    const char opcode = rp[0];
    sp[0] = rp[0];
    struct kv * const kv =  (typeof(kv))(&(rp[4]));
    struct kv * const out = (typeof(kv))(&(sp[4]));
    rp += 4;
    switch(opcode) {
      case 'G':
        {
          struct kv * const ret = api->get(api->map, kv, out);
          sp[1] = ret ? 'Y' : 'N';
          rp += key_size_align(kv, 4);
          sp += 4;
          if (ret) {
            sp += kv_size_align(ret, 4);
          }
        }
        break;
      case 'P':
        {
          const bool r = api->probe(api->map, kv);
          sp[1] = r ? 'Y' : 'N';
          rp += key_size_align(kv, 4);
          sp += 4;
        }
        break;
      case 'S':
        {
          const bool r = api->set(api->map, kv);
          sp[1] = r ? 'Y' : 'N';
          rp += kv_size_align(kv, 4);
          sp += 4;
        }
        break;
      case 'D':
        {
          const bool r = api->del(api->map, kv);
          sp[1] = r ? 'Y' : 'N';
          rp += key_size_align(kv, 4);
          sp += 4;
        }
        break;
      case 'C':
        {
          api->clean(api->map);
          sp += 4;
        }
        break;
      case 'X': // zero response for shut down
        {
          return 0;
        }
        break;
      default:
        {
          sp += 4;
          return sp - sbuf;
        }
        break;
    }
  }
  sp[0] = '\0';
  sp += 4;
  const u64 respsize = sp - sbuf;
  debug_assert(respsize <= bufsize);
  return respsize;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x30(%rbp), %rax
movzbl (%rax), %eax
cmpl $0x0, %eax
je 0x708f
jmp 0x6df5
movq -0x30(%rbp), %rax
addq $0x40, %rax
cmpq -0x40(%rbp), %rax
jae 0x6e18
movq -0x40(%rbp), %rax
prefetchnta (%rax)
movq -0x40(%rbp), %rax
addq $0x40, %rax
movq %rax, -0x40(%rbp)
jmp 0x6df5
jmp 0x6e1a
movq -0x38(%rbp), %rax
addq $0x40, %rax
cmpq -0x48(%rbp), %rax
jae 0x6e3d
movq -0x48(%rbp), %rax
prefetchw (%rax)
movq -0x48(%rbp), %rax
addq $0x40, %rax
movq %rax, -0x48(%rbp)
jmp 0x6e1a
movq -0x50(%rbp), %rax
incq %rax
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rax
movb (%rax), %al
movb %al, -0x51(%rbp)
movq -0x30(%rbp), %rax
movb (%rax), %cl
movq -0x38(%rbp), %rax
movb %cl, (%rax)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x60(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x68(%rbp)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x30(%rbp)
movsbl -0x51(%rbp), %eax
addl $-0x43, %eax
movl %eax, %ecx
movq %rcx, -0x88(%rbp)
subl $0x15, %eax
ja 0x706d
movq -0x88(%rbp), %rax
leaq 0x1515c(%rip), %rcx     # 0x1c004
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
movq -0x60(%rbp), %rsi
movq -0x68(%rbp), %rdx
callq *%rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rdx
movl $0x4e, %eax
movl $0x59, %ecx
cmpq $0x0, %rdx
cmovnel %ecx, %eax
movb %al, %cl
movq -0x38(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x60(%rbp), %rdi
movl $0x4, %esi
callq 0xdf50
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x70(%rbp)
je 0x6f2b
movq -0x70(%rbp), %rdi
movl $0x4, %esi
callq 0xdeb0
addq -0x38(%rbp), %rax
movq %rax, -0x38(%rbp)
jmp 0x708a
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
movq -0x60(%rbp), %rsi
callq *%rax
andb $0x1, %al
movb %al, -0x71(%rbp)
movb -0x71(%rbp), %dl
movl $0x4e, %eax
movl $0x59, %ecx
testb $0x1, %dl
cmovnel %ecx, %eax
movb %al, %cl
movq -0x38(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x60(%rbp), %rdi
movl $0x4, %esi
callq 0xdf50
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
jmp 0x708a
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
movq -0x60(%rbp), %rsi
callq *%rax
andb $0x1, %al
movb %al, -0x72(%rbp)
movb -0x72(%rbp), %dl
movl $0x4e, %eax
movl $0x59, %ecx
testb $0x1, %dl
cmovnel %ecx, %eax
movb %al, %cl
movq -0x38(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x60(%rbp), %rdi
movl $0x4, %esi
callq 0xdeb0
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
jmp 0x708a
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
movq -0x60(%rbp), %rsi
callq *%rax
andb $0x1, %al
movb %al, -0x73(%rbp)
movb -0x73(%rbp), %dl
movl $0x4e, %eax
movl $0x59, %ecx
testb $0x1, %dl
cmovnel %ecx, %eax
movb %al, %cl
movq -0x38(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x60(%rbp), %rdi
movl $0x4, %esi
callq 0xdf50
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
jmp 0x708a
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
jmp 0x708a
movq $0x0, -0x8(%rbp)
jmp 0x70cf
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x70cf
jmp 0x6de3
movq -0x38(%rbp), %rax
movb $0x0, (%rax)
movq -0x38(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
cmpq -0x20(%rbp), %rax
setbe %al
movzbl %al, %edi
andl $0x1, %edi
callq 0x78f0
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x90, %rsp
popq %rbp
retq
nopl (%rax)