// File: /workspace/github_c_makefile_star2_O0/simh[P]simtools/crossassemblers/macro11/parse.c
// Function: parse_binary
EX_TREE        *parse_binary(
    char *cp,
    char term,
    int depth)
{
    EX_TREE        *leftp,
                   *rightp,
                   *tp;

    leftp = parse_unary(cp);

    while (leftp->type != EX_ERR) {
        cp = skipwhite(leftp->cp);

        if (*cp == term)
            return leftp;

        switch (*cp) {
        case '+':
            if (depth >= ADD_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, ADD_PREC);
            tp = new_ex_bin(EX_ADD, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        case '-':
            if (depth >= ADD_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, ADD_PREC);
            tp = new_ex_bin(EX_SUB, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        case '*':
            if (depth >= MUL_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, MUL_PREC);
            tp = new_ex_bin(EX_MUL, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        case '/':
            if (depth >= MUL_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, MUL_PREC);
            tp = new_ex_bin(EX_DIV, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        case '!':
            if (depth >= OR_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, OR_PREC);
            tp = new_ex_bin(EX_OR, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        case '&':
            if (depth >= AND_PREC)
                return leftp;

            rightp = parse_binary(cp + 1, term, AND_PREC);
            tp = new_ex_bin(EX_AND, leftp, rightp);
            tp->cp = rightp->cp;
            leftp = tp;
            break;

        default:
            /* Some unknown character.  Let caller decide if it's okay. */

            return leftp;
        }                              /* end switch */
    }                                  /* end while */

    /* Can't be reached except by error. */
    return leftp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movb %sil, %al
movq %rdi, -0x10(%rbp)
movb %al, -0x11(%rbp)
movl %edx, -0x18(%rbp)
movq -0x10(%rbp), %rdi
callq 0xcd30
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x7, (%rax)
je 0xcd0f
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xb9e0
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
movsbl -0x11(%rbp), %ecx
cmpl %ecx, %eax
jne 0xca9c
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
addl $-0x21, %eax
movl %eax, %ecx
movq %rcx, -0x38(%rbp)
subl $0xe, %eax
ja 0xcd00
movq -0x38(%rbp), %rax
leaq 0x8ba0(%rip), %rcx      # 0x15660
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpl $0x1, -0x18(%rbp)
jl 0xcadc
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x8, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
cmpl $0x1, -0x18(%rbp)
jl 0xcb3c
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0x9, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
cmpl $0x1, -0x18(%rbp)
jl 0xcb9c
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0xa, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
cmpl $0x1, -0x18(%rbp)
jl 0xcbfc
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0xb, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
cmpl $0x1, -0x18(%rbp)
jl 0xcc5c
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0xd, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
cmpl $0x1, -0x18(%rbp)
jl 0xccb6
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
movl $0x1, %edx
movsbl -0x11(%rbp), %esi
callq 0xca40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movl $0xc, %edi
callq 0xa400
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0xcd0a
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xcd17
jmp 0xca62
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)