// File: /workspace/github_c_makefile_star2_O0/samtools[P]htslib/hts_expr.c
// Function: unary_expr
static int unary_expr(hts_filter_t *filt, void *data, hts_expr_sym_func *fn,
                      char *str, char **end, hts_expr_val_t *res) {
    int err;
    str = ws(str);
    if (*str == '+' || *str == '-') {
        err = simple_expr(filt, data, fn, str+1, end, res);
        if (!hts_expr_val_exists(res)) {
            hts_expr_val_undef(res);
        } else {
            err |= res->is_str;
            if (*str == '-')
                res->d = -res->d;
            res->is_true = res->d != 0;
        }
    } else if (*str == '!') {
        err = unary_expr(filt, data, fn, str+1, end, res);
        if (res->is_true) {
            // Any explicitly true value becomes false
            res->d = res->is_true = 0;
        } else if (!hts_expr_val_exists(res)) {
            // We can also still negate undef values by toggling the
            // is_true override value.
            res->d = res->is_true = !res->is_true;
        } else if (res->is_str) {
            // !null = true, !"foo" = false, NOTE: !"" = false also
            res->d = res->is_true = (res->s.s == NULL);
        } else {
            res->d = !(int64_t)res->d;
            res->is_true = res->d != 0;
        }
        res->is_str = 0;
    } else if (*str == '~') {
        err = unary_expr(filt, data, fn, str+1, end, res);
        if (!hts_expr_val_exists(res)) {
            hts_expr_val_undef(res);
        } else {
            err |= res->is_str;
            if (!hts_expr_val_exists(res)) {
                hts_expr_val_undef(res);
            } else {
                res->d = ~(int64_t)res->d;
                res->is_true = res->d != 0;
            }
        }
    } else {
        err = simple_expr(filt, data, fn, str, end, res);
    }
    return err ? -1 : 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x20(%rbp), %rdi
callq 0x29c80
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x2b, %eax
je 0x2b5f9
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
jne 0x2b6a3
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
addq $0x1, %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
callq 0x2b8d0
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rdi
callq 0x29ce0
cmpl $0x0, %eax
jne 0x2b636
movq -0x30(%rbp), %rdi
callq 0x2a750
jmp 0x2b69e
movq -0x30(%rbp), %rax
movsbl (%rax), %eax
orl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
jne 0x2b678
movq -0x30(%rbp), %rax
movsd 0x20(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movq -0x30(%rbp), %rax
movsd 0x20(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movb %al, %cl
movq -0x30(%rbp), %rax
movb %cl, 0x1(%rax)
jmp 0x2b8b1
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x21, %eax
jne 0x2b7d4
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
addq $0x1, %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
callq 0x2b5b0
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rax
cmpb $0x0, 0x1(%rax)
je 0x2b6fa
movq -0x30(%rbp), %rax
movb $0x0, 0x1(%rax)
movq -0x30(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, 0x20(%rax)
jmp 0x2b7c8
movq -0x30(%rbp), %rdi
callq 0x29ce0
cmpl $0x0, %eax
jne 0x2b72d
movq -0x30(%rbp), %rcx
movb 0x1(%rcx), %al
testb %al, %al
sete %al
sete 0x1(%rcx)
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0x20(%rax)
jmp 0x2b7c6
movq -0x30(%rbp), %rax
cmpb $0x0, (%rax)
je 0x2b779
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rcx
testq %rcx, %rcx
sete %cl
sete 0x1(%rax)
movsd 0xc18b8(%rip), %xmm0    # 0xed008
xorps %xmm1, %xmm1
movsd %xmm1, -0x48(%rbp)
movsd %xmm0, -0x40(%rbp)
je 0x2b769
movsd -0x48(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x40(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0x20(%rax)
jmp 0x2b7c4
movq -0x30(%rbp), %rax
cvttsd2si 0x20(%rax), %rax
cmpq $0x0, %rax
setne %al
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movq -0x30(%rbp), %rax
movsd 0x20(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movb %al, %cl
movq -0x30(%rbp), %rax
movb %cl, 0x1(%rax)
jmp 0x2b7c6
jmp 0x2b7c8
movq -0x30(%rbp), %rax
movb $0x0, (%rax)
jmp 0x2b8af
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x7e, %eax
jne 0x2b88d
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
addq $0x1, %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
callq 0x2b5b0
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rdi
callq 0x29ce0
cmpl $0x0, %eax
jne 0x2b821
movq -0x30(%rbp), %rdi
callq 0x2a750
jmp 0x2b88b
movq -0x30(%rbp), %rax
movsbl (%rax), %eax
orl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rdi
callq 0x29ce0
cmpl $0x0, %eax
jne 0x2b847
movq -0x30(%rbp), %rdi
callq 0x2a750
jmp 0x2b889
movq -0x30(%rbp), %rax
cvttsd2si 0x20(%rax), %rax
xorq $-0x1, %rax
cvtsi2sd %rax, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movq -0x30(%rbp), %rax
movsd 0x20(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movb %al, %cl
movq -0x30(%rbp), %rax
movb %cl, 0x1(%rax)
jmp 0x2b88b
jmp 0x2b8ad
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
callq 0x2b8d0
movl %eax, -0x34(%rbp)
jmp 0x2b8af
jmp 0x2b8b1
movl -0x34(%rbp), %edx
xorl %eax, %eax
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
cmpl $0x0, %edx
cmovnel %ecx, %eax
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)