// File: /workspace/github_c_makefile_star2_O0/thiagok00[P]INF1715-Compilers/TabelaSimbolos.c
// Function: tipa_expbin
static void tipa_expbin(Simbolo*s, Exp *e, int nivelEscopo) {
  Tipo *nv;
  tipa_expressao(s, e->u.expbin.expesq,nivelEscopo);
  tipa_expressao(s, e->u.expbin.expdir,nivelEscopo);

  if (e->u.expbin.expesq->tipo->tag != base || e->u.expbin.expdir->tipo->tag != base){
    printf("[Erro] tipo invalido em soma\n");exit(1);
  }

  if (verifica_tipo(e->u.expbin.expesq->tipo,bVoid) || verifica_tipo(e->u.expbin.expdir->tipo,bVoid)){
    printf("[Erro] Operacao nao pode ser feita com tipo Void\n");
    exit(1);
  }

  switch (e->u.expbin.opbin) {
    case opadd:
    case opsub:
    case opmult:
    case opdiv:
      //promovendo tipo "menor" para tipo "maior"
      if(e->u.expbin.expesq->tipo->tipo_base == bInt && e->u.expbin.expdir->tipo->tipo_base == bFloat){
        Exp *expas = promove_tipo(e->u.expbin.expdir,bFloat);
        expas->u.expnewas.exp = e->u.expbin.expesq;
        e->u.expbin.expesq = expas;
        e->tipo = e->u.expbin.expdir->tipo;
      }
      else if (e->u.expbin.expesq->tipo->tipo_base == bFloat && e->u.expbin.expdir->tipo->tipo_base == bInt){
        Exp *expas = promove_tipo(e->u.expbin.expdir,bFloat);
        expas->u.expnewas.exp = e->u.expbin.expdir;
        e->u.expbin.expdir = expas;
        e->tipo = e->u.expbin.expesq->tipo;
      }
      else {
        e->tipo = e->u.expbin.expesq->tipo;
      }
    break;
    case equal:
    case notequal:
    case less:
    case lessequal:
    case greater:
    case greaterequal:

      nv = (Tipo*) malloc(sizeof(Tipo));
      if (nv == NULL) {printf("falta de memoria\n");exit(1);}
      nv->tag = base;
      nv->tipo_base = bInt;
      nv->de = NULL;
      if(cmp_tipo_base(e->u.expbin.expesq->tipo, e->u.expbin.expdir->tipo) > 0){
        Exp *expas = promove_tipo(e->u.expbin.expdir,e->u.expbin.expesq->tipo->tipo_base);
        e->u.expbin.expdir = expas;
        e->tipo = e->u.expbin.expesq->tipo;
      }
      else if (cmp_tipo_base(e->u.expbin.expesq->tipo, e->u.expbin.expdir->tipo) < 0){
        Exp *expas = promove_tipo(e->u.expbin.expesq,e->u.expbin.expdir->tipo->tipo_base);
        e->u.expbin.expesq = expas;
        e->tipo = e->u.expbin.expdir->tipo;
      }
      else {
        e->tipo = e->u.expbin.expesq->tipo;
      }
      e->tipo = nv;
    break;
    case opand:
    case opor:
      if (verifica_tipo(e->u.expbin.expesq->tipo,bInt) == 0) {
        printf("[Erro] expressao esperava valor int e encontrou %s",getStringTipo(e->u.expbin.expesq->tipo));
        exit(1);
      }
      if (verifica_tipo(e->u.expbin.expdir->tipo,bInt) == 0 ) {
        printf("[Erro] expressao esperava valor int e encontrou %s",getStringTipo(e->u.expbin.expdir->tipo));
      }

      nv = (Tipo*) malloc(sizeof(Tipo));
      if (nv == NULL) {printf("falta de memoria\n");exit(1);}
      nv->tag = base;
      nv->tipo_base = bInt;
      nv->de = NULL;
      e->tipo = nv;
    break;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
movl -0x14(%rbp), %edx
callq 0x6310
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
jne 0x681d
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
je 0x6835
leaq 0x3fc8(%rip), %rdi      # 0xa7ec
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
xorl %esi, %esi
callq 0x7140
cmpl $0x0, %eax
jne 0x6865
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rdi
xorl %esi, %esi
callq 0x7140
cmpl $0x0, %eax
je 0x687d
leaq 0x3f9e(%rip), %rdi      # 0xa80a
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x10(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x44(%rbp)
subl $0x4, %eax
jb 0x68b3
jmp 0x688e
movl -0x44(%rbp), %eax
addl $-0x4, %eax
subl $0x6, %eax
jb 0x69a9
jmp 0x689f
movl -0x44(%rbp), %eax
addl $-0xa, %eax
subl $0x2, %eax
jb 0x6ae6
jmp 0x6bc4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x2, 0x4(%rax)
jne 0x6922
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x3, 0x4(%rax)
jne 0x6922
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x3, %esi
callq 0x6610
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x69a4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x3, 0x4(%rax)
jne 0x698e
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x2, 0x4(%rax)
jne 0x698e
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x3, %esi
callq 0x6610
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x69a2
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x69a4
jmp 0x6bc4
movl $0x10, %edi
callq 0x1130
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x69d6
leaq 0x3e77(%rip), %rdi      # 0xa83c
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x20(%rbp), %rax
movl $0x0, (%rax)
movq -0x20(%rbp), %rax
movl $0x2, 0x4(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x6580
cmpl $0x0, %eax
jle 0x6a5b
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movl 0x4(%rax), %esi
callq 0x6610
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x6ad5
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x6580
cmpl $0x0, %eax
jge 0x6abf
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movl 0x4(%rax), %esi
callq 0x6610
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x6ad3
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x6ad5
movq -0x20(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x6bc4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
movl $0x2, %esi
callq 0x7140
cmpl $0x0, %eax
jne 0x6b2d
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, %rsi
leaq 0x3d32(%rip), %rdi      # 0xa84e
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rdi
movl $0x2, %esi
callq 0x7140
cmpl $0x0, %eax
jne 0x6b6a
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rdi
callq 0x4a90
movq %rax, %rsi
leaq 0x3ceb(%rip), %rdi      # 0xa84e
movb $0x0, %al
callq 0x10a0
movl $0x10, %edi
callq 0x1130
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x6b97
leaq 0x3cb6(%rip), %rdi      # 0xa83c
movb $0x0, %al
callq 0x10a0
movl $0x1, %edi
callq 0x1190
movq -0x20(%rbp), %rax
movl $0x0, (%rax)
movq -0x20(%rbp), %rax
movl $0x2, 0x4(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x20(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)