// File: /workspace/github_cpp_makefile_star2_O3/jenniferdr[P]proyectoIAI/basepatrones.cc
// Function: llenarBDPat(bool*, char*, unsigned char*)
void llenarBDPat(bool set[16], int8 inicial[16], unsigned char bd[]) {

  NodoPat* nodo_inicial = new NodoPat();
  memcpy(&(nodo_inicial->estado), inicial, 16*sizeof(int8));
  nodo_inicial->movimientos = 0;
  nodo_inicial->posicion_cero = 0;

  bd[compactar(inicial, set)] = 0;

  std::queue<NodoPat*> cola;
  cola.push(nodo_inicial);

  int nodos_expandidos = 0;

  int movs[4] = {-4,-1,1,4};

  while (!cola.empty()) {
    NodoPat* nodo = cola.front();
    cola.pop();

    nodos_expandidos++;

    for (int i = 0; i < 4; i++) {

      if (puedeMoverse(movs[i], nodo->posicion_cero)) {

	int8 temp[16];
	memcpy(&temp, &(nodo->estado), 16*sizeof(int8));

	char ficha = temp[nodo->posicion_cero + movs[i]];
	temp[nodo->posicion_cero] = ficha;
	temp[nodo->posicion_cero + movs[i]] = 0;
	if ( bd[compactar(temp, set)] == 255 ) {
	  NodoPat* hijo = new NodoPat();
	  memcpy(&(hijo->estado), &temp, 16*sizeof(int8));
	  hijo->posicion_cero = nodo->posicion_cero + movs[i];
	  hijo->movimientos = nodo->movimientos + (ficha > 0 ? 1 : 0);
	  bd[compactar(temp, set)] = hijo->movimientos;
	  cola.push(hijo);
	} else {
	  unsigned char val1 = bd[compactar(temp, set)];
	  unsigned char val2 = nodo->movimientos + (ficha > 0 ? 1 : 0);
	  bd[compactar(temp, set)] = val1 < val2 ? val1 : val2;
	}
      }
    }
    delete nodo;
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movq %rdx, %rbx
movq %rdx, 0x18(%rsp)
movq %rsi, %r12
movq %rdi, %r14
movl $0x12, %edi
callq 0x2180
movq %rax, %r15
movq %rax, 0x80(%rsp)
movups (%r12), %xmm0
movups %xmm0, (%rax)
movw $0x0, 0x10(%rax)
movq %r12, %rdi
movq %r14, 0x70(%rsp)
movq %r14, %rsi
callq 0x3770
cltq
movb $0x0, (%rbx,%rax)
xorps %xmm0, %xmm0
leaq 0x20(%rsp), %r12
movaps %xmm0, 0x40(%r12)
movaps %xmm0, 0x30(%r12)
movaps %xmm0, 0x20(%r12)
movaps %xmm0, 0x10(%r12)
movaps %xmm0, (%r12)
movq %r12, %rdi
xorl %esi, %esi
callq 0x3e5a
movq 0x30(%r12), %rax
movq 0x40(%r12), %rcx
addq $-0x8, %rcx
cmpq %rcx, %rax
je 0x38a0
movq %r15, (%rax)
movq 0x50(%rsp), %rcx
addq $0x8, %rcx
movq %rcx, 0x50(%rsp)
jmp 0x38b7
leaq 0x20(%rsp), %rdi
leaq 0x80(%rsp), %rsi
callq 0x3fd0
movq 0x50(%rsp), %rcx
movq 0x30(%rsp), %rax
cmpq %rax, %rcx
je 0x3a40
leaq 0x2754(%rip), %r12      # 0x6020
movq (%rax), %rbp
movq 0x40(%rsp), %rcx
addq $-0x8, %rcx
cmpq %rcx, %rax
je 0x38e3
addq $0x8, %rax
jmp 0x3915
movq 0x38(%rsp), %rdi
movl $0x200, %esi            # imm = 0x200
callq 0x2190
movq 0x48(%rsp), %rax
leaq 0x8(%rax), %rcx
movq %rcx, 0x48(%rsp)
movq 0x8(%rax), %rax
movq %rax, 0x38(%rsp)
leaq 0x200(%rax), %rcx
movq %rcx, 0x40(%rsp)
movq %rax, 0x30(%rsp)
xorl %r15d, %r15d
movl (%r15,%r12), %r14d
movsbl 0x11(%rbp), %edx
leal (%r14,%rdx), %eax
cmpl $0xf, %eax
ja 0x3a15
movslq %edx, %rcx
cmpb $0xc, %cl
ja 0x3966
movzbl %dl, %edx
movl $0x888, %esi            # imm = 0x888
btl %edx, %esi
jb 0x395c
movl $0x1110, %esi           # imm = 0x1110
btl %edx, %esi
jae 0x3966
cmpq $0x4, %r15
jne 0x3966
jmp 0x3a15
cmpq $0x8, %r15
je 0x3a15
movups (%rbp), %xmm0
movaps %xmm0, (%rsp)
movl %eax, %eax
movb (%rsp,%rax), %bl
movb %bl, (%rsp,%rcx)
movb $0x0, (%rsp,%rax)
movq %rsp, %rdi
movq 0x70(%rsp), %rsi
callq 0x3770
movslq %eax, %r13
movq 0x18(%rsp), %rsi
movb (%rsi,%r13), %al
cmpb $-0x1, %al
je 0x39b0
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movzbl %cl, %ecx
movzbl %al, %edx
cmpb %cl, %al
cmovael %ecx, %edx
movb %dl, (%rsi,%r13)
jmp 0x3a15
movl $0x12, %edi
callq 0x2180
movq %rax, 0x78(%rsp)
movw $0x0, 0x10(%rax)
movaps (%rsp), %xmm0
movups %xmm0, (%rax)
addb 0x11(%rbp), %r14b
movb %r14b, 0x11(%rax)
testb %bl, %bl
setg %cl
addb 0x10(%rbp), %cl
movb %cl, 0x10(%rax)
movq 0x18(%rsp), %rdx
movb %cl, (%rdx,%r13)
movq 0x50(%rsp), %rcx
movq 0x60(%rsp), %rdx
addq $-0x8, %rdx
cmpq %rdx, %rcx
je 0x3a06
movq %rax, (%rcx)
addq $0x8, 0x50(%rsp)
jmp 0x3a15
leaq 0x20(%rsp), %rdi
leaq 0x78(%rsp), %rsi
callq 0x3fd0
addq $0x4, %r15
cmpq $0x10, %r15
jne 0x391d
movl $0x12, %esi
movq %rbp, %rdi
callq 0x2190
movq 0x30(%rsp), %rax
cmpq %rax, 0x50(%rsp)
jne 0x38cc
leaq 0x20(%rsp), %rdi
callq 0x3e02
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x3a5e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x3e02
movq %rbx, %rdi
callq 0x22b0