// File: /workspace/github_c_makefile_star2_O0/voithos[P]awl/src/builtins.c
// Function: builtin_bool_op
awlval* builtin_bool_op(awlenv* e, awlval* a, char* op) {
    if (streq(op, "not")) {
        AWLASSERT_ARGCOUNT(a, 1, op);
        EVAL_SINGLE_ARG(e, a, 0);
        AWLASSERT_TYPE(a, 0, AWLVAL_BOOL, op);

        awlval* x = awlval_take(a, 0);
        x->bln = !x->bln;
        return x;
    }

    AWLASSERT_ARGCOUNT(a, 2, op);

    awlval* x = awlval_pop(a, 0);
    awlval* y = awlval_take(a, 0);

    x = awlval_eval(e, x);
    if (x->type != AWLVAL_BOOL) {
        awlval* err = awlval_err(
                "function '%s' passed incorrect type for arg %i; got %s, expected %s",
                op, 0, awlval_type_name(x->type), awlval_type_name(AWLVAL_BOOL));
        awlval_del(x);
        awlval_del(y);
        return err;
    }

    if ((streq(op, "and") && !x->bln) || (streq(op, "or") && x->bln)) {
        awlval_del(y);
        return x;
    }

    y = awlval_eval(e, y);
    if (y->type != AWLVAL_BOOL) {
        awlval* err = awlval_err(
                "function '%s' passed incorrect type for arg %i; got %s, expected %s",
                op, 1, awlval_type_name(y->type), awlval_type_name(AWLVAL_BOOL));
        awlval_del(x);
        awlval_del(y);
        return err;
    }

    if (streq(op, "and")) {
        x->bln = x->bln && y->bln;
    }
    if (streq(op, "or")) {
        x->bln = x->bln || y->bln;
    }

    awlval_del(y);
    return x;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x20(%rbp), %rdi
leaq 0x16b63(%rip), %rsi     # 0x1a125
callq 0x18d50
testb $0x1, %al
jne 0x35d0
jmp 0x36d8
movq -0x18(%rbp), %rax
cmpl $0x1, 0x4(%rax)
je 0x3612
movq -0x20(%rbp), %rsi
movq -0x18(%rbp), %rax
movl 0x4(%rax), %ecx
leaq 0x16af6(%rip), %rdi     # 0x1a0e2
movl $0x1, %edx
movb $0x0, %al
callq 0x16600
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rdi
callq 0x16cf0
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
xorl %edx, %edx
callq 0x7be0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x363b
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
cmpl $0x6, (%rax)
je 0x36a8
movq -0x20(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movl (%rax), %edi
callq 0x161a0
movq %rax, -0x68(%rbp)
movl $0x6, %edi
callq 0x161a0
movq -0x70(%rbp), %rsi
movq -0x68(%rbp), %rcx
movq %rax, %r8
leaq 0x16aa4(%rip), %rdi     # 0x1a129
xorl %edx, %edx
movb $0x0, %al
callq 0x16600
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
callq 0x16cf0
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x17560
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movb 0x18(%rax), %cl
xorb $-0x1, %cl
movq -0x38(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x18(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x18(%rbp), %rax
cmpl $0x2, 0x4(%rax)
je 0x371a
movq -0x20(%rbp), %rsi
movq -0x18(%rbp), %rax
movl 0x4(%rax), %ecx
leaq 0x169ee(%rip), %rdi     # 0x1a0e2
movl $0x2, %edx
movb $0x0, %al
callq 0x16600
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rdi
callq 0x16cf0
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x174b0
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x17560
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rsi
callq 0x7770
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpl $0x6, (%rax)
je 0x37b1
movq -0x20(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x48(%rbp), %rax
movl (%rax), %edi
callq 0x161a0
movq %rax, -0x78(%rbp)
movl $0x6, %edi
callq 0x161a0
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rcx
movq %rax, %r8
leaq 0x169a4(%rip), %rdi     # 0x1a129
xorl %edx, %edx
movb $0x0, %al
callq 0x16600
movq %rax, -0x58(%rbp)
movq -0x48(%rbp), %rdi
callq 0x16cf0
movq -0x50(%rbp), %rdi
callq 0x16cf0
movq -0x58(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x20(%rbp), %rdi
leaq 0x169b1(%rip), %rsi     # 0x1a16d
callq 0x18d50
testb $0x1, %al
jne 0x37c7
jmp 0x37d1
movq -0x48(%rbp), %rax
testb $0x1, 0x18(%rax)
je 0x37f1
movq -0x20(%rbp), %rdi
leaq 0x1797a(%rip), %rsi     # 0x1b156
callq 0x18d50
testb $0x1, %al
jne 0x37e7
jmp 0x3807
movq -0x48(%rbp), %rax
testb $0x1, 0x18(%rax)
je 0x3807
movq -0x50(%rbp), %rdi
callq 0x16cf0
movq -0x48(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x10(%rbp), %rdi
movq -0x50(%rbp), %rsi
callq 0x7770
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpl $0x6, (%rax)
je 0x388f
movq -0x20(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x50(%rbp), %rax
movl (%rax), %edi
callq 0x161a0
movq %rax, -0x88(%rbp)
movl $0x6, %edi
callq 0x161a0
movq -0x90(%rbp), %rsi
movq -0x88(%rbp), %rcx
movq %rax, %r8
leaq 0x168c9(%rip), %rdi     # 0x1a129
movl $0x1, %edx
movb $0x0, %al
callq 0x16600
movq %rax, -0x60(%rbp)
movq -0x48(%rbp), %rdi
callq 0x16cf0
movq -0x50(%rbp), %rdi
callq 0x16cf0
movq -0x60(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x392a
movq -0x20(%rbp), %rdi
leaq 0x168d3(%rip), %rsi     # 0x1a16d
callq 0x18d50
testb $0x1, %al
jne 0x38a5
jmp 0x38d4
movq -0x48(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x18(%rcx)
movb %al, -0x91(%rbp)
je 0x38c4
movq -0x50(%rbp), %rax
movb 0x18(%rax), %al
movb %al, -0x91(%rbp)
movb -0x91(%rbp), %cl
movq -0x48(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x18(%rax)
movq -0x20(%rbp), %rdi
leaq 0x17877(%rip), %rsi     # 0x1b156
callq 0x18d50
testb $0x1, %al
jne 0x38ea
jmp 0x3919
movq -0x48(%rbp), %rcx
movb $0x1, %al
testb $0x1, 0x18(%rcx)
movb %al, -0x92(%rbp)
jne 0x3909
movq -0x50(%rbp), %rax
movb 0x18(%rax), %al
movb %al, -0x92(%rbp)
movb -0x92(%rbp), %cl
movq -0x48(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x18(%rax)
movq -0x50(%rbp), %rdi
callq 0x16cf0
movq -0x48(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0xa0, %rsp
popq %rbp
retq
nopw (%rax,%rax)