// File: /workspace/github_c_makefile_star2_O0/thiagok00[P]INF1715-Compilers/TabelaSimbolos.c
// Function: tipa_comando
static void tipa_comando(Simbolo*s, CMD *cmd, int nivelEscopo) {
  switch (cmd->tag) {
    case CMD_BLOCK:
      s = tipa_bloco(s,cmd->u.bloco,nivelEscopo+1);
    break;
    case CMD_ATR:
      checa_tipo_cmdatr(s,cmd,nivelEscopo);
    break;
    case CMD_WHILE:
      checa_tipo_expcond(s,cmd->u.cmdwhile.exp,nivelEscopo);
      s = tipa_bloco(s,cmd->u.cmdwhile.bloco,nivelEscopo+1);
    break;
    case CMD_IF:
      checa_tipo_expcond(s,cmd->u.cmdif.exp,nivelEscopo);
      s = tipa_bloco(s,cmd->u.cmdif.bloco,nivelEscopo+1);
    break;
    case CMD_IFELSE:
      checa_tipo_expcond(s,cmd->u.cmdifelse.exp,nivelEscopo);
      s = tipa_bloco(s,cmd->u.cmdifelse.blocoif,nivelEscopo+1);
      s = tipa_bloco(s,cmd->u.cmdifelse.blocoelse,nivelEscopo+1);
    break;
    case CMD_RETURN:
      //TODO checa tipo
    case CMD_PRINT:
      tipa_expressao(s,cmd->u.e,nivelEscopo);
      if(cmd->u.e->tipo->tipo_base != bChar && cmd->u.e->tipo->tag != array) {
        if(cmd->u.e->tipo->tipo_base != bInt && cmd->u.e->tipo->tipo_base != bFloat){
          printf("[Erro] tipo inesperado em print :%s\n",getStringTipo(cmd->u.e->tipo));
          exit(1);
        }
    }
    break;
    case CMD_CHAMADA:
      tipa_expressao(s,cmd->u.e,nivelEscopo);
    break;
    default:
    break;
  }

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x20(%rbp)
subq $0x9, %rax
ja 0x5fd8
movq -0x20(%rbp), %rax
leaq 0x479e(%rip), %rcx      # 0xa5e0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
addl $0x1, %edx
callq 0x5c70
movq %rax, -0x8(%rbp)
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movl -0x14(%rbp), %edx
callq 0x6040
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x62a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movl -0x14(%rbp), %edx
addl $0x1, %edx
callq 0x5c70
movq %rax, -0x8(%rbp)
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x62a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movl -0x14(%rbp), %edx
addl $0x1, %edx
callq 0x5c70
movq %rax, -0x8(%rbp)
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x62a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movl -0x14(%rbp), %edx
addl $0x1, %edx
callq 0x5c70
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
movl -0x14(%rbp), %edx
addl $0x1, %edx
callq 0x5c70
movq %rax, -0x8(%rbp)
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x1, 0x4(%rax)
je 0x5fc0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x1, (%rax)
je 0x5fc0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x2, 0x4(%rax)
je 0x5fbe
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x3, 0x4(%rax)
je 0x5fbe
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, %rsi
leaq 0x4739(%rip), %rdi      # 0xa6e6
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
jmp 0x5fc0
jmp 0x5fda
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
jmp 0x5fda
jmp 0x5fda
addq $0x20, %rsp
popq %rbp
retq