// File: /workspace/github_c_makefile_star2_O0/markdryan[P]subtilis/frontend/parser_exp.c
// Function: prv_priority4
static subtilis_exp_t *prv_priority4(subtilis_parser_t *p, subtilis_token_t *t,
				     subtilis_error_t *err)
{
	const char *tbuf;
	subtilis_exp_t *e1 = NULL;
	subtilis_exp_t *e2 = NULL;
	subtilis_exp_fn_t exp_fn;

	e1 = prv_priority3(p, t, err);
	if (err->type != SUBTILIS_ERROR_OK)
		goto cleanup;
	tbuf = subtilis_token_get_text(t);

	/*
	 * Special case for number too big.
	 */

	if ((t->type == SUBTILIS_TOKEN_INTEGER) &&
	    (t->tok.integer == -2147483648)) {
		subtilis_error_set_number_too_long(
		    err, tbuf, p->l->stream->name, p->l->line);
		goto cleanup;
	}

	while (t->type == SUBTILIS_TOKEN_OPERATOR) {
		tbuf = subtilis_token_get_text(t);
		if (!strcmp(tbuf, "+"))
			exp_fn = subtilis_exp_add;
		else if (!strcmp(tbuf, "-"))
			exp_fn = subtilis_type_if_sub;
		else
			break;
		subtilis_lexer_get(p->l, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			goto cleanup;
		e2 = prv_priority3(p, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			goto cleanup;

		e1 = exp_fn(p, e1, e2, err);
		e2 = NULL;
		if (err->type != SUBTILIS_ERROR_OK)
			goto cleanup;
	}

	return e1;

cleanup:

	subtilis_exp_delete(e2);
	subtilis_exp_delete(e1);
	return NULL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x26530
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x0, (%rax)
je 0x263b7
jmp 0x26503
movq -0x18(%rbp), %rdi
callq 0x12d70
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x26424
movq -0x18(%rbp), %rax
movslq 0x8(%rax), %rax
cmpq $-0x80000000, %rax      # imm = 0x80000000
jne 0x26424
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rdx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x30(%rax), %r8
movq -0x10(%rbp), %rax
movq (%rax), %rax
movl 0x38(%rax), %r9d
movl $0x8, %esi
leaq 0x84e6f(%rip), %rcx     # 0xab276
leaq 0x844de(%rip), %rax     # 0xaa8ec
movq %rax, (%rsp)
movl $0x295, 0x8(%rsp)       # imm = 0x295
callq 0x156d0
jmp 0x26503
jmp 0x26426
movq -0x18(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x264f9
movq -0x18(%rbp), %rdi
callq 0x12d70
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
leaq 0x844ca(%rip), %rsi     # 0xaa915
callq 0x12140
cmpl $0x0, %eax
jne 0x26462
leaq 0x11774(%rip), %rax     # 0x37bd0
movq %rax, -0x40(%rbp)
jmp 0x26488
movq -0x28(%rbp), %rdi
leaq 0x8406f(%rip), %rsi     # 0xaa4dc
callq 0x12140
cmpl $0x0, %eax
jne 0x26484
leaq 0x22e42(%rip), %rax     # 0x492c0
movq %rax, -0x40(%rbp)
jmp 0x26486
jmp 0x264f9
jmp 0x26488
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x133f0
movq -0x20(%rbp), %rax
cmpl $0x0, (%rax)
je 0x264a7
jmp 0x26503
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x26530
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x0, (%rax)
je 0x264c7
jmp 0x26503
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq *%rax
movq %rax, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x0, (%rax)
je 0x264f4
jmp 0x26503
jmp 0x26426
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x2651d
movq -0x38(%rbp), %rdi
callq 0x36ee0
movq -0x30(%rbp), %rdi
callq 0x36ee0
movq $0x0, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)