// File: /workspace/github_c_makefile_star2_O0/vtereshkov[P]umka-lang/src/umka_types.c
// Function: typeValidOperator
bool typeValidOperator(const Type *type, TokenKind op)
{
    switch (op)
    {
        case TOK_PLUS:      return typeInteger(type) || typeReal(type) || type->kind == TYPE_STR;
        case TOK_MINUS:
        case TOK_MUL:
        case TOK_DIV:
        case TOK_MOD:       return typeInteger(type) || typeReal(type);
        case TOK_AND:
        case TOK_OR:
        case TOK_XOR:
        case TOK_SHL:
        case TOK_SHR:       return typeInteger(type);
        case TOK_PLUSEQ:    return typeInteger(type) || typeReal(type) || type->kind == TYPE_STR;
        case TOK_MINUSEQ:
        case TOK_MULEQ:
        case TOK_DIVEQ:
        case TOK_MODEQ:     return typeInteger(type) || typeReal(type);
        case TOK_ANDEQ:
        case TOK_OREQ:
        case TOK_XOREQ:
        case TOK_SHLEQ:
        case TOK_SHREQ:     return typeInteger(type);
        case TOK_ANDAND:
        case TOK_OROR:      return type->kind == TYPE_BOOL;
        case TOK_PLUSPLUS:
        case TOK_MINUSMINUS:return typeInteger(type);
        case TOK_EQEQ:      return typeOrdinal(type) || typeReal(type) || type->kind == TYPE_PTR || type->kind == TYPE_WEAKPTR || type->kind == TYPE_STR || type->kind == TYPE_ARRAY || type->kind == TYPE_STRUCT;
        case TOK_LESS:
        case TOK_GREATER:   return typeOrdinal(type) || typeReal(type) || type->kind == TYPE_STR;
        case TOK_EQ:        return true;
        case TOK_NOT:       return type->kind == TYPE_BOOL;
        case TOK_NOTEQ:     return typeOrdinal(type) || typeReal(type) || type->kind == TYPE_PTR || type->kind == TYPE_WEAKPTR || type->kind == TYPE_STR || type->kind == TYPE_ARRAY || type->kind == TYPE_STRUCT;
        case TOK_LESSEQ:
        case TOK_GREATEREQ: return typeOrdinal(type) || typeReal(type) || type->kind == TYPE_STR;
        default:            return false;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl -0x14(%rbp), %eax
addl $-0x16, %eax
movl %eax, %ecx
movq %rcx, -0x20(%rbp)
subl $0x20, %eax
ja 0x22d80
movq -0x20(%rbp), %rax
leaq 0x1b724d(%rip), %rcx    # 0x1d9cfc
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rdi
callq 0x22810
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x21(%rbp)
jne 0x22aef
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x21(%rbp)
jne 0x22aef
movq -0x10(%rbp), %rax
cmpl $0x14, (%rax)
sete %al
movb %al, -0x21(%rbp)
movb -0x21(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x22(%rbp)
jne 0x22b1d
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, -0x22(%rbp)
movb -0x22(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x23(%rbp)
jne 0x22b74
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x23(%rbp)
jne 0x22b74
movq -0x10(%rbp), %rax
cmpl $0x14, (%rax)
sete %al
movb %al, -0x23(%rbp)
movb -0x23(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x24(%rbp)
jne 0x22ba2
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, -0x24(%rbp)
movb -0x24(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rax
cmpl $0xc, (%rax)
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22810
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22d90
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x25(%rbp)
jne 0x22c58
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x25(%rbp)
jne 0x22c58
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x10, (%rcx)
movb %al, -0x25(%rbp)
je 0x22c58
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x11, (%rcx)
movb %al, -0x25(%rbp)
je 0x22c58
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x14, (%rcx)
movb %al, -0x25(%rbp)
je 0x22c58
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x12, (%rcx)
movb %al, -0x25(%rbp)
je 0x22c58
movq -0x10(%rbp), %rax
cmpl $0x16, (%rax)
sete %al
movb %al, -0x25(%rbp)
movb -0x25(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22d90
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x26(%rbp)
jne 0x22c9c
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x26(%rbp)
jne 0x22c9c
movq -0x10(%rbp), %rax
cmpl $0x14, (%rax)
sete %al
movb %al, -0x26(%rbp)
movb -0x26(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movb $0x1, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rax
cmpl $0xc, (%rax)
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22d90
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x27(%rbp)
jne 0x22d35
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x27(%rbp)
jne 0x22d35
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x10, (%rcx)
movb %al, -0x27(%rbp)
je 0x22d35
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x11, (%rcx)
movb %al, -0x27(%rbp)
je 0x22d35
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x14, (%rcx)
movb %al, -0x27(%rbp)
je 0x22d35
movq -0x10(%rbp), %rcx
movb $0x1, %al
cmpl $0x12, (%rcx)
movb %al, -0x27(%rbp)
je 0x22d35
movq -0x10(%rbp), %rax
cmpl $0x16, (%rax)
sete %al
movb %al, -0x27(%rbp)
movb -0x27(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movq -0x10(%rbp), %rdi
callq 0x22d90
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x28(%rbp)
jne 0x22d76
movq -0x10(%rbp), %rdi
callq 0x22850
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x28(%rbp)
jne 0x22d76
movq -0x10(%rbp), %rax
cmpl $0x14, (%rax)
sete %al
movb %al, -0x28(%rbp)
movb -0x28(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x22d84
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x30, %rsp
popq %rbp
retq
nop